Commit 69252128 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Jaroslav Kysela

[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: default avatarAndy Shevchenko <andy@smile.org.ua>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 29a52c24
...@@ -30,6 +30,7 @@ struct snd_tea575x; ...@@ -30,6 +30,7 @@ struct snd_tea575x;
struct snd_tea575x_ops { struct snd_tea575x_ops {
void (*write)(struct snd_tea575x *tea, unsigned int val); void (*write)(struct snd_tea575x *tea, unsigned int val);
unsigned int (*read)(struct snd_tea575x *tea); unsigned int (*read)(struct snd_tea575x *tea);
void (*mute)(struct snd_tea575x *tea, unsigned int mute);
}; };
struct snd_tea575x { struct snd_tea575x {
......
...@@ -158,6 +158,10 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file, ...@@ -158,6 +158,10 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
struct video_audio v; struct video_audio v;
if(copy_from_user(&v, arg, sizeof(v))) if(copy_from_user(&v, arg, sizeof(v)))
return -EFAULT; return -EFAULT;
if (tea->ops->mute)
tea->ops->mute(tea,
(v.flags &
VIDEO_AUDIO_MUTE) ? 1 : 0);
if(v.audio) if(v.audio)
return -EINVAL; return -EINVAL;
return 0; return 0;
...@@ -205,6 +209,10 @@ void snd_tea575x_init(struct snd_tea575x *tea) ...@@ -205,6 +209,10 @@ void snd_tea575x_init(struct snd_tea575x *tea)
tea->freq = 90500 * 16; /* 90.5Mhz default */ tea->freq = 90500 * 16; /* 90.5Mhz default */
snd_tea575x_set_freq(tea); snd_tea575x_set_freq(tea);
/* mute on init */
if (tea->ops->mute)
tea->ops->mute(tea, 1);
} }
void snd_tea575x_exit(struct snd_tea575x *tea) void snd_tea575x_exit(struct snd_tea575x *tea)
......
...@@ -978,6 +978,27 @@ static unsigned int snd_fm801_tea575x_64pcr_read(struct snd_tea575x *tea) ...@@ -978,6 +978,27 @@ static unsigned int snd_fm801_tea575x_64pcr_read(struct snd_tea575x *tea)
return val; return val;
} }
static void snd_fm801_tea575x_64pcr_mute(struct snd_tea575x *tea,
unsigned int mute)
{
struct fm801 *chip = tea->private_data;
unsigned short reg;
spin_lock_irq(&chip->reg_lock);
reg = inw(FM801_REG(chip, GPIO_CTRL));
if (mute)
/* 0xf800 (mute) */
reg &= ~FM801_GPIO_GP(TEA_64PCR_WRITE_ENABLE);
else
/* 0xf802 (unmute) */
reg |= FM801_GPIO_GP(TEA_64PCR_WRITE_ENABLE);
outw(reg, FM801_REG(chip, GPIO_CTRL));
udelay(1);
spin_unlock_irq(&chip->reg_lock);
}
static struct snd_tea575x_ops snd_fm801_tea_ops[3] = { static struct snd_tea575x_ops snd_fm801_tea_ops[3] = {
{ {
/* 1 = MediaForte 256-PCS */ /* 1 = MediaForte 256-PCS */
...@@ -993,6 +1014,7 @@ static struct snd_tea575x_ops snd_fm801_tea_ops[3] = { ...@@ -993,6 +1014,7 @@ static struct snd_tea575x_ops snd_fm801_tea_ops[3] = {
/* 3 = MediaForte 64-PCR */ /* 3 = MediaForte 64-PCR */
.write = snd_fm801_tea575x_64pcr_write, .write = snd_fm801_tea575x_64pcr_write,
.read = snd_fm801_tea575x_64pcr_read, .read = snd_fm801_tea575x_64pcr_read,
.mute = snd_fm801_tea575x_64pcr_mute,
} }
}; };
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment