diff options
Diffstat (limited to 'sound/pci/intel8x0.c')
-rw-r--r-- | sound/pci/intel8x0.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index cc16f95f9cef..7c806bd9cc90 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -424,6 +424,7 @@ struct _snd_intel8x0 { | |||
424 | unsigned xbox: 1; /* workaround for Xbox AC'97 detection */ | 424 | unsigned xbox: 1; /* workaround for Xbox AC'97 detection */ |
425 | 425 | ||
426 | int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */ | 426 | int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */ |
427 | unsigned int sdm_saved; /* SDM reg value */ | ||
427 | 428 | ||
428 | ac97_bus_t *ac97_bus; | 429 | ac97_bus_t *ac97_bus; |
429 | ac97_t *ac97[3]; | 430 | ac97_t *ac97[3]; |
@@ -2373,6 +2374,8 @@ static int intel8x0_suspend(snd_card_t *card, pm_message_t state) | |||
2373 | for (i = 0; i < 3; i++) | 2374 | for (i = 0; i < 3; i++) |
2374 | if (chip->ac97[i]) | 2375 | if (chip->ac97[i]) |
2375 | snd_ac97_suspend(chip->ac97[i]); | 2376 | snd_ac97_suspend(chip->ac97[i]); |
2377 | if (chip->device_type == DEVICE_INTEL_ICH4) | ||
2378 | chip->sdm_saved = igetbyte(chip, ICHREG(SDM)); | ||
2376 | pci_disable_device(chip->pci); | 2379 | pci_disable_device(chip->pci); |
2377 | return 0; | 2380 | return 0; |
2378 | } | 2381 | } |
@@ -2386,6 +2389,16 @@ static int intel8x0_resume(snd_card_t *card) | |||
2386 | pci_set_master(chip->pci); | 2389 | pci_set_master(chip->pci); |
2387 | snd_intel8x0_chip_init(chip, 0); | 2390 | snd_intel8x0_chip_init(chip, 0); |
2388 | 2391 | ||
2392 | /* re-initialize mixer stuff */ | ||
2393 | if (chip->device_type == DEVICE_INTEL_ICH4) { | ||
2394 | /* enable separate SDINs for ICH4 */ | ||
2395 | iputbyte(chip, ICHREG(SDM), chip->sdm_saved); | ||
2396 | /* use slot 10/11 for SPDIF */ | ||
2397 | iputdword(chip, ICHREG(GLOB_CNT), | ||
2398 | (igetdword(chip, ICHREG(GLOB_CNT)) & ~ICH_PCM_SPDIF_MASK) | | ||
2399 | ICH_PCM_SPDIF_1011); | ||
2400 | } | ||
2401 | |||
2389 | /* refill nocache */ | 2402 | /* refill nocache */ |
2390 | if (chip->fix_nocache) | 2403 | if (chip->fix_nocache) |
2391 | fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1); | 2404 | fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1); |
@@ -2451,8 +2464,7 @@ static void __devinit intel8x0_measure_ac97_clock(intel8x0_t *chip) | |||
2451 | } | 2464 | } |
2452 | do_gettimeofday(&start_time); | 2465 | do_gettimeofday(&start_time); |
2453 | spin_unlock_irq(&chip->reg_lock); | 2466 | spin_unlock_irq(&chip->reg_lock); |
2454 | set_current_state(TASK_UNINTERRUPTIBLE); | 2467 | msleep(50); |
2455 | schedule_timeout(HZ / 20); | ||
2456 | spin_lock_irq(&chip->reg_lock); | 2468 | spin_lock_irq(&chip->reg_lock); |
2457 | /* check the position */ | 2469 | /* check the position */ |
2458 | pos = ichdev->fragsize1; | 2470 | pos = ichdev->fragsize1; |