| @@ -35,6 +35,8 @@ · 34 unmodified lines |
| 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> |
| @@ -865,7 +867,7 @@ static int meye_open(struct file *file) · 824 unmodified lines |
| 865 | 867 | meye.grab_buffer[i].state = MEYE_BUF_UNUSED; |
| 866 | 868 | kfifo_reset(&meye.grabq); |
| 867 | 869 | kfifo_reset(&meye.doneq); |
| 868 | | − return 0; |
| 870 | + return v4l2_fh_open(file); |
| 869 | 871 | } |
| 870 | 872 | |
| 871 | 873 | static int meye_release(struct file *file) |
| @@ -873,7 +875,7 @@ static int meye_release(struct file *file) · 1 unmodified line |
| 873 | 875 | mchip_hic_stop(); |
| 874 | 876 | mchip_dma_free(); |
| 875 | 877 | clear_bit(0, &meye.in_use); |
| 876 | | − return 0; |
| 878 | + return v4l2_fh_release(file); |
| 877 | 879 | } |
| 878 | 880 | |
| 879 | 881 | static int meyeioc_g_params(struct meye_params *p) |
| @@ -1032,8 +1034,9 @@ static int vidioc_querycap(struct file *file, void *fh, · 152 unmodified lines |
| 1032 | 1034 | cap->version = (MEYE_DRIVER_MAJORVERSION << 8) + |
| 1033 | 1035 | MEYE_DRIVER_MINORVERSION; |
| 1034 | 1036 | |
| 1035 | | − cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | |
| 1037 | + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | |
| 1036 | 1038 | V4L2_CAP_STREAMING; |
| 1039 | + cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
| 1037 | 1040 | |
| 1038 | 1041 | return 0; |
| 1039 | 1042 | } |
| @@ -1063,191 +1066,50 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int i) · 23 unmodified lines |
| 1063 | 1066 | return 0; |
| 1064 | 1067 | } |
| 1065 | 1068 | |
| 1066 | | −static int vidioc_queryctrl(struct file *file, void *fh, |
| 1067 | | − struct v4l2_queryctrl *c) |
| 1068 | | −{ |
| 1069 | | − switch (c->id) { |
| 1070 | | − |
| 1071 | | − case V4L2_CID_BRIGHTNESS: |
| 1072 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1073 | | − strcpy(c->name, "Brightness"); |
| 1074 | | − c->minimum = 0; |
| 1075 | | − c->maximum = 63; |
| 1076 | | − c->step = 1; |
| 1077 | | − c->default_value = 32; |
| 1078 | | − c->flags = 0; |
| 1079 | | − break; |
| 1080 | | − case V4L2_CID_HUE: |
| 1081 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1082 | | − strcpy(c->name, "Hue"); |
| 1083 | | − c->minimum = 0; |
| 1084 | | − c->maximum = 63; |
| 1085 | | − c->step = 1; |
| 1086 | | − c->default_value = 32; |
| 1087 | | − c->flags = 0; |
| 1088 | | − break; |
| 1089 | | − case V4L2_CID_CONTRAST: |
| 1090 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1091 | | − strcpy(c->name, "Contrast"); |
| 1092 | | − c->minimum = 0; |
| 1093 | | − c->maximum = 63; |
| 1094 | | − c->step = 1; |
| 1095 | | − c->default_value = 32; |
| 1096 | | − c->flags = 0; |
| 1097 | | − break; |
| 1098 | | − case V4L2_CID_SATURATION: |
| 1099 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1100 | | − strcpy(c->name, "Saturation"); |
| 1101 | | − c->minimum = 0; |
| 1102 | | − c->maximum = 63; |
| 1103 | | − c->step = 1; |
| 1104 | | − c->default_value = 32; |
| 1105 | | − c->flags = 0; |
| 1106 | | − break; |
| 1107 | | − case V4L2_CID_AGC: |
| 1108 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1109 | | − strcpy(c->name, "Agc"); |
| 1110 | | − c->minimum = 0; |
| 1111 | | − c->maximum = 63; |
| 1112 | | − c->step = 1; |
| 1113 | | − c->default_value = 48; |
| 1114 | | − c->flags = 0; |
| 1115 | | − break; |
| 1116 | | − case V4L2_CID_MEYE_SHARPNESS: |
| 1117 | | − case V4L2_CID_SHARPNESS: |
| 1118 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1119 | | − strcpy(c->name, "Sharpness"); |
| 1120 | | − c->minimum = 0; |
| 1121 | | − c->maximum = 63; |
| 1122 | | − c->step = 1; |
| 1123 | | − c->default_value = 32; |
| 1124 | | − |
| 1125 | | − /* Continue to report legacy private SHARPNESS ctrl but |
| 1126 | | − * say it is disabled in preference to ctrl in the spec |
| 1127 | | − */ |
| 1128 | | − c->flags = (c->id == V4L2_CID_SHARPNESS) ? 0 : |
| 1129 | | − V4L2_CTRL_FLAG_DISABLED; |
| 1130 | | − break; |
| 1131 | | − case V4L2_CID_PICTURE: |
| 1132 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1133 | | − strcpy(c->name, "Picture"); |
| 1134 | | − c->minimum = 0; |
| 1135 | | − c->maximum = 63; |
| 1136 | | − c->step = 1; |
| 1137 | | − c->default_value = 0; |
| 1138 | | − c->flags = 0; |
| 1139 | | − break; |
| 1140 | | − case V4L2_CID_JPEGQUAL: |
| 1141 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1142 | | − strcpy(c->name, "JPEG quality"); |
| 1143 | | − c->minimum = 0; |
| 1144 | | − c->maximum = 10; |
| 1145 | | − c->step = 1; |
| 1146 | | − c->default_value = 8; |
| 1147 | | − c->flags = 0; |
| 1148 | | − break; |
| 1149 | | − case V4L2_CID_FRAMERATE: |
| 1150 | | − c->type = V4L2_CTRL_TYPE_INTEGER; |
| 1151 | | − strcpy(c->name, "Framerate"); |
| 1152 | | − c->minimum = 0; |
| 1153 | | − c->maximum = 31; |
| 1154 | | − c->step = 1; |
| 1155 | | − c->default_value = 0; |
| 1156 | | − c->flags = 0; |
| 1157 | | − break; |
| 1158 | | − default: |
| 1159 | | − return -EINVAL; |
| 1160 | | − } |
| 1161 | | − |
| 1162 | | − return 0; |
| 1163 | | −} |
| 1164 | | − |
| 1165 | | −static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *c) |
| 1069 | +static int meye_s_ctrl(struct v4l2_ctrl *ctrl) |
| 1166 | 1070 | { |
| 1167 | 1071 | mutex_lock(&meye.lock); |
| 1168 | | − switch (c->id) { |
| 1072 | + switch (ctrl->id) { |
| 1169 | 1073 | case V4L2_CID_BRIGHTNESS: |
| 1170 | 1074 | sony_pic_camera_command( |
| 1171 | | − SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->value); |
| 1172 | | − meye.brightness = c->value << 10; |
| 1075 | + SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val); |
| 1076 | + meye.brightness = ctrl->val << 10; |
| 1173 | 1077 | break; |
| 1174 | 1078 | case V4L2_CID_HUE: |
| 1175 | 1079 | sony_pic_camera_command( |
| 1176 | | − SONY_PIC_COMMAND_SETCAMERAHUE, c->value); |
| 1177 | | − meye.hue = c->value << 10; |
| 1080 | + SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val); |
| 1081 | + meye.hue = ctrl->val << 10; |
| 1178 | 1082 | break; |
| 1179 | 1083 | case V4L2_CID_CONTRAST: |
| 1180 | 1084 | sony_pic_camera_command( |
| 1181 | | − SONY_PIC_COMMAND_SETCAMERACONTRAST, c->value); |
| 1182 | | − meye.contrast = c->value << 10; |
| 1085 | + SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val); |
| 1086 | + meye.contrast = ctrl->val << 10; |
| 1183 | 1087 | break; |
| 1184 | 1088 | case V4L2_CID_SATURATION: |
| 1185 | 1089 | sony_pic_camera_command( |
| 1186 | | − SONY_PIC_COMMAND_SETCAMERACOLOR, c->value); |
| 1187 | | − meye.colour = c->value << 10; |
| 1090 | + SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val); |
| 1091 | + meye.colour = ctrl->val << 10; |
| 1188 | 1092 | break; |
| 1189 | | − case V4L2_CID_AGC: |
| 1093 | + case V4L2_CID_MEYE_AGC: |
| 1190 | 1094 | sony_pic_camera_command( |
| 1191 | | − SONY_PIC_COMMAND_SETCAMERAAGC, c->value); |
| 1192 | | − meye.params.agc = c->value; |
| 1095 | + SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val); |
| 1096 | + meye.params.agc = ctrl->val; |
| 1193 | 1097 | break; |
| 1194 | 1098 | case V4L2_CID_SHARPNESS: |
| 1195 | | − case V4L2_CID_MEYE_SHARPNESS: |
| 1196 | 1099 | sony_pic_camera_command( |
| 1197 | | − SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->value); |
| 1198 | | − meye.params.sharpness = c->value; |
| 1100 | + SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val); |
| 1101 | + meye.params.sharpness = ctrl->val; |
| 1199 | 1102 | break; |
| 1200 | | − case V4L2_CID_PICTURE: |
| 1103 | + case V4L2_CID_MEYE_PICTURE: |
| 1201 | 1104 | sony_pic_camera_command( |
| 1202 | | − SONY_PIC_COMMAND_SETCAMERAPICTURE, c->value); |
| 1203 | | − meye.params.picture = c->value; |
| 1105 | + SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val); |
| 1106 | + meye.params.picture = ctrl->val; |
| 1204 | 1107 | break; |
| 1205 | | − case V4L2_CID_JPEGQUAL: |
| 1206 | | − meye.params.quality = c->value; |
| 1108 | + case V4L2_CID_JPEG_COMPRESSION_QUALITY: |
| 1109 | + meye.params.quality = ctrl->val; |
| 1207 | 1110 | break; |
| 1208 | | − case V4L2_CID_FRAMERATE: |
| 1209 | | − meye.params.framerate = c->value; |
| 1210 | | − break; |
| 1211 | | − default: |
| 1212 | | − mutex_unlock(&meye.lock); |
| 1213 | | − return -EINVAL; |
| 1214 | | − } |
| 1215 | | − mutex_unlock(&meye.lock); |
| 1216 | | − |
| 1217 | | − return 0; |
| 1218 | | −} |
| 1219 | | − |
| 1220 | | −static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *c) |
| 1221 | | −{ |
| 1222 | | − mutex_lock(&meye.lock); |
| 1223 | | − switch (c->id) { |
| 1224 | | − case V4L2_CID_BRIGHTNESS: |
| 1225 | | − c->value = meye.brightness >> 10; |
| 1226 | | − break; |
| 1227 | | − case V4L2_CID_HUE: |
| 1228 | | − c->value = meye.hue >> 10; |
| 1229 | | − break; |
| 1230 | | − case V4L2_CID_CONTRAST: |
| 1231 | | − c->value = meye.contrast >> 10; |
| 1232 | | − break; |
| 1233 | | − case V4L2_CID_SATURATION: |
| 1234 | | − c->value = meye.colour >> 10; |
| 1235 | | − break; |
| 1236 | | − case V4L2_CID_AGC: |
| 1237 | | − c->value = meye.params.agc; |
| 1238 | | − break; |
| 1239 | | − case V4L2_CID_SHARPNESS: |
| 1240 | | − case V4L2_CID_MEYE_SHARPNESS: |
| 1241 | | − c->value = meye.params.sharpness; |
| 1242 | | − break; |
| 1243 | | − case V4L2_CID_PICTURE: |
| 1244 | | − c->value = meye.params.picture; |
| 1245 | | − break; |
| 1246 | | − case V4L2_CID_JPEGQUAL: |
| 1247 | | − c->value = meye.params.quality; |
| 1248 | | − break; |
| 1249 | | − case V4L2_CID_FRAMERATE: |
| 1250 | | − c->value = meye.params.framerate; |
| 1111 | + case V4L2_CID_MEYE_FRAMERATE: |
| 1112 | + meye.params.framerate = ctrl->val; |
| 1251 | 1113 | break; |
| 1252 | 1114 | default: |
| 1253 | 1115 | mutex_unlock(&meye.lock); |
| @@ -1577,12 +1439,12 @@ static long vidioc_default(struct file *file, void *fh, bool valid_prio, · 323 unmodified lines |
| 1577 | 1439 | |
| 1578 | 1440 | static unsigned int meye_poll(struct file *file, poll_table *wait) |
| 1579 | 1441 | { |
| 1580 | | − unsigned int res = 0; |
| 1442 | + unsigned int res = v4l2_ctrl_poll(file, wait); |
| 1581 | 1443 | |
| 1582 | 1444 | mutex_lock(&meye.lock); |
| 1583 | 1445 | poll_wait(file, &meye.proc_list, wait); |
| 1584 | 1446 | if (kfifo_len(&meye.doneq)) |
| 1585 | | − res = POLLIN | POLLRDNORM; |
| 1447 | + res |= POLLIN | POLLRDNORM; |
| 1586 | 1448 | mutex_unlock(&meye.lock); |
| 1587 | 1449 | return res; |
| 1588 | 1450 | } |
| @@ -1669,9 +1531,6 @@ static const struct v4l2_ioctl_ops meye_ioctl_ops = { · 80 unmodified lines |
| 1669 | 1531 | .vidioc_enum_input = vidioc_enum_input, |
| 1670 | 1532 | .vidioc_g_input = vidioc_g_input, |
| 1671 | 1533 | .vidioc_s_input = vidioc_s_input, |
| 1672 | | − .vidioc_queryctrl = vidioc_queryctrl, |
| 1673 | | − .vidioc_s_ctrl = vidioc_s_ctrl, |
| 1674 | | − .vidioc_g_ctrl = vidioc_g_ctrl, |
| 1675 | 1534 | .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, |
| 1676 | 1535 | .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, |
| 1677 | 1536 | .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, |
| @@ -1682,6 +1541,9 @@ static const struct v4l2_ioctl_ops meye_ioctl_ops = { · 4 unmodified lines |
| 1682 | 1541 | .vidioc_dqbuf = vidioc_dqbuf, |
| 1683 | 1542 | .vidioc_streamon = vidioc_streamon, |
| 1684 | 1543 | .vidioc_streamoff = vidioc_streamoff, |
| 1544 | + .vidioc_log_status = v4l2_ctrl_log_status, |
| 1545 | + .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, |
| 1546 | + .vidioc_unsubscribe_event = v4l2_event_unsubscribe, |
| 1685 | 1547 | .vidioc_default = vidioc_default, |
| 1686 | 1548 | }; |
| 1687 | 1549 | |
| @@ -1692,6 +1554,10 @@ static struct video_device meye_template = { · 4 unmodified lines |
| 1692 | 1554 | .release = video_device_release, |
| 1693 | 1555 | }; |
| 1694 | 1556 | |
| 1557 | +static const struct v4l2_ctrl_ops meye_ctrl_ops = { |
| 1558 | + .s_ctrl = meye_s_ctrl, |
| 1559 | +}; |
| 1560 | + |
| 1695 | 1561 | #ifdef CONFIG_PM |
| 1696 | 1562 | static int meye_suspend(struct pci_dev *pdev, pm_message_t state) |
| 1697 | 1563 | { |
| @@ -1730,6 +1596,32 @@ static int meye_resume(struct pci_dev *pdev) · 32 unmodified lines |
| 1730 | 1596 | |
| 1731 | 1597 | static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) |
| 1732 | 1598 | { |
| 1599 | + static const struct v4l2_ctrl_config ctrl_agc = { |
| 1600 | + .id = V4L2_CID_MEYE_AGC, |
| 1601 | + .type = V4L2_CTRL_TYPE_INTEGER, |
| 1602 | + .ops = &meye_ctrl_ops, |
| 1603 | + .name = "AGC", |
| 1604 | + .max = 63, |
| 1605 | + .step = 1, |
| 1606 | + .def = 48, |
| 1607 | + .flags = V4L2_CTRL_FLAG_SLIDER, |
| 1608 | + }; |
| 1609 | + static const struct v4l2_ctrl_config ctrl_picture = { |
| 1610 | + .id = V4L2_CID_MEYE_PICTURE, |
| 1611 | + .type = V4L2_CTRL_TYPE_INTEGER, |
| 1612 | + .ops = &meye_ctrl_ops, |
| 1613 | + .name = "Picture", |
| 1614 | + .max = 63, |
| 1615 | + .step = 1, |
| 1616 | + }; |
| 1617 | + static const struct v4l2_ctrl_config ctrl_framerate = { |
| 1618 | + .id = V4L2_CID_MEYE_FRAMERATE, |
| 1619 | + .type = V4L2_CTRL_TYPE_INTEGER, |
| 1620 | + .ops = &meye_ctrl_ops, |
| 1621 | + .name = "Framerate", |
| 1622 | + .max = 31, |
| 1623 | + .step = 1, |
| 1624 | + }; |
| 1733 | 1625 | struct v4l2_device *v4l2_dev = &meye.v4l2_dev; |
| 1734 | 1626 | int ret = -EBUSY; |
| 1735 | 1627 | unsigned long mchip_adr; |
| @@ -1833,24 +1725,31 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) · 97 unmodified lines |
| 1833 | 1725 | |
| 1834 | 1726 | mutex_init(&meye.lock); |
| 1835 | 1727 | init_waitqueue_head(&meye.proc_list); |
| 1836 | | − meye.brightness = 32 << 10; |
| 1837 | | − meye.hue = 32 << 10; |
| 1838 | | − meye.colour = 32 << 10; |
| 1839 | | − meye.contrast = 32 << 10; |
| 1840 | | − meye.params.subsample = 0; |
| 1841 | | − meye.params.quality = 8; |
| 1842 | | − meye.params.sharpness = 32; |
| 1843 | | − meye.params.agc = 48; |
| 1844 | | − meye.params.picture = 0; |
| 1845 | | − meye.params.framerate = 0; |
| 1846 | | − |
| 1847 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, 32); |
| 1848 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE, 32); |
| 1849 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR, 32); |
| 1850 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST, 32); |
| 1851 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS, 32); |
| 1852 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE, 0); |
| 1853 | | − sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC, 48); |
| 1728 | + |
| 1729 | + v4l2_ctrl_handler_init(&meye.hdl, 3); |
| 1730 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1731 | + V4L2_CID_BRIGHTNESS, 0, 63, 1, 32); |
| 1732 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1733 | + V4L2_CID_HUE, 0, 63, 1, 32); |
| 1734 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1735 | + V4L2_CID_CONTRAST, 0, 63, 1, 32); |
| 1736 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1737 | + V4L2_CID_SATURATION, 0, 63, 1, 32); |
| 1738 | + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL); |
| 1739 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1740 | + V4L2_CID_SHARPNESS, 0, 63, 1, 32); |
| 1741 | + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL); |
| 1742 | + v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
| 1743 | + V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8); |
| 1744 | + v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL); |
| 1745 | + if (meye.hdl.error) { |
| 1746 | + v4l2_err(v4l2_dev, "couldn't register controls\n"); |
| 1747 | + goto outvideoreg; |
| 1748 | + } |
| 1749 | + |
| 1750 | + v4l2_ctrl_handler_setup(&meye.hdl); |
| 1751 | + meye.vdev->ctrl_handler = &meye.hdl; |
| 1752 | + set_bit(V4L2_FL_USE_FH_PRIO, &meye.vdev->flags); |
| 1854 | 1753 | |
| 1855 | 1754 | if (video_register_device(meye.vdev, VFL_TYPE_GRABBER, |
| 1856 | 1755 | video_nr) < 0) { |
| @@ -1866,6 +1765,7 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) · 9 unmodified lines |
| 1866 | 1765 | return 0; |
| 1867 | 1766 | |
| 1868 | 1767 | outvideoreg: |
| 1768 | + v4l2_ctrl_handler_free(&meye.hdl); |
| 1869 | 1769 | free_irq(meye.mchip_irq, meye_irq); |
| 1870 | 1770 | outreqirq: |
| 1871 | 1771 | iounmap(meye.mchip_mmregs); |