diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2014-01-05 09:06:05 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-17 10:57:19 -0400 |
commit | 265c7f8a72e972a707246a2bb2c492524aa95ea4 (patch) | |
tree | 0b6bfc8dd17ff6aba78ca08f178cf13ee0c4fa62 | |
parent | 998e7659150760c0f4871ee20de2ef2276e3f80a (diff) |
[media] v4l2-ctrls: type_ops can handle array elements
Extend the control type operations to handle N-dimensional array elements.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ctrls.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index 6ed2d5608611..f6ac9271d292 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | |||
@@ -1169,14 +1169,16 @@ static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx, | |||
1169 | case V4L2_CTRL_TYPE_BUTTON: | 1169 | case V4L2_CTRL_TYPE_BUTTON: |
1170 | return false; | 1170 | return false; |
1171 | case V4L2_CTRL_TYPE_STRING: | 1171 | case V4L2_CTRL_TYPE_STRING: |
1172 | idx *= ctrl->elem_size; | ||
1172 | /* strings are always 0-terminated */ | 1173 | /* strings are always 0-terminated */ |
1173 | return !strcmp(ptr1.p_char, ptr2.p_char); | 1174 | return !strcmp(ptr1.p_char + idx, ptr2.p_char + idx); |
1174 | case V4L2_CTRL_TYPE_INTEGER64: | 1175 | case V4L2_CTRL_TYPE_INTEGER64: |
1175 | return *ptr1.p_s64 == *ptr2.p_s64; | 1176 | return ptr1.p_s64[idx] == ptr2.p_s64[idx]; |
1176 | default: | 1177 | default: |
1177 | if (ctrl->is_ptr) | 1178 | if (ctrl->is_int) |
1178 | return !memcmp(ptr1.p, ptr2.p, ctrl->elem_size); | 1179 | return ptr1.p_s32[idx] == ptr2.p_s32[idx]; |
1179 | return *ptr1.p_s32 == *ptr2.p_s32; | 1180 | idx *= ctrl->elem_size; |
1181 | return !memcmp(ptr1.p + idx, ptr2.p + idx, ctrl->elem_size); | ||
1180 | } | 1182 | } |
1181 | } | 1183 | } |
1182 | 1184 | ||
@@ -1185,18 +1187,19 @@ static void std_init(const struct v4l2_ctrl *ctrl, u32 idx, | |||
1185 | { | 1187 | { |
1186 | switch (ctrl->type) { | 1188 | switch (ctrl->type) { |
1187 | case V4L2_CTRL_TYPE_STRING: | 1189 | case V4L2_CTRL_TYPE_STRING: |
1188 | memset(ptr.p_char, ' ', ctrl->minimum); | 1190 | idx *= ctrl->elem_size; |
1189 | ptr.p_char[ctrl->minimum] = '\0'; | 1191 | memset(ptr.p_char + idx, ' ', ctrl->minimum); |
1192 | ptr.p_char[idx + ctrl->minimum] = '\0'; | ||
1190 | break; | 1193 | break; |
1191 | case V4L2_CTRL_TYPE_INTEGER64: | 1194 | case V4L2_CTRL_TYPE_INTEGER64: |
1192 | *ptr.p_s64 = ctrl->default_value; | 1195 | ptr.p_s64[idx] = ctrl->default_value; |
1193 | break; | 1196 | break; |
1194 | case V4L2_CTRL_TYPE_INTEGER: | 1197 | case V4L2_CTRL_TYPE_INTEGER: |
1195 | case V4L2_CTRL_TYPE_INTEGER_MENU: | 1198 | case V4L2_CTRL_TYPE_INTEGER_MENU: |
1196 | case V4L2_CTRL_TYPE_MENU: | 1199 | case V4L2_CTRL_TYPE_MENU: |
1197 | case V4L2_CTRL_TYPE_BITMASK: | 1200 | case V4L2_CTRL_TYPE_BITMASK: |
1198 | case V4L2_CTRL_TYPE_BOOLEAN: | 1201 | case V4L2_CTRL_TYPE_BOOLEAN: |
1199 | *ptr.p_s32 = ctrl->default_value; | 1202 | ptr.p_s32[idx] = ctrl->default_value; |
1200 | break; | 1203 | break; |
1201 | default: | 1204 | default: |
1202 | break; | 1205 | break; |
@@ -1264,36 +1267,37 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, | |||
1264 | 1267 | ||
1265 | switch (ctrl->type) { | 1268 | switch (ctrl->type) { |
1266 | case V4L2_CTRL_TYPE_INTEGER: | 1269 | case V4L2_CTRL_TYPE_INTEGER: |
1267 | return ROUND_TO_RANGE(*ptr.p_s32, u32, ctrl); | 1270 | return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl); |
1268 | case V4L2_CTRL_TYPE_INTEGER64: | 1271 | case V4L2_CTRL_TYPE_INTEGER64: |
1269 | return ROUND_TO_RANGE(*ptr.p_s64, u64, ctrl); | 1272 | return ROUND_TO_RANGE(ptr.p_s64[idx], u64, ctrl); |
1270 | 1273 | ||
1271 | case V4L2_CTRL_TYPE_BOOLEAN: | 1274 | case V4L2_CTRL_TYPE_BOOLEAN: |
1272 | *ptr.p_s32 = !!*ptr.p_s32; | 1275 | ptr.p_s32[idx] = !!ptr.p_s32[idx]; |
1273 | return 0; | 1276 | return 0; |
1274 | 1277 | ||
1275 | case V4L2_CTRL_TYPE_MENU: | 1278 | case V4L2_CTRL_TYPE_MENU: |
1276 | case V4L2_CTRL_TYPE_INTEGER_MENU: | 1279 | case V4L2_CTRL_TYPE_INTEGER_MENU: |
1277 | if (*ptr.p_s32 < ctrl->minimum || *ptr.p_s32 > ctrl->maximum) | 1280 | if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum) |
1278 | return -ERANGE; | 1281 | return -ERANGE; |
1279 | if (ctrl->menu_skip_mask & (1 << *ptr.p_s32)) | 1282 | if (ctrl->menu_skip_mask & (1 << ptr.p_s32[idx])) |
1280 | return -EINVAL; | 1283 | return -EINVAL; |
1281 | if (ctrl->type == V4L2_CTRL_TYPE_MENU && | 1284 | if (ctrl->type == V4L2_CTRL_TYPE_MENU && |
1282 | ctrl->qmenu[*ptr.p_s32][0] == '\0') | 1285 | ctrl->qmenu[ptr.p_s32[idx]][0] == '\0') |
1283 | return -EINVAL; | 1286 | return -EINVAL; |
1284 | return 0; | 1287 | return 0; |
1285 | 1288 | ||
1286 | case V4L2_CTRL_TYPE_BITMASK: | 1289 | case V4L2_CTRL_TYPE_BITMASK: |
1287 | *ptr.p_s32 &= ctrl->maximum; | 1290 | ptr.p_s32[idx] &= ctrl->maximum; |
1288 | return 0; | 1291 | return 0; |
1289 | 1292 | ||
1290 | case V4L2_CTRL_TYPE_BUTTON: | 1293 | case V4L2_CTRL_TYPE_BUTTON: |
1291 | case V4L2_CTRL_TYPE_CTRL_CLASS: | 1294 | case V4L2_CTRL_TYPE_CTRL_CLASS: |
1292 | *ptr.p_s32 = 0; | 1295 | ptr.p_s32[idx] = 0; |
1293 | return 0; | 1296 | return 0; |
1294 | 1297 | ||
1295 | case V4L2_CTRL_TYPE_STRING: | 1298 | case V4L2_CTRL_TYPE_STRING: |
1296 | len = strlen(ptr.p_char); | 1299 | idx *= ctrl->elem_size; |
1300 | len = strlen(ptr.p_char + idx); | ||
1297 | if (len < ctrl->minimum) | 1301 | if (len < ctrl->minimum) |
1298 | return -ERANGE; | 1302 | return -ERANGE; |
1299 | if ((len - ctrl->minimum) % ctrl->step) | 1303 | if ((len - ctrl->minimum) % ctrl->step) |