aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-18 04:12:09 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:34:04 -0400
commit726795c1d94f7153edd0038b61fd6dd7dd0163d1 (patch)
treea4117ed097a84cb98a7a29d4a34aaab2f04669bd /drivers/media/video/gspca
parent9bf81642e1f3096f0882dcfdb2102a9a9445869c (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.c124
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");
30struct sd { 30struct 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 */
40static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val);
41static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val);
42static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val);
43static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val);
44
45static 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
76static const struct v4l2_pix_format sif_mode[] = { 36static 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)
202static int sd_config(struct gspca_dev *gspca_dev, 162static 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
244static void setexposure(struct gspca_dev *gspca_dev) 201static 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
253static void setgain(struct gspca_dev *gspca_dev) 208static 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
342static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val) 294static 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
352static 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
360static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val) 315static 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
370static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val) 319static 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 */
379static const struct sd_desc sd_desc = { 338static 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,