aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/video/em28xx/em28xx-core.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2008-11-20 12:40:51 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-29 17:53:37 -0200
commit35ae6f04ad3e4c3ed8a83382b6511bd9beb5c768 (patch)
treeac482c50af4af87bab959b6e839a8383811d8daa /drivers/media/video/em28xx/em28xx-core.c
parentf1990a9c39d957e6896fc506fc5388b7f302c429 (diff)
V4L/DVB (9670): em28xx: allow specifying audio output
Some boards use different AC97 setups for output. This patch adds the capability of specifying the output to be used. Currently, only one output is selected, but the better is to allow user to select it via a mixer, on alsa driver. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-core.c')
-rw-r--r--drivers/media/video/em28xx/em28xx-core.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c
index 2842ddf6dda..8aead5e84d0 100644
--- a/drivers/media/video/em28xx/em28xx-core.c
+++ b/drivers/media/video/em28xx/em28xx-core.c
@@ -388,9 +388,17 @@ static int em28xx_set_audio_source(struct em28xx *dev)
return ret;
}
+static int outputs[] = {
+ [EM28XX_AOUT_MASTER] = AC97_MASTER_VOL,
+ [EM28XX_AOUT_LINE] = AC97_LINE_LEVEL_VOL,
+ [EM28XX_AOUT_MONO] = AC97_MASTER_MONO_VOL,
+ [EM28XX_AOUT_LFE] = AC97_LFE_MASTER_VOL,
+ [EM28XX_AOUT_SURR] = AC97_SURR_MASTER_VOL,
+};
+
int em28xx_audio_analog_set(struct em28xx *dev)
{
- int ret;
+ int ret, i;
u8 xclk = 0x07;
if (!dev->audio_mode.has_audio)
@@ -400,11 +408,13 @@ int em28xx_audio_analog_set(struct em28xx *dev)
It would be possible to use also line output.
*/
if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
- /* Mute */
- ret = em28xx_write_ac97(dev, AC97_MASTER_VOL, 0x8000);
-
- if (ret < 0)
- return ret;
+ /* Mute all outputs */
+ for (i = 0; i < ARRAY_SIZE(outputs); i++) {
+ ret = em28xx_write_ac97(dev, outputs[i], 0x8000);
+ if (ret < 0)
+ em28xx_warn("couldn't setup AC97 register %d\n",
+ outputs[i]);
+ }
}
if (dev->has_12mhz_i2s)
@@ -433,7 +443,7 @@ int em28xx_audio_analog_set(struct em28xx *dev)
vol |= 0x8000;
/* Sets volume */
- ret = em28xx_write_ac97(dev, AC97_MASTER_VOL, vol);
+ ret = em28xx_write_ac97(dev, outputs[dev->ctl_aoutput], vol);
}
return ret;