aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/via82xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/via82xx.c')
-rw-r--r--sound/pci/via82xx.c145
1 files changed, 82 insertions, 63 deletions
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c
index 9b4d74d49f98..42c48f0ce8e8 100644
--- a/sound/pci/via82xx.c
+++ b/sound/pci/via82xx.c
@@ -101,7 +101,7 @@ MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
101module_param_array(ac97_quirk, charp, NULL, 0444); 101module_param_array(ac97_quirk, charp, NULL, 0444);
102MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware."); 102MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
103module_param_array(dxs_support, int, NULL, 0444); 103module_param_array(dxs_support, int, NULL, 0444);
104MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA)"); 104MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA, 5 = enable any sample rate)");
105 105
106 106
107/* pci ids */ 107/* pci ids */
@@ -302,6 +302,7 @@ DEFINE_VIA_REGSET(CAPTURE_8233, 0x60);
302#define VIA_DXS_DISABLE 2 302#define VIA_DXS_DISABLE 2
303#define VIA_DXS_48K 3 303#define VIA_DXS_48K 3
304#define VIA_DXS_NO_VRA 4 304#define VIA_DXS_NO_VRA 4
305#define VIA_DXS_SRC 5
305 306
306 307
307/* 308/*
@@ -380,6 +381,7 @@ struct _snd_via82xx {
380 struct via_rate_lock rates[2]; /* playback and capture */ 381 struct via_rate_lock rates[2]; /* playback and capture */
381 unsigned int dxs_fixed: 1; /* DXS channel accepts only 48kHz */ 382 unsigned int dxs_fixed: 1; /* DXS channel accepts only 48kHz */
382 unsigned int no_vra: 1; /* no need to set VRA on DXS channels */ 383 unsigned int no_vra: 1; /* no need to set VRA on DXS channels */
384 unsigned int dxs_src: 1; /* use full SRC capabilities of DXS */
383 unsigned int spdif_on: 1; /* only spdif rates work to external DACs */ 385 unsigned int spdif_on: 1; /* only spdif rates work to external DACs */
384 386
385 snd_pcm_t *pcms[2]; 387 snd_pcm_t *pcms[2];
@@ -489,10 +491,8 @@ static int clean_via_table(viadev_t *dev, snd_pcm_substream_t *substream,
489 snd_dma_free_pages(&dev->table); 491 snd_dma_free_pages(&dev->table);
490 dev->table.area = NULL; 492 dev->table.area = NULL;
491 } 493 }
492 if (dev->idx_table) { 494 kfree(dev->idx_table);
493 kfree(dev->idx_table); 495 dev->idx_table = NULL;
494 dev->idx_table = NULL;
495 }
496 return 0; 496 return 0;
497} 497}
498 498
@@ -924,15 +924,17 @@ static int snd_via8233_playback_prepare(snd_pcm_substream_t *substream)
924 via82xx_t *chip = snd_pcm_substream_chip(substream); 924 via82xx_t *chip = snd_pcm_substream_chip(substream);
925 viadev_t *viadev = (viadev_t *)substream->runtime->private_data; 925 viadev_t *viadev = (viadev_t *)substream->runtime->private_data;
926 snd_pcm_runtime_t *runtime = substream->runtime; 926 snd_pcm_runtime_t *runtime = substream->runtime;
927 int ac97_rate = chip->dxs_src ? 48000 : runtime->rate;
927 int rate_changed; 928 int rate_changed;
928 u32 rbits; 929 u32 rbits;
929 930
930 if ((rate_changed = via_lock_rate(&chip->rates[0], runtime->rate)) < 0) 931 if ((rate_changed = via_lock_rate(&chip->rates[0], ac97_rate)) < 0)
931 return rate_changed; 932 return rate_changed;
932 if (rate_changed) { 933 if (rate_changed) {
933 snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, 934 snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE,
934 chip->no_vra ? 48000 : runtime->rate); 935 chip->no_vra ? 48000 : runtime->rate);
935 snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate); 936 snd_ac97_set_rate(chip->ac97, AC97_SPDIF,
937 chip->no_vra ? 48000 : runtime->rate);
936 } 938 }
937 if (runtime->rate == 48000) 939 if (runtime->rate == 48000)
938 rbits = 0xfffff; 940 rbits = 0xfffff;
@@ -1074,6 +1076,12 @@ static int snd_via82xx_pcm_open(via82xx_t *chip, viadev_t *viadev, snd_pcm_subst
1074 /* fixed DXS playback rate */ 1076 /* fixed DXS playback rate */
1075 runtime->hw.rates = SNDRV_PCM_RATE_48000; 1077 runtime->hw.rates = SNDRV_PCM_RATE_48000;
1076 runtime->hw.rate_min = runtime->hw.rate_max = 48000; 1078 runtime->hw.rate_min = runtime->hw.rate_max = 48000;
1079 } else if (chip->dxs_src && viadev->reg_offset < 0x40) {
1080 /* use full SRC capabilities of DXS */
1081 runtime->hw.rates = (SNDRV_PCM_RATE_CONTINUOUS |
1082 SNDRV_PCM_RATE_8000_48000);
1083 runtime->hw.rate_min = 8000;
1084 runtime->hw.rate_max = 48000;
1077 } else if (! ratep->rate) { 1085 } else if (! ratep->rate) {
1078 int idx = viadev->direction ? AC97_RATES_ADC : AC97_RATES_FRONT_DAC; 1086 int idx = viadev->direction ? AC97_RATES_ADC : AC97_RATES_FRONT_DAC;
1079 runtime->hw.rates = chip->ac97->rates[idx]; 1087 runtime->hw.rates = chip->ac97->rates[idx];
@@ -1550,51 +1558,51 @@ static void snd_via82xx_mixer_free_ac97(ac97_t *ac97)
1550 1558
1551static struct ac97_quirk ac97_quirks[] = { 1559static struct ac97_quirk ac97_quirks[] = {
1552 { 1560 {
1553 .vendor = 0x1106, 1561 .subvendor = 0x1106,
1554 .device = 0x4161, 1562 .subdevice = 0x4161,
1555 .codec_id = 0x56494161, /* VT1612A */ 1563 .codec_id = 0x56494161, /* VT1612A */
1556 .name = "Soltek SL-75DRV5", 1564 .name = "Soltek SL-75DRV5",
1557 .type = AC97_TUNE_NONE 1565 .type = AC97_TUNE_NONE
1558 }, 1566 },
1559 { /* FIXME: which codec? */ 1567 { /* FIXME: which codec? */
1560 .vendor = 0x1106, 1568 .subvendor = 0x1106,
1561 .device = 0x4161, 1569 .subdevice = 0x4161,
1562 .name = "ASRock K7VT2", 1570 .name = "ASRock K7VT2",
1563 .type = AC97_TUNE_HP_ONLY 1571 .type = AC97_TUNE_HP_ONLY
1564 }, 1572 },
1565 { 1573 {
1566 .vendor = 0x1019, 1574 .subvendor = 0x1019,
1567 .device = 0x0a81, 1575 .subdevice = 0x0a81,
1568 .name = "ECS K7VTA3", 1576 .name = "ECS K7VTA3",
1569 .type = AC97_TUNE_HP_ONLY 1577 .type = AC97_TUNE_HP_ONLY
1570 }, 1578 },
1571 { 1579 {
1572 .vendor = 0x1019, 1580 .subvendor = 0x1019,
1573 .device = 0x0a85, 1581 .subdevice = 0x0a85,
1574 .name = "ECS L7VMM2", 1582 .name = "ECS L7VMM2",
1575 .type = AC97_TUNE_HP_ONLY 1583 .type = AC97_TUNE_HP_ONLY
1576 }, 1584 },
1577 { 1585 {
1578 .vendor = 0x1849, 1586 .subvendor = 0x1849,
1579 .device = 0x3059, 1587 .subdevice = 0x3059,
1580 .name = "ASRock K7VM2", 1588 .name = "ASRock K7VM2",
1581 .type = AC97_TUNE_HP_ONLY /* VT1616 */ 1589 .type = AC97_TUNE_HP_ONLY /* VT1616 */
1582 }, 1590 },
1583 { 1591 {
1584 .vendor = 0x14cd, 1592 .subvendor = 0x14cd,
1585 .device = 0x7002, 1593 .subdevice = 0x7002,
1586 .name = "Unknown", 1594 .name = "Unknown",
1587 .type = AC97_TUNE_ALC_JACK 1595 .type = AC97_TUNE_ALC_JACK
1588 }, 1596 },
1589 { 1597 {
1590 .vendor = 0x1071, 1598 .subvendor = 0x1071,
1591 .device = 0x8590, 1599 .subdevice = 0x8590,
1592 .name = "Mitac Mobo", 1600 .name = "Mitac Mobo",
1593 .type = AC97_TUNE_ALC_JACK 1601 .type = AC97_TUNE_ALC_JACK
1594 }, 1602 },
1595 { 1603 {
1596 .vendor = 0x161f, 1604 .subvendor = 0x161f,
1597 .device = 0x202b, 1605 .subdevice = 0x202b,
1598 .name = "Arima Notebook", 1606 .name = "Arima Notebook",
1599 .type = AC97_TUNE_HP_ONLY, 1607 .type = AC97_TUNE_HP_ONLY,
1600 }, 1608 },
@@ -2132,8 +2140,8 @@ static struct via823x_info via823x_cards[] __devinitdata = {
2132 * auto detection of DXS channel supports. 2140 * auto detection of DXS channel supports.
2133 */ 2141 */
2134struct dxs_whitelist { 2142struct dxs_whitelist {
2135 unsigned short vendor; 2143 unsigned short subvendor;
2136 unsigned short device; 2144 unsigned short subdevice;
2137 unsigned short mask; 2145 unsigned short mask;
2138 short action; /* new dxs_support value */ 2146 short action; /* new dxs_support value */
2139}; 2147};
@@ -2141,38 +2149,44 @@ struct dxs_whitelist {
2141static int __devinit check_dxs_list(struct pci_dev *pci) 2149static int __devinit check_dxs_list(struct pci_dev *pci)
2142{ 2150{
2143 static struct dxs_whitelist whitelist[] = { 2151 static struct dxs_whitelist whitelist[] = {
2144 { .vendor = 0x1005, .device = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */ 2152 { .subvendor = 0x1005, .subdevice = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */
2145 { .vendor = 0x1019, .device = 0x0996, .action = VIA_DXS_48K }, 2153 { .subvendor = 0x1019, .subdevice = 0x0996, .action = VIA_DXS_48K },
2146 { .vendor = 0x1019, .device = 0x0a81, .action = VIA_DXS_NO_VRA }, /* ECS K7VTA3 v8.0 */ 2154 { .subvendor = 0x1019, .subdevice = 0x0a81, .action = VIA_DXS_NO_VRA }, /* ECS K7VTA3 v8.0 */
2147 { .vendor = 0x1019, .device = 0x0a85, .action = VIA_DXS_NO_VRA }, /* ECS L7VMM2 */ 2155 { .subvendor = 0x1019, .subdevice = 0x0a85, .action = VIA_DXS_NO_VRA }, /* ECS L7VMM2 */
2148 { .vendor = 0x1025, .device = 0x0033, .action = VIA_DXS_NO_VRA }, /* Acer Inspire 1353LM */ 2156 { .subvendor = 0x1025, .subdevice = 0x0033, .action = VIA_DXS_NO_VRA }, /* Acer Inspire 1353LM */
2149 { .vendor = 0x1043, .device = 0x8095, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8X (FIXME: possibly VIA_DXS_ENABLE?)*/ 2157 { .subvendor = 0x1043, .subdevice = 0x8095, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8X (FIXME: possibly VIA_DXS_ENABLE?)*/
2150 { .vendor = 0x1043, .device = 0x80a1, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8-X */ 2158 { .subvendor = 0x1043, .subdevice = 0x80a1, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8-X */
2151 { .vendor = 0x1043, .device = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/ 2159 { .subvendor = 0x1043, .subdevice = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/
2152 { .vendor = 0x1071, .device = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */ 2160 { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */
2153 { .vendor = 0x10cf, .device = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */ 2161 { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */
2154 { .vendor = 0x1106, .device = 0x4161, .action = VIA_DXS_NO_VRA }, /* ASRock K7VT2 */ 2162 { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */
2155 { .vendor = 0x1106, .device = 0x4552, .action = VIA_DXS_NO_VRA }, /* QDI Kudoz 7X/600-6AL */ 2163 { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
2156 { .vendor = 0x1106, .device = 0xaa01, .action = VIA_DXS_NO_VRA }, /* EPIA MII */ 2164 { .subvendor = 0x1106, .subdevice = 0x4161, .action = VIA_DXS_NO_VRA }, /* ASRock K7VT2 */
2157 { .vendor = 0x1297, .device = 0xa232, .action = VIA_DXS_ENABLE }, /* Shuttle ?? */ 2165 { .subvendor = 0x1106, .subdevice = 0x4552, .action = VIA_DXS_NO_VRA }, /* QDI Kudoz 7X/600-6AL */
2158 { .vendor = 0x1297, .device = 0xc160, .action = VIA_DXS_ENABLE }, /* Shuttle SK41G */ 2166 { .subvendor = 0x1106, .subdevice = 0xaa01, .action = VIA_DXS_NO_VRA }, /* EPIA MII */
2159 { .vendor = 0x1458, .device = 0xa002, .action = VIA_DXS_ENABLE }, /* Gigabyte GA-7VAXP */ 2167 { .subvendor = 0x1106, .subdevice = 0xc001, .action = VIA_DXS_SRC }, /* Insight P4-ITX */
2160 { .vendor = 0x1462, .device = 0x3800, .action = VIA_DXS_ENABLE }, /* MSI KT266 */ 2168 { .subvendor = 0x1297, .subdevice = 0xa232, .action = VIA_DXS_ENABLE }, /* Shuttle ?? */
2161 { .vendor = 0x1462, .device = 0x5901, .action = VIA_DXS_NO_VRA }, /* MSI KT6 Delta-SR */ 2169 { .subvendor = 0x1297, .subdevice = 0xc160, .action = VIA_DXS_ENABLE }, /* Shuttle SK41G */
2162 { .vendor = 0x1462, .device = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */ 2170 { .subvendor = 0x1458, .subdevice = 0xa002, .action = VIA_DXS_ENABLE }, /* Gigabyte GA-7VAXP */
2163 { .vendor = 0x1462, .device = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */ 2171 { .subvendor = 0x1462, .subdevice = 0x0080, .action = VIA_DXS_SRC }, /* MSI K8T Neo-FIS2R */
2164 { .vendor = 0x147b, .device = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */ 2172 { .subvendor = 0x1462, .subdevice = 0x3800, .action = VIA_DXS_ENABLE }, /* MSI KT266 */
2165 { .vendor = 0x147b, .device = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */ 2173 { .subvendor = 0x1462, .subdevice = 0x5901, .action = VIA_DXS_NO_VRA }, /* MSI KT6 Delta-SR */
2166 { .vendor = 0x147b, .device = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */ 2174 { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */
2167 { .vendor = 0x147b, .device = 0x1415, .action = VIA_DXS_NO_VRA }, /* Abit AV8 */ 2175 { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */
2168 { .vendor = 0x14ff, .device = 0x0403, .action = VIA_DXS_ENABLE }, /* Twinhead mobo */ 2176 { .subvendor = 0x147b, .subdevice = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */
2169 { .vendor = 0x1584, .device = 0x8120, .action = VIA_DXS_ENABLE }, /* Gericom/Targa/Vobis/Uniwill laptop */ 2177 { .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */
2170 { .vendor = 0x1584, .device = 0x8123, .action = VIA_DXS_NO_VRA }, /* Uniwill (Targa Visionary XP-210) */ 2178 { .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */
2171 { .vendor = 0x161f, .device = 0x202b, .action = VIA_DXS_NO_VRA }, /* Amira Note book */ 2179 { .subvendor = 0x147b, .subdevice = 0x1415, .action = VIA_DXS_NO_VRA }, /* Abit AV8 */
2172 { .vendor = 0x161f, .device = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */ 2180 { .subvendor = 0x14ff, .subdevice = 0x0403, .action = VIA_DXS_ENABLE }, /* Twinhead mobo */
2173 { .vendor = 0x1631, .device = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */ 2181 { .subvendor = 0x14ff, .subdevice = 0x0408, .action = VIA_DXS_NO_VRA }, /* Twinhead mobo */
2174 { .vendor = 0x1695, .device = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */ 2182 { .subvendor = 0x1584, .subdevice = 0x8120, .action = VIA_DXS_ENABLE }, /* Gericom/Targa/Vobis/Uniwill laptop */
2175 { .vendor = 0x1849, .device = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */ 2183 { .subvendor = 0x1584, .subdevice = 0x8123, .action = VIA_DXS_NO_VRA }, /* Uniwill (Targa Visionary XP-210) */
2184 { .subvendor = 0x161f, .subdevice = 0x202b, .action = VIA_DXS_NO_VRA }, /* Amira Note book */
2185 { .subvendor = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */
2186 { .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */
2187 { .subvendor = 0x1695, .subdevice = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */
2188 { .subvendor = 0x1849, .subdevice = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */
2189 { .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */
2176 { } /* terminator */ 2190 { } /* terminator */
2177 }; 2191 };
2178 struct dxs_whitelist *w; 2192 struct dxs_whitelist *w;
@@ -2182,14 +2196,14 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2182 pci_read_config_word(pci, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vendor); 2196 pci_read_config_word(pci, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vendor);
2183 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &subsystem_device); 2197 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &subsystem_device);
2184 2198
2185 for (w = whitelist; w->vendor; w++) { 2199 for (w = whitelist; w->subvendor; w++) {
2186 if (w->vendor != subsystem_vendor) 2200 if (w->subvendor != subsystem_vendor)
2187 continue; 2201 continue;
2188 if (w->mask) { 2202 if (w->mask) {
2189 if ((w->mask & subsystem_device) == w->device) 2203 if ((w->mask & subsystem_device) == w->subdevice)
2190 return w->action; 2204 return w->action;
2191 } else { 2205 } else {
2192 if (subsystem_device == w->device) 2206 if (subsystem_device == w->subdevice)
2193 return w->action; 2207 return w->action;
2194 } 2208 }
2195 } 2209 }
@@ -2198,8 +2212,9 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2198 * not detected, try 48k rate only to be sure. 2212 * not detected, try 48k rate only to be sure.
2199 */ 2213 */
2200 printk(KERN_INFO "via82xx: Assuming DXS channels with 48k fixed sample rate.\n"); 2214 printk(KERN_INFO "via82xx: Assuming DXS channels with 48k fixed sample rate.\n");
2201 printk(KERN_INFO " Please try dxs_support=1 or dxs_support=4 option\n"); 2215 printk(KERN_INFO " Please try dxs_support=5 option\n");
2202 printk(KERN_INFO " and report if it works on your machine.\n"); 2216 printk(KERN_INFO " and report if it works on your machine.\n");
2217 printk(KERN_INFO " For more details, read ALSA-Configuration.txt.\n");
2203 return VIA_DXS_48K; 2218 return VIA_DXS_48K;
2204}; 2219};
2205 2220
@@ -2288,6 +2303,10 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,
2288 chip->dxs_fixed = 1; 2303 chip->dxs_fixed = 1;
2289 else if (dxs_support[dev] == VIA_DXS_NO_VRA) 2304 else if (dxs_support[dev] == VIA_DXS_NO_VRA)
2290 chip->no_vra = 1; 2305 chip->no_vra = 1;
2306 else if (dxs_support[dev] == VIA_DXS_SRC) {
2307 chip->no_vra = 1;
2308 chip->dxs_src = 1;
2309 }
2291 } 2310 }
2292 if ((err = snd_via8233_init_misc(chip, dev)) < 0) 2311 if ((err = snd_via8233_init_misc(chip, dev)) < 0)
2293 goto __error; 2312 goto __error;
@@ -2334,7 +2353,7 @@ static struct pci_driver driver = {
2334 2353
2335static int __init alsa_card_via82xx_init(void) 2354static int __init alsa_card_via82xx_init(void)
2336{ 2355{
2337 return pci_module_init(&driver); 2356 return pci_register_driver(&driver);
2338} 2357}
2339 2358
2340static void __exit alsa_card_via82xx_exit(void) 2359static void __exit alsa_card_via82xx_exit(void)