aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2014-01-05 09:06:05 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-17 10:57:19 -0400
commit265c7f8a72e972a707246a2bb2c492524aa95ea4 (patch)
tree0b6bfc8dd17ff6aba78ca08f178cf13ee0c4fa62
parent998e7659150760c0f4871ee20de2ef2276e3f80a (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.c40
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)