diff options
Diffstat (limited to 'drivers/media/video/cx18/cx18-av-audio.c')
-rw-r--r-- | drivers/media/video/cx18/cx18-av-audio.c | 120 |
1 files changed, 57 insertions, 63 deletions
diff --git a/drivers/media/video/cx18/cx18-av-audio.c b/drivers/media/video/cx18/cx18-av-audio.c index a2f0ad57043..9e30983f2ff 100644 --- a/drivers/media/video/cx18/cx18-av-audio.c +++ b/drivers/media/video/cx18/cx18-av-audio.c | |||
@@ -464,82 +464,76 @@ static void set_mute(struct cx18 *cx, int mute) | |||
464 | } | 464 | } |
465 | } | 465 | } |
466 | 466 | ||
467 | int cx18_av_audio(struct cx18 *cx, unsigned int cmd, void *arg) | 467 | int cx18_av_s_clock_freq(struct v4l2_subdev *sd, u32 freq) |
468 | { | 468 | { |
469 | struct cx18 *cx = v4l2_get_subdevdata(sd); | ||
469 | struct cx18_av_state *state = &cx->av_state; | 470 | struct cx18_av_state *state = &cx->av_state; |
470 | struct v4l2_control *ctrl = arg; | ||
471 | int retval; | 471 | int retval; |
472 | u8 v; | ||
472 | 473 | ||
473 | switch (cmd) { | 474 | if (state->aud_input > CX18_AV_AUDIO_SERIAL2) { |
474 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: | 475 | v = cx18_av_read(cx, 0x803) & ~0x10; |
475 | { | 476 | cx18_av_write_expect(cx, 0x803, v, v, 0x1f); |
476 | u8 v; | 477 | cx18_av_write(cx, 0x8d3, 0x1f); |
477 | if (state->aud_input > CX18_AV_AUDIO_SERIAL2) { | 478 | } |
478 | v = cx18_av_read(cx, 0x803) & ~0x10; | 479 | v = cx18_av_read(cx, 0x810) | 0x1; |
479 | cx18_av_write_expect(cx, 0x803, v, v, 0x1f); | 480 | cx18_av_write_expect(cx, 0x810, v, v, 0x0f); |
480 | cx18_av_write(cx, 0x8d3, 0x1f); | ||
481 | } | ||
482 | v = cx18_av_read(cx, 0x810) | 0x1; | ||
483 | cx18_av_write_expect(cx, 0x810, v, v, 0x0f); | ||
484 | 481 | ||
485 | retval = set_audclk_freq(cx, *(u32 *)arg); | 482 | retval = set_audclk_freq(cx, freq); |
486 | 483 | ||
487 | v = cx18_av_read(cx, 0x810) & ~0x1; | 484 | v = cx18_av_read(cx, 0x810) & ~0x1; |
488 | cx18_av_write_expect(cx, 0x810, v, v, 0x0f); | 485 | cx18_av_write_expect(cx, 0x810, v, v, 0x0f); |
489 | if (state->aud_input > CX18_AV_AUDIO_SERIAL2) { | 486 | if (state->aud_input > CX18_AV_AUDIO_SERIAL2) { |
490 | v = cx18_av_read(cx, 0x803) | 0x10; | 487 | v = cx18_av_read(cx, 0x803) | 0x10; |
491 | cx18_av_write_expect(cx, 0x803, v, v, 0x1f); | 488 | cx18_av_write_expect(cx, 0x803, v, v, 0x1f); |
492 | } | ||
493 | return retval; | ||
494 | } | 489 | } |
490 | return retval; | ||
491 | } | ||
495 | 492 | ||
496 | case VIDIOC_G_CTRL: | 493 | int cx18_av_audio_g_ctrl(struct cx18 *cx, struct v4l2_control *ctrl) |
497 | switch (ctrl->id) { | 494 | { |
498 | case V4L2_CID_AUDIO_VOLUME: | 495 | switch (ctrl->id) { |
499 | ctrl->value = get_volume(cx); | 496 | case V4L2_CID_AUDIO_VOLUME: |
500 | break; | 497 | ctrl->value = get_volume(cx); |
501 | case V4L2_CID_AUDIO_BASS: | ||
502 | ctrl->value = get_bass(cx); | ||
503 | break; | ||
504 | case V4L2_CID_AUDIO_TREBLE: | ||
505 | ctrl->value = get_treble(cx); | ||
506 | break; | ||
507 | case V4L2_CID_AUDIO_BALANCE: | ||
508 | ctrl->value = get_balance(cx); | ||
509 | break; | ||
510 | case V4L2_CID_AUDIO_MUTE: | ||
511 | ctrl->value = get_mute(cx); | ||
512 | break; | ||
513 | default: | ||
514 | return -EINVAL; | ||
515 | } | ||
516 | break; | 498 | break; |
517 | 499 | case V4L2_CID_AUDIO_BASS: | |
518 | case VIDIOC_S_CTRL: | 500 | ctrl->value = get_bass(cx); |
519 | switch (ctrl->id) { | 501 | break; |
520 | case V4L2_CID_AUDIO_VOLUME: | 502 | case V4L2_CID_AUDIO_TREBLE: |
521 | set_volume(cx, ctrl->value); | 503 | ctrl->value = get_treble(cx); |
522 | break; | 504 | break; |
523 | case V4L2_CID_AUDIO_BASS: | 505 | case V4L2_CID_AUDIO_BALANCE: |
524 | set_bass(cx, ctrl->value); | 506 | ctrl->value = get_balance(cx); |
525 | break; | 507 | break; |
526 | case V4L2_CID_AUDIO_TREBLE: | 508 | case V4L2_CID_AUDIO_MUTE: |
527 | set_treble(cx, ctrl->value); | 509 | ctrl->value = get_mute(cx); |
528 | break; | ||
529 | case V4L2_CID_AUDIO_BALANCE: | ||
530 | set_balance(cx, ctrl->value); | ||
531 | break; | ||
532 | case V4L2_CID_AUDIO_MUTE: | ||
533 | set_mute(cx, ctrl->value); | ||
534 | break; | ||
535 | default: | ||
536 | return -EINVAL; | ||
537 | } | ||
538 | break; | 510 | break; |
539 | |||
540 | default: | 511 | default: |
541 | return -EINVAL; | 512 | return -EINVAL; |
542 | } | 513 | } |
514 | return 0; | ||
515 | } | ||
543 | 516 | ||
517 | int cx18_av_audio_s_ctrl(struct cx18 *cx, struct v4l2_control *ctrl) | ||
518 | { | ||
519 | switch (ctrl->id) { | ||
520 | case V4L2_CID_AUDIO_VOLUME: | ||
521 | set_volume(cx, ctrl->value); | ||
522 | break; | ||
523 | case V4L2_CID_AUDIO_BASS: | ||
524 | set_bass(cx, ctrl->value); | ||
525 | break; | ||
526 | case V4L2_CID_AUDIO_TREBLE: | ||
527 | set_treble(cx, ctrl->value); | ||
528 | break; | ||
529 | case V4L2_CID_AUDIO_BALANCE: | ||
530 | set_balance(cx, ctrl->value); | ||
531 | break; | ||
532 | case V4L2_CID_AUDIO_MUTE: | ||
533 | set_mute(cx, ctrl->value); | ||
534 | break; | ||
535 | default: | ||
536 | return -EINVAL; | ||
537 | } | ||
544 | return 0; | 538 | return 0; |
545 | } | 539 | } |