diff options
Diffstat (limited to 'sound/pci/cmipci.c')
-rw-r--r-- | sound/pci/cmipci.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index 42227012c0b..315ba26bbd8 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -2818,7 +2818,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc static struct snd_device_ops ops = { .dev_free = snd_cmipci_dev_free, }; - unsigned int val = 0; + unsigned int val; long iomidi; int integrated_midi = 0; int pcm_index, pcm_spdif_index; @@ -2920,18 +2920,46 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc break; } - sprintf(card->shortname, "C-Media PCI %s", card->driver); - sprintf(card->longname, "%s (model %d) at 0x%lx, irq %i", - card->shortname, - cm->chip_version, - cm->iobase, - cm->irq); + sprintf(card->shortname, "C-Media %s", card->driver); + if (cm->chip_version < 68) { + val = pci->device < 0x110 ? 8338 : 8738; + sprintf(card->longname, + "C-Media CMI%d (model %d) at 0x%lx, irq %i", + val, cm->chip_version, cm->iobase, cm->irq); + } else { + switch (snd_cmipci_read_b(cm, CM_REG_INT_HLDCLR + 3) & 0x03) { + case 0: + val = 8769; + break; + case 2: + val = 8762; + break; + default: + switch ((pci->subsystem_vendor << 16) | + pci->subsystem_device) { + case 0x13f69761: + case 0x584d3741: + case 0x584d3751: + case 0x584d3761: + case 0x584d3771: + case 0x72848384: + val = 8770; + break; + default: + val = 8768; + break; + } + } + sprintf(card->longname, "C-Media CMI%d at 0x%lx, irq %i", + val, cm->iobase, cm->irq); + } if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, cm, &ops)) < 0) { snd_cmipci_free(cm); return err; } + val = 0; if (cm->chip_version > 33 && mpu_port[dev] == 1) { val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1); if (val != 0x00 && val != 0xff) { |