diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-05-18 04:12:09 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:34:04 -0400 |
commit | 726795c1d94f7153edd0038b61fd6dd7dd0163d1 (patch) | |
tree | a4117ed097a84cb98a7a29d4a34aaab2f04669bd /drivers/media/video/gspca | |
parent | 9bf81642e1f3096f0882dcfdb2102a9a9445869c (diff) |
[media] tv8532: 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/tv8532.c | 124 |
1 files changed, 41 insertions, 83 deletions
diff --git a/drivers/media/video/gspca/tv8532.c b/drivers/media/video/gspca/tv8532.c index c8922c5ffbf5..8baa03f7c604 100644 --- a/drivers/media/video/gspca/tv8532.c +++ b/drivers/media/video/gspca/tv8532.c | |||
@@ -30,49 +30,9 @@ MODULE_LICENSE("GPL"); | |||
30 | struct sd { | 30 | struct sd { |
31 | struct gspca_dev gspca_dev; /* !! must be the first item */ | 31 | struct gspca_dev gspca_dev; /* !! must be the first item */ |
32 | 32 | ||
33 | __u16 exposure; | ||
34 | __u16 gain; | ||
35 | |||
36 | __u8 packet; | 33 | __u8 packet; |
37 | }; | 34 | }; |
38 | 35 | ||
39 | /* V4L2 controls supported by the driver */ | ||
40 | static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val); | ||
41 | static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val); | ||
42 | static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val); | ||
43 | static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val); | ||
44 | |||
45 | static const struct ctrl sd_ctrls[] = { | ||
46 | { | ||
47 | { | ||
48 | .id = V4L2_CID_EXPOSURE, | ||
49 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
50 | .name = "Exposure", | ||
51 | .minimum = 1, | ||
52 | .maximum = 0x18f, | ||
53 | .step = 1, | ||
54 | #define EXPOSURE_DEF 0x18f | ||
55 | .default_value = EXPOSURE_DEF, | ||
56 | }, | ||
57 | .set = sd_setexposure, | ||
58 | .get = sd_getexposure, | ||
59 | }, | ||
60 | { | ||
61 | { | ||
62 | .id = V4L2_CID_GAIN, | ||
63 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
64 | .name = "Gain", | ||
65 | .minimum = 0, | ||
66 | .maximum = 0x7ff, | ||
67 | .step = 1, | ||
68 | #define GAIN_DEF 0x100 | ||
69 | .default_value = GAIN_DEF, | ||
70 | }, | ||
71 | .set = sd_setgain, | ||
72 | .get = sd_getgain, | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | static const struct v4l2_pix_format sif_mode[] = { | 36 | static const struct v4l2_pix_format sif_mode[] = { |
77 | {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, | 37 | {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, |
78 | .bytesperline = 176, | 38 | .bytesperline = 176, |
@@ -202,15 +162,12 @@ static void tv_8532WriteEEprom(struct gspca_dev *gspca_dev) | |||
202 | static int sd_config(struct gspca_dev *gspca_dev, | 162 | static int sd_config(struct gspca_dev *gspca_dev, |
203 | const struct usb_device_id *id) | 163 | const struct usb_device_id *id) |
204 | { | 164 | { |
205 | struct sd *sd = (struct sd *) gspca_dev; | ||
206 | struct cam *cam; | 165 | struct cam *cam; |
207 | 166 | ||
208 | cam = &gspca_dev->cam; | 167 | cam = &gspca_dev->cam; |
209 | cam->cam_mode = sif_mode; | 168 | cam->cam_mode = sif_mode; |
210 | cam->nmodes = ARRAY_SIZE(sif_mode); | 169 | cam->nmodes = ARRAY_SIZE(sif_mode); |
211 | 170 | ||
212 | sd->exposure = EXPOSURE_DEF; | ||
213 | sd->gain = GAIN_DEF; | ||
214 | return 0; | 171 | return 0; |
215 | } | 172 | } |
216 | 173 | ||
@@ -241,23 +198,19 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
241 | return 0; | 198 | return 0; |
242 | } | 199 | } |
243 | 200 | ||
244 | static void setexposure(struct gspca_dev *gspca_dev) | 201 | static void setexposure(struct gspca_dev *gspca_dev, s32 val) |
245 | { | 202 | { |
246 | struct sd *sd = (struct sd *) gspca_dev; | 203 | reg_w2(gspca_dev, R1C_AD_EXPOSE_TIMEL, val); |
247 | |||
248 | reg_w2(gspca_dev, R1C_AD_EXPOSE_TIMEL, sd->exposure); | ||
249 | reg_w1(gspca_dev, R00_PART_CONTROL, LATENT_CHANGE | EXPO_CHANGE); | 204 | reg_w1(gspca_dev, R00_PART_CONTROL, LATENT_CHANGE | EXPO_CHANGE); |
250 | /* 0x84 */ | 205 | /* 0x84 */ |
251 | } | 206 | } |
252 | 207 | ||
253 | static void setgain(struct gspca_dev *gspca_dev) | 208 | static void setgain(struct gspca_dev *gspca_dev, s32 val) |
254 | { | 209 | { |
255 | struct sd *sd = (struct sd *) gspca_dev; | 210 | reg_w2(gspca_dev, R20_GAIN_G1L, val); |
256 | 211 | reg_w2(gspca_dev, R22_GAIN_RL, val); | |
257 | reg_w2(gspca_dev, R20_GAIN_G1L, sd->gain); | 212 | reg_w2(gspca_dev, R24_GAIN_BL, val); |
258 | reg_w2(gspca_dev, R22_GAIN_RL, sd->gain); | 213 | reg_w2(gspca_dev, R26_GAIN_G2L, val); |
259 | reg_w2(gspca_dev, R24_GAIN_BL, sd->gain); | ||
260 | reg_w2(gspca_dev, R26_GAIN_G2L, sd->gain); | ||
261 | } | 214 | } |
262 | 215 | ||
263 | /* -- start the camera -- */ | 216 | /* -- start the camera -- */ |
@@ -289,8 +242,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
289 | 242 | ||
290 | tv_8532_setReg(gspca_dev); | 243 | tv_8532_setReg(gspca_dev); |
291 | 244 | ||
292 | setexposure(gspca_dev); | 245 | v4l2_ctrl_handler_setup(&gspca_dev->ctrl_handler); |
293 | setgain(gspca_dev); | ||
294 | 246 | ||
295 | /************************************************/ | 247 | /************************************************/ |
296 | reg_w1(gspca_dev, R31_UPD, 0x01); /* update registers */ | 248 | reg_w1(gspca_dev, R31_UPD, 0x01); /* update registers */ |
@@ -339,49 +291,55 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
339 | data + gspca_dev->width + 5, gspca_dev->width); | 291 | data + gspca_dev->width + 5, gspca_dev->width); |
340 | } | 292 | } |
341 | 293 | ||
342 | static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val) | 294 | static int sd_s_ctrl(struct v4l2_ctrl *ctrl) |
343 | { | 295 | { |
344 | struct sd *sd = (struct sd *) gspca_dev; | 296 | struct gspca_dev *gspca_dev = |
297 | container_of(ctrl->handler, struct gspca_dev, ctrl_handler); | ||
345 | 298 | ||
346 | sd->exposure = val; | 299 | gspca_dev->usb_err = 0; |
347 | if (gspca_dev->streaming) | ||
348 | setexposure(gspca_dev); | ||
349 | return 0; | ||
350 | } | ||
351 | 300 | ||
352 | static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val) | 301 | if (!gspca_dev->streaming) |
353 | { | 302 | return 0; |
354 | struct sd *sd = (struct sd *) gspca_dev; | ||
355 | 303 | ||
356 | *val = sd->exposure; | 304 | switch (ctrl->id) { |
357 | return 0; | 305 | case V4L2_CID_EXPOSURE: |
306 | setexposure(gspca_dev, ctrl->val); | ||
307 | break; | ||
308 | case V4L2_CID_GAIN: | ||
309 | setgain(gspca_dev, ctrl->val); | ||
310 | break; | ||
311 | } | ||
312 | return gspca_dev->usb_err; | ||
358 | } | 313 | } |
359 | 314 | ||
360 | static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val) | 315 | static const struct v4l2_ctrl_ops sd_ctrl_ops = { |
361 | { | 316 | .s_ctrl = sd_s_ctrl, |
362 | struct sd *sd = (struct sd *) gspca_dev; | 317 | }; |
363 | |||
364 | sd->gain = val; | ||
365 | if (gspca_dev->streaming) | ||
366 | setgain(gspca_dev); | ||
367 | return 0; | ||
368 | } | ||
369 | 318 | ||
370 | static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val) | 319 | static int sd_init_controls(struct gspca_dev *gspca_dev) |
371 | { | 320 | { |
372 | struct sd *sd = (struct sd *) gspca_dev; | 321 | struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; |
373 | 322 | ||
374 | *val = sd->gain; | 323 | gspca_dev->vdev.ctrl_handler = hdl; |
324 | v4l2_ctrl_handler_init(hdl, 2); | ||
325 | v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
326 | V4L2_CID_EXPOSURE, 0, 0x18f, 1, 0x18f); | ||
327 | v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
328 | V4L2_CID_GAIN, 0, 0x7ff, 1, 0x100); | ||
329 | |||
330 | if (hdl->error) { | ||
331 | pr_err("Could not initialize controls\n"); | ||
332 | return hdl->error; | ||
333 | } | ||
375 | return 0; | 334 | return 0; |
376 | } | 335 | } |
377 | 336 | ||
378 | /* sub-driver description */ | 337 | /* sub-driver description */ |
379 | static const struct sd_desc sd_desc = { | 338 | static const struct sd_desc sd_desc = { |
380 | .name = MODULE_NAME, | 339 | .name = MODULE_NAME, |
381 | .ctrls = sd_ctrls, | ||
382 | .nctrls = ARRAY_SIZE(sd_ctrls), | ||
383 | .config = sd_config, | 340 | .config = sd_config, |
384 | .init = sd_init, | 341 | .init = sd_init, |
342 | .init_controls = sd_init_controls, | ||
385 | .start = sd_start, | 343 | .start = sd_start, |
386 | .stopN = sd_stopN, | 344 | .stopN = sd_stopN, |
387 | .pkt_scan = sd_pkt_scan, | 345 | .pkt_scan = sd_pkt_scan, |