diff -r 1227a1c12325 pci/hda/hda_intel.c --- a/pci/hda/hda_intel.c Mon Dec 24 14:40:56 2007 +0100 +++ b/pci/hda/hda_intel.c Thu Jan 03 15:27:10 2008 -0800 @@ -1709,12 +1709,13 @@ static int __devinit azx_create(struct s { struct azx *chip; int err; + unsigned short gcap; static struct snd_device_ops ops = { .dev_free = azx_dev_free, }; *rchip = NULL; - + err = pci_enable_device(pci); if (err < 0) return err; @@ -1790,10 +1791,19 @@ static int __devinit azx_create(struct s chip->capture_index_offset = ATIHDMI_CAPTURE_INDEX; break; default: - chip->playback_streams = ICH6_NUM_PLAYBACK; - chip->capture_streams = ICH6_NUM_CAPTURE; - chip->playback_index_offset = ICH6_PLAYBACK_INDEX; - chip->capture_index_offset = ICH6_CAPTURE_INDEX; + /* read number of streams from GCAP register instead of using + * hardcoded value + */ + gcap = azx_readw(chip, GCAP); + if(!gcap) { + snd_printk(KERN_ERR "Device has no streams \n"); + goto errout; + }; + chip->playback_streams = (gcap&(0xF<<12))>>12; + chip->capture_streams = (gcap&(0xF<<8))>>8; + chip->playback_index_offset = (gcap&(0xF<<12))>>12; + chip->capture_index_offset = 0; + break; } chip->num_streams = chip->playback_streams + chip->capture_streams;