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.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c
index 0f171dd1377b..39daf62d2bad 100644
--- a/sound/pci/via82xx.c
+++ b/sound/pci/via82xx.c
@@ -123,6 +123,7 @@ module_param(enable, bool, 0444);
123#define VIA_REV_8233A 0x40 /* 1 rec, 1 multi-pb, spdf */ 123#define VIA_REV_8233A 0x40 /* 1 rec, 1 multi-pb, spdf */
124#define VIA_REV_8235 0x50 /* 2 rec, 4 pb, 1 multi-pb, spdif */ 124#define VIA_REV_8235 0x50 /* 2 rec, 4 pb, 1 multi-pb, spdif */
125#define VIA_REV_8237 0x60 125#define VIA_REV_8237 0x60
126#define VIA_REV_8251 0x70
126 127
127/* 128/*
128 * Direct registers 129 * Direct registers
@@ -395,7 +396,7 @@ struct via82xx {
395#endif 396#endif
396}; 397};
397 398
398static struct pci_device_id snd_via82xx_ids[] = { 399static struct pci_device_id snd_via82xx_ids[] __devinitdata = {
399 /* 0x1106, 0x3058 */ 400 /* 0x1106, 0x3058 */
400 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, }, /* 686A */ 401 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, }, /* 686A */
401 /* 0x1106, 0x3059 */ 402 /* 0x1106, 0x3059 */
@@ -862,6 +863,11 @@ static snd_pcm_uframes_t snd_via8233_pcm_pointer(struct snd_pcm_substream *subst
862 if (!status) 863 if (!status)
863 status = inb(VIADEV_REG(viadev, OFFSET_STATUS)); 864 status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
864 865
866 /* An apparent bug in the 8251 is worked around by sending a
867 * REG_CTRL_START. */
868 if (chip->revision == VIA_REV_8251 && (status & VIA_REG_STAT_EOL))
869 snd_via82xx_pcm_trigger(substream, SNDRV_PCM_TRIGGER_START);
870
865 if (!(status & VIA_REG_STAT_ACTIVE)) { 871 if (!(status & VIA_REG_STAT_ACTIVE)) {
866 res = 0; 872 res = 0;
867 goto unlock; 873 goto unlock;
@@ -2313,6 +2319,7 @@ static struct via823x_info via823x_cards[] __devinitdata = {
2313 { VIA_REV_8233A, "VIA 8233A", TYPE_VIA8233A }, 2319 { VIA_REV_8233A, "VIA 8233A", TYPE_VIA8233A },
2314 { VIA_REV_8235, "VIA 8235", TYPE_VIA8233 }, 2320 { VIA_REV_8235, "VIA 8235", TYPE_VIA8233 },
2315 { VIA_REV_8237, "VIA 8237", TYPE_VIA8233 }, 2321 { VIA_REV_8237, "VIA 8237", TYPE_VIA8233 },
2322 { VIA_REV_8251, "VIA 8251", TYPE_VIA8233 },
2316}; 2323};
2317 2324
2318/* 2325/*
@@ -2325,7 +2332,7 @@ struct dxs_whitelist {
2325 short action; /* new dxs_support value */ 2332 short action; /* new dxs_support value */
2326}; 2333};
2327 2334
2328static int __devinit check_dxs_list(struct pci_dev *pci) 2335static int __devinit check_dxs_list(struct pci_dev *pci, int revision)
2329{ 2336{
2330 static struct dxs_whitelist whitelist[] = { 2337 static struct dxs_whitelist whitelist[] = {
2331 { .subvendor = 0x1005, .subdevice = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */ 2338 { .subvendor = 0x1005, .subdevice = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */
@@ -2342,6 +2349,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2342 { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */ 2349 { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */
2343 { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */ 2350 { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */
2344 { .subvendor = 0x1043, .subdevice = 0x8174, .action = VIA_DXS_SRC }, /* ASUS */ 2351 { .subvendor = 0x1043, .subdevice = 0x8174, .action = VIA_DXS_SRC }, /* ASUS */
2352 { .subvendor = 0x1043, .subdevice = 0x81b9, .action = VIA_DXS_SRC }, /* ASUS A8V-MX */
2345 { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */ 2353 { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */
2346 { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */ 2354 { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */
2347 { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */ 2355 { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
@@ -2405,6 +2413,10 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2405 } 2413 }
2406 } 2414 }
2407 2415
2416 /* for newer revision, default to DXS_SRC */
2417 if (revision >= VIA_REV_8235)
2418 return VIA_DXS_SRC;
2419
2408 /* 2420 /*
2409 * not detected, try 48k rate only to be sure. 2421 * not detected, try 48k rate only to be sure.
2410 */ 2422 */
@@ -2449,7 +2461,7 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,
2449 } 2461 }
2450 if (chip_type != TYPE_VIA8233A) { 2462 if (chip_type != TYPE_VIA8233A) {
2451 if (dxs_support == VIA_DXS_AUTO) 2463 if (dxs_support == VIA_DXS_AUTO)
2452 dxs_support = check_dxs_list(pci); 2464 dxs_support = check_dxs_list(pci, revision);
2453 /* force to use VIA8233 or 8233A model according to 2465 /* force to use VIA8233 or 8233A model according to
2454 * dxs_support module option 2466 * dxs_support module option
2455 */ 2467 */