diff options
Diffstat (limited to 'sound/pci/via82xx.c')
-rw-r--r-- | sound/pci/via82xx.c | 18 |
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 | ||
398 | static struct pci_device_id snd_via82xx_ids[] = { | 399 | static 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 | ||
2328 | static int __devinit check_dxs_list(struct pci_dev *pci) | 2335 | static 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 | */ |