aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-14 03:54:13 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:21:35 -0400
commit1bfea3e49d2edd8ea102d04be25ae62d6fc016c0 (patch)
treedf60449ad894454c5bb3b621829479e1658f35c6 /drivers/media/video/gspca
parentcbc1c94cc573d8e355447191ba88ede99d12594f (diff)
[media] gspca-cpia1: convert to the control framework
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r--drivers/media/video/gspca/cpia1.c485
1 files changed, 127 insertions, 358 deletions
diff --git a/drivers/media/video/gspca/cpia1.c b/drivers/media/video/gspca/cpia1.c
index 8f33bbd091a..57cad7b9431 100644
--- a/drivers/media/video/gspca/cpia1.c
+++ b/drivers/media/video/gspca/cpia1.c
@@ -225,6 +225,15 @@ MODULE_LICENSE("GPL");
225#define FIRMWARE_VERSION(x, y) (sd->params.version.firmwareVersion == (x) && \ 225#define FIRMWARE_VERSION(x, y) (sd->params.version.firmwareVersion == (x) && \
226 sd->params.version.firmwareRevision == (y)) 226 sd->params.version.firmwareRevision == (y))
227 227
228#define CPIA1_CID_COMP_TARGET (V4L2_CTRL_CLASS_USER + 0x1000)
229#define BRIGHTNESS_DEF 50
230#define CONTRAST_DEF 48
231#define SATURATION_DEF 50
232#define FREQ_DEF V4L2_CID_POWER_LINE_FREQUENCY_50HZ
233#define ILLUMINATORS_1_DEF 0
234#define ILLUMINATORS_2_DEF 0
235#define COMP_TARGET_DEF CPIA_COMPRESSION_TARGET_QUALITY
236
228/* Developer's Guide Table 5 p 3-34 237/* Developer's Guide Table 5 p 3-34
229 * indexed by [mains][sensorFps.baserate][sensorFps.divisor]*/ 238 * indexed by [mains][sensorFps.baserate][sensorFps.divisor]*/
230static u8 flicker_jumps[2][2][4] = 239static u8 flicker_jumps[2][2][4] =
@@ -360,135 +369,9 @@ struct sd {
360 atomic_t fps; 369 atomic_t fps;
361 int exposure_count; 370 int exposure_count;
362 u8 exposure_status; 371 u8 exposure_status;
372 struct v4l2_ctrl *freq;
363 u8 mainsFreq; /* 0 = 50hz, 1 = 60hz */ 373 u8 mainsFreq; /* 0 = 50hz, 1 = 60hz */
364 u8 first_frame; 374 u8 first_frame;
365 u8 freq;
366};
367
368/* V4L2 controls supported by the driver */
369static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
370static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
371static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
372static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
373static int sd_setsaturation(struct gspca_dev *gspca_dev, __s32 val);
374static int sd_getsaturation(struct gspca_dev *gspca_dev, __s32 *val);
375static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val);
376static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val);
377static int sd_setcomptarget(struct gspca_dev *gspca_dev, __s32 val);
378static int sd_getcomptarget(struct gspca_dev *gspca_dev, __s32 *val);
379static int sd_setilluminator1(struct gspca_dev *gspca_dev, __s32 val);
380static int sd_getilluminator1(struct gspca_dev *gspca_dev, __s32 *val);
381static int sd_setilluminator2(struct gspca_dev *gspca_dev, __s32 val);
382static int sd_getilluminator2(struct gspca_dev *gspca_dev, __s32 *val);
383
384static const struct ctrl sd_ctrls[] = {
385 {
386#define BRIGHTNESS_IDX 0
387 {
388 .id = V4L2_CID_BRIGHTNESS,
389 .type = V4L2_CTRL_TYPE_INTEGER,
390 .name = "Brightness",
391 .minimum = 0,
392 .maximum = 100,
393 .step = 1,
394#define BRIGHTNESS_DEF 50
395 .default_value = BRIGHTNESS_DEF,
396 .flags = 0,
397 },
398 .set = sd_setbrightness,
399 .get = sd_getbrightness,
400 },
401#define CONTRAST_IDX 1
402 {
403 {
404 .id = V4L2_CID_CONTRAST,
405 .type = V4L2_CTRL_TYPE_INTEGER,
406 .name = "Contrast",
407 .minimum = 0,
408 .maximum = 96,
409 .step = 8,
410#define CONTRAST_DEF 48
411 .default_value = CONTRAST_DEF,
412 },
413 .set = sd_setcontrast,
414 .get = sd_getcontrast,
415 },
416#define SATURATION_IDX 2
417 {
418 {
419 .id = V4L2_CID_SATURATION,
420 .type = V4L2_CTRL_TYPE_INTEGER,
421 .name = "Saturation",
422 .minimum = 0,
423 .maximum = 100,
424 .step = 1,
425#define SATURATION_DEF 50
426 .default_value = SATURATION_DEF,
427 },
428 .set = sd_setsaturation,
429 .get = sd_getsaturation,
430 },
431#define POWER_LINE_FREQUENCY_IDX 3
432 {
433 {
434 .id = V4L2_CID_POWER_LINE_FREQUENCY,
435 .type = V4L2_CTRL_TYPE_MENU,
436 .name = "Light frequency filter",
437 .minimum = 0,
438 .maximum = 2, /* 0: 0, 1: 50Hz, 2:60Hz */
439 .step = 1,
440#define FREQ_DEF 1
441 .default_value = FREQ_DEF,
442 },
443 .set = sd_setfreq,
444 .get = sd_getfreq,
445 },
446#define ILLUMINATORS_1_IDX 4
447 {
448 {
449 .id = V4L2_CID_ILLUMINATORS_1,
450 .type = V4L2_CTRL_TYPE_BOOLEAN,
451 .name = "Illuminator 1",
452 .minimum = 0,
453 .maximum = 1,
454 .step = 1,
455#define ILLUMINATORS_1_DEF 0
456 .default_value = ILLUMINATORS_1_DEF,
457 },
458 .set = sd_setilluminator1,
459 .get = sd_getilluminator1,
460 },
461#define ILLUMINATORS_2_IDX 5
462 {
463 {
464 .id = V4L2_CID_ILLUMINATORS_2,
465 .type = V4L2_CTRL_TYPE_BOOLEAN,
466 .name = "Illuminator 2",
467 .minimum = 0,
468 .maximum = 1,
469 .step = 1,
470#define ILLUMINATORS_2_DEF 0
471 .default_value = ILLUMINATORS_2_DEF,
472 },
473 .set = sd_setilluminator2,
474 .get = sd_getilluminator2,
475 },
476#define COMP_TARGET_IDX 6
477 {
478 {
479#define V4L2_CID_COMP_TARGET V4L2_CID_PRIVATE_BASE
480 .id = V4L2_CID_COMP_TARGET,
481 .type = V4L2_CTRL_TYPE_MENU,
482 .name = "Compression Target",
483 .minimum = 0,
484 .maximum = 1,
485 .step = 1,
486#define COMP_TARGET_DEF CPIA_COMPRESSION_TARGET_QUALITY
487 .default_value = COMP_TARGET_DEF,
488 },
489 .set = sd_setcomptarget,
490 .get = sd_getcomptarget,
491 },
492}; 375};
493 376
494static const struct v4l2_pix_format mode[] = { 377static const struct v4l2_pix_format mode[] = {
@@ -770,15 +653,6 @@ static void reset_camera_params(struct gspca_dev *gspca_dev)
770 params->apcor.gain2 = 0x16; 653 params->apcor.gain2 = 0x16;
771 params->apcor.gain4 = 0x24; 654 params->apcor.gain4 = 0x24;
772 params->apcor.gain8 = 0x34; 655 params->apcor.gain8 = 0x34;
773 params->flickerControl.flickerMode = 0;
774 params->flickerControl.disabled = 1;
775
776 params->flickerControl.coarseJump =
777 flicker_jumps[sd->mainsFreq]
778 [params->sensorFps.baserate]
779 [params->sensorFps.divisor];
780 params->flickerControl.allowableOverExposure =
781 find_over_exposure(params->colourParams.brightness);
782 params->vlOffset.gain1 = 20; 656 params->vlOffset.gain1 = 20;
783 params->vlOffset.gain2 = 24; 657 params->vlOffset.gain2 = 24;
784 params->vlOffset.gain4 = 26; 658 params->vlOffset.gain4 = 26;
@@ -798,6 +672,15 @@ static void reset_camera_params(struct gspca_dev *gspca_dev)
798 params->sensorFps.divisor = 1; 672 params->sensorFps.divisor = 1;
799 params->sensorFps.baserate = 1; 673 params->sensorFps.baserate = 1;
800 674
675 params->flickerControl.flickerMode = 0;
676 params->flickerControl.disabled = 1;
677 params->flickerControl.coarseJump =
678 flicker_jumps[sd->mainsFreq]
679 [params->sensorFps.baserate]
680 [params->sensorFps.divisor];
681 params->flickerControl.allowableOverExposure =
682 find_over_exposure(params->colourParams.brightness);
683
801 params->yuvThreshold.yThreshold = 6; /* From windows driver */ 684 params->yuvThreshold.yThreshold = 6; /* From windows driver */
802 params->yuvThreshold.uvThreshold = 6; /* From windows driver */ 685 params->yuvThreshold.uvThreshold = 6; /* From windows driver */
803 686
@@ -1110,9 +993,6 @@ static int command_setlights(struct gspca_dev *gspca_dev)
1110 struct sd *sd = (struct sd *) gspca_dev; 993 struct sd *sd = (struct sd *) gspca_dev;
1111 int ret, p1, p2; 994 int ret, p1, p2;
1112 995
1113 if (!sd->params.qx3.qx3_detected)
1114 return 0;
1115
1116 p1 = (sd->params.qx3.bottomlight == 0) << 1; 996 p1 = (sd->params.qx3.bottomlight == 0) << 1;
1117 p2 = (sd->params.qx3.toplight == 0) << 3; 997 p2 = (sd->params.qx3.toplight == 0) << 3;
1118 998
@@ -1551,8 +1431,10 @@ static void restart_flicker(struct gspca_dev *gspca_dev)
1551static int sd_config(struct gspca_dev *gspca_dev, 1431static int sd_config(struct gspca_dev *gspca_dev,
1552 const struct usb_device_id *id) 1432 const struct usb_device_id *id)
1553{ 1433{
1434 struct sd *sd = (struct sd *) gspca_dev;
1554 struct cam *cam; 1435 struct cam *cam;
1555 1436
1437 sd->mainsFreq = FREQ_DEF == V4L2_CID_POWER_LINE_FREQUENCY_60HZ;
1556 reset_camera_params(gspca_dev); 1438 reset_camera_params(gspca_dev);
1557 1439
1558 PDEBUG(D_PROBE, "cpia CPiA camera detected (vid/pid 0x%04X:0x%04X)", 1440 PDEBUG(D_PROBE, "cpia CPiA camera detected (vid/pid 0x%04X:0x%04X)",
@@ -1562,8 +1444,25 @@ static int sd_config(struct gspca_dev *gspca_dev,
1562 cam->cam_mode = mode; 1444 cam->cam_mode = mode;
1563 cam->nmodes = ARRAY_SIZE(mode); 1445 cam->nmodes = ARRAY_SIZE(mode);
1564 1446
1565 sd_setfreq(gspca_dev, FREQ_DEF); 1447 goto_low_power(gspca_dev);
1448 /* Check the firmware version. */
1449 sd->params.version.firmwareVersion = 0;
1450 get_version_information(gspca_dev);
1451 if (sd->params.version.firmwareVersion != 1) {
1452 PDEBUG(D_ERR, "only firmware version 1 is supported (got: %d)",
1453 sd->params.version.firmwareVersion);
1454 return -ENODEV;
1455 }
1566 1456
1457 /* A bug in firmware 1-02 limits gainMode to 2 */
1458 if (sd->params.version.firmwareRevision <= 2 &&
1459 sd->params.exposure.gainMode > 2) {
1460 sd->params.exposure.gainMode = 2;
1461 }
1462
1463 /* set QX3 detected flag */
1464 sd->params.qx3.qx3_detected = (sd->params.pnpID.vendor == 0x0813 &&
1465 sd->params.pnpID.product == 0x0001);
1567 return 0; 1466 return 0;
1568} 1467}
1569 1468
@@ -1602,21 +1501,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
1602 /* Check the firmware version. */ 1501 /* Check the firmware version. */
1603 sd->params.version.firmwareVersion = 0; 1502 sd->params.version.firmwareVersion = 0;
1604 get_version_information(gspca_dev); 1503 get_version_information(gspca_dev);
1605 if (sd->params.version.firmwareVersion != 1) {
1606 PDEBUG(D_ERR, "only firmware version 1 is supported (got: %d)",
1607 sd->params.version.firmwareVersion);
1608 return -ENODEV;
1609 }
1610
1611 /* A bug in firmware 1-02 limits gainMode to 2 */
1612 if (sd->params.version.firmwareRevision <= 2 &&
1613 sd->params.exposure.gainMode > 2) {
1614 sd->params.exposure.gainMode = 2;
1615 }
1616
1617 /* set QX3 detected flag */
1618 sd->params.qx3.qx3_detected = (sd->params.pnpID.vendor == 0x0813 &&
1619 sd->params.pnpID.product == 0x0001);
1620 1504
1621 /* The fatal error checking should be done after 1505 /* The fatal error checking should be done after
1622 * the camera powers up (developer's guide p 3-38) */ 1506 * the camera powers up (developer's guide p 3-38) */
@@ -1785,9 +1669,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
1785 or disable the illuminator controls, if this isn't a QX3 */ 1669 or disable the illuminator controls, if this isn't a QX3 */
1786 if (sd->params.qx3.qx3_detected) 1670 if (sd->params.qx3.qx3_detected)
1787 command_setlights(gspca_dev); 1671 command_setlights(gspca_dev);
1788 else
1789 gspca_dev->ctrl_dis |=
1790 ((1 << ILLUMINATORS_1_IDX) | (1 << ILLUMINATORS_2_IDX));
1791 1672
1792 sd_stopN(gspca_dev); 1673 sd_stopN(gspca_dev);
1793 1674
@@ -1871,235 +1752,123 @@ static void sd_dq_callback(struct gspca_dev *gspca_dev)
1871 do_command(gspca_dev, CPIA_COMMAND_ReadMCPorts, 0, 0, 0, 0); 1752 do_command(gspca_dev, CPIA_COMMAND_ReadMCPorts, 0, 0, 0, 0);
1872} 1753}
1873 1754
1874static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) 1755static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
1875{
1876 struct sd *sd = (struct sd *) gspca_dev;
1877 int ret;
1878
1879 sd->params.colourParams.brightness = val;
1880 sd->params.flickerControl.allowableOverExposure =
1881 find_over_exposure(sd->params.colourParams.brightness);
1882 if (gspca_dev->streaming) {
1883 ret = command_setcolourparams(gspca_dev);
1884 if (ret)
1885 return ret;
1886 return command_setflickerctrl(gspca_dev);
1887 }
1888 return 0;
1889}
1890
1891static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
1892{ 1756{
1893 struct sd *sd = (struct sd *) gspca_dev; 1757 struct gspca_dev *gspca_dev =
1894 1758 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
1895 *val = sd->params.colourParams.brightness; 1759 struct sd *sd = (struct sd *)gspca_dev;
1896 return 0;
1897}
1898 1760
1899static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val) 1761 gspca_dev->usb_err = 0;
1900{
1901 struct sd *sd = (struct sd *) gspca_dev;
1902 1762
1903 sd->params.colourParams.contrast = val; 1763 if (!gspca_dev->streaming && ctrl->id != V4L2_CID_POWER_LINE_FREQUENCY)
1904 if (gspca_dev->streaming) 1764 return 0;
1905 return command_setcolourparams(gspca_dev);
1906
1907 return 0;
1908}
1909
1910static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
1911{
1912 struct sd *sd = (struct sd *) gspca_dev;
1913
1914 *val = sd->params.colourParams.contrast;
1915 return 0;
1916}
1917
1918static int sd_setsaturation(struct gspca_dev *gspca_dev, __s32 val)
1919{
1920 struct sd *sd = (struct sd *) gspca_dev;
1921
1922 sd->params.colourParams.saturation = val;
1923 if (gspca_dev->streaming)
1924 return command_setcolourparams(gspca_dev);
1925
1926 return 0;
1927}
1928
1929static int sd_getsaturation(struct gspca_dev *gspca_dev, __s32 *val)
1930{
1931 struct sd *sd = (struct sd *) gspca_dev;
1932
1933 *val = sd->params.colourParams.saturation;
1934 return 0;
1935}
1936
1937static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val)
1938{
1939 struct sd *sd = (struct sd *) gspca_dev;
1940 int on;
1941 1765
1942 switch (val) { 1766 switch (ctrl->id) {
1943 case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */ 1767 case V4L2_CID_BRIGHTNESS:
1944 on = 0; 1768 sd->params.colourParams.brightness = ctrl->val;
1769 sd->params.flickerControl.allowableOverExposure =
1770 find_over_exposure(sd->params.colourParams.brightness);
1771 gspca_dev->usb_err = command_setcolourparams(gspca_dev);
1772 if (!gspca_dev->usb_err)
1773 gspca_dev->usb_err = command_setflickerctrl(gspca_dev);
1945 break; 1774 break;
1946 case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */ 1775 case V4L2_CID_CONTRAST:
1947 on = 1; 1776 sd->params.colourParams.contrast = ctrl->val;
1948 sd->mainsFreq = 0; 1777 gspca_dev->usb_err = command_setcolourparams(gspca_dev);
1949 break; 1778 break;
1950 case 2: /* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */ 1779 case V4L2_CID_SATURATION:
1951 on = 1; 1780 sd->params.colourParams.saturation = ctrl->val;
1952 sd->mainsFreq = 1; 1781 gspca_dev->usb_err = command_setcolourparams(gspca_dev);
1953 break; 1782 break;
1954 default: 1783 case V4L2_CID_POWER_LINE_FREQUENCY:
1955 return -EINVAL; 1784 sd->mainsFreq = ctrl->val == V4L2_CID_POWER_LINE_FREQUENCY_60HZ;
1956 } 1785 sd->params.flickerControl.coarseJump =
1957 1786 flicker_jumps[sd->mainsFreq]
1958 sd->freq = val; 1787 [sd->params.sensorFps.baserate]
1959 sd->params.flickerControl.coarseJump = 1788 [sd->params.sensorFps.divisor];
1960 flicker_jumps[sd->mainsFreq] 1789
1961 [sd->params.sensorFps.baserate] 1790 gspca_dev->usb_err = set_flicker(gspca_dev,
1962 [sd->params.sensorFps.divisor]; 1791 ctrl->val != V4L2_CID_POWER_LINE_FREQUENCY_DISABLED,
1963 1792 gspca_dev->streaming);
1964 return set_flicker(gspca_dev, on, gspca_dev->streaming);
1965}
1966
1967static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val)
1968{
1969 struct sd *sd = (struct sd *) gspca_dev;
1970
1971 *val = sd->freq;
1972 return 0;
1973}
1974
1975static int sd_setcomptarget(struct gspca_dev *gspca_dev, __s32 val)
1976{
1977 struct sd *sd = (struct sd *) gspca_dev;
1978
1979 sd->params.compressionTarget.frTargeting = val;
1980 if (gspca_dev->streaming)
1981 return command_setcompressiontarget(gspca_dev);
1982
1983 return 0;
1984}
1985
1986static int sd_getcomptarget(struct gspca_dev *gspca_dev, __s32 *val)
1987{
1988 struct sd *sd = (struct sd *) gspca_dev;
1989
1990 *val = sd->params.compressionTarget.frTargeting;
1991 return 0;
1992}
1993
1994static int sd_setilluminator(struct gspca_dev *gspca_dev, __s32 val, int n)
1995{
1996 struct sd *sd = (struct sd *) gspca_dev;
1997 int ret;
1998
1999 if (!sd->params.qx3.qx3_detected)
2000 return -EINVAL;
2001
2002 switch (n) {
2003 case 1:
2004 sd->params.qx3.bottomlight = val ? 1 : 0;
2005 break; 1793 break;
2006 case 2: 1794 case V4L2_CID_ILLUMINATORS_1:
2007 sd->params.qx3.toplight = val ? 1 : 0; 1795 sd->params.qx3.bottomlight = ctrl->val;
1796 gspca_dev->usb_err = command_setlights(gspca_dev);
2008 break; 1797 break;
2009 default: 1798 case V4L2_CID_ILLUMINATORS_2:
2010 return -EINVAL; 1799 sd->params.qx3.toplight = ctrl->val;
2011 } 1800 gspca_dev->usb_err = command_setlights(gspca_dev);
2012
2013 ret = command_setlights(gspca_dev);
2014 if (ret && ret != -EINVAL)
2015 ret = -EBUSY;
2016
2017 return ret;
2018}
2019
2020static int sd_setilluminator1(struct gspca_dev *gspca_dev, __s32 val)
2021{
2022 return sd_setilluminator(gspca_dev, val, 1);
2023}
2024
2025static int sd_setilluminator2(struct gspca_dev *gspca_dev, __s32 val)
2026{
2027 return sd_setilluminator(gspca_dev, val, 2);
2028}
2029
2030static int sd_getilluminator(struct gspca_dev *gspca_dev, __s32 *val, int n)
2031{
2032 struct sd *sd = (struct sd *) gspca_dev;
2033
2034 if (!sd->params.qx3.qx3_detected)
2035 return -EINVAL;
2036
2037 switch (n) {
2038 case 1:
2039 *val = sd->params.qx3.bottomlight;
2040 break; 1801 break;
2041 case 2: 1802 case CPIA1_CID_COMP_TARGET:
2042 *val = sd->params.qx3.toplight; 1803 sd->params.compressionTarget.frTargeting = ctrl->val;
1804 gspca_dev->usb_err = command_setcompressiontarget(gspca_dev);
2043 break; 1805 break;
2044 default:
2045 return -EINVAL;
2046 } 1806 }
2047 return 0; 1807 return gspca_dev->usb_err;
2048} 1808}
2049 1809
2050static int sd_getilluminator1(struct gspca_dev *gspca_dev, __s32 *val) 1810static const struct v4l2_ctrl_ops sd_ctrl_ops = {
2051{ 1811 .s_ctrl = sd_s_ctrl,
2052 return sd_getilluminator(gspca_dev, val, 1); 1812};
2053}
2054 1813
2055static int sd_getilluminator2(struct gspca_dev *gspca_dev, __s32 *val) 1814static int sd_init_controls(struct gspca_dev *gspca_dev)
2056{ 1815{
2057 return sd_getilluminator(gspca_dev, val, 2); 1816 struct sd *sd = (struct sd *)gspca_dev;
2058} 1817 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1818 static const char * const comp_target_menu[] = {
1819 "Quality",
1820 "Framerate",
1821 NULL
1822 };
1823 static const struct v4l2_ctrl_config comp_target = {
1824 .ops = &sd_ctrl_ops,
1825 .id = CPIA1_CID_COMP_TARGET,
1826 .type = V4L2_CTRL_TYPE_MENU,
1827 .name = "Compression Target",
1828 .qmenu = comp_target_menu,
1829 .max = 1,
1830 .def = COMP_TARGET_DEF,
1831 };
1832
1833 gspca_dev->vdev.ctrl_handler = hdl;
1834 v4l2_ctrl_handler_init(hdl, 7);
1835 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1836 V4L2_CID_BRIGHTNESS, 0, 100, 1, BRIGHTNESS_DEF);
1837 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1838 V4L2_CID_CONTRAST, 0, 96, 8, CONTRAST_DEF);
1839 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1840 V4L2_CID_SATURATION, 0, 100, 1, SATURATION_DEF);
1841 sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
1842 V4L2_CID_POWER_LINE_FREQUENCY,
1843 V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
1844 FREQ_DEF);
1845 if (sd->params.qx3.qx3_detected) {
1846 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1847 V4L2_CID_ILLUMINATORS_1, 0, 1, 1,
1848 ILLUMINATORS_1_DEF);
1849 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1850 V4L2_CID_ILLUMINATORS_2, 0, 1, 1,
1851 ILLUMINATORS_2_DEF);
1852 }
1853 v4l2_ctrl_new_custom(hdl, &comp_target, NULL);
2059 1854
2060static int sd_querymenu(struct gspca_dev *gspca_dev, 1855 if (hdl->error) {
2061 struct v4l2_querymenu *menu) 1856 pr_err("Could not initialize controls\n");
2062{ 1857 return hdl->error;
2063 switch (menu->id) {
2064 case V4L2_CID_POWER_LINE_FREQUENCY:
2065 switch (menu->index) {
2066 case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */
2067 strcpy((char *) menu->name, "NoFliker");
2068 return 0;
2069 case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
2070 strcpy((char *) menu->name, "50 Hz");
2071 return 0;
2072 case 2: /* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
2073 strcpy((char *) menu->name, "60 Hz");
2074 return 0;
2075 }
2076 break;
2077 case V4L2_CID_COMP_TARGET:
2078 switch (menu->index) {
2079 case CPIA_COMPRESSION_TARGET_QUALITY:
2080 strcpy((char *) menu->name, "Quality");
2081 return 0;
2082 case CPIA_COMPRESSION_TARGET_FRAMERATE:
2083 strcpy((char *) menu->name, "Framerate");
2084 return 0;
2085 }
2086 break;
2087 } 1858 }
2088 return -EINVAL; 1859 return 0;
2089} 1860}
2090 1861
2091/* sub-driver description */ 1862/* sub-driver description */
2092static const struct sd_desc sd_desc = { 1863static const struct sd_desc sd_desc = {
2093 .name = MODULE_NAME, 1864 .name = MODULE_NAME,
2094 .ctrls = sd_ctrls,
2095 .nctrls = ARRAY_SIZE(sd_ctrls),
2096 .config = sd_config, 1865 .config = sd_config,
2097 .init = sd_init, 1866 .init = sd_init,
1867 .init_controls = sd_init_controls,
2098 .start = sd_start, 1868 .start = sd_start,
2099 .stopN = sd_stopN, 1869 .stopN = sd_stopN,
2100 .dq_callback = sd_dq_callback, 1870 .dq_callback = sd_dq_callback,
2101 .pkt_scan = sd_pkt_scan, 1871 .pkt_scan = sd_pkt_scan,
2102 .querymenu = sd_querymenu,
2103#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) 1872#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2104 .other_input = 1, 1873 .other_input = 1,
2105#endif 1874#endif