aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWu Fengguang <fengguang.wu@intel.com>2009-08-01 07:17:14 -0400
committerTakashi Iwai <tiwai@suse.de>2009-08-03 02:27:39 -0400
commitfeb273404f15d86098cb0e81e46330d5c1e22b1b (patch)
treeaffd262499584b92c791ccbc92b2c09431cd8975
parentc32649feb4573b31f0a2bfdf35cbe1351256c764 (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>
-rw-r--r--sound/pci/hda/hda_intel.c11
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