diff options
Diffstat (limited to 'sound/pci/ali5451/ali5451.c')
-rw-r--r-- | sound/pci/ali5451/ali5451.c | 83 |
1 files changed, 12 insertions, 71 deletions
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index c551006e2920..b458d208720b 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
@@ -310,12 +310,16 @@ static int snd_ali_codec_ready(struct snd_ali *codec, | |||
310 | unsigned int res; | 310 | unsigned int res; |
311 | 311 | ||
312 | end_time = jiffies + msecs_to_jiffies(250); | 312 | end_time = jiffies + msecs_to_jiffies(250); |
313 | do { | 313 | |
314 | for (;;) { | ||
314 | res = snd_ali_5451_peek(codec,port); | 315 | res = snd_ali_5451_peek(codec,port); |
315 | if (!(res & 0x8000)) | 316 | if (!(res & 0x8000)) |
316 | return 0; | 317 | return 0; |
318 | if (!time_after_eq(end_time, jiffies)) | ||
319 | break; | ||
317 | schedule_timeout_uninterruptible(1); | 320 | schedule_timeout_uninterruptible(1); |
318 | } while (time_after_eq(end_time, jiffies)); | 321 | } |
322 | |||
319 | snd_ali_5451_poke(codec, port, res & ~0x8000); | 323 | snd_ali_5451_poke(codec, port, res & ~0x8000); |
320 | snd_printdd("ali_codec_ready: codec is not ready.\n "); | 324 | snd_printdd("ali_codec_ready: codec is not ready.\n "); |
321 | return -EIO; | 325 | return -EIO; |
@@ -327,15 +331,17 @@ static int snd_ali_stimer_ready(struct snd_ali *codec) | |||
327 | unsigned long dwChk1,dwChk2; | 331 | unsigned long dwChk1,dwChk2; |
328 | 332 | ||
329 | dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); | 333 | dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); |
330 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); | ||
331 | |||
332 | end_time = jiffies + msecs_to_jiffies(250); | 334 | end_time = jiffies + msecs_to_jiffies(250); |
333 | do { | 335 | |
336 | for (;;) { | ||
334 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); | 337 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); |
335 | if (dwChk2 != dwChk1) | 338 | if (dwChk2 != dwChk1) |
336 | return 0; | 339 | return 0; |
340 | if (!time_after_eq(end_time, jiffies)) | ||
341 | break; | ||
337 | schedule_timeout_uninterruptible(1); | 342 | schedule_timeout_uninterruptible(1); |
338 | } while (time_after_eq(end_time, jiffies)); | 343 | } |
344 | |||
339 | snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); | 345 | snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); |
340 | return -EIO; | 346 | return -EIO; |
341 | } | 347 | } |
@@ -472,45 +478,6 @@ static int snd_ali_reset_5451(struct snd_ali *codec) | |||
472 | return 0; | 478 | return 0; |
473 | } | 479 | } |
474 | 480 | ||
475 | #ifdef CODEC_RESET | ||
476 | |||
477 | static int snd_ali_reset_codec(struct snd_ali *codec) | ||
478 | { | ||
479 | struct pci_dev *pci_dev; | ||
480 | unsigned char bVal; | ||
481 | unsigned int dwVal; | ||
482 | unsigned short wCount, wReg; | ||
483 | |||
484 | pci_dev = codec->pci_m1533; | ||
485 | |||
486 | pci_read_config_dword(pci_dev, 0x7c, &dwVal); | ||
487 | pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000); | ||
488 | udelay(5000); | ||
489 | pci_read_config_dword(pci_dev, 0x7c, &dwVal); | ||
490 | pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff); | ||
491 | udelay(5000); | ||
492 | |||
493 | bVal = inb(ALI_REG(codec,ALI_SCTRL)); | ||
494 | bVal |= 0x02; | ||
495 | outb(ALI_REG(codec,ALI_SCTRL),bVal); | ||
496 | udelay(5000); | ||
497 | bVal = inb(ALI_REG(codec,ALI_SCTRL)); | ||
498 | bVal &= 0xfd; | ||
499 | outb(ALI_REG(codec,ALI_SCTRL),bVal); | ||
500 | udelay(15000); | ||
501 | |||
502 | wCount = 200; | ||
503 | while (wCount--) { | ||
504 | wReg = snd_ali_codec_read(codec->ac97, AC97_POWERDOWN); | ||
505 | if ((wReg & 0x000f) == 0x000f) | ||
506 | return 0; | ||
507 | udelay(5000); | ||
508 | } | ||
509 | return -1; | ||
510 | } | ||
511 | |||
512 | #endif | ||
513 | |||
514 | /* | 481 | /* |
515 | * ALI 5451 Controller | 482 | * ALI 5451 Controller |
516 | */ | 483 | */ |
@@ -555,22 +522,6 @@ static void snd_ali_disable_address_interrupt(struct snd_ali *codec) | |||
555 | outl(gc, ALI_REG(codec, ALI_GC_CIR)); | 522 | outl(gc, ALI_REG(codec, ALI_GC_CIR)); |
556 | } | 523 | } |
557 | 524 | ||
558 | #if 0 /* not used */ | ||
559 | static void snd_ali_enable_voice_irq(struct snd_ali *codec, | ||
560 | unsigned int channel) | ||
561 | { | ||
562 | unsigned int mask; | ||
563 | struct snd_ali_channel_control *pchregs = &(codec->chregs); | ||
564 | |||
565 | snd_ali_printk("enable_voice_irq channel=%d\n",channel); | ||
566 | |||
567 | mask = 1 << (channel & 0x1f); | ||
568 | pchregs->data.ainten = inl(ALI_REG(codec, pchregs->regs.ainten)); | ||
569 | pchregs->data.ainten |= mask; | ||
570 | outl(pchregs->data.ainten, ALI_REG(codec, pchregs->regs.ainten)); | ||
571 | } | ||
572 | #endif | ||
573 | |||
574 | static void snd_ali_disable_voice_irq(struct snd_ali *codec, | 525 | static void snd_ali_disable_voice_irq(struct snd_ali *codec, |
575 | unsigned int channel) | 526 | unsigned int channel) |
576 | { | 527 | { |
@@ -671,16 +622,6 @@ static void snd_ali_free_channel_pcm(struct snd_ali *codec, int channel) | |||
671 | } | 622 | } |
672 | } | 623 | } |
673 | 624 | ||
674 | #if 0 /* not used */ | ||
675 | static void snd_ali_start_voice(struct snd_ali *codec, unsigned int channel) | ||
676 | { | ||
677 | unsigned int mask = 1 << (channel & 0x1f); | ||
678 | |||
679 | snd_ali_printk("start_voice: channel=%d\n",channel); | ||
680 | outl(mask, ALI_REG(codec,codec->chregs.regs.start)); | ||
681 | } | ||
682 | #endif | ||
683 | |||
684 | static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel) | 625 | static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel) |
685 | { | 626 | { |
686 | unsigned int mask = 1 << (channel & 0x1f); | 627 | unsigned int mask = 1 << (channel & 0x1f); |