diff options
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 25f35fa9706e..5f2c3ca863db 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -1708,12 +1708,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
1708 | { | 1708 | { |
1709 | struct azx *chip; | 1709 | struct azx *chip; |
1710 | int err; | 1710 | int err; |
1711 | unsigned short gcap; | ||
1711 | static struct snd_device_ops ops = { | 1712 | static struct snd_device_ops ops = { |
1712 | .dev_free = azx_dev_free, | 1713 | .dev_free = azx_dev_free, |
1713 | }; | 1714 | }; |
1714 | 1715 | ||
1715 | *rchip = NULL; | 1716 | *rchip = NULL; |
1716 | 1717 | ||
1717 | err = pci_enable_device(pci); | 1718 | err = pci_enable_device(pci); |
1718 | if (err < 0) | 1719 | if (err < 0) |
1719 | return err; | 1720 | return err; |
@@ -1775,25 +1776,40 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
1775 | pci_set_master(pci); | 1776 | pci_set_master(pci); |
1776 | synchronize_irq(chip->irq); | 1777 | synchronize_irq(chip->irq); |
1777 | 1778 | ||
1778 | switch (chip->driver_type) { | 1779 | gcap = azx_readw(chip, GCAP); |
1779 | case AZX_DRIVER_ULI: | 1780 | snd_printdd("chipset global capabilities = 0x%x\n", gcap); |
1780 | chip->playback_streams = ULI_NUM_PLAYBACK; | 1781 | |
1781 | chip->capture_streams = ULI_NUM_CAPTURE; | 1782 | if (gcap) { |
1782 | chip->playback_index_offset = ULI_PLAYBACK_INDEX; | 1783 | /* read number of streams from GCAP register instead of using |
1783 | chip->capture_index_offset = ULI_CAPTURE_INDEX; | 1784 | * hardcoded value |
1784 | break; | 1785 | */ |
1785 | case AZX_DRIVER_ATIHDMI: | 1786 | chip->playback_streams = (gcap & (0xF << 12)) >> 12; |
1786 | chip->playback_streams = ATIHDMI_NUM_PLAYBACK; | 1787 | chip->capture_streams = (gcap & (0xF << 8)) >> 8; |
1787 | chip->capture_streams = ATIHDMI_NUM_CAPTURE; | 1788 | chip->playback_index_offset = (gcap & (0xF << 12)) >> 12; |
1788 | chip->playback_index_offset = ATIHDMI_PLAYBACK_INDEX; | 1789 | chip->capture_index_offset = 0; |
1789 | chip->capture_index_offset = ATIHDMI_CAPTURE_INDEX; | 1790 | } else { |
1790 | break; | 1791 | /* gcap didn't give any info, switching to old method */ |
1791 | default: | 1792 | |
1792 | chip->playback_streams = ICH6_NUM_PLAYBACK; | 1793 | switch (chip->driver_type) { |
1793 | chip->capture_streams = ICH6_NUM_CAPTURE; | 1794 | case AZX_DRIVER_ULI: |
1794 | chip->playback_index_offset = ICH6_PLAYBACK_INDEX; | 1795 | chip->playback_streams = ULI_NUM_PLAYBACK; |
1795 | chip->capture_index_offset = ICH6_CAPTURE_INDEX; | 1796 | chip->capture_streams = ULI_NUM_CAPTURE; |
1796 | break; | 1797 | chip->playback_index_offset = ULI_PLAYBACK_INDEX; |
1798 | chip->capture_index_offset = ULI_CAPTURE_INDEX; | ||
1799 | break; | ||
1800 | case AZX_DRIVER_ATIHDMI: | ||
1801 | chip->playback_streams = ATIHDMI_NUM_PLAYBACK; | ||
1802 | chip->capture_streams = ATIHDMI_NUM_CAPTURE; | ||
1803 | chip->playback_index_offset = ATIHDMI_PLAYBACK_INDEX; | ||
1804 | chip->capture_index_offset = ATIHDMI_CAPTURE_INDEX; | ||
1805 | break; | ||
1806 | default: | ||
1807 | chip->playback_streams = ICH6_NUM_PLAYBACK; | ||
1808 | chip->capture_streams = ICH6_NUM_CAPTURE; | ||
1809 | chip->playback_index_offset = ICH6_PLAYBACK_INDEX; | ||
1810 | chip->capture_index_offset = ICH6_CAPTURE_INDEX; | ||
1811 | break; | ||
1812 | } | ||
1797 | } | 1813 | } |
1798 | chip->num_streams = chip->playback_streams + chip->capture_streams; | 1814 | chip->num_streams = chip->playback_streams + chip->capture_streams; |
1799 | chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev), | 1815 | chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev), |