diff options
Diffstat (limited to 'drivers/media/video/cx18/cx18-audio.c')
-rw-r--r-- | drivers/media/video/cx18/cx18-audio.c | 52 |
1 files changed, 14 insertions, 38 deletions
diff --git a/drivers/media/video/cx18/cx18-audio.c b/drivers/media/video/cx18/cx18-audio.c index 57beddf0af4d..bb5c5165dd5f 100644 --- a/drivers/media/video/cx18/cx18-audio.c +++ b/drivers/media/video/cx18/cx18-audio.c | |||
@@ -23,7 +23,6 @@ | |||
23 | 23 | ||
24 | #include "cx18-driver.h" | 24 | #include "cx18-driver.h" |
25 | #include "cx18-io.h" | 25 | #include "cx18-io.h" |
26 | #include "cx18-i2c.h" | ||
27 | #include "cx18-cards.h" | 26 | #include "cx18-cards.h" |
28 | #include "cx18-audio.h" | 27 | #include "cx18-audio.h" |
29 | 28 | ||
@@ -33,55 +32,32 @@ | |||
33 | settings. */ | 32 | settings. */ |
34 | int cx18_audio_set_io(struct cx18 *cx) | 33 | int cx18_audio_set_io(struct cx18 *cx) |
35 | { | 34 | { |
35 | const struct cx18_card_audio_input *in; | ||
36 | struct v4l2_routing route; | 36 | struct v4l2_routing route; |
37 | u32 audio_input; | ||
38 | u32 val; | 37 | u32 val; |
39 | int mux_input; | ||
40 | int err; | 38 | int err; |
41 | 39 | ||
42 | /* Determine which input to use */ | 40 | /* Determine which input to use */ |
43 | if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) { | 41 | if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) |
44 | audio_input = cx->card->radio_input.audio_input; | 42 | in = &cx->card->radio_input; |
45 | mux_input = cx->card->radio_input.muxer_input; | 43 | else |
46 | } else { | 44 | in = &cx->card->audio_inputs[cx->audio_input]; |
47 | audio_input = | ||
48 | cx->card->audio_inputs[cx->audio_input].audio_input; | ||
49 | mux_input = | ||
50 | cx->card->audio_inputs[cx->audio_input].muxer_input; | ||
51 | } | ||
52 | 45 | ||
53 | /* handle muxer chips */ | 46 | /* handle muxer chips */ |
54 | route.input = mux_input; | 47 | route.input = in->muxer_input; |
55 | route.output = 0; | 48 | route.output = 0; |
56 | cx18_i2c_hw(cx, cx->card->hw_muxer, VIDIOC_INT_S_AUDIO_ROUTING, &route); | 49 | v4l2_subdev_call(cx->sd_extmux, audio, s_routing, &route); |
57 | 50 | ||
58 | route.input = audio_input; | 51 | route.input = in->audio_input; |
59 | err = cx18_i2c_hw(cx, cx->card->hw_audio_ctrl, | 52 | err = cx18_call_hw_err(cx, cx->card->hw_audio_ctrl, |
60 | VIDIOC_INT_S_AUDIO_ROUTING, &route); | 53 | audio, s_routing, &route); |
61 | if (err) | 54 | if (err) |
62 | return err; | 55 | return err; |
63 | 56 | ||
57 | /* FIXME - this internal mux should be abstracted to a subdev */ | ||
64 | val = cx18_read_reg(cx, CX18_AUDIO_ENABLE) & ~0x30; | 58 | val = cx18_read_reg(cx, CX18_AUDIO_ENABLE) & ~0x30; |
65 | val |= (audio_input > CX18_AV_AUDIO_SERIAL2) ? 0x20 : | 59 | val |= (in->audio_input > CX18_AV_AUDIO_SERIAL2) ? 0x20 : |
66 | (audio_input << 4); | 60 | (in->audio_input << 4); |
67 | cx18_write_reg(cx, val | 0xb00, CX18_AUDIO_ENABLE); | 61 | cx18_write_reg_expect(cx, val | 0xb00, CX18_AUDIO_ENABLE, val, 0x30); |
68 | cx18_vapi(cx, CX18_APU_RESETAI, 1, 0); | ||
69 | return 0; | 62 | return 0; |
70 | } | 63 | } |
71 | |||
72 | void cx18_audio_set_route(struct cx18 *cx, struct v4l2_routing *route) | ||
73 | { | ||
74 | cx18_i2c_hw(cx, cx->card->hw_audio_ctrl, | ||
75 | VIDIOC_INT_S_AUDIO_ROUTING, route); | ||
76 | } | ||
77 | |||
78 | void cx18_audio_set_audio_clock_freq(struct cx18 *cx, u8 freq) | ||
79 | { | ||
80 | static u32 freqs[3] = { 44100, 48000, 32000 }; | ||
81 | |||
82 | /* The audio clock of the digitizer must match the codec sample | ||
83 | rate otherwise you get some very strange effects. */ | ||
84 | if (freq > 2) | ||
85 | return; | ||
86 | cx18_call_i2c_clients(cx, VIDIOC_INT_AUDIO_CLOCK_FREQ, &freqs[freq]); | ||
87 | } | ||