diff options
-rw-r--r-- | drivers/media/pci/meye/meye.c | 278 | ||||
-rw-r--r-- | drivers/media/pci/meye/meye.h | 2 | ||||
-rw-r--r-- | include/uapi/linux/meye.h | 8 | ||||
-rw-r--r-- | include/uapi/linux/v4l2-controls.h | 5 |
4 files changed, 99 insertions, 194 deletions
diff --git a/drivers/media/pci/meye/meye.c b/drivers/media/pci/meye/meye.c index 3b39deaa8f6b..7859c43479d7 100644 --- a/drivers/media/pci/meye/meye.c +++ b/drivers/media/pci/meye/meye.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include <media/v4l2-common.h> | 35 | #include <media/v4l2-common.h> |
36 | #include <media/v4l2-device.h> | 36 | #include <media/v4l2-device.h> |
37 | #include <media/v4l2-ioctl.h> | 37 | #include <media/v4l2-ioctl.h> |
38 | #include <media/v4l2-fh.h> | ||
39 | #include <media/v4l2-event.h> | ||
38 | #include <asm/uaccess.h> | 40 | #include <asm/uaccess.h> |
39 | #include <asm/io.h> | 41 | #include <asm/io.h> |
40 | #include <linux/delay.h> | 42 | #include <linux/delay.h> |
@@ -865,7 +867,7 @@ static int meye_open(struct file *file) | |||
865 | meye.grab_buffer[i].state = MEYE_BUF_UNUSED; | 867 | meye.grab_buffer[i].state = MEYE_BUF_UNUSED; |
866 | kfifo_reset(&meye.grabq); | 868 | kfifo_reset(&meye.grabq); |
867 | kfifo_reset(&meye.doneq); | 869 | kfifo_reset(&meye.doneq); |
868 | return 0; | 870 | return v4l2_fh_open(file); |
869 | } | 871 | } |
870 | 872 | ||
871 | static int meye_release(struct file *file) | 873 | static int meye_release(struct file *file) |
@@ -873,7 +875,7 @@ static int meye_release(struct file *file) | |||
873 | mchip_hic_stop(); | 875 | mchip_hic_stop(); |
874 | mchip_dma_free(); | 876 | mchip_dma_free(); |
875 | clear_bit(0, &meye.in_use); | 877 | clear_bit(0, &meye.in_use); |
876 | return 0; | 878 | return v4l2_fh_release(file); |
877 | } | 879 | } |
878 | 880 | ||
879 | static int meyeioc_g_params(struct meye_params *p) | 881 | static int meyeioc_g_params(struct meye_params *p) |
@@ -1032,8 +1034,9 @@ static int vidioc_querycap(struct file *file, void *fh, | |||
1032 | cap->version = (MEYE_DRIVER_MAJORVERSION << 8) + | 1034 | cap->version = (MEYE_DRIVER_MAJORVERSION << 8) + |
1033 | MEYE_DRIVER_MINORVERSION; | 1035 | MEYE_DRIVER_MINORVERSION; |
1034 | 1036 | ||
1035 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | | 1037 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | |
1036 | V4L2_CAP_STREAMING; | 1038 | V4L2_CAP_STREAMING; |
1039 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1037 | 1040 | ||
1038 | return 0; | 1041 | return 0; |
1039 | } | 1042 | } |
@@ -1063,191 +1066,50 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int i) | |||
1063 | return 0; | 1066 | return 0; |
1064 | } | 1067 | } |
1065 | 1068 | ||
1066 | static int vidioc_queryctrl(struct file *file, void *fh, | 1069 | static int meye_s_ctrl(struct v4l2_ctrl *ctrl) |
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) | ||
1166 | { | 1070 | { |
1167 | mutex_lock(&meye.lock); | 1071 | mutex_lock(&meye.lock); |
1168 | switch (c->id) { | 1072 | switch (ctrl->id) { |
1169 | case V4L2_CID_BRIGHTNESS: | 1073 | case V4L2_CID_BRIGHTNESS: |
1170 | sony_pic_camera_command( | 1074 | sony_pic_camera_command( |
1171 | SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->value); | 1075 | SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, ctrl->val); |
1172 | meye.brightness = c->value << 10; | 1076 | meye.brightness = ctrl->val << 10; |
1173 | break; | 1077 | break; |
1174 | case V4L2_CID_HUE: | 1078 | case V4L2_CID_HUE: |
1175 | sony_pic_camera_command( | 1079 | sony_pic_camera_command( |
1176 | SONY_PIC_COMMAND_SETCAMERAHUE, c->value); | 1080 | SONY_PIC_COMMAND_SETCAMERAHUE, ctrl->val); |
1177 | meye.hue = c->value << 10; | 1081 | meye.hue = ctrl->val << 10; |
1178 | break; | 1082 | break; |
1179 | case V4L2_CID_CONTRAST: | 1083 | case V4L2_CID_CONTRAST: |
1180 | sony_pic_camera_command( | 1084 | sony_pic_camera_command( |
1181 | SONY_PIC_COMMAND_SETCAMERACONTRAST, c->value); | 1085 | SONY_PIC_COMMAND_SETCAMERACONTRAST, ctrl->val); |
1182 | meye.contrast = c->value << 10; | 1086 | meye.contrast = ctrl->val << 10; |
1183 | break; | 1087 | break; |
1184 | case V4L2_CID_SATURATION: | 1088 | case V4L2_CID_SATURATION: |
1185 | sony_pic_camera_command( | 1089 | sony_pic_camera_command( |
1186 | SONY_PIC_COMMAND_SETCAMERACOLOR, c->value); | 1090 | SONY_PIC_COMMAND_SETCAMERACOLOR, ctrl->val); |
1187 | meye.colour = c->value << 10; | 1091 | meye.colour = ctrl->val << 10; |
1188 | break; | 1092 | break; |
1189 | case V4L2_CID_AGC: | 1093 | case V4L2_CID_MEYE_AGC: |
1190 | sony_pic_camera_command( | 1094 | sony_pic_camera_command( |
1191 | SONY_PIC_COMMAND_SETCAMERAAGC, c->value); | 1095 | SONY_PIC_COMMAND_SETCAMERAAGC, ctrl->val); |
1192 | meye.params.agc = c->value; | 1096 | meye.params.agc = ctrl->val; |
1193 | break; | 1097 | break; |
1194 | case V4L2_CID_SHARPNESS: | 1098 | case V4L2_CID_SHARPNESS: |
1195 | case V4L2_CID_MEYE_SHARPNESS: | ||
1196 | sony_pic_camera_command( | 1099 | sony_pic_camera_command( |
1197 | SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->value); | 1100 | SONY_PIC_COMMAND_SETCAMERASHARPNESS, ctrl->val); |
1198 | meye.params.sharpness = c->value; | 1101 | meye.params.sharpness = ctrl->val; |
1199 | break; | 1102 | break; |
1200 | case V4L2_CID_PICTURE: | 1103 | case V4L2_CID_MEYE_PICTURE: |
1201 | sony_pic_camera_command( | 1104 | sony_pic_camera_command( |
1202 | SONY_PIC_COMMAND_SETCAMERAPICTURE, c->value); | 1105 | SONY_PIC_COMMAND_SETCAMERAPICTURE, ctrl->val); |
1203 | meye.params.picture = c->value; | 1106 | meye.params.picture = ctrl->val; |
1204 | break; | 1107 | break; |
1205 | case V4L2_CID_JPEGQUAL: | 1108 | case V4L2_CID_JPEG_COMPRESSION_QUALITY: |
1206 | meye.params.quality = c->value; | 1109 | meye.params.quality = ctrl->val; |
1207 | break; | 1110 | break; |
1208 | case V4L2_CID_FRAMERATE: | 1111 | case V4L2_CID_MEYE_FRAMERATE: |
1209 | meye.params.framerate = c->value; | 1112 | meye.params.framerate = ctrl->val; |
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; | ||
1251 | break; | 1113 | break; |
1252 | default: | 1114 | default: |
1253 | mutex_unlock(&meye.lock); | 1115 | mutex_unlock(&meye.lock); |
@@ -1577,12 +1439,12 @@ static long vidioc_default(struct file *file, void *fh, bool valid_prio, | |||
1577 | 1439 | ||
1578 | static unsigned int meye_poll(struct file *file, poll_table *wait) | 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 | mutex_lock(&meye.lock); | 1444 | mutex_lock(&meye.lock); |
1583 | poll_wait(file, &meye.proc_list, wait); | 1445 | poll_wait(file, &meye.proc_list, wait); |
1584 | if (kfifo_len(&meye.doneq)) | 1446 | if (kfifo_len(&meye.doneq)) |
1585 | res = POLLIN | POLLRDNORM; | 1447 | res |= POLLIN | POLLRDNORM; |
1586 | mutex_unlock(&meye.lock); | 1448 | mutex_unlock(&meye.lock); |
1587 | return res; | 1449 | return res; |
1588 | } | 1450 | } |
@@ -1669,9 +1531,6 @@ static const struct v4l2_ioctl_ops meye_ioctl_ops = { | |||
1669 | .vidioc_enum_input = vidioc_enum_input, | 1531 | .vidioc_enum_input = vidioc_enum_input, |
1670 | .vidioc_g_input = vidioc_g_input, | 1532 | .vidioc_g_input = vidioc_g_input, |
1671 | .vidioc_s_input = vidioc_s_input, | 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 | .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, | 1534 | .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, |
1676 | .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, | 1535 | .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, |
1677 | .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, | 1536 | .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, |
@@ -1682,6 +1541,9 @@ static const struct v4l2_ioctl_ops meye_ioctl_ops = { | |||
1682 | .vidioc_dqbuf = vidioc_dqbuf, | 1541 | .vidioc_dqbuf = vidioc_dqbuf, |
1683 | .vidioc_streamon = vidioc_streamon, | 1542 | .vidioc_streamon = vidioc_streamon, |
1684 | .vidioc_streamoff = vidioc_streamoff, | 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 | .vidioc_default = vidioc_default, | 1547 | .vidioc_default = vidioc_default, |
1686 | }; | 1548 | }; |
1687 | 1549 | ||
@@ -1692,6 +1554,10 @@ static struct video_device meye_template = { | |||
1692 | .release = video_device_release, | 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 | #ifdef CONFIG_PM | 1561 | #ifdef CONFIG_PM |
1696 | static int meye_suspend(struct pci_dev *pdev, pm_message_t state) | 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) | |||
1730 | 1596 | ||
1731 | static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) | 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 | struct v4l2_device *v4l2_dev = &meye.v4l2_dev; | 1625 | struct v4l2_device *v4l2_dev = &meye.v4l2_dev; |
1734 | int ret = -EBUSY; | 1626 | int ret = -EBUSY; |
1735 | unsigned long mchip_adr; | 1627 | unsigned long mchip_adr; |
@@ -1833,24 +1725,31 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) | |||
1833 | 1725 | ||
1834 | mutex_init(&meye.lock); | 1726 | mutex_init(&meye.lock); |
1835 | init_waitqueue_head(&meye.proc_list); | 1727 | init_waitqueue_head(&meye.proc_list); |
1836 | meye.brightness = 32 << 10; | 1728 | |
1837 | meye.hue = 32 << 10; | 1729 | v4l2_ctrl_handler_init(&meye.hdl, 3); |
1838 | meye.colour = 32 << 10; | 1730 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1839 | meye.contrast = 32 << 10; | 1731 | V4L2_CID_BRIGHTNESS, 0, 63, 1, 32); |
1840 | meye.params.subsample = 0; | 1732 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1841 | meye.params.quality = 8; | 1733 | V4L2_CID_HUE, 0, 63, 1, 32); |
1842 | meye.params.sharpness = 32; | 1734 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1843 | meye.params.agc = 48; | 1735 | V4L2_CID_CONTRAST, 0, 63, 1, 32); |
1844 | meye.params.picture = 0; | 1736 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1845 | meye.params.framerate = 0; | 1737 | V4L2_CID_SATURATION, 0, 63, 1, 32); |
1846 | 1738 | v4l2_ctrl_new_custom(&meye.hdl, &ctrl_agc, NULL); | |
1847 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, 32); | 1739 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1848 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE, 32); | 1740 | V4L2_CID_SHARPNESS, 0, 63, 1, 32); |
1849 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR, 32); | 1741 | v4l2_ctrl_new_custom(&meye.hdl, &ctrl_picture, NULL); |
1850 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST, 32); | 1742 | v4l2_ctrl_new_std(&meye.hdl, &meye_ctrl_ops, |
1851 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS, 32); | 1743 | V4L2_CID_JPEG_COMPRESSION_QUALITY, 0, 10, 1, 8); |
1852 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE, 0); | 1744 | v4l2_ctrl_new_custom(&meye.hdl, &ctrl_framerate, NULL); |
1853 | sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC, 48); | 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 | if (video_register_device(meye.vdev, VFL_TYPE_GRABBER, | 1754 | if (video_register_device(meye.vdev, VFL_TYPE_GRABBER, |
1856 | video_nr) < 0) { | 1755 | video_nr) < 0) { |
@@ -1866,6 +1765,7 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) | |||
1866 | return 0; | 1765 | return 0; |
1867 | 1766 | ||
1868 | outvideoreg: | 1767 | outvideoreg: |
1768 | v4l2_ctrl_handler_free(&meye.hdl); | ||
1869 | free_irq(meye.mchip_irq, meye_irq); | 1769 | free_irq(meye.mchip_irq, meye_irq); |
1870 | outreqirq: | 1770 | outreqirq: |
1871 | iounmap(meye.mchip_mmregs); | 1771 | iounmap(meye.mchip_mmregs); |
diff --git a/drivers/media/pci/meye/meye.h b/drivers/media/pci/meye/meye.h index 4bdeb03f1644..6fed9274cfa5 100644 --- a/drivers/media/pci/meye/meye.h +++ b/drivers/media/pci/meye/meye.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/types.h> | 39 | #include <linux/types.h> |
40 | #include <linux/pci.h> | 40 | #include <linux/pci.h> |
41 | #include <linux/kfifo.h> | 41 | #include <linux/kfifo.h> |
42 | #include <media/v4l2-ctrls.h> | ||
42 | 43 | ||
43 | /****************************************************************************/ | 44 | /****************************************************************************/ |
44 | /* Motion JPEG chip registers */ | 45 | /* Motion JPEG chip registers */ |
@@ -290,6 +291,7 @@ struct meye_grab_buffer { | |||
290 | /* Motion Eye device structure */ | 291 | /* Motion Eye device structure */ |
291 | struct meye { | 292 | struct meye { |
292 | struct v4l2_device v4l2_dev; /* Main v4l2_device struct */ | 293 | struct v4l2_device v4l2_dev; /* Main v4l2_device struct */ |
294 | struct v4l2_ctrl_handler hdl; | ||
293 | struct pci_dev *mchip_dev; /* pci device */ | 295 | struct pci_dev *mchip_dev; /* pci device */ |
294 | u8 mchip_irq; /* irq */ | 296 | u8 mchip_irq; /* irq */ |
295 | u8 mchip_mode; /* actual mchip mode: HIC_MODE... */ | 297 | u8 mchip_mode; /* actual mchip mode: HIC_MODE... */ |
diff --git a/include/uapi/linux/meye.h b/include/uapi/linux/meye.h index 0dd49954f746..8ff50fe9e481 100644 --- a/include/uapi/linux/meye.h +++ b/include/uapi/linux/meye.h | |||
@@ -57,10 +57,8 @@ struct meye_params { | |||
57 | #define MEYEIOC_STILLJCAPT _IOR ('v', BASE_VIDIOC_PRIVATE+5, int) | 57 | #define MEYEIOC_STILLJCAPT _IOR ('v', BASE_VIDIOC_PRIVATE+5, int) |
58 | 58 | ||
59 | /* V4L2 private controls */ | 59 | /* V4L2 private controls */ |
60 | #define V4L2_CID_AGC V4L2_CID_PRIVATE_BASE | 60 | #define V4L2_CID_MEYE_AGC (V4L2_CID_USER_MEYE_BASE + 0) |
61 | #define V4L2_CID_MEYE_SHARPNESS (V4L2_CID_PRIVATE_BASE + 1) | 61 | #define V4L2_CID_MEYE_PICTURE (V4L2_CID_USER_MEYE_BASE + 1) |
62 | #define V4L2_CID_PICTURE (V4L2_CID_PRIVATE_BASE + 2) | 62 | #define V4L2_CID_MEYE_FRAMERATE (V4L2_CID_USER_MEYE_BASE + 2) |
63 | #define V4L2_CID_JPEGQUAL (V4L2_CID_PRIVATE_BASE + 3) | ||
64 | #define V4L2_CID_FRAMERATE (V4L2_CID_PRIVATE_BASE + 4) | ||
65 | 63 | ||
66 | #endif | 64 | #endif |
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 0bece06792d7..dcd63745e83a 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h | |||
@@ -140,6 +140,11 @@ enum v4l2_colorfx { | |||
140 | /* last CID + 1 */ | 140 | /* last CID + 1 */ |
141 | #define V4L2_CID_LASTP1 (V4L2_CID_BASE+43) | 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 | /* MPEG-class control IDs */ | 149 | /* MPEG-class control IDs */ |
145 | 150 | ||