forked from Minki/linux
[ALSA] hda-intel - Probe additional slots only if necessary
Probing the codec slots on ATI controller causes problems on some devices like Acer laptops. On these devices, reading from codec slot 3 results in the communication failure with the codec chip. Meanwhile, some laptops (e.g. Gateway) have the codec connection only on slot 3, and probing this slot is mandatory for them. The patch improves the probing robustness. The additional slots are now checked only when no codecs are found in the primary three slots. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
parent
4505179c73
commit
19a982b694
@ -198,6 +198,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
|
|||||||
#define RIRB_INT_MASK 0x05
|
#define RIRB_INT_MASK 0x05
|
||||||
|
|
||||||
/* STATESTS int mask: SD2,SD1,SD0 */
|
/* STATESTS int mask: SD2,SD1,SD0 */
|
||||||
|
#define AZX_MAX_CODECS 3
|
||||||
#define STATESTS_INT_MASK 0x07
|
#define STATESTS_INT_MASK 0x07
|
||||||
|
|
||||||
/* SD_CTL bits */
|
/* SD_CTL bits */
|
||||||
@ -991,7 +992,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
codecs = 0;
|
codecs = 0;
|
||||||
for (c = 0; c < azx_max_codecs[chip->driver_type]; c++) {
|
for (c = 0; c < AZX_MAX_CODECS; c++) {
|
||||||
if ((chip->codec_mask & (1 << c)) & probe_mask) {
|
if ((chip->codec_mask & (1 << c)) & probe_mask) {
|
||||||
err = snd_hda_codec_new(chip->bus, c, NULL);
|
err = snd_hda_codec_new(chip->bus, c, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -999,7 +1000,18 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
|
|||||||
codecs++;
|
codecs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (! codecs) {
|
if (!codecs) {
|
||||||
|
/* probe additional slots if no codec is found */
|
||||||
|
for (; c < azx_max_codecs[chip->driver_type]; c++) {
|
||||||
|
if ((chip->codec_mask & (1 << c)) & probe_mask) {
|
||||||
|
err = snd_hda_codec_new(chip->bus, c, NULL);
|
||||||
|
if (err < 0)
|
||||||
|
continue;
|
||||||
|
codecs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!codecs) {
|
||||||
snd_printk(KERN_ERR SFX "no codecs initialized\n");
|
snd_printk(KERN_ERR SFX "no codecs initialized\n");
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user