Update of /cvsroot/alsa/alsa-kernel/pci In directory sc8-pr-cvs1:/tmp/cvs-serv22821
Modified Files: intel8x0.c Log Message: - improved the probe/resume function. check only the valid codec bits in chip_init() during resume. Index: intel8x0.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/intel8x0.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -r1.86 -r1.87 --- intel8x0.c 30 Jul 2003 10:54:03 -0000 1.86 +++ intel8x0.c 30 Jul 2003 14:39:38 -0000 1.87 @@ -523,6 +523,19 @@ /* * access to AC97 codec via normal i/o (for ICH and SIS7012) */ + +/* return the GLOB_STA bit for the corresponding codec */ +static unsigned int get_ich_codec_bit(intel8x0_t *chip, unsigned int codec) +{ + static unsigned int codec_bit[3] = { + ICH_PCR, ICH_SCR, ICH_TCR + }; + snd_assert(codec < 3, return ICH_PCR); + if (chip->device_type == DEVICE_INTEL_ICH4) + codec = chip->ac97_sdin[codec]; + return codec_bit[codec]; +} + static int snd_intel8x0_codec_semaphore(intel8x0_t *chip, unsigned int codec) { int time; @@ -534,19 +547,7 @@ /* so we check any */ codec = ICH_PCR | ICH_SCR | ICH_TCR; } else { - if (chip->device_type == DEVICE_INTEL_ICH4) { - switch (chip->ac97_sdin[codec]) { - case 0: codec = ICH_PCR; break; - case 1: codec = ICH_SCR; break; - case 2: codec = ICH_TCR; break; - } - } else { - switch (codec) { - case 0: codec = ICH_PCR; break; - case 1: codec = ICH_SCR; break; - case 2: codec = ICH_TCR; break; - } - } + codec = get_ich_codec_bit(chip, codec); } /* codec ready ? */ @@ -1731,9 +1732,14 @@ } } ac97.pci = chip->pci; - if ((err = snd_ac97_mixer(chip->card, &ac97, &x97)) < 0) + if ((err = snd_ac97_mixer(chip->card, &ac97, &x97)) < 0) { + /* clear the cold-reset bit for the next chance */ + if (chip->device_type != DEVICE_ALI) + iputdword(chip, ICHREG(GLOB_CNT), igetdword(chip, ICHREG(GLOB_CNT)) & ~ICH_AC97COLD); return err; + } chip->ac97[0] = x97; + /* tune up the primary codec */ snd_ac97_tune_hardware(chip->ac97[0], ac97_quirks); /* the following three entries are common among all devices */ chip->ichd[ICHD_PCMOUT].ac97 = x97; @@ -1886,7 +1892,7 @@ schedule_timeout(1);\ } while (0) -static int snd_intel8x0_ich_chip_init(intel8x0_t *chip) +static int snd_intel8x0_ich_chip_init(intel8x0_t *chip, int probing) { unsigned long end_time; unsigned int cnt, status, nstatus; @@ -1915,49 +1921,55 @@ return -EIO; __ok: - /* wait for any codec ready status. - * Once it becomes ready it should remain ready - * as long as we do not disable the ac97 link. - */ - end_time = jiffies + HZ; - do { - status = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); - if (status) - goto __ok1; - do_delay(chip); - } while (time_after_eq(end_time, jiffies)); - snd_printk(KERN_ERR "codec_ready: codec is not ready [0x%x]\n", igetdword(chip, ICHREG(GLOB_STA))); - return -EIO; - - __ok1: - if (status == (ICH_PCR | ICH_SCR | ICH_TCR)) - goto __ok3; - /* wait for other codecs ready status. No secondary codecs? , ok */ - end_time = jiffies + HZ / 4; - do { - nstatus = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); - if (nstatus != status) { - status = nstatus; - goto __ok2; + if (probing) { + /* wait for any codec ready status. + * Once it becomes ready it should remain ready + * as long as we do not disable the ac97 link. + */ + end_time = jiffies + HZ; + do { + status = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); + if (status) + break; + do_delay(chip); + } while (time_after_eq(end_time, jiffies)); + if (! status) { + /* no codec is found */ + snd_printk(KERN_ERR "codec_ready: codec is not ready [0x%x]\n", igetdword(chip, ICHREG(GLOB_STA))); + return -EIO; } - do_delay(chip); - } while (time_after_eq(end_time, jiffies)); - __ok2: - if (status == (ICH_PCR | ICH_SCR | ICH_TCR)) - goto __ok3; - /* wait for other codecs ready status. No other secondary codecs? , ok */ - /* end_time is not initialized here */ - do { - nstatus = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); - if (nstatus != status) { - status = nstatus; - goto __ok2; + if (chip->device_type == DEVICE_INTEL_ICH4) + /* ICH4 can have three codecs */ + nstatus = ICH_PCR | ICH_SCR | ICH_TCR; + else + /* others up to two codecs */ + nstatus = ICH_PCR | ICH_SCR; + + /* wait for other codecs ready status. */ + end_time = jiffies + HZ / 4; + while (status != nstatus && time_after_eq(end_time, jiffies)) { + do_delay(chip); + status |= igetdword(chip, ICHREG(GLOB_STA)) & nstatus; } - do_delay(chip); - } while (time_after_eq(end_time, jiffies)); - __ok3: + } else { + /* resume phase */ + int i; + status = 0; + for (i = 0; i < 3; i++) + if (chip->ac97[i]) + status |= get_ich_codec_bit(chip, i); + /* wait until all the probed codecs are ready */ + end_time = jiffies + HZ; + do { + nstatus = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); + if (status == nstatus) + break; + do_delay(chip); + } while (time_after_eq(end_time, jiffies)); + } + if (chip->device_type == DEVICE_SIS) { /* unmute the output on SIS7012 */ iputword(chip, 0x4c, igetword(chip, 0x4c) | 1); @@ -1972,7 +1984,7 @@ return 0; } -static int snd_intel8x0_ali_chip_init(intel8x0_t *chip) +static int snd_intel8x0_ali_chip_init(intel8x0_t *chip, int probing) { u32 reg; int i = 0; @@ -1991,7 +2003,8 @@ do_delay(chip); } snd_printk(KERN_ERR "AC'97 reset failed.\n"); - return -EIO; + if (probing) + return -EIO; __ok: for (i = 0; i < HZ / 2; i++) { @@ -2006,17 +2019,17 @@ return 0; } -static int snd_intel8x0_chip_init(intel8x0_t *chip) +static int snd_intel8x0_chip_init(intel8x0_t *chip, int probing) { unsigned int i; int err; if (chip->device_type != DEVICE_ALI) { - if ((err = snd_intel8x0_ich_chip_init(chip)) < 0) + if ((err = snd_intel8x0_ich_chip_init(chip, probing)) < 0) return err; iagetword(chip, 0); /* clear semaphore flag */ } else { - if ((err = snd_intel8x0_ali_chip_init(chip)) < 0) + if ((err = snd_intel8x0_ali_chip_init(chip, probing)) < 0) return err; } @@ -2104,7 +2117,7 @@ pci_enable_device(chip->pci); pci_set_master(chip->pci); - snd_intel8x0_chip_init(chip); + snd_intel8x0_chip_init(chip, 0); for (i = 0; i < 3; i++) if (chip->ac97[i]) snd_ac97_resume(chip->ac97[i]); @@ -2462,7 +2475,7 @@ chip->int_sta_reg = device_type == DEVICE_ALI ? ICH_REG_ALI_INTERRUPTSR : ICH_REG_GLOB_STA; chip->int_sta_mask = int_sta_masks; - if ((err = snd_intel8x0_chip_init(chip)) < 0) { + if ((err = snd_intel8x0_chip_init(chip, 1)) < 0) { snd_intel8x0_free(chip); return err; } ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog