diff options
| author | Takashi Iwai <tiwai@suse.de> | 2010-02-05 03:09:25 -0500 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2010-02-05 03:09:25 -0500 |
| commit | 794d6206508673d7c7426976d4e78e6af10b3e4f (patch) | |
| tree | d429dc7a774f9cd5d6b77509edcacdb813831ce3 | |
| parent | cec27c891b805b2ab2302f9fcbdacb6f179ac0d4 (diff) | |
| parent | 9492837a6f54b069e13e40e3c89898bb8837a386 (diff) | |
Merge branch 'fix/hda' into topic/hda
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 22 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 7 |
2 files changed, 23 insertions, 6 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 12230a2ed4f1..353412bb5ccb 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -425,6 +425,7 @@ struct azx { | |||
| 425 | 425 | ||
| 426 | /* flags */ | 426 | /* flags */ |
| 427 | int position_fix; | 427 | int position_fix; |
| 428 | int poll_count; | ||
| 428 | unsigned int running :1; | 429 | unsigned int running :1; |
| 429 | unsigned int initialized :1; | 430 | unsigned int initialized :1; |
| 430 | unsigned int single_cmd :1; | 431 | unsigned int single_cmd :1; |
| @@ -505,7 +506,7 @@ static char *driver_short_names[] __devinitdata = { | |||
| 505 | #define get_azx_dev(substream) (substream->runtime->private_data) | 506 | #define get_azx_dev(substream) (substream->runtime->private_data) |
| 506 | 507 | ||
| 507 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); | 508 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); |
| 508 | 509 | static int azx_send_cmd(struct hda_bus *bus, unsigned int val); | |
| 509 | /* | 510 | /* |
| 510 | * Interface for HD codec | 511 | * Interface for HD codec |
| 511 | */ | 512 | */ |
| @@ -663,11 +664,12 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 663 | { | 664 | { |
| 664 | struct azx *chip = bus->private_data; | 665 | struct azx *chip = bus->private_data; |
| 665 | unsigned long timeout; | 666 | unsigned long timeout; |
| 667 | int do_poll = 0; | ||
| 666 | 668 | ||
| 667 | again: | 669 | again: |
| 668 | timeout = jiffies + msecs_to_jiffies(1000); | 670 | timeout = jiffies + msecs_to_jiffies(1000); |
| 669 | for (;;) { | 671 | for (;;) { |
| 670 | if (chip->polling_mode) { | 672 | if (chip->polling_mode || do_poll) { |
| 671 | spin_lock_irq(&chip->reg_lock); | 673 | spin_lock_irq(&chip->reg_lock); |
| 672 | azx_update_rirb(chip); | 674 | azx_update_rirb(chip); |
| 673 | spin_unlock_irq(&chip->reg_lock); | 675 | spin_unlock_irq(&chip->reg_lock); |
| @@ -675,6 +677,9 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 675 | if (!chip->rirb.cmds[addr]) { | 677 | if (!chip->rirb.cmds[addr]) { |
| 676 | smp_rmb(); | 678 | smp_rmb(); |
| 677 | bus->rirb_error = 0; | 679 | bus->rirb_error = 0; |
| 680 | |||
| 681 | if (!do_poll) | ||
| 682 | chip->poll_count = 0; | ||
| 678 | return chip->rirb.res[addr]; /* the last value */ | 683 | return chip->rirb.res[addr]; /* the last value */ |
| 679 | } | 684 | } |
| 680 | if (time_after(jiffies, timeout)) | 685 | if (time_after(jiffies, timeout)) |
| @@ -687,6 +692,16 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 687 | } | 692 | } |
| 688 | } | 693 | } |
| 689 | 694 | ||
| 695 | if (!chip->polling_mode && chip->poll_count < 2) { | ||
| 696 | snd_printdd(SFX "azx_get_response timeout, " | ||
| 697 | "polling the codec once: last cmd=0x%08x\n", | ||
| 698 | chip->last_cmd[addr]); | ||
| 699 | do_poll = 1; | ||
| 700 | chip->poll_count++; | ||
| 701 | goto again; | ||
| 702 | } | ||
| 703 | |||
| 704 | |||
| 690 | if (!chip->polling_mode) { | 705 | if (!chip->polling_mode) { |
| 691 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " | 706 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " |
| 692 | "switching to polling mode: last cmd=0x%08x\n", | 707 | "switching to polling mode: last cmd=0x%08x\n", |
| @@ -2042,7 +2057,7 @@ static int azx_acquire_irq(struct azx *chip, int do_disconnect) | |||
| 2042 | { | 2057 | { |
| 2043 | if (request_irq(chip->pci->irq, azx_interrupt, | 2058 | if (request_irq(chip->pci->irq, azx_interrupt, |
| 2044 | chip->msi ? 0 : IRQF_SHARED, | 2059 | chip->msi ? 0 : IRQF_SHARED, |
| 2045 | "HDA Intel", chip)) { | 2060 | "hda_intel", chip)) { |
| 2046 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " | 2061 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " |
| 2047 | "disabling device\n", chip->pci->irq); | 2062 | "disabling device\n", chip->pci->irq); |
| 2048 | if (do_disconnect) | 2063 | if (do_disconnect) |
| @@ -2331,6 +2346,7 @@ static void __devinit check_probe_mask(struct azx *chip, int dev) | |||
| 2331 | */ | 2346 | */ |
| 2332 | static struct snd_pci_quirk msi_black_list[] __devinitdata = { | 2347 | static struct snd_pci_quirk msi_black_list[] __devinitdata = { |
| 2333 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ | 2348 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ |
| 2349 | SND_PCI_QUIRK(0x1043, 0x829c, "ASUS", 0), /* nvidia */ | ||
| 2334 | {} | 2350 | {} |
| 2335 | }; | 2351 | }; |
| 2336 | 2352 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 82772f0ab3e7..0c224977c8cf 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -9514,6 +9514,7 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 9514 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), | 9514 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), |
| 9515 | .channel_mode = alc883_3ST_6ch_modes, | 9515 | .channel_mode = alc883_3ST_6ch_modes, |
| 9516 | .need_dac_fix = 1, | 9516 | .need_dac_fix = 1, |
| 9517 | .const_channel_count = 6, | ||
| 9517 | .num_mux_defs = | 9518 | .num_mux_defs = |
| 9518 | ARRAY_SIZE(alc888_2_capture_sources), | 9519 | ARRAY_SIZE(alc888_2_capture_sources), |
| 9519 | .input_mux = alc888_2_capture_sources, | 9520 | .input_mux = alc888_2_capture_sources, |
| @@ -10423,7 +10424,7 @@ static void alc262_hp_t5735_setup(struct hda_codec *codec) | |||
| 10423 | struct alc_spec *spec = codec->spec; | 10424 | struct alc_spec *spec = codec->spec; |
| 10424 | 10425 | ||
| 10425 | spec->autocfg.hp_pins[0] = 0x15; | 10426 | spec->autocfg.hp_pins[0] = 0x15; |
| 10426 | spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */ | 10427 | spec->autocfg.speaker_pins[0] = 0x14; |
| 10427 | } | 10428 | } |
| 10428 | 10429 | ||
| 10429 | static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { | 10430 | static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { |
| @@ -11852,9 +11853,9 @@ static struct alc_config_preset alc262_presets[] = { | |||
| 11852 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | 11853 | .num_channel_mode = ARRAY_SIZE(alc262_modes), |
| 11853 | .channel_mode = alc262_modes, | 11854 | .channel_mode = alc262_modes, |
| 11854 | .input_mux = &alc262_capture_source, | 11855 | .input_mux = &alc262_capture_source, |
| 11855 | .unsol_event = alc_automute_amp_unsol_event, | 11856 | .unsol_event = alc_sku_unsol_event, |
| 11856 | .setup = alc262_hp_t5735_setup, | 11857 | .setup = alc262_hp_t5735_setup, |
| 11857 | .init_hook = alc_automute_amp, | 11858 | .init_hook = alc_inithook, |
| 11858 | }, | 11859 | }, |
| 11859 | [ALC262_HP_RP5700] = { | 11860 | [ALC262_HP_RP5700] = { |
| 11860 | .mixers = { alc262_hp_rp5700_mixer }, | 11861 | .mixers = { alc262_hp_rp5700_mixer }, |
