diff --git a/utils/v4l2-tracer/libv4l2tracer.cpp b/utils/v4l2-tracer/libv4l2tracer.cpp
index 6b438628..5d0817b2 100644
--- a/utils/v4l2-tracer/libv4l2tracer.cpp
+++ b/utils/v4l2-tracer/libv4l2tracer.cpp
@@ -24,9 +24,15 @@ const std::list<unsigned long> ioctls = {
 	VIDIOC_DQBUF,
 	VIDIOC_G_PARM,
 	VIDIOC_S_PARM,
+	VIDIOC_ENUMINPUT,
 	VIDIOC_G_CTRL,
 	VIDIOC_S_CTRL,
 	VIDIOC_QUERYCTRL,
+	VIDIOC_G_INPUT,
+	VIDIOC_S_INPUT,
+	VIDIOC_G_OUTPUT,
+	VIDIOC_S_OUTPUT,
+	VIDIOC_ENUMOUTPUT,
 	VIDIOC_G_CROP,
 	VIDIOC_S_CROP,
 	VIDIOC_TRY_FMT,
diff --git a/utils/v4l2-tracer/retrace.cpp b/utils/v4l2-tracer/retrace.cpp
index 36a218d3..29ac4a38 100644
--- a/utils/v4l2-tracer/retrace.cpp
+++ b/utils/v4l2-tracer/retrace.cpp
@@ -614,6 +614,17 @@ void retrace_vidioc_queryctrl(int fd_retrace, json_object *ioctl_args)
 	free(ptr);
 }
 
+void retrace_vidioc_enuminput(int fd_retrace, json_object *ioctl_args)
+{
+	struct v4l2_input *ptr = retrace_v4l2_input_gen(ioctl_args);
+	ioctl(fd_retrace, VIDIOC_ENUMINPUT, ptr);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_ENUMINPUT");
+
+	free(ptr);
+}
+
 void retrace_vidioc_g_control(int fd_retrace, json_object *ioctl_args)
 {
 	struct v4l2_control *ptr = retrace_v4l2_control_gen(ioctl_args);
@@ -636,6 +647,61 @@ void retrace_vidioc_s_control(int fd_retrace, json_object *ioctl_args)
 	free(ptr);
 }
 
+void retrace_vidioc_g_input(int fd_retrace, json_object *ioctl_args)
+{
+	int input = 0;
+	ioctl(fd_retrace, VIDIOC_G_INPUT, &input);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_G_INPUT");
+}
+
+void retrace_vidioc_s_input(int fd_retrace, json_object *ioctl_args)
+{
+	int input = 0;
+	json_object *input_obj;
+	if (json_object_object_get_ex(ioctl_args, "input", &input_obj))
+		input = json_object_get_int(input_obj);
+
+	ioctl(fd_retrace, VIDIOC_S_INPUT, &input);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_S_INPUT");
+}
+
+void retrace_vidioc_g_output(int fd_retrace, json_object *ioctl_args)
+{
+	int output = 0;
+	ioctl(fd_retrace, VIDIOC_G_OUTPUT, &output);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_G_OUTPUT");
+}
+
+void retrace_vidioc_s_output(int fd_retrace, json_object *ioctl_args)
+{
+	int output = 0;
+	json_object *output_obj;
+	if (json_object_object_get_ex(ioctl_args, "output", &output_obj))
+		output = json_object_get_int(output_obj);
+
+	ioctl(fd_retrace, VIDIOC_S_OUTPUT, &output);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_S_OUTPUT");
+}
+
+void retrace_vidioc_enumoutput(int fd_retrace, json_object *ioctl_args)
+{
+	struct v4l2_output *ptr = retrace_v4l2_output_gen(ioctl_args);
+	ioctl(fd_retrace, VIDIOC_ENUMOUTPUT, ptr);
+
+	if (is_verbose() || (errno != 0))
+		perror("VIDIOC_ENUMOUTPUT");
+
+	free(ptr);
+}
+
 void retrace_vidioc_g_crop(int fd_retrace, json_object *ioctl_args)
 {
 	struct v4l2_crop *ptr = retrace_v4l2_crop_gen(ioctl_args);
@@ -1165,6 +1231,9 @@ void retrace_ioctl(json_object *syscall_obj)
 	case VIDIOC_S_PARM:
 		retrace_vidioc_s_parm(fd_retrace, ioctl_args_user);
 		break;
+	case VIDIOC_ENUMINPUT:
+		retrace_vidioc_enuminput(fd_retrace, ioctl_args_user);
+		break;
 	case VIDIOC_G_CTRL:
 		retrace_vidioc_g_control(fd_retrace, ioctl_args_user);
 		break;
@@ -1174,6 +1243,21 @@ void retrace_ioctl(json_object *syscall_obj)
 	case VIDIOC_QUERYCTRL:
 		retrace_vidioc_queryctrl(fd_retrace, ioctl_args_user);
 		break;
+	case VIDIOC_G_INPUT:
+		retrace_vidioc_g_input(fd_retrace, ioctl_args_user);
+		break;
+	case VIDIOC_S_INPUT:
+		retrace_vidioc_s_input(fd_retrace, ioctl_args_user);
+		break;
+	case VIDIOC_G_OUTPUT:
+		retrace_vidioc_g_output(fd_retrace, ioctl_args_user);
+		break;
+	case VIDIOC_S_OUTPUT:
+		retrace_vidioc_s_output(fd_retrace, ioctl_args_user);
+		break;
+	case VIDIOC_ENUMOUTPUT:
+		retrace_vidioc_enumoutput(fd_retrace, ioctl_args_user);
+		break;
 	case VIDIOC_G_CROP:
 		retrace_vidioc_g_crop(fd_retrace, ioctl_args_user);
 		break;
diff --git a/utils/v4l2-tracer/trace.cpp b/utils/v4l2-tracer/trace.cpp
index 4896751b..a393d0d4 100644
--- a/utils/v4l2-tracer/trace.cpp
+++ b/utils/v4l2-tracer/trace.cpp
@@ -556,6 +556,9 @@ json_object *trace_ioctl_args(unsigned long cmd, void *arg)
 	case VIDIOC_S_PARM:
 		trace_v4l2_streamparm(arg, ioctl_args);
 		break;
+	case VIDIOC_ENUMINPUT:
+		trace_v4l2_input_gen(arg, ioctl_args);
+		break;
 	case VIDIOC_G_CTRL:
 	case VIDIOC_S_CTRL:
 		trace_v4l2_control_gen(arg, ioctl_args);
@@ -563,6 +566,21 @@ json_object *trace_ioctl_args(unsigned long cmd, void *arg)
 	case VIDIOC_QUERYCTRL:
 		trace_v4l2_queryctrl_gen(arg, ioctl_args);
 		break;
+	case VIDIOC_G_INPUT:
+	case VIDIOC_S_INPUT: {
+		int *input = static_cast<int*>(arg);
+		json_object_object_add(ioctl_args, "input", json_object_new_int(*input));
+		break;
+	}
+	case VIDIOC_G_OUTPUT:
+	case VIDIOC_S_OUTPUT: {
+		int *output = static_cast<int*>(arg);
+		json_object_object_add(ioctl_args, "output", json_object_new_int(*output));
+		break;
+	}
+	case VIDIOC_ENUMOUTPUT:
+		trace_v4l2_output_gen(arg, ioctl_args);
+		break;
 	case VIDIOC_G_CROP:
 	case VIDIOC_S_CROP:
 		trace_v4l2_crop_gen(arg, ioctl_args);
diff --git a/utils/v4l2-tracer/v4l2-tracer-gen.pl b/utils/v4l2-tracer/v4l2-tracer-gen.pl
index 66d46f0c..7a47f116 100755
--- a/utils/v4l2-tracer/v4l2-tracer-gen.pl
+++ b/utils/v4l2-tracer/v4l2-tracer-gen.pl
@@ -156,6 +156,12 @@ sub get_val_def_name {
 		if ($struct_name eq "v4l2_frmivalenum") {
 			return "v4l2_frmivaltypes_val_def";
 		}
+		if ($struct_name eq "v4l2_input") {
+			return $val_def_name = "input_type_val_def";
+		}
+		if ($struct_name eq "v4l2_output") {
+			return $val_def_name = "output_type_val_def";
+		}
 		return "nullptr"; # will print as hex string
 	}
 	# special treatment for struct v4l2_input which has members named both "tuner" and "type"
@@ -209,6 +215,9 @@ sub get_val_def_name {
 	if ($member =~ /xfer_func/) {
 		return "v4l2_xfer_func_val_def";
 	}
+	if (($member eq "status") && ($struct_name eq "v4l2_input")) {
+		$val_def_name = "input_field_val_def";
+	}
 	return "";
 }
 
@@ -824,11 +833,41 @@ while (<>) {
 		flag_def_gen("V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS");
 		next;
 	}
+	if (grep {/^#define V4L2_STD_PAL_B\s+/} $_) {
+		printf $fh_common_info_h "constexpr flag_def std_flag_def[] = {\n";
+		flag_def_gen("V4L2_STD_ALL");
+		next
+	}
 	if (grep {/^#define V4L2_MODE_HIGHQUALITY\s+/} $_) {
 		printf $fh_common_info_h "constexpr val_def streamparm_val_def[] = {\n";
 		val_def_gen("V4L2_CAP_TIMEPERFRAME");
 		next;
 	}
+	if (grep {/^#define V4L2_INPUT_TYPE_TUNER\s+/} $_) {
+		printf $fh_common_info_h "constexpr val_def input_type_val_def[] = {\n";
+		val_def_gen("V4L2_INPUT_TYPE_TOUCH");
+		next
+	}
+	if (grep {/^#define V4L2_IN_ST_NO_POWER\s+/} $_) {
+		printf $fh_common_info_h "constexpr val_def input_field_val_def[] = {\n";
+		val_def_gen("V4L2_IN_ST_VTR");
+		next
+	}
+	if (grep {/^#define V4L2_IN_CAP_DV_TIMINGS\s+/} $_) {
+		printf $fh_common_info_h "constexpr flag_def input_cap_flag_def[] = {\n";
+		flag_def_gen("V4L2_IN_CAP_NATIVE_SIZE");
+		next
+	}
+	if (grep {/^#define V4L2_OUTPUT_TYPE_MODULATOR\s+/} $_) {
+		printf $fh_common_info_h "constexpr val_def output_type_val_def[] = {\n";
+		val_def_gen("V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY");
+		next
+	}
+	if (grep {/^#define V4L2_OUT_CAP_DV_TIMINGS\s+/} $_) {
+		printf $fh_common_info_h "constexpr flag_def output_cap_flag_def[] = {\n";
+		flag_def_gen("V4L2_OUT_CAP_NATIVE_SIZE");
+		next
+	}
 	if (grep {/^#define V4L2_ENC_CMD_START\s+/} $_) {
 		printf $fh_common_info_h "constexpr val_def encoder_cmd_val_def[] = {\n";
 		val_def_gen("V4L2_ENC_CMD_RESUME");
