History

[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.

Hans Verkuil committed 13 years ago

Commit ed986d11 parent cd138234 files · +99 −194Browse files

Unified · Split

4 files
  1. drivers/media/pci/meye/meye.c +89 −189
  2. drivers/media/pci/meye/meye.h +2 −0
  3. include/uapi/linux/meye.h +3 −5
  4. include/uapi/linux/v4l2-controls.h +5 −0
drivers/media/pci/meye/meye.c+89−189
@@ -35,6 +35,8 @@ · 34 unmodified lines
3535 #include <media/v4l2-common.h>
3636 #include <media/v4l2-device.h>
3737 #include <media/v4l2-ioctl.h>
38+#include <media/v4l2-fh.h>
39+#include <media/v4l2-event.h>
3840 #include <asm/uaccess.h>
3941 #include <asm/io.h>
4042 #include <linux/delay.h>
@@ -865,7 +867,7 @@ static int meye_open(struct file *file) · 824 unmodified lines
865867 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
866868 kfifo_reset(&meye.grabq);
867869 kfifo_reset(&meye.doneq);
868− return 0;
870+ return v4l2_fh_open(file);
869871 }
870872
871873 static int meye_release(struct file *file)
@@ -873,7 +875,7 @@ static int meye_release(struct file *file) · 1 unmodified line
873875 mchip_hic_stop();
874876 mchip_dma_free();
875877 clear_bit(0, &meye.in_use);
876− return 0;
878+ return v4l2_fh_release(file);
877879 }
878880
879881 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
10321034 cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
10331035 MEYE_DRIVER_MINORVERSION;
10341036
1035− cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1037+ cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
10361038 V4L2_CAP_STREAMING;
1039+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
10371040
10381041 return 0;
10391042 }
@@ -1063,191 +1066,50 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int i) · 23 unmodified lines
10631066 return 0;
10641067 }
10651068
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)
11661070 {
11671071 mutex_lock(&meye.lock);
1168− switch (c->id) {
1072+ switch (ctrl->id) {
11691073 case V4L2_CID_BRIGHTNESS:
11701074 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;
11731077 break;
11741078 case V4L2_CID_HUE:
11751079 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;
11781082 break;
11791083 case V4L2_CID_CONTRAST:
11801084 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;
11831087 break;
11841088 case V4L2_CID_SATURATION:
11851089 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;
11881092 break;
1189− case V4L2_CID_AGC:
1093+ case V4L2_CID_MEYE_AGC:
11901094 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;
11931097 break;
11941098 case V4L2_CID_SHARPNESS:
1195− case V4L2_CID_MEYE_SHARPNESS:
11961099 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;
11991102 break;
1200− case V4L2_CID_PICTURE:
1103+ case V4L2_CID_MEYE_PICTURE:
12011104 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;
12041107 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;
12071110 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;
12511113 break;
12521114 default:
12531115 mutex_unlock(&meye.lock);
@@ -1577,12 +1439,12 @@ static long vidioc_default(struct file *file, void *fh, bool valid_prio, · 323 unmodified lines
15771439
15781440 static unsigned int meye_poll(struct file *file, poll_table *wait)
15791441 {
1580− unsigned int res = 0;
1442+ unsigned int res = v4l2_ctrl_poll(file, wait);
15811443
15821444 mutex_lock(&meye.lock);
15831445 poll_wait(file, &meye.proc_list, wait);
15841446 if (kfifo_len(&meye.doneq))
1585− res = POLLIN | POLLRDNORM;
1447+ res |= POLLIN | POLLRDNORM;
15861448 mutex_unlock(&meye.lock);
15871449 return res;
15881450 }
@@ -1669,9 +1531,6 @@ static const struct v4l2_ioctl_ops meye_ioctl_ops = { · 80 unmodified lines
16691531 .vidioc_enum_input = vidioc_enum_input,
16701532 .vidioc_g_input = vidioc_g_input,
16711533 .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,
16751534 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
16761535 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
16771536 .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
16821541 .vidioc_dqbuf = vidioc_dqbuf,
16831542 .vidioc_streamon = vidioc_streamon,
16841543 .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,
16851547 .vidioc_default = vidioc_default,
16861548 };
16871549
@@ -1692,6 +1554,10 @@ static struct video_device meye_template = { · 4 unmodified lines
16921554 .release = video_device_release,
16931555 };
16941556
1557+static const struct v4l2_ctrl_ops meye_ctrl_ops = {
1558+ .s_ctrl = meye_s_ctrl,
1559+};
1560+
16951561 #ifdef CONFIG_PM
16961562 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
16971563 {
@@ -1730,6 +1596,32 @@ static int meye_resume(struct pci_dev *pdev) · 32 unmodified lines
17301596
17311597 static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
17321598 {
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+ };
17331625 struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
17341626 int ret = -EBUSY;
17351627 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
18331725
18341726 mutex_init(&meye.lock);
18351727 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);
18541753
18551754 if (video_register_device(meye.vdev, VFL_TYPE_GRABBER,
18561755 video_nr) < 0) {
@@ -1866,6 +1765,7 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) · 9 unmodified lines
18661765 return 0;
18671766
18681767 outvideoreg:
1768+ v4l2_ctrl_handler_free(&meye.hdl);
18691769 free_irq(meye.mchip_irq, meye_irq);
18701770 outreqirq:
18711771 iounmap(meye.mchip_mmregs);
drivers/media/pci/meye/meye.h+2−0
@@ -39,6 +39,7 @@ · 38 unmodified lines
3939 #include <linux/types.h>
4040 #include <linux/pci.h>
4141 #include <linux/kfifo.h>
42+#include <media/v4l2-ctrls.h>
4243
4344 /****************************************************************************/
4445 /* Motion JPEG chip registers */
@@ -290,6 +291,7 @@ struct meye_grab_buffer { · 245 unmodified lines
290291 /* Motion Eye device structure */
291292 struct meye {
292293 struct v4l2_device v4l2_dev; /* Main v4l2_device struct */
294+ struct v4l2_ctrl_handler hdl;
293295 struct pci_dev *mchip_dev; /* pci device */
294296 u8 mchip_irq; /* irq */
295297 u8 mchip_mode; /* actual mchip mode: HIC_MODE... */
include/uapi/linux/meye.h+3−5
@@ -57,10 +57,8 @@ struct meye_params { · 56 unmodified lines
5757 #define MEYEIOC_STILLJCAPT _IOR ('v', BASE_VIDIOC_PRIVATE+5, int)
5858
5959 /* 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)
6563
6664 #endif
include/uapi/linux/v4l2-controls.h+5−0
@@ -140,6 +140,11 @@ enum v4l2_colorfx { · 139 unmodified lines
140140 /* last CID + 1 */
141141 #define V4L2_CID_LASTP1 (V4L2_CID_BASE+43)
142142
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)
143148
144149 /* MPEG-class control IDs */
145150

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t