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