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

[media] meye: convert to the control framework

Convert the meye driver to the control framework. Some private controls
have been replaced with standardized controls (SHARPNESS and JPEGQUAL).
The AGC control looks like it can be replaced by the AUTOGAIN control, but
it isn't a boolean so I do not know how to interpret it.
The FRAMERATE control looks like it can be replaced by S_PARM, but again,
without knowing how to interpret it I decided to leave it alone.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
ed986d1f cd13823f

+98 -193
+88 -188
drivers/media/pci/meye/meye.c
··· 35 35 #include <media/v4l2-common.h> 36 36 #include <media/v4l2-device.h> 37 37 #include <media/v4l2-ioctl.h> 38 + #include <media/v4l2-fh.h> 39 + #include <media/v4l2-event.h> 38 40 #include <asm/uaccess.h> 39 41 #include <asm/io.h> 40 42 #include <linux/delay.h> ··· 867 865 meye.grab_buffer[i].state = MEYE_BUF_UNUSED; 868 866 kfifo_reset(&meye.grabq); 869 867 kfifo_reset(&meye.doneq); 870 - return 0; 868 + return v4l2_fh_open(file); 871 869 } 872 870 873 871 static int meye_release(struct file *file) ··· 875 873 mchip_hic_stop(); 876 874 mchip_dma_free(); 877 875 clear_bit(0, &meye.in_use); 878 - return 0; 876 + return v4l2_fh_release(file); 879 877 } 880 878 881 879 static int meyeioc_g_params(struct meye_params *p) ··· 1034 1032 cap->version = (MEYE_DRIVER_MAJORVERSION << 8) + 1035 1033 MEYE_DRIVER_MINORVERSION; 1036 1034 1037 - cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | 1035 + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | 1038 1036 V4L2_CAP_STREAMING; 1037 + cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; 1039 1038 1040 1039 return 0; 1041 1040 } ··· 1066 1063 return 0; 1067 1064 } 1068 1065 1069 - static int vidioc_queryctrl(struct file *file, void *fh, 1070 - struct v4l2_queryctrl *c) 1071 - { 1072 - switch (c->id) { 1073 - 1074 - case V4L2_CID_BRIGHTNESS: 1075 - c->type = V4L2_CTRL_TYPE_INTEGER; 1076 - strcpy(c->name, "Brightness"); 1077 - c->minimum = 0; 1078 - c->maximum = 63; 1079 - c->step = 1; 1080 - c->default_value = 32; 1081 - c->flags = 0; 1082 - break; 1083 - case V4L2_CID_HUE: 1084 - c->type = V4L2_CTRL_TYPE_INTEGER; 1085 - strcpy(c->name, "Hue"); 1086 - c->minimum = 0; 1087 - c->maximum = 63; 1088 - c->step = 1; 1089 - c->default_value = 32; 1090 - c->flags = 0; 1091 - break; 1092 - case V4L2_CID_CONTRAST: 1093 - c->type = V4L2_CTRL_TYPE_INTEGER; 1094 - strcpy(c->name, "Contrast"); 1095 - c->minimum = 0; 1096 - c->maximum = 63; 1097 - c->step = 1; 1098 - c->default_value = 32; 1099 - c->flags = 0; 1100 - break; 1101 - case V4L2_CID_SATURATION: 1102 - c->type = V4L2_CTRL_TYPE_INTEGER; 1103 - strcpy(c->name, "Saturation"); 1104 - c->minimum = 0; 1105 - c->maximum = 63; 1106 - c->step = 1; 1107 - c->default_value = 32; 1108 - c->flags = 0; 1109 - break; 1110 - case V4L2_CID_AGC: 1111 - c->type = V4L2_CTRL_TYPE_INTEGER; 1112 - strcpy(c->name, "Agc"); 1113 - c->minimum = 0; 1114 - c->maximum = 63; 1115 - c->step = 1; 1116 - c->default_value = 48; 1117 - c->flags = 0; 1118 - break; 1119 - case V4L2_CID_MEYE_SHARPNESS: 1120 - case V4L2_CID_SHARPNESS: 1121 - c->type = V4L2_CTRL_TYPE_INTEGER; 1122 - strcpy(c->name, "Sharpness"); 1123 - c->minimum = 0; 1124 - c->maximum = 63; 1125 - c->step = 1; 1126 - c->default_value = 32; 1127 - 1128 - /* Continue to report legacy private SHARPNESS ctrl but 1129 - * say it is disabled in preference to ctrl in the spec 1130 - */ 1131 - c->flags = (c->id == V4L2_CID_SHARPNESS) ? 0 : 1132 - V4L2_CTRL_FLAG_DISABLED; 1133 - break; 1134 - case V4L2_CID_PICTURE: 1135 - c->type = V4L2_CTRL_TYPE_INTEGER; 1136 - strcpy(c->name, "Picture"); 1137 - c->minimum = 0; 1138 - c->maximum = 63; 1139 - c->step = 1; 1140 - c->default_value = 0; 1141 - c->flags = 0; 1142 - break; 1143 - case V4L2_CID_JPEGQUAL: 1144 - c->type = V4L2_CTRL_TYPE_INTEGER; 1145 - strcpy(c->name, "JPEG quality"); 1146 - c->minimum = 0; 1147 - c->maximum = 10; 1148 - c->step = 1; 1149 - c->default_value = 8; 1150 - c->flags = 0; 1151 - break; 1152 - case V4L2_CID_FRAMERATE: 1153 - c->type = V4L2_CTRL_TYPE_INTEGER; 1154 - strcpy(c->name, "Framerate"); 1155 - c->minimum = 0; 1156 - c->maximum = 31; 1157 - c->step = 1; 1158 - c->default_value = 0; 1159 - c->flags = 0; 1160 - break; 1161 - default: 1162 - return -EINVAL; 1163 - } 1164 - 1165 - return 0; 1166 - } 1167 - 1168 - static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *c) 1066 + static int meye_s_ctrl(struct v4l2_ctrl *ctrl) 1169 1067 { 1170 1068 mutex_lock(&meye.lock); 1171 - switch (c->id) { 1069 + switch (ctrl->id) { 1172 1070 case V4L2_CID_BRIGHTNESS: 1173 1071 sony_pic_camera_command( 1174 - SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->value); 1175 - meye.brightness = c->value << 10; 1072 + SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val); 1073 + meye.brightness = ctrl->val << 10; 1176 1074 break; 1177 1075 case V4L2_CID_HUE: 1178 1076 sony_pic_camera_command( 1179 - SONY_PIC_COMMAND_SETCAMERAHUE, c->value); 1180 - meye.hue = c->value << 10; 1077 + SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val); 1078 + meye.hue = ctrl->val << 10; 1181 1079 break; 1182 1080 case V4L2_CID_CONTRAST: 1183 1081 sony_pic_camera_command( 1184 - SONY_PIC_COMMAND_SETCAMERACONTRAST, c->value); 1185 - meye.contrast = c->value << 10; 1082 + SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val); 1083 + meye.contrast = ctrl->val << 10; 1186 1084 break; 1187 1085 case V4L2_CID_SATURATION: 1188 1086 sony_pic_camera_command( 1189 - SONY_PIC_COMMAND_SETCAMERACOLOR, c->value); 1190 - meye.colour = c->value << 10; 1087 + SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val); 1088 + meye.colour = ctrl->val << 10; 1191 1089 break; 1192 - case V4L2_CID_AGC: 1090 + case V4L2_CID_MEYE_AGC: 1193 1091 sony_pic_camera_command( 1194 - SONY_PIC_COMMAND_SETCAMERAAGC, c->value); 1195 - meye.params.agc = c->value; 1092 + SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val); 1093 + meye.params.agc = ctrl->val; 1196 1094 break; 1197 1095 case V4L2_CID_SHARPNESS: 1198 - case V4L2_CID_MEYE_SHARPNESS: 1199 1096 sony_pic_camera_command( 1200 - SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->value); 1201 - meye.params.sharpness = c->value; 1097 + SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val); 1098 + meye.params.sharpness = ctrl->val; 1202 1099 break; 1203 - case V4L2_CID_PICTURE: 1100 + case V4L2_CID_MEYE_PICTURE: 1204 1101 sony_pic_camera_command( 1205 - SONY_PIC_COMMAND_SETCAMERAPICTURE, c->value); 1206 - meye.params.picture = c->value; 1102 + SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val); 1103 + meye.params.picture = ctrl->val; 1207 1104 break; 1208 - case V4L2_CID_JPEGQUAL: 1209 - meye.params.quality = c->value; 1105 + case V4L2_CID_JPEG_COMPRESSION_QUALITY: 1106 + meye.params.quality = ctrl->val; 1210 1107 break; 1211 - case V4L2_CID_FRAMERATE: 1212 - meye.params.framerate = c->value; 1213 - break; 1214 - default: 1215 - mutex_unlock(&meye.lock); 1216 - return -EINVAL; 1217 - } 1218 - mutex_unlock(&meye.lock); 1219 - 1220 - return 0; 1221 - } 1222 - 1223 - static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *c) 1224 - { 1225 - mutex_lock(&meye.lock); 1226 - switch (c->id) { 1227 - case V4L2_CID_BRIGHTNESS: 1228 - c->value = meye.brightness >> 10; 1229 - break; 1230 - case V4L2_CID_HUE: 1231 - c->value = meye.hue >> 10; 1232 - break; 1233 - case V4L2_CID_CONTRAST: 1234 - c->value = meye.contrast >> 10; 1235 - break; 1236 - case V4L2_CID_SATURATION: 1237 - c->value = meye.colour >> 10; 1238 - break; 1239 - case V4L2_CID_AGC: 1240 - c->value = meye.params.agc; 1241 - break; 1242 - case V4L2_CID_SHARPNESS: 1243 - case V4L2_CID_MEYE_SHARPNESS: 1244 - c->value = meye.params.sharpness; 1245 - break; 1246 - case V4L2_CID_PICTURE: 1247 - c->value = meye.params.picture; 1248 - break; 1249 - case V4L2_CID_JPEGQUAL: 1250 - c->value = meye.params.quality; 1251 - break; 1252 - case V4L2_CID_FRAMERATE: 1253 - c->value = meye.params.framerate; 1108 + case V4L2_CID_MEYE_FRAMERATE: 1109 + meye.params.framerate = ctrl->val; 1254 1110 break; 1255 1111 default: 1256 1112 mutex_unlock(&meye.lock); ··· 1439 1577 1440 1578 static unsigned int meye_poll(struct file *file, poll_table *wait) 1441 1579 { 1442 - unsigned int res = 0; 1580 + unsigned int res = v4l2_ctrl_poll(file, wait); 1443 1581 1444 1582 mutex_lock(&meye.lock); 1445 1583 poll_wait(file, &meye.proc_list, wait); 1446 1584 if (kfifo_len(&meye.doneq)) 1447 - res = POLLIN | POLLRDNORM; 1585 + res |= POLLIN | POLLRDNORM; 1448 1586 mutex_unlock(&meye.lock); 1449 1587 return res; 1450 1588 } ··· 1531 1669 .vidioc_enum_input = vidioc_enum_input, 1532 1670 .vidioc_g_input = vidioc_g_input, 1533 1671 .vidioc_s_input = vidioc_s_input, 1534 - .vidioc_queryctrl = vidioc_queryctrl, 1535 - .vidioc_s_ctrl = vidioc_s_ctrl, 1536 - .vidioc_g_ctrl = vidioc_g_ctrl, 1537 1672 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, 1538 1673 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, 1539 1674 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, ··· 1541 1682 .vidioc_dqbuf = vidioc_dqbuf, 1542 1683 .vidioc_streamon = vidioc_streamon, 1543 1684 .vidioc_streamoff = vidioc_streamoff, 1685 + .vidioc_log_status = v4l2_ctrl_log_status, 1686 + .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, 1687 + .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 1544 1688 .vidioc_default = vidioc_default, 1545 1689 }; 1546 1690 ··· 1552 1690 .fops = &meye_fops, 1553 1691 .ioctl_ops = &meye_ioctl_ops, 1554 1692 .release = video_device_release, 1693 + }; 1694 + 1695 + static const struct v4l2_ctrl_ops meye_ctrl_ops = { 1696 + .s_ctrl = meye_s_ctrl, 1555 1697 }; 1556 1698 1557 1699 #ifdef CONFIG_PM ··· 1596 1730 1597 1731 static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) 1598 1732 { 1733 + static const struct v4l2_ctrl_config ctrl_agc = { 1734 + .id = V4L2_CID_MEYE_AGC, 1735 + .type = V4L2_CTRL_TYPE_INTEGER, 1736 + .ops = &meye_ctrl_ops, 1737 + .name = "AGC", 1738 + .max = 63, 1739 + .step = 1, 1740 + .def = 48, 1741 + .flags = V4L2_CTRL_FLAG_SLIDER, 1742 + }; 1743 + static const struct v4l2_ctrl_config ctrl_picture = { 1744 + .id = V4L2_CID_MEYE_PICTURE, 1745 + .type = V4L2_CTRL_TYPE_INTEGER, 1746 + .ops = &meye_ctrl_ops, 1747 + .name = "Picture", 1748 + .max = 63, 1749 + .step = 1, 1750 + }; 1751 + static const struct v4l2_ctrl_config ctrl_framerate = { 1752 + .id = V4L2_CID_MEYE_FRAMERATE, 1753 + .type = V4L2_CTRL_TYPE_INTEGER, 1754 + .ops = &meye_ctrl_ops, 1755 + .name = "Framerate", 1756 + .max = 31, 1757 + .step = 1, 1758 + }; 1599 1759 struct v4l2_device *v4l2_dev = &meye.v4l2_dev; 1600 1760 int ret = -EBUSY; 1601 1761 unsigned long mchip_adr; ··· 1725 1833 1726 1834 mutex_init(&meye.lock); 1727 1835 init_waitqueue_head(&meye.proc_list); 1728 - meye.brightness = 32 << 10; 1729 - meye.hue = 32 << 10; 1730 - meye.colour = 32 << 10; 1731 - meye.contrast = 32 << 10; 1732 - meye.params.subsample = 0; 1733 - meye.params.quality = 8; 1734 - meye.params.sharpness = 32; 1735 - meye.params.agc = 48; 1736 - meye.params.picture = 0; 1737 - meye.params.framerate = 0; 1738 1836 1739 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, 32); 1740 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE, 32); 1741 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR, 32); 1742 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST, 32); 1743 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS, 32); 1744 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE, 0); 1745 - sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC, 48); 1837 + v4l2_ctrl_handler_init(&meye.hdl, 3); 1838 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1839 + V4L2_CID_BRIGHTNESS, 0, 63, 1, 32); 1840 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1841 + V4L2_CID_HUE, 0, 63, 1, 32); 1842 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1843 + V4L2_CID_CONTRAST, 0, 63, 1, 32); 1844 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1845 + V4L2_CID_SATURATION, 0, 63, 1, 32); 1846 + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL); 1847 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1848 + V4L2_CID_SHARPNESS, 0, 63, 1, 32); 1849 + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL); 1850 + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, 1851 + V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8); 1852 + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL); 1853 + if (meye.hdl.error) { 1854 + v4l2_err(v4l2_dev, "couldn't register controls\n"); 1855 + goto outvideoreg; 1856 + } 1857 + 1858 + v4l2_ctrl_handler_setup(&meye.hdl); 1859 + meye.vdev->ctrl_handler = &meye.hdl; 1860 + set_bit(V4L2_FL_USE_FH_PRIO, &meye.vdev->flags); 1746 1861 1747 1862 if (video_register_device(meye.vdev, VFL_TYPE_GRABBER, 1748 1863 video_nr) < 0) { ··· 1765 1866 return 0; 1766 1867 1767 1868 outvideoreg: 1869 + v4l2_ctrl_handler_free(&meye.hdl); 1768 1870 free_irq(meye.mchip_irq, meye_irq); 1769 1871 outreqirq: 1770 1872 iounmap(meye.mchip_mmregs);
+2
drivers/media/pci/meye/meye.h
··· 39 39 #include <linux/types.h> 40 40 #include <linux/pci.h> 41 41 #include <linux/kfifo.h> 42 + #include <media/v4l2-ctrls.h> 42 43 43 44 /****************************************************************************/ 44 45 /* Motion JPEG chip registers */ ··· 291 290 /* Motion Eye device structure */ 292 291 struct meye { 293 292 struct v4l2_device v4l2_dev; /* Main v4l2_device struct */ 293 + struct v4l2_ctrl_handler hdl; 294 294 struct pci_dev *mchip_dev; /* pci device */ 295 295 u8 mchip_irq; /* irq */ 296 296 u8 mchip_mode; /* actual mchip mode: HIC_MODE... */
+3 -5
include/uapi/linux/meye.h
··· 57 57 #define MEYEIOC_STILLJCAPT _IOR ('v', BASE_VIDIOC_PRIVATE+5, int) 58 58 59 59 /* V4L2 private controls */ 60 - #define V4L2_CID_AGC V4L2_CID_PRIVATE_BASE 61 - #define V4L2_CID_MEYE_SHARPNESS (V4L2_CID_PRIVATE_BASE + 1) 62 - #define V4L2_CID_PICTURE (V4L2_CID_PRIVATE_BASE + 2) 63 - #define V4L2_CID_JPEGQUAL (V4L2_CID_PRIVATE_BASE + 3) 64 - #define V4L2_CID_FRAMERATE (V4L2_CID_PRIVATE_BASE + 4) 60 + #define V4L2_CID_MEYE_AGC (V4L2_CID_USER_MEYE_BASE + 0) 61 + #define V4L2_CID_MEYE_PICTURE (V4L2_CID_USER_MEYE_BASE + 1) 62 + #define V4L2_CID_MEYE_FRAMERATE (V4L2_CID_USER_MEYE_BASE + 2) 65 63 66 64 #endif
+5
include/uapi/linux/v4l2-controls.h
··· 140 140 /* last CID + 1 */ 141 141 #define V4L2_CID_LASTP1 (V4L2_CID_BASE+43) 142 142 143 + /* USER-class private control IDs */ 144 + 145 + /* The base for the meye driver controls. See linux/meye.h for the list 146 + * of controls. We reserve 16 controls for this driver. */ 147 + #define V4L2_CID_USER_MEYE_BASE (V4L2_CID_USER_BASE + 0x1000) 143 148 144 149 /* MPEG-class control IDs */ 145 150