Commit 69252128ec628e9d19739db0101e1826d993aecb

Authored by Andy Shevchenko
Committed by Jaroslav Kysela
1 parent 29a52c242d

[ALSA] fm801 - Add mute support for FM-only card with FM801 PCI to tuner bridge

This is improvement of the early support of the FM-only cards where the
fm801 chip represents the PCI to tuner bridge.
The tuner initialization isn't included the mute on as well as mute support
via V4L request. Proposed patch should fix this at least for 64-PCR model.

Signed-off-by: Andy Shevchenko <andy@smile.org.ua>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>

Showing 3 changed files with 31 additions and 0 deletions Side-by-side Diff

include/sound/tea575x-tuner.h
... ... @@ -30,6 +30,7 @@
30 30 struct snd_tea575x_ops {
31 31 void (*write)(struct snd_tea575x *tea, unsigned int val);
32 32 unsigned int (*read)(struct snd_tea575x *tea);
  33 + void (*mute)(struct snd_tea575x *tea, unsigned int mute);
33 34 };
34 35  
35 36 struct snd_tea575x {
sound/i2c/other/tea575x-tuner.c
... ... @@ -158,6 +158,10 @@
158 158 struct video_audio v;
159 159 if(copy_from_user(&v, arg, sizeof(v)))
160 160 return -EFAULT;
  161 + if (tea->ops->mute)
  162 + tea->ops->mute(tea,
  163 + (v.flags &
  164 + VIDEO_AUDIO_MUTE) ? 1 : 0);
161 165 if(v.audio)
162 166 return -EINVAL;
163 167 return 0;
... ... @@ -205,6 +209,10 @@
205 209 tea->freq = 90500 * 16; /* 90.5Mhz default */
206 210  
207 211 snd_tea575x_set_freq(tea);
  212 +
  213 + /* mute on init */
  214 + if (tea->ops->mute)
  215 + tea->ops->mute(tea, 1);
208 216 }
209 217  
210 218 void snd_tea575x_exit(struct snd_tea575x *tea)
... ... @@ -978,6 +978,27 @@
978 978 return val;
979 979 }
980 980  
  981 +static void snd_fm801_tea575x_64pcr_mute(struct snd_tea575x *tea,
  982 + unsigned int mute)
  983 +{
  984 + struct fm801 *chip = tea->private_data;
  985 + unsigned short reg;
  986 +
  987 + spin_lock_irq(&chip->reg_lock);
  988 +
  989 + reg = inw(FM801_REG(chip, GPIO_CTRL));
  990 + if (mute)
  991 + /* 0xf800 (mute) */
  992 + reg &= ~FM801_GPIO_GP(TEA_64PCR_WRITE_ENABLE);
  993 + else
  994 + /* 0xf802 (unmute) */
  995 + reg |= FM801_GPIO_GP(TEA_64PCR_WRITE_ENABLE);
  996 + outw(reg, FM801_REG(chip, GPIO_CTRL));
  997 + udelay(1);
  998 +
  999 + spin_unlock_irq(&chip->reg_lock);
  1000 +}
  1001 +
981 1002 static struct snd_tea575x_ops snd_fm801_tea_ops[3] = {
982 1003 {
983 1004 /* 1 = MediaForte 256-PCS */
... ... @@ -993,6 +1014,7 @@
993 1014 /* 3 = MediaForte 64-PCR */
994 1015 .write = snd_fm801_tea575x_64pcr_write,
995 1016 .read = snd_fm801_tea575x_64pcr_read,
  1017 + .mute = snd_fm801_tea575x_64pcr_mute,
996 1018 }
997 1019 };
998 1020 #endif