aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-16 06:38:45 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:27:25 -0400
commit705881e3a8ceb722fe1a1ff339fb6797850d3b30 (patch)
tree6bb25b9f21df6da673085ec664466688d1b2197a /drivers
parent9bf0c43eee72f677aecd892d0b97a3070e27cd51 (diff)
[media] spca501: 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')
-rw-r--r--drivers/media/video/gspca/spca501.c241
1 files changed, 60 insertions, 181 deletions
diff --git a/drivers/media/video/gspca/spca501.c b/drivers/media/video/gspca/spca501.c
index 9c16821addd4..838204d44a15 100644
--- a/drivers/media/video/gspca/spca501.c
+++ b/drivers/media/video/gspca/spca501.c
@@ -61,79 +61,6 @@ static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val);
61static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val); 61static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val);
62static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val); 62static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val);
63 63
64static const struct ctrl sd_ctrls[] = {
65#define MY_BRIGHTNESS 0
66 {
67 {
68 .id = V4L2_CID_BRIGHTNESS,
69 .type = V4L2_CTRL_TYPE_INTEGER,
70 .name = "Brightness",
71 .minimum = 0,
72 .maximum = 127,
73 .step = 1,
74 .default_value = 0,
75 },
76 .set = sd_setbrightness,
77 .get = sd_getbrightness,
78 },
79#define MY_CONTRAST 1
80 {
81 {
82 .id = V4L2_CID_CONTRAST,
83 .type = V4L2_CTRL_TYPE_INTEGER,
84 .name = "Contrast",
85 .minimum = 0,
86 .maximum = 64725,
87 .step = 1,
88 .default_value = 64725,
89 },
90 .set = sd_setcontrast,
91 .get = sd_getcontrast,
92 },
93#define MY_COLOR 2
94 {
95 {
96 .id = V4L2_CID_SATURATION,
97 .type = V4L2_CTRL_TYPE_INTEGER,
98 .name = "Color",
99 .minimum = 0,
100 .maximum = 63,
101 .step = 1,
102 .default_value = 20,
103 },
104 .set = sd_setcolors,
105 .get = sd_getcolors,
106 },
107#define MY_BLUE_BALANCE 3
108 {
109 {
110 .id = V4L2_CID_BLUE_BALANCE,
111 .type = V4L2_CTRL_TYPE_INTEGER,
112 .name = "Blue Balance",
113 .minimum = 0,
114 .maximum = 127,
115 .step = 1,
116 .default_value = 0,
117 },
118 .set = sd_setblue_balance,
119 .get = sd_getblue_balance,
120 },
121#define MY_RED_BALANCE 4
122 {
123 {
124 .id = V4L2_CID_RED_BALANCE,
125 .type = V4L2_CTRL_TYPE_INTEGER,
126 .name = "Red Balance",
127 .minimum = 0,
128 .maximum = 127,
129 .step = 1,
130 .default_value = 0,
131 },
132 .set = sd_setred_balance,
133 .get = sd_getred_balance,
134 },
135};
136
137static const struct v4l2_pix_format vga_mode[] = { 64static const struct v4l2_pix_format vga_mode[] = {
138 {160, 120, V4L2_PIX_FMT_SPCA501, V4L2_FIELD_NONE, 65 {160, 120, V4L2_PIX_FMT_SPCA501, V4L2_FIELD_NONE,
139 .bytesperline = 160, 66 .bytesperline = 160,
@@ -1878,42 +1805,32 @@ static int write_vector(struct gspca_dev *gspca_dev,
1878 return 0; 1805 return 0;
1879} 1806}
1880 1807
1881static void setbrightness(struct gspca_dev *gspca_dev) 1808static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
1882{ 1809{
1883 struct sd *sd = (struct sd *) gspca_dev; 1810 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x12, val);
1884
1885 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x12, sd->brightness);
1886} 1811}
1887 1812
1888static void setcontrast(struct gspca_dev *gspca_dev) 1813static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
1889{ 1814{
1890 struct sd *sd = (struct sd *) gspca_dev;
1891
1892 reg_write(gspca_dev->dev, 0x00, 0x00, 1815 reg_write(gspca_dev->dev, 0x00, 0x00,
1893 (sd->contrast >> 8) & 0xff); 1816 (val >> 8) & 0xff);
1894 reg_write(gspca_dev->dev, 0x00, 0x01, 1817 reg_write(gspca_dev->dev, 0x00, 0x01,
1895 sd->contrast & 0xff); 1818 val & 0xff);
1896} 1819}
1897 1820
1898static void setcolors(struct gspca_dev *gspca_dev) 1821static void setcolors(struct gspca_dev *gspca_dev, s32 val)
1899{ 1822{
1900 struct sd *sd = (struct sd *) gspca_dev; 1823 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x0c, val);
1901
1902 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x0c, sd->colors);
1903} 1824}
1904 1825
1905static void setblue_balance(struct gspca_dev *gspca_dev) 1826static void setblue_balance(struct gspca_dev *gspca_dev, s32 val)
1906{ 1827{
1907 struct sd *sd = (struct sd *) gspca_dev; 1828 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x11, val);
1908
1909 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x11, sd->blue_balance);
1910} 1829}
1911 1830
1912static void setred_balance(struct gspca_dev *gspca_dev) 1831static void setred_balance(struct gspca_dev *gspca_dev, s32 val)
1913{ 1832{
1914 struct sd *sd = (struct sd *) gspca_dev; 1833 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x13, val);
1915
1916 reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x13, sd->red_balance);
1917} 1834}
1918 1835
1919/* this function is called at probe time */ 1836/* this function is called at probe time */
@@ -1927,9 +1844,6 @@ static int sd_config(struct gspca_dev *gspca_dev,
1927 cam->cam_mode = vga_mode; 1844 cam->cam_mode = vga_mode;
1928 cam->nmodes = ARRAY_SIZE(vga_mode); 1845 cam->nmodes = ARRAY_SIZE(vga_mode);
1929 sd->subtype = id->driver_info; 1846 sd->subtype = id->driver_info;
1930 sd->brightness = sd_ctrls[MY_BRIGHTNESS].qctrl.default_value;
1931 sd->contrast = sd_ctrls[MY_CONTRAST].qctrl.default_value;
1932 sd->colors = sd_ctrls[MY_COLOR].qctrl.default_value;
1933 1847
1934 return 0; 1848 return 0;
1935} 1849}
@@ -2012,9 +1926,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
2012 * brightness / contrast / color set otherwise it assumes what seems 1926 * brightness / contrast / color set otherwise it assumes what seems
2013 * max contrast. Note that strange enough setting any of these is 1927 * max contrast. Note that strange enough setting any of these is
2014 * enough to fix the max contrast problem, to be sure we set all 3 */ 1928 * enough to fix the max contrast problem, to be sure we set all 3 */
2015 setbrightness(gspca_dev); 1929 v4l2_ctrl_handler_setup(&gspca_dev->ctrl_handler);
2016 setcontrast(gspca_dev);
2017 setcolors(gspca_dev);
2018 return 0; 1930 return 0;
2019} 1931}
2020 1932
@@ -2053,103 +1965,70 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
2053 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 1965 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
2054} 1966}
2055 1967
2056static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) 1968static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
2057{ 1969{
2058 struct sd *sd = (struct sd *) gspca_dev; 1970 struct gspca_dev *gspca_dev =
1971 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
2059 1972
2060 sd->brightness = val; 1973 gspca_dev->usb_err = 0;
2061 if (gspca_dev->streaming)
2062 setbrightness(gspca_dev);
2063 return 0;
2064}
2065
2066static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
2067{
2068 struct sd *sd = (struct sd *) gspca_dev;
2069 1974
2070 *val = sd->brightness; 1975 if (!gspca_dev->streaming)
2071 return 0; 1976 return 0;
2072}
2073
2074static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
2075{
2076 struct sd *sd = (struct sd *) gspca_dev;
2077
2078 sd->contrast = val;
2079 if (gspca_dev->streaming)
2080 setcontrast(gspca_dev);
2081 return 0;
2082}
2083
2084static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
2085{
2086 struct sd *sd = (struct sd *) gspca_dev;
2087
2088 *val = sd->contrast;
2089 return 0;
2090}
2091
2092static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
2093{
2094 struct sd *sd = (struct sd *) gspca_dev;
2095 1977
2096 sd->colors = val; 1978 switch (ctrl->id) {
2097 if (gspca_dev->streaming) 1979 case V4L2_CID_BRIGHTNESS:
2098 setcolors(gspca_dev); 1980 setbrightness(gspca_dev, ctrl->val);
2099 return 0; 1981 break;
2100} 1982 case V4L2_CID_CONTRAST:
2101 1983 setcontrast(gspca_dev, ctrl->val);
2102static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val) 1984 break;
2103{ 1985 case V4L2_CID_SATURATION:
2104 struct sd *sd = (struct sd *) gspca_dev; 1986 setcolors(gspca_dev, ctrl->val);
2105 1987 break;
2106 *val = sd->colors; 1988 case V4L2_CID_BLUE_BALANCE:
2107 return 0; 1989 setblue_balance(gspca_dev, ctrl->val);
2108} 1990 break;
2109 1991 case V4L2_CID_RED_BALANCE:
2110static int sd_setblue_balance(struct gspca_dev *gspca_dev, __s32 val) 1992 setred_balance(gspca_dev, ctrl->val);
2111{ 1993 break;
2112 struct sd *sd = (struct sd *) gspca_dev; 1994 }
2113 1995 return gspca_dev->usb_err;
2114 sd->blue_balance = val;
2115 if (gspca_dev->streaming)
2116 setblue_balance(gspca_dev);
2117 return 0;
2118}
2119
2120static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val)
2121{
2122 struct sd *sd = (struct sd *) gspca_dev;
2123
2124 *val = sd->blue_balance;
2125 return 0;
2126} 1996}
2127 1997
2128static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val) 1998static const struct v4l2_ctrl_ops sd_ctrl_ops = {
2129{ 1999 .s_ctrl = sd_s_ctrl,
2130 struct sd *sd = (struct sd *) gspca_dev; 2000};
2131
2132 sd->red_balance = val;
2133 if (gspca_dev->streaming)
2134 setred_balance(gspca_dev);
2135 return 0;
2136}
2137 2001
2138static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val) 2002static int sd_init_controls(struct gspca_dev *gspca_dev)
2139{ 2003{
2140 struct sd *sd = (struct sd *) gspca_dev; 2004 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
2141 2005
2142 *val = sd->red_balance; 2006 gspca_dev->vdev.ctrl_handler = hdl;
2007 v4l2_ctrl_handler_init(hdl, 5);
2008 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2009 V4L2_CID_BRIGHTNESS, 0, 127, 1, 0);
2010 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2011 V4L2_CID_CONTRAST, 0, 64725, 1, 64725);
2012 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2013 V4L2_CID_SATURATION, 0, 63, 1, 20);
2014 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2015 V4L2_CID_BLUE_BALANCE, 0, 127, 1, 0);
2016 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2017 V4L2_CID_RED_BALANCE, 0, 127, 1, 0);
2018
2019 if (hdl->error) {
2020 pr_err("Could not initialize controls\n");
2021 return hdl->error;
2022 }
2143 return 0; 2023 return 0;
2144} 2024}
2145 2025
2146/* sub-driver description */ 2026/* sub-driver description */
2147static const struct sd_desc sd_desc = { 2027static const struct sd_desc sd_desc = {
2148 .name = MODULE_NAME, 2028 .name = MODULE_NAME,
2149 .ctrls = sd_ctrls,
2150 .nctrls = ARRAY_SIZE(sd_ctrls),
2151 .config = sd_config, 2029 .config = sd_config,
2152 .init = sd_init, 2030 .init = sd_init,
2031 .init_controls = sd_init_controls,
2153 .start = sd_start, 2032 .start = sd_start,
2154 .stopN = sd_stopN, 2033 .stopN = sd_stopN,
2155 .stop0 = sd_stop0, 2034 .stop0 = sd_stop0,