On Sun, 2011-09-18 at 11:15 +0800, Hor Jiun Shyong wrote: > Package: linux-image-3.0.0-1-486 > Version: 3.0.0-3 > > Issue: Sound card not detected. Soundcard Chipset: FM801. Soundcard > is working under linux-image-2.6.39-2-486 and older kernels. [...]
Please can you test whether the attached patch fixes this? Instructions for building a patched kernel package can be found at <http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official>. Ben. -- Ben Hutchings If more than one person is responsible for a bug, no one is at fault.
commit 63bdc367e9dc1a440a2dabeb27ba9745348ff628 Author: Ben Hutchings <b...@decadent.org.uk> Date: Mon Sep 19 01:55:57 2011 +0100 fm801: Gracefully handle failure of tuner auto-detect commit 9676001559fce06e37c7dc230ab275f605556176 ("ALSA: fm801: add error handling if auto-detect fails") seems to break systems that were previously working without a tuner. As a bonus, this should fix init and cleanup for the case where the tuner is explicitly disabled. Reported-by: Hor Jiun Shyong <jiunshy...@gmail.com> References: http://bugs.debian.org/641946 Signed-off-by: Ben Hutchings <b...@decadent.org.uk> commit b06a2e531f2801093424f625ec1e54872d71052f Author: Ben Hutchings <b...@decadent.org.uk> Date: Mon Sep 19 01:50:05 2011 +0100 fm801: Fix double free in case of error in tuner detection commit 9676001559fce06e37c7dc230ab275f605556176 ("ALSA: fm801: add error handling if auto-detect fails") added incorrect error handling. Once we have successfully called snd_device_new(), the cleanup function fm801_free() will automatically be called by snd_card_free() and we must *not* also call fm801_free() directly. Reported-by: Hor Jiun Shyong <jiunshy...@gmail.com> References: http://bugs.debian.org/641946 Signed-off-by: Ben Hutchings <b...@decadent.org.uk> diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index a7ec703..ecce948 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -68,6 +68,7 @@ MODULE_PARM_DESC(enable, "Enable FM801 soundcard."); module_param_array(tea575x_tuner, int, NULL, 0444); MODULE_PARM_DESC(tea575x_tuner, "TEA575x tuner access method (0 = auto, 1 = SF256-PCS, 2=SF256-PCP, 3=SF64-PCR, 8=disable, +16=tuner-only)."); +#define TUNER_DISABLED (1<<3) #define TUNER_ONLY (1<<4) #define TUNER_TYPE_MASK (~TUNER_ONLY & 0xFFFF) @@ -1150,7 +1151,8 @@ static int snd_fm801_free(struct fm801 *chip) __end_hw: #ifdef CONFIG_SND_FM801_TEA575X_BOOL - snd_tea575x_exit(&chip->tea); + if (!(chip->tea575x_tuner & TUNER_DISABLED)) + snd_tea575x_exit(&chip->tea); #endif if (chip->irq >= 0) free_irq(chip->irq, chip); @@ -1236,7 +1238,6 @@ static int __devinit snd_fm801_create(struct snd_card *card, (tea575x_tuner & TUNER_TYPE_MASK) < 4) { if (snd_tea575x_init(&chip->tea)) { snd_printk(KERN_ERR "TEA575x radio not found\n"); - snd_fm801_free(chip); return -ENODEV; } } else if ((tea575x_tuner & TUNER_TYPE_MASK) == 0) { @@ -1251,11 +1252,15 @@ static int __devinit snd_fm801_create(struct snd_card *card, } if (tea575x_tuner == 4) { snd_printk(KERN_ERR "TEA575x radio not found\n"); - snd_fm801_free(chip); - return -ENODEV; + chip->tea575x_tuner = TUNER_DISABLED; } } - strlcpy(chip->tea.card, snd_fm801_tea575x_gpios[(tea575x_tuner & TUNER_TYPE_MASK) - 1].name, sizeof(chip->tea.card)); + if (!(chip->tea575x_tuner & TUNER_DISABLED)) { + strlcpy(chip->tea.card, + snd_fm801_tea575x_gpios[(tea575x_tuner & + TUNER_TYPE_MASK) - 1].name, + sizeof(chip->tea.card)); + } #endif *rchip = chip;
signature.asc
Description: This is a digitally signed message part