aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/v4l2-core/v4l2-ctrls.c35
-rw-r--r--include/media/v4l2-ctrls.h2
-rw-r--r--include/uapi/linux/v4l2-controls.h9
-rw-r--r--include/uapi/linux/videodev2.h2
4 files changed, 48 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 5db038525f99..4863cf05175d 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -805,6 +805,15 @@ const char *v4l2_ctrl_get_name(u32 id)
805 case V4L2_CID_RDS_TX_PTY: return "RDS Program Type"; 805 case V4L2_CID_RDS_TX_PTY: return "RDS Program Type";
806 case V4L2_CID_RDS_TX_PS_NAME: return "RDS PS Name"; 806 case V4L2_CID_RDS_TX_PS_NAME: return "RDS PS Name";
807 case V4L2_CID_RDS_TX_RADIO_TEXT: return "RDS Radio Text"; 807 case V4L2_CID_RDS_TX_RADIO_TEXT: return "RDS Radio Text";
808 case V4L2_CID_RDS_TX_MONO_STEREO: return "RDS Stereo";
809 case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD: return "RDS Artificial Head";
810 case V4L2_CID_RDS_TX_COMPRESSED: return "RDS Compressed";
811 case V4L2_CID_RDS_TX_DYNAMIC_PTY: return "RDS Dynamic PTY";
812 case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
813 case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM: return "RDS Traffic Program";
814 case V4L2_CID_RDS_TX_MUSIC_SPEECH: return "RDS Music";
815 case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE: return "RDS Enable Alt Frequencies";
816 case V4L2_CID_RDS_TX_ALT_FREQS: return "RDS Alternate Frequencies";
808 case V4L2_CID_AUDIO_LIMITER_ENABLED: return "Audio Limiter Feature Enabled"; 817 case V4L2_CID_AUDIO_LIMITER_ENABLED: return "Audio Limiter Feature Enabled";
809 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time"; 818 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
810 case V4L2_CID_AUDIO_LIMITER_DEVIATION: return "Audio Limiter Deviation"; 819 case V4L2_CID_AUDIO_LIMITER_DEVIATION: return "Audio Limiter Deviation";
@@ -946,6 +955,14 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
946 case V4L2_CID_RF_TUNER_IF_GAIN_AUTO: 955 case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:
947 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO: 956 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
948 case V4L2_CID_RF_TUNER_PLL_LOCK: 957 case V4L2_CID_RF_TUNER_PLL_LOCK:
958 case V4L2_CID_RDS_TX_MONO_STEREO:
959 case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
960 case V4L2_CID_RDS_TX_COMPRESSED:
961 case V4L2_CID_RDS_TX_DYNAMIC_PTY:
962 case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
963 case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
964 case V4L2_CID_RDS_TX_MUSIC_SPEECH:
965 case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
949 *type = V4L2_CTRL_TYPE_BOOLEAN; 966 *type = V4L2_CTRL_TYPE_BOOLEAN;
950 *min = 0; 967 *min = 0;
951 *max = *step = 1; 968 *max = *step = 1;
@@ -1089,6 +1106,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
1089 case V4L2_CID_DETECT_MD_THRESHOLD_GRID: 1106 case V4L2_CID_DETECT_MD_THRESHOLD_GRID:
1090 *type = V4L2_CTRL_TYPE_U16; 1107 *type = V4L2_CTRL_TYPE_U16;
1091 break; 1108 break;
1109 case V4L2_CID_RDS_TX_ALT_FREQS:
1110 *type = V4L2_CTRL_TYPE_U32;
1111 break;
1092 default: 1112 default:
1093 *type = V4L2_CTRL_TYPE_INTEGER; 1113 *type = V4L2_CTRL_TYPE_INTEGER;
1094 break; 1114 break;
@@ -1209,6 +1229,8 @@ static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
1209 return ptr1.p_u8[idx] == ptr2.p_u8[idx]; 1229 return ptr1.p_u8[idx] == ptr2.p_u8[idx];
1210 case V4L2_CTRL_TYPE_U16: 1230 case V4L2_CTRL_TYPE_U16:
1211 return ptr1.p_u16[idx] == ptr2.p_u16[idx]; 1231 return ptr1.p_u16[idx] == ptr2.p_u16[idx];
1232 case V4L2_CTRL_TYPE_U32:
1233 return ptr1.p_u32[idx] == ptr2.p_u32[idx];
1212 default: 1234 default:
1213 if (ctrl->is_int) 1235 if (ctrl->is_int)
1214 return ptr1.p_s32[idx] == ptr2.p_s32[idx]; 1236 return ptr1.p_s32[idx] == ptr2.p_s32[idx];
@@ -1242,6 +1264,9 @@ static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
1242 case V4L2_CTRL_TYPE_U16: 1264 case V4L2_CTRL_TYPE_U16:
1243 ptr.p_u16[idx] = ctrl->default_value; 1265 ptr.p_u16[idx] = ctrl->default_value;
1244 break; 1266 break;
1267 case V4L2_CTRL_TYPE_U32:
1268 ptr.p_u32[idx] = ctrl->default_value;
1269 break;
1245 default: 1270 default:
1246 idx *= ctrl->elem_size; 1271 idx *= ctrl->elem_size;
1247 memset(ptr.p + idx, 0, ctrl->elem_size); 1272 memset(ptr.p + idx, 0, ctrl->elem_size);
@@ -1289,6 +1314,9 @@ static void std_log(const struct v4l2_ctrl *ctrl)
1289 case V4L2_CTRL_TYPE_U16: 1314 case V4L2_CTRL_TYPE_U16:
1290 pr_cont("%u", (unsigned)*ptr.p_u16); 1315 pr_cont("%u", (unsigned)*ptr.p_u16);
1291 break; 1316 break;
1317 case V4L2_CTRL_TYPE_U32:
1318 pr_cont("%u", (unsigned)*ptr.p_u32);
1319 break;
1292 default: 1320 default:
1293 pr_cont("unknown type %d", ctrl->type); 1321 pr_cont("unknown type %d", ctrl->type);
1294 break; 1322 break;
@@ -1346,6 +1374,8 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
1346 return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl); 1374 return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
1347 case V4L2_CTRL_TYPE_U16: 1375 case V4L2_CTRL_TYPE_U16:
1348 return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl); 1376 return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
1377 case V4L2_CTRL_TYPE_U32:
1378 return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
1349 1379
1350 case V4L2_CTRL_TYPE_BOOLEAN: 1380 case V4L2_CTRL_TYPE_BOOLEAN:
1351 ptr.p_s32[idx] = !!ptr.p_s32[idx]; 1381 ptr.p_s32[idx] = !!ptr.p_s32[idx];
@@ -1578,6 +1608,7 @@ static int check_range(enum v4l2_ctrl_type type,
1578 /* fall through */ 1608 /* fall through */
1579 case V4L2_CTRL_TYPE_U8: 1609 case V4L2_CTRL_TYPE_U8:
1580 case V4L2_CTRL_TYPE_U16: 1610 case V4L2_CTRL_TYPE_U16:
1611 case V4L2_CTRL_TYPE_U32:
1581 case V4L2_CTRL_TYPE_INTEGER: 1612 case V4L2_CTRL_TYPE_INTEGER:
1582 case V4L2_CTRL_TYPE_INTEGER64: 1613 case V4L2_CTRL_TYPE_INTEGER64:
1583 if (step == 0 || min > max || def < min || def > max) 1614 if (step == 0 || min > max || def < min || def > max)
@@ -1893,6 +1924,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
1893 case V4L2_CTRL_TYPE_U16: 1924 case V4L2_CTRL_TYPE_U16:
1894 elem_size = sizeof(u16); 1925 elem_size = sizeof(u16);
1895 break; 1926 break;
1927 case V4L2_CTRL_TYPE_U32:
1928 elem_size = sizeof(u32);
1929 break;
1896 default: 1930 default:
1897 if (type < V4L2_CTRL_COMPOUND_TYPES) 1931 if (type < V4L2_CTRL_COMPOUND_TYPES)
1898 elem_size = sizeof(s32); 1932 elem_size = sizeof(s32);
@@ -3248,6 +3282,7 @@ int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
3248 case V4L2_CTRL_TYPE_BITMASK: 3282 case V4L2_CTRL_TYPE_BITMASK:
3249 case V4L2_CTRL_TYPE_U8: 3283 case V4L2_CTRL_TYPE_U8:
3250 case V4L2_CTRL_TYPE_U16: 3284 case V4L2_CTRL_TYPE_U16:
3285 case V4L2_CTRL_TYPE_U32:
3251 if (ctrl->is_array) 3286 if (ctrl->is_array)
3252 return -EINVAL; 3287 return -EINVAL;
3253 ret = check_range(ctrl->type, min, max, step, def); 3288 ret = check_range(ctrl->type, min, max, step, def);
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index d6540d201764..b7cd7a665e35 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -41,6 +41,7 @@ struct poll_table_struct;
41 * @p_s64: Pointer to a 64-bit signed value. 41 * @p_s64: Pointer to a 64-bit signed value.
42 * @p_u8: Pointer to a 8-bit unsigned value. 42 * @p_u8: Pointer to a 8-bit unsigned value.
43 * @p_u16: Pointer to a 16-bit unsigned value. 43 * @p_u16: Pointer to a 16-bit unsigned value.
44 * @p_u32: Pointer to a 32-bit unsigned value.
44 * @p_char: Pointer to a string. 45 * @p_char: Pointer to a string.
45 * @p: Pointer to a compound value. 46 * @p: Pointer to a compound value.
46 */ 47 */
@@ -49,6 +50,7 @@ union v4l2_ctrl_ptr {
49 s64 *p_s64; 50 s64 *p_s64;
50 u8 *p_u8; 51 u8 *p_u8;
51 u16 *p_u16; 52 u16 *p_u16;
53 u32 *p_u32;
52 char *p_char; 54 char *p_char;
53 void *p; 55 void *p;
54}; 56};
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index db526d1c8309..a13e6fef987e 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -757,6 +757,15 @@ enum v4l2_auto_focus_range {
757#define V4L2_CID_RDS_TX_PTY (V4L2_CID_FM_TX_CLASS_BASE + 3) 757#define V4L2_CID_RDS_TX_PTY (V4L2_CID_FM_TX_CLASS_BASE + 3)
758#define V4L2_CID_RDS_TX_PS_NAME (V4L2_CID_FM_TX_CLASS_BASE + 5) 758#define V4L2_CID_RDS_TX_PS_NAME (V4L2_CID_FM_TX_CLASS_BASE + 5)
759#define V4L2_CID_RDS_TX_RADIO_TEXT (V4L2_CID_FM_TX_CLASS_BASE + 6) 759#define V4L2_CID_RDS_TX_RADIO_TEXT (V4L2_CID_FM_TX_CLASS_BASE + 6)
760#define V4L2_CID_RDS_TX_MONO_STEREO (V4L2_CID_FM_TX_CLASS_BASE + 7)
761#define V4L2_CID_RDS_TX_ARTIFICIAL_HEAD (V4L2_CID_FM_TX_CLASS_BASE + 8)
762#define V4L2_CID_RDS_TX_COMPRESSED (V4L2_CID_FM_TX_CLASS_BASE + 9)
763#define V4L2_CID_RDS_TX_DYNAMIC_PTY (V4L2_CID_FM_TX_CLASS_BASE + 10)
764#define V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT (V4L2_CID_FM_TX_CLASS_BASE + 11)
765#define V4L2_CID_RDS_TX_TRAFFIC_PROGRAM (V4L2_CID_FM_TX_CLASS_BASE + 12)
766#define V4L2_CID_RDS_TX_MUSIC_SPEECH (V4L2_CID_FM_TX_CLASS_BASE + 13)
767#define V4L2_CID_RDS_TX_ALT_FREQS_ENABLE (V4L2_CID_FM_TX_CLASS_BASE + 14)
768#define V4L2_CID_RDS_TX_ALT_FREQS (V4L2_CID_FM_TX_CLASS_BASE + 15)
760 769
761#define V4L2_CID_AUDIO_LIMITER_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 64) 770#define V4L2_CID_AUDIO_LIMITER_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 64)
762#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 65) 771#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 65)
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 5fd42027877a..778a3298fb34 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1288,6 +1288,7 @@ struct v4l2_ext_control {
1288 char *string; 1288 char *string;
1289 __u8 *p_u8; 1289 __u8 *p_u8;
1290 __u16 *p_u16; 1290 __u16 *p_u16;
1291 __u32 *p_u32;
1291 void *ptr; 1292 void *ptr;
1292 }; 1293 };
1293} __attribute__ ((packed)); 1294} __attribute__ ((packed));
@@ -1320,6 +1321,7 @@ enum v4l2_ctrl_type {
1320 V4L2_CTRL_COMPOUND_TYPES = 0x0100, 1321 V4L2_CTRL_COMPOUND_TYPES = 0x0100,
1321 V4L2_CTRL_TYPE_U8 = 0x0100, 1322 V4L2_CTRL_TYPE_U8 = 0x0100,
1322 V4L2_CTRL_TYPE_U16 = 0x0101, 1323 V4L2_CTRL_TYPE_U16 = 0x0101,
1324 V4L2_CTRL_TYPE_U32 = 0x0102,
1323}; 1325};
1324 1326
1325/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ 1327/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */