diff options
author | Wu Fengguang <fengguang.wu@intel.com> | 2009-08-01 07:17:14 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-08-03 02:27:39 -0400 |
commit | feb273404f15d86098cb0e81e46330d5c1e22b1b (patch) | |
tree | affd262499584b92c791ccbc92b2c09431cd8975 /sound/pci | |
parent | c32649feb4573b31f0a2bfdf35cbe1351256c764 (diff) |
ALSA: hda: remember last command for each codec
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index df6d9820efad..7c43f92de2fa 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -418,7 +418,7 @@ struct azx { | |||
418 | unsigned int probing :1; /* codec probing phase */ | 418 | unsigned int probing :1; /* codec probing phase */ |
419 | 419 | ||
420 | /* for debugging */ | 420 | /* for debugging */ |
421 | unsigned int last_cmd; /* last issued command (to sync) */ | 421 | unsigned int last_cmd[AZX_MAX_CODECS]; |
422 | 422 | ||
423 | /* for pending irqs */ | 423 | /* for pending irqs */ |
424 | struct work_struct irq_pending_work; | 424 | struct work_struct irq_pending_work; |
@@ -668,7 +668,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
668 | 668 | ||
669 | if (chip->msi) { | 669 | if (chip->msi) { |
670 | snd_printk(KERN_WARNING SFX "No response from codec, " | 670 | snd_printk(KERN_WARNING SFX "No response from codec, " |
671 | "disabling MSI: last cmd=0x%08x\n", chip->last_cmd); | 671 | "disabling MSI: last cmd=0x%08x\n", |
672 | chip->last_cmd[addr]); | ||
672 | free_irq(chip->irq, chip); | 673 | free_irq(chip->irq, chip); |
673 | chip->irq = -1; | 674 | chip->irq = -1; |
674 | pci_disable_msi(chip->pci); | 675 | pci_disable_msi(chip->pci); |
@@ -683,7 +684,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
683 | if (!chip->polling_mode) { | 684 | if (!chip->polling_mode) { |
684 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " | 685 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " |
685 | "switching to polling mode: last cmd=0x%08x\n", | 686 | "switching to polling mode: last cmd=0x%08x\n", |
686 | chip->last_cmd); | 687 | chip->last_cmd[addr]); |
687 | chip->polling_mode = 1; | 688 | chip->polling_mode = 1; |
688 | goto again; | 689 | goto again; |
689 | } | 690 | } |
@@ -707,7 +708,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
707 | 708 | ||
708 | snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, " | 709 | snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, " |
709 | "switching to single_cmd mode: last cmd=0x%08x\n", | 710 | "switching to single_cmd mode: last cmd=0x%08x\n", |
710 | chip->last_cmd); | 711 | chip->last_cmd[addr]); |
711 | chip->single_cmd = 1; | 712 | chip->single_cmd = 1; |
712 | bus->response_reset = 0; | 713 | bus->response_reset = 0; |
713 | /* re-initialize CORB/RIRB */ | 714 | /* re-initialize CORB/RIRB */ |
@@ -794,7 +795,7 @@ static int azx_send_cmd(struct hda_bus *bus, unsigned int val) | |||
794 | { | 795 | { |
795 | struct azx *chip = bus->private_data; | 796 | struct azx *chip = bus->private_data; |
796 | 797 | ||
797 | chip->last_cmd = val; | 798 | chip->last_cmd[azx_command_addr(val)] = val; |
798 | if (chip->single_cmd) | 799 | if (chip->single_cmd) |
799 | return azx_single_send_cmd(bus, val); | 800 | return azx_single_send_cmd(bus, val); |
800 | else | 801 | else |