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

[media] bt819: 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
bd84a65a ceed52d6

+49 -80
+49 -80
drivers/media/video/bt819.c
··· 37 37 #include <linux/slab.h> 38 38 #include <media/v4l2-device.h> 39 39 #include <media/v4l2-chip-ident.h> 40 + #include <media/v4l2-ctrls.h> 40 41 #include <media/bt819.h> 41 42 42 43 MODULE_DESCRIPTION("Brooktree-819 video decoder driver"); ··· 53 52 54 53 struct bt819 { 55 54 struct v4l2_subdev sd; 55 + struct v4l2_ctrl_handler hdl; 56 56 unsigned char reg[32]; 57 57 58 58 v4l2_std_id norm; 59 59 int ident; 60 60 int input; 61 61 int enable; 62 - int bright; 63 - int contrast; 64 - int hue; 65 - int sat; 66 62 }; 67 63 68 64 static inline struct bt819 *to_bt819(struct v4l2_subdev *sd) 69 65 { 70 66 return container_of(sd, struct bt819, sd); 67 + } 68 + 69 + static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl) 70 + { 71 + return &container_of(ctrl->handler, struct bt819, hdl)->sd; 71 72 } 72 73 73 74 struct timing { ··· 336 333 return 0; 337 334 } 338 335 339 - static int bt819_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc) 336 + static int bt819_s_ctrl(struct v4l2_ctrl *ctrl) 340 337 { 341 - switch (qc->id) { 342 - case V4L2_CID_BRIGHTNESS: 343 - v4l2_ctrl_query_fill(qc, -128, 127, 1, 0); 344 - break; 345 - 346 - case V4L2_CID_CONTRAST: 347 - v4l2_ctrl_query_fill(qc, 0, 511, 1, 256); 348 - break; 349 - 350 - case V4L2_CID_SATURATION: 351 - v4l2_ctrl_query_fill(qc, 0, 511, 1, 256); 352 - break; 353 - 354 - case V4L2_CID_HUE: 355 - v4l2_ctrl_query_fill(qc, -128, 127, 1, 0); 356 - break; 357 - 358 - default: 359 - return -EINVAL; 360 - } 361 - return 0; 362 - } 363 - 364 - static int bt819_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) 365 - { 338 + struct v4l2_subdev *sd = to_sd(ctrl); 366 339 struct bt819 *decoder = to_bt819(sd); 367 340 int temp; 368 341 369 342 switch (ctrl->id) { 370 343 case V4L2_CID_BRIGHTNESS: 371 - if (decoder->bright == ctrl->value) 372 - break; 373 - decoder->bright = ctrl->value; 374 - bt819_write(decoder, 0x0a, decoder->bright); 344 + bt819_write(decoder, 0x0a, ctrl->val); 375 345 break; 376 346 377 347 case V4L2_CID_CONTRAST: 378 - if (decoder->contrast == ctrl->value) 379 - break; 380 - decoder->contrast = ctrl->value; 381 - bt819_write(decoder, 0x0c, decoder->contrast & 0xff); 382 - bt819_setbit(decoder, 0x0b, 2, ((decoder->contrast >> 8) & 0x01)); 348 + bt819_write(decoder, 0x0c, ctrl->val & 0xff); 349 + bt819_setbit(decoder, 0x0b, 2, ((ctrl->val >> 8) & 0x01)); 383 350 break; 384 351 385 352 case V4L2_CID_SATURATION: 386 - if (decoder->sat == ctrl->value) 387 - break; 388 - decoder->sat = ctrl->value; 389 - bt819_write(decoder, 0x0d, (decoder->sat >> 7) & 0xff); 390 - bt819_setbit(decoder, 0x0b, 1, ((decoder->sat >> 15) & 0x01)); 353 + bt819_write(decoder, 0x0d, (ctrl->val >> 7) & 0xff); 354 + bt819_setbit(decoder, 0x0b, 1, ((ctrl->val >> 15) & 0x01)); 391 355 392 356 /* Ratio between U gain and V gain must stay the same as 393 357 the ratio between the default U and V gain values. */ 394 - temp = (decoder->sat * 180) / 254; 358 + temp = (ctrl->val * 180) / 254; 395 359 bt819_write(decoder, 0x0e, (temp >> 7) & 0xff); 396 360 bt819_setbit(decoder, 0x0b, 0, (temp >> 15) & 0x01); 397 361 break; 398 362 399 363 case V4L2_CID_HUE: 400 - if (decoder->hue == ctrl->value) 401 - break; 402 - decoder->hue = ctrl->value; 403 - bt819_write(decoder, 0x0f, decoder->hue); 364 + bt819_write(decoder, 0x0f, ctrl->val); 404 365 break; 405 366 406 - default: 407 - return -EINVAL; 408 - } 409 - return 0; 410 - } 411 - 412 - static int bt819_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) 413 - { 414 - struct bt819 *decoder = to_bt819(sd); 415 - 416 - switch (ctrl->id) { 417 - case V4L2_CID_BRIGHTNESS: 418 - ctrl->value = decoder->bright; 419 - break; 420 - case V4L2_CID_CONTRAST: 421 - ctrl->value = decoder->contrast; 422 - break; 423 - case V4L2_CID_SATURATION: 424 - ctrl->value = decoder->sat; 425 - break; 426 - case V4L2_CID_HUE: 427 - ctrl->value = decoder->hue; 428 - break; 429 367 default: 430 368 return -EINVAL; 431 369 } ··· 383 439 384 440 /* ----------------------------------------------------------------------- */ 385 441 442 + static const struct v4l2_ctrl_ops bt819_ctrl_ops = { 443 + .s_ctrl = bt819_s_ctrl, 444 + }; 445 + 386 446 static const struct v4l2_subdev_core_ops bt819_core_ops = { 387 447 .g_chip_ident = bt819_g_chip_ident, 388 - .g_ctrl = bt819_g_ctrl, 389 - .s_ctrl = bt819_s_ctrl, 390 - .queryctrl = bt819_queryctrl, 448 + .g_ext_ctrls = v4l2_subdev_g_ext_ctrls, 449 + .try_ext_ctrls = v4l2_subdev_try_ext_ctrls, 450 + .s_ext_ctrls = v4l2_subdev_s_ext_ctrls, 451 + .g_ctrl = v4l2_subdev_g_ctrl, 452 + .s_ctrl = v4l2_subdev_s_ctrl, 453 + .queryctrl = v4l2_subdev_queryctrl, 454 + .querymenu = v4l2_subdev_querymenu, 391 455 .s_std = bt819_s_std, 392 456 }; 393 457 ··· 457 505 decoder->norm = V4L2_STD_NTSC; 458 506 decoder->input = 0; 459 507 decoder->enable = 1; 460 - decoder->bright = 0; 461 - decoder->contrast = 0xd8; /* 100% of original signal */ 462 - decoder->hue = 0; 463 - decoder->sat = 0xfe; /* 100% of original signal */ 464 508 465 509 i = bt819_init(sd); 466 510 if (i < 0) 467 511 v4l2_dbg(1, debug, sd, "init status %d\n", i); 512 + 513 + v4l2_ctrl_handler_init(&decoder->hdl, 4); 514 + v4l2_ctrl_new_std(&decoder->hdl, &bt819_ctrl_ops, 515 + V4L2_CID_BRIGHTNESS, -128, 127, 1, 0); 516 + v4l2_ctrl_new_std(&decoder->hdl, &bt819_ctrl_ops, 517 + V4L2_CID_CONTRAST, 0, 511, 1, 0xd8); 518 + v4l2_ctrl_new_std(&decoder->hdl, &bt819_ctrl_ops, 519 + V4L2_CID_SATURATION, 0, 511, 1, 0xfe); 520 + v4l2_ctrl_new_std(&decoder->hdl, &bt819_ctrl_ops, 521 + V4L2_CID_HUE, -128, 127, 1, 0); 522 + sd->ctrl_handler = &decoder->hdl; 523 + if (decoder->hdl.error) { 524 + int err = decoder->hdl.error; 525 + 526 + v4l2_ctrl_handler_free(&decoder->hdl); 527 + kfree(decoder); 528 + return err; 529 + } 530 + v4l2_ctrl_handler_setup(&decoder->hdl); 468 531 return 0; 469 532 } 470 533 471 534 static int bt819_remove(struct i2c_client *client) 472 535 { 473 536 struct v4l2_subdev *sd = i2c_get_clientdata(client); 537 + struct bt819 *decoder = to_bt819(sd); 474 538 475 539 v4l2_device_unregister_subdev(sd); 476 - kfree(to_bt819(sd)); 540 + v4l2_ctrl_handler_free(&decoder->hdl); 541 + kfree(decoder); 477 542 return 0; 478 543 } 479 544