diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-05-16 06:38:45 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:27:25 -0400 |
commit | 705881e3a8ceb722fe1a1ff339fb6797850d3b30 (patch) | |
tree | 6bb25b9f21df6da673085ec664466688d1b2197a /drivers | |
parent | 9bf0c43eee72f677aecd892d0b97a3070e27cd51 (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.c | 241 |
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); | |||
61 | static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val); | 61 | static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val); |
62 | static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val); | 62 | static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val); |
63 | 63 | ||
64 | static 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 | |||
137 | static const struct v4l2_pix_format vga_mode[] = { | 64 | static 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 | ||
1881 | static void setbrightness(struct gspca_dev *gspca_dev) | 1808 | static 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 | ||
1888 | static void setcontrast(struct gspca_dev *gspca_dev) | 1813 | static 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 | ||
1898 | static void setcolors(struct gspca_dev *gspca_dev) | 1821 | static 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 | ||
1905 | static void setblue_balance(struct gspca_dev *gspca_dev) | 1826 | static 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 | ||
1912 | static void setred_balance(struct gspca_dev *gspca_dev) | 1831 | static 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 | ||
2056 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 1968 | static 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 | |||
2066 | static 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 | |||
2074 | static 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 | |||
2084 | static 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 | |||
2092 | static 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); | |
2102 | static 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: | |
2110 | static 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 | |||
2120 | static 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 | ||
2128 | static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val) | 1998 | static 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 | ||
2138 | static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val) | 2002 | static 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 */ |
2147 | static const struct sd_desc sd_desc = { | 2027 | static 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, |