Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

media: uvcvideo: Factor out query_boundaries from query_ctrl

Split the function in two parts. queryctrl_boundaries will be used in
future patches.

No functional change expected from this patch.

Reviewed-by: Yunke Cao <yunkec@google.com>
Tested-by: Yunke Cao <yunkec@google.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Link: https://lore.kernel.org/r/20250203-uvc-roi-v17-11-5900a9fed613@chromium.org
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>

authored by

Ricardo Ribalda and committed by
Hans Verkuil
cc9a7cb3 8c3d9d4d

+60 -46
+60 -46
drivers/media/usb/uvc/uvc_ctrl.c
··· 1374 1374 return ~0; 1375 1375 } 1376 1376 1377 - static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, 1378 - struct uvc_control *ctrl, 1379 - struct uvc_control_mapping *mapping, 1380 - struct v4l2_queryctrl *v4l2_ctrl) 1377 + static int __uvc_queryctrl_boundaries(struct uvc_video_chain *chain, 1378 + struct uvc_control *ctrl, 1379 + struct uvc_control_mapping *mapping, 1380 + struct v4l2_queryctrl *v4l2_ctrl) 1381 1381 { 1382 - struct uvc_control_mapping *master_map = NULL; 1383 - struct uvc_control *master_ctrl = NULL; 1384 - 1385 - memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); 1386 - v4l2_ctrl->id = mapping->id; 1387 - v4l2_ctrl->type = mapping->v4l2_type; 1388 - strscpy(v4l2_ctrl->name, uvc_map_get_name(mapping), 1389 - sizeof(v4l2_ctrl->name)); 1390 - v4l2_ctrl->flags = 0; 1391 - 1392 - if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) 1393 - v4l2_ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY; 1394 - if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) 1395 - v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; 1396 - 1397 - if (mapping->master_id) 1398 - __uvc_find_control(ctrl->entity, mapping->master_id, 1399 - &master_map, &master_ctrl, 0, 0); 1400 - if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) { 1401 - s32 val; 1402 - int ret; 1403 - 1404 - if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) 1405 - return -EIO; 1406 - 1407 - ret = __uvc_ctrl_get(chain, master_ctrl, master_map, &val); 1408 - if (ret < 0) 1409 - return ret; 1410 - 1411 - if (val != mapping->master_manual) 1412 - v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; 1413 - } 1414 - 1415 - if (v4l2_ctrl->type >= V4L2_CTRL_COMPOUND_TYPES) { 1416 - v4l2_ctrl->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; 1417 - v4l2_ctrl->default_value = 0; 1418 - v4l2_ctrl->minimum = 0; 1419 - v4l2_ctrl->maximum = 0; 1420 - v4l2_ctrl->step = 0; 1421 - return 0; 1422 - } 1423 - 1424 1382 if (!ctrl->cached) { 1425 1383 int ret = uvc_ctrl_populate_cache(chain, ctrl); 1426 1384 if (ret < 0) ··· 1422 1464 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) 1423 1465 v4l2_ctrl->minimum = uvc_mapping_get_s32(mapping, UVC_GET_MIN, 1424 1466 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); 1467 + else 1468 + v4l2_ctrl->minimum = 0; 1425 1469 1426 1470 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) 1427 1471 v4l2_ctrl->maximum = uvc_mapping_get_s32(mapping, UVC_GET_MAX, 1428 1472 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); 1473 + else 1474 + v4l2_ctrl->maximum = 0; 1429 1475 1430 1476 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) 1431 1477 v4l2_ctrl->step = uvc_mapping_get_s32(mapping, UVC_GET_RES, 1432 1478 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); 1479 + else 1480 + v4l2_ctrl->step = 0; 1433 1481 1434 1482 return 0; 1483 + } 1484 + 1485 + static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, 1486 + struct uvc_control *ctrl, 1487 + struct uvc_control_mapping *mapping, 1488 + struct v4l2_queryctrl *v4l2_ctrl) 1489 + { 1490 + struct uvc_control_mapping *master_map = NULL; 1491 + struct uvc_control *master_ctrl = NULL; 1492 + 1493 + memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); 1494 + v4l2_ctrl->id = mapping->id; 1495 + v4l2_ctrl->type = mapping->v4l2_type; 1496 + strscpy(v4l2_ctrl->name, uvc_map_get_name(mapping), 1497 + sizeof(v4l2_ctrl->name)); 1498 + v4l2_ctrl->flags = 0; 1499 + 1500 + if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) 1501 + v4l2_ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY; 1502 + if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) 1503 + v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; 1504 + 1505 + if (mapping->master_id) 1506 + __uvc_find_control(ctrl->entity, mapping->master_id, 1507 + &master_map, &master_ctrl, 0, 0); 1508 + if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) { 1509 + s32 val; 1510 + int ret; 1511 + 1512 + if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) 1513 + return -EIO; 1514 + 1515 + ret = __uvc_ctrl_get(chain, master_ctrl, master_map, &val); 1516 + if (ret < 0) 1517 + return ret; 1518 + 1519 + if (val != mapping->master_manual) 1520 + v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; 1521 + } 1522 + 1523 + if (v4l2_ctrl->type >= V4L2_CTRL_COMPOUND_TYPES) { 1524 + v4l2_ctrl->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; 1525 + v4l2_ctrl->default_value = 0; 1526 + v4l2_ctrl->minimum = 0; 1527 + v4l2_ctrl->maximum = 0; 1528 + v4l2_ctrl->step = 0; 1529 + return 0; 1530 + } 1531 + 1532 + return __uvc_queryctrl_boundaries(chain, ctrl, mapping, v4l2_ctrl); 1435 1533 } 1436 1534 1437 1535 int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,