diff options
-rw-r--r-- | sound/pci/hda/hda_codec.c | 7 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 3 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 3 |
3 files changed, 12 insertions, 1 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 503869aad7f9..35090b3acbac 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -221,6 +221,8 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, | |||
221 | again: | 221 | again: |
222 | snd_hda_power_up(codec); | 222 | snd_hda_power_up(codec); |
223 | mutex_lock(&bus->cmd_mutex); | 223 | mutex_lock(&bus->cmd_mutex); |
224 | if (flags & HDA_RW_NO_RESPONSE_FALLBACK) | ||
225 | bus->no_response_fallback = 1; | ||
224 | for (;;) { | 226 | for (;;) { |
225 | trace_hda_send_cmd(codec, cmd); | 227 | trace_hda_send_cmd(codec, cmd); |
226 | err = bus->ops.command(bus, cmd); | 228 | err = bus->ops.command(bus, cmd); |
@@ -233,6 +235,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, | |||
233 | *res = bus->ops.get_response(bus, codec->addr); | 235 | *res = bus->ops.get_response(bus, codec->addr); |
234 | trace_hda_get_response(codec, *res); | 236 | trace_hda_get_response(codec, *res); |
235 | } | 237 | } |
238 | bus->no_response_fallback = 0; | ||
236 | mutex_unlock(&bus->cmd_mutex); | 239 | mutex_unlock(&bus->cmd_mutex); |
237 | snd_hda_power_down(codec); | 240 | snd_hda_power_down(codec); |
238 | if (!codec_in_pm(codec) && res && *res == -1 && bus->rirb_error) { | 241 | if (!codec_in_pm(codec) && res && *res == -1 && bus->rirb_error) { |
@@ -3805,11 +3808,13 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, | |||
3805 | hda_nid_t fg = codec->afg ? codec->afg : codec->mfg; | 3808 | hda_nid_t fg = codec->afg ? codec->afg : codec->mfg; |
3806 | int count; | 3809 | int count; |
3807 | unsigned int state; | 3810 | unsigned int state; |
3811 | int flags = 0; | ||
3808 | 3812 | ||
3809 | /* this delay seems necessary to avoid click noise at power-down */ | 3813 | /* this delay seems necessary to avoid click noise at power-down */ |
3810 | if (power_state == AC_PWRST_D3) { | 3814 | if (power_state == AC_PWRST_D3) { |
3811 | /* transition time less than 10ms for power down */ | 3815 | /* transition time less than 10ms for power down */ |
3812 | msleep(codec->epss ? 10 : 100); | 3816 | msleep(codec->epss ? 10 : 100); |
3817 | flags = HDA_RW_NO_RESPONSE_FALLBACK; | ||
3813 | } | 3818 | } |
3814 | 3819 | ||
3815 | /* repeat power states setting at most 10 times*/ | 3820 | /* repeat power states setting at most 10 times*/ |
@@ -3818,7 +3823,7 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, | |||
3818 | codec->patch_ops.set_power_state(codec, fg, | 3823 | codec->patch_ops.set_power_state(codec, fg, |
3819 | power_state); | 3824 | power_state); |
3820 | else { | 3825 | else { |
3821 | snd_hda_codec_read(codec, fg, 0, | 3826 | snd_hda_codec_read(codec, fg, flags, |
3822 | AC_VERB_SET_POWER_STATE, | 3827 | AC_VERB_SET_POWER_STATE, |
3823 | power_state); | 3828 | power_state); |
3824 | snd_hda_codec_set_power_to_all(codec, fg, power_state); | 3829 | snd_hda_codec_set_power_to_all(codec, fg, power_state); |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 39a658e02988..701c2e069b10 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -679,6 +679,7 @@ struct hda_bus { | |||
679 | unsigned int response_reset:1; /* controller was reset */ | 679 | unsigned int response_reset:1; /* controller was reset */ |
680 | unsigned int in_reset:1; /* during reset operation */ | 680 | unsigned int in_reset:1; /* during reset operation */ |
681 | unsigned int power_keep_link_on:1; /* don't power off HDA link */ | 681 | unsigned int power_keep_link_on:1; /* don't power off HDA link */ |
682 | unsigned int no_response_fallback:1; /* don't fallback at RIRB error */ | ||
682 | 683 | ||
683 | int primary_dig_out_type; /* primary digital out PCM type */ | 684 | int primary_dig_out_type; /* primary digital out PCM type */ |
684 | }; | 685 | }; |
@@ -930,6 +931,8 @@ enum { | |||
930 | HDA_INPUT, HDA_OUTPUT | 931 | HDA_INPUT, HDA_OUTPUT |
931 | }; | 932 | }; |
932 | 933 | ||
934 | /* snd_hda_codec_read/write optional flags */ | ||
935 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0) | ||
933 | 936 | ||
934 | /* | 937 | /* |
935 | * constructors | 938 | * constructors |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 49dfad4a099e..f089fa0aa03d 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -942,6 +942,9 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
942 | } | 942 | } |
943 | } | 943 | } |
944 | 944 | ||
945 | if (!bus->no_response_fallback) | ||
946 | return -1; | ||
947 | |||
945 | if (!chip->polling_mode && chip->poll_count < 2) { | 948 | if (!chip->polling_mode && chip->poll_count < 2) { |
946 | snd_printdd(SFX "%s: azx_get_response timeout, " | 949 | snd_printdd(SFX "%s: azx_get_response timeout, " |
947 | "polling the codec once: last cmd=0x%08x\n", | 950 | "polling the codec once: last cmd=0x%08x\n", |