diff options
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 4d2df771112e..e9d4cb4d07e1 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -520,38 +520,36 @@ static void azx_update_rirb(struct azx *chip) | |||
520 | static unsigned int azx_rirb_get_response(struct hda_codec *codec) | 520 | static unsigned int azx_rirb_get_response(struct hda_codec *codec) |
521 | { | 521 | { |
522 | struct azx *chip = codec->bus->private_data; | 522 | struct azx *chip = codec->bus->private_data; |
523 | int timeout = 50; | 523 | unsigned long timeout; |
524 | 524 | ||
525 | for (;;) { | 525 | again: |
526 | timeout = jiffies + msecs_to_jiffies(1000); | ||
527 | do { | ||
526 | if (chip->polling_mode) { | 528 | if (chip->polling_mode) { |
527 | spin_lock_irq(&chip->reg_lock); | 529 | spin_lock_irq(&chip->reg_lock); |
528 | azx_update_rirb(chip); | 530 | azx_update_rirb(chip); |
529 | spin_unlock_irq(&chip->reg_lock); | 531 | spin_unlock_irq(&chip->reg_lock); |
530 | } | 532 | } |
531 | if (! chip->rirb.cmds) | 533 | if (! chip->rirb.cmds) |
532 | break; | 534 | return chip->rirb.res; /* the last value */ |
533 | if (! --timeout) { | 535 | schedule_timeout_interruptible(1); |
534 | if (! chip->polling_mode) { | 536 | } while (time_after_eq(timeout, jiffies)); |
535 | snd_printk(KERN_WARNING "hda_intel: " | 537 | |
536 | "azx_get_response timeout, " | 538 | if (!chip->polling_mode) { |
537 | "switching to polling mode...\n"); | 539 | snd_printk(KERN_WARNING "hda_intel: azx_get_response timeout, " |
538 | chip->polling_mode = 1; | 540 | "switching to polling mode...\n"); |
539 | timeout = 50; | 541 | chip->polling_mode = 1; |
540 | continue; | 542 | goto again; |
541 | } | ||
542 | snd_printk(KERN_ERR | ||
543 | "hda_intel: azx_get_response timeout, " | ||
544 | "switching to single_cmd mode...\n"); | ||
545 | chip->rirb.rp = azx_readb(chip, RIRBWP); | ||
546 | chip->rirb.cmds = 0; | ||
547 | /* switch to single_cmd mode */ | ||
548 | chip->single_cmd = 1; | ||
549 | azx_free_cmd_io(chip); | ||
550 | return -1; | ||
551 | } | ||
552 | msleep(1); | ||
553 | } | 543 | } |
554 | return chip->rirb.res; /* the last value */ | 544 | |
545 | snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, " | ||
546 | "switching to single_cmd mode...\n"); | ||
547 | chip->rirb.rp = azx_readb(chip, RIRBWP); | ||
548 | chip->rirb.cmds = 0; | ||
549 | /* switch to single_cmd mode */ | ||
550 | chip->single_cmd = 1; | ||
551 | azx_free_cmd_io(chip); | ||
552 | return -1; | ||
555 | } | 553 | } |
556 | 554 | ||
557 | /* | 555 | /* |