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

[media] via-camera: implement the control framework

And added a missing kfree to clean up the via_camera struct.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Javier Martin <javier.martin@vista-silicon.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Javier Martin and committed by
Mauro Carvalho Chehab
dbf8f4e5 593403c5

+14 -46
+14 -46
drivers/media/platform/via-camera.c
··· 18 18 #include <media/v4l2-device.h> 19 19 #include <media/v4l2-ioctl.h> 20 20 #include <media/v4l2-chip-ident.h> 21 + #include <media/v4l2-ctrls.h> 21 22 #include <media/ov7670.h> 22 23 #include <media/videobuf-dma-sg.h> 23 24 #include <linux/delay.h> ··· 64 63 65 64 struct via_camera { 66 65 struct v4l2_device v4l2_dev; 66 + struct v4l2_ctrl_handler ctrl_handler; 67 67 struct video_device vdev; 68 68 struct v4l2_subdev *sensor; 69 69 struct platform_device *platdev; ··· 820 818 } 821 819 822 820 /* 823 - * Control ops are passed through to the sensor. 824 - */ 825 - static int viacam_queryctrl(struct file *filp, void *priv, 826 - struct v4l2_queryctrl *qc) 827 - { 828 - struct via_camera *cam = priv; 829 - int ret; 830 - 831 - mutex_lock(&cam->lock); 832 - ret = sensor_call(cam, core, queryctrl, qc); 833 - mutex_unlock(&cam->lock); 834 - return ret; 835 - } 836 - 837 - 838 - static int viacam_g_ctrl(struct file *filp, void *priv, 839 - struct v4l2_control *ctrl) 840 - { 841 - struct via_camera *cam = priv; 842 - int ret; 843 - 844 - mutex_lock(&cam->lock); 845 - ret = sensor_call(cam, core, g_ctrl, ctrl); 846 - mutex_unlock(&cam->lock); 847 - return ret; 848 - } 849 - 850 - 851 - static int viacam_s_ctrl(struct file *filp, void *priv, 852 - struct v4l2_control *ctrl) 853 - { 854 - struct via_camera *cam = priv; 855 - int ret; 856 - 857 - mutex_lock(&cam->lock); 858 - ret = sensor_call(cam, core, s_ctrl, ctrl); 859 - mutex_unlock(&cam->lock); 860 - return ret; 861 - } 862 - 863 - /* 864 821 * Only one input. 865 822 */ 866 823 static int viacam_enum_input(struct file *filp, void *priv, ··· 1175 1214 1176 1215 static const struct v4l2_ioctl_ops viacam_ioctl_ops = { 1177 1216 .vidioc_g_chip_ident = viacam_g_chip_ident, 1178 - .vidioc_queryctrl = viacam_queryctrl, 1179 - .vidioc_g_ctrl = viacam_g_ctrl, 1180 - .vidioc_s_ctrl = viacam_s_ctrl, 1181 1217 .vidioc_enum_input = viacam_enum_input, 1182 1218 .vidioc_g_input = viacam_g_input, 1183 1219 .vidioc_s_input = viacam_s_input, ··· 1376 1418 ret = v4l2_device_register(&pdev->dev, &cam->v4l2_dev); 1377 1419 if (ret) { 1378 1420 dev_err(&pdev->dev, "Unable to register v4l2 device\n"); 1379 - return ret; 1421 + goto out_free; 1380 1422 } 1423 + ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10); 1424 + if (ret) 1425 + goto out_unregister; 1426 + cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler; 1381 1427 /* 1382 1428 * Convince the system that we can do DMA. 1383 1429 */ ··· 1398 1436 */ 1399 1437 ret = via_sensor_power_setup(cam); 1400 1438 if (ret) 1401 - goto out_unregister; 1439 + goto out_ctrl_hdl_free; 1402 1440 via_sensor_power_up(cam); 1403 1441 1404 1442 /* ··· 1447 1485 free_irq(viadev->pdev->irq, cam); 1448 1486 out_power_down: 1449 1487 via_sensor_power_release(cam); 1488 + out_ctrl_hdl_free: 1489 + v4l2_ctrl_handler_free(&cam->ctrl_handler); 1450 1490 out_unregister: 1451 1491 v4l2_device_unregister(&cam->v4l2_dev); 1492 + out_free: 1493 + kfree(cam); 1452 1494 return ret; 1453 1495 } 1454 1496 ··· 1465 1499 v4l2_device_unregister(&cam->v4l2_dev); 1466 1500 free_irq(viadev->pdev->irq, cam); 1467 1501 via_sensor_power_release(cam); 1502 + v4l2_ctrl_handler_free(&cam->ctrl_handler); 1503 + kfree(cam); 1468 1504 via_cam_info = NULL; 1469 1505 return 0; 1470 1506 }