Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] saa7110: use control framework

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
4744ebf6 bd84a65a

+46 -69
+46 -69
drivers/media/video/saa7110.c
··· 36 36 #include <linux/videodev2.h> 37 37 #include <media/v4l2-device.h> 38 38 #include <media/v4l2-chip-ident.h> 39 + #include <media/v4l2-ctrls.h> 39 40 40 41 MODULE_DESCRIPTION("Philips SAA7110 video decoder driver"); 41 42 MODULE_AUTHOR("Pauline Middelink"); ··· 54 53 55 54 struct saa7110 { 56 55 struct v4l2_subdev sd; 56 + struct v4l2_ctrl_handler hdl; 57 57 u8 reg[SAA7110_NR_REG]; 58 58 59 59 v4l2_std_id norm; 60 60 int input; 61 61 int enable; 62 - int bright; 63 - int contrast; 64 - int hue; 65 - int sat; 66 62 67 63 wait_queue_head_t wq; 68 64 }; ··· 67 69 static inline struct saa7110 *to_saa7110(struct v4l2_subdev *sd) 68 70 { 69 71 return container_of(sd, struct saa7110, sd); 72 + } 73 + 74 + static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl) 75 + { 76 + return &container_of(ctrl->handler, struct saa7110, hdl)->sd; 70 77 } 71 78 72 79 /* ----------------------------------------------------------------------- */ ··· 329 326 return 0; 330 327 } 331 328 332 - static int saa7110_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc) 329 + static int saa7110_s_ctrl(struct v4l2_ctrl *ctrl) 333 330 { 334 - switch (qc->id) { 335 - case V4L2_CID_BRIGHTNESS: 336 - return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); 337 - case V4L2_CID_CONTRAST: 338 - case V4L2_CID_SATURATION: 339 - return v4l2_ctrl_query_fill(qc, 0, 127, 1, 64); 340 - case V4L2_CID_HUE: 341 - return v4l2_ctrl_query_fill(qc, -128, 127, 1, 0); 342 - default: 343 - return -EINVAL; 344 - } 345 - return 0; 346 - } 347 - 348 - static int saa7110_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) 349 - { 350 - struct saa7110 *decoder = to_saa7110(sd); 331 + struct v4l2_subdev *sd = to_sd(ctrl); 351 332 352 333 switch (ctrl->id) { 353 334 case V4L2_CID_BRIGHTNESS: 354 - ctrl->value = decoder->bright; 335 + saa7110_write(sd, 0x19, ctrl->val); 355 336 break; 356 337 case V4L2_CID_CONTRAST: 357 - ctrl->value = decoder->contrast; 338 + saa7110_write(sd, 0x13, ctrl->val); 358 339 break; 359 340 case V4L2_CID_SATURATION: 360 - ctrl->value = decoder->sat; 341 + saa7110_write(sd, 0x12, ctrl->val); 361 342 break; 362 343 case V4L2_CID_HUE: 363 - ctrl->value = decoder->hue; 364 - break; 365 - default: 366 - return -EINVAL; 367 - } 368 - return 0; 369 - } 370 - 371 - static int saa7110_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) 372 - { 373 - struct saa7110 *decoder = to_saa7110(sd); 374 - 375 - switch (ctrl->id) { 376 - case V4L2_CID_BRIGHTNESS: 377 - if (decoder->bright != ctrl->value) { 378 - decoder->bright = ctrl->value; 379 - saa7110_write(sd, 0x19, decoder->bright); 380 - } 381 - break; 382 - case V4L2_CID_CONTRAST: 383 - if (decoder->contrast != ctrl->value) { 384 - decoder->contrast = ctrl->value; 385 - saa7110_write(sd, 0x13, decoder->contrast); 386 - } 387 - break; 388 - case V4L2_CID_SATURATION: 389 - if (decoder->sat != ctrl->value) { 390 - decoder->sat = ctrl->value; 391 - saa7110_write(sd, 0x12, decoder->sat); 392 - } 393 - break; 394 - case V4L2_CID_HUE: 395 - if (decoder->hue != ctrl->value) { 396 - decoder->hue = ctrl->value; 397 - saa7110_write(sd, 0x07, decoder->hue); 398 - } 344 + saa7110_write(sd, 0x07, ctrl->val); 399 345 break; 400 346 default: 401 347 return -EINVAL; ··· 361 409 362 410 /* ----------------------------------------------------------------------- */ 363 411 412 + static const struct v4l2_ctrl_ops saa7110_ctrl_ops = { 413 + .s_ctrl = saa7110_s_ctrl, 414 + }; 415 + 364 416 static const struct v4l2_subdev_core_ops saa7110_core_ops = { 365 417 .g_chip_ident = saa7110_g_chip_ident, 366 - .g_ctrl = saa7110_g_ctrl, 367 - .s_ctrl = saa7110_s_ctrl, 368 - .queryctrl = saa7110_queryctrl, 418 + .g_ext_ctrls = v4l2_subdev_g_ext_ctrls, 419 + .try_ext_ctrls = v4l2_subdev_try_ext_ctrls, 420 + .s_ext_ctrls = v4l2_subdev_s_ext_ctrls, 421 + .g_ctrl = v4l2_subdev_g_ctrl, 422 + .s_ctrl = v4l2_subdev_s_ctrl, 423 + .queryctrl = v4l2_subdev_queryctrl, 424 + .querymenu = v4l2_subdev_querymenu, 369 425 .s_std = saa7110_s_std, 370 426 }; 371 427 ··· 414 454 decoder->norm = V4L2_STD_PAL; 415 455 decoder->input = 0; 416 456 decoder->enable = 1; 417 - decoder->bright = 32768; 418 - decoder->contrast = 32768; 419 - decoder->hue = 32768; 420 - decoder->sat = 32768; 457 + v4l2_ctrl_handler_init(&decoder->hdl, 2); 458 + v4l2_ctrl_new_std(&decoder->hdl, &saa7110_ctrl_ops, 459 + V4L2_CID_BRIGHTNESS, 0, 255, 1, 128); 460 + v4l2_ctrl_new_std(&decoder->hdl, &saa7110_ctrl_ops, 461 + V4L2_CID_CONTRAST, 0, 127, 1, 64); 462 + v4l2_ctrl_new_std(&decoder->hdl, &saa7110_ctrl_ops, 463 + V4L2_CID_SATURATION, 0, 127, 1, 64); 464 + v4l2_ctrl_new_std(&decoder->hdl, &saa7110_ctrl_ops, 465 + V4L2_CID_HUE, -128, 127, 1, 0); 466 + sd->ctrl_handler = &decoder->hdl; 467 + if (decoder->hdl.error) { 468 + int err = decoder->hdl.error; 469 + 470 + v4l2_ctrl_handler_free(&decoder->hdl); 471 + kfree(decoder); 472 + return err; 473 + } 474 + v4l2_ctrl_handler_setup(&decoder->hdl); 475 + 421 476 init_waitqueue_head(&decoder->wq); 422 477 423 478 rv = saa7110_write_block(sd, initseq, sizeof(initseq)); ··· 465 490 static int saa7110_remove(struct i2c_client *client) 466 491 { 467 492 struct v4l2_subdev *sd = i2c_get_clientdata(client); 493 + struct saa7110 *decoder = to_saa7110(sd); 468 494 469 495 v4l2_device_unregister_subdev(sd); 470 - kfree(to_saa7110(sd)); 496 + v4l2_ctrl_handler_free(&decoder->hdl); 497 + kfree(decoder); 471 498 return 0; 472 499 } 473 500