[alsa-devel] [PATCH 1/3] ALSA: hda - add new function snd_hda_bus_reset() for codec communitation error
Takashi Iwai
tiwai at suse.de
Mon Apr 8 16:21:01 CEST 2013
At Mon, 8 Apr 2013 13:53:44 -0400,
mengdong.lin at intel.com wrote:
>
> From: Mengdong Lin <mengdong.lin at intel.com>
>
> A new function snd_hda_bus_reset() is defined to suspend and resume all codecs
> on the hda bus.
You mixed up the result and the purpose in the description :)
The purpose of snd_hda_bus_reset() is to reset the codecs on the bus,
and eventually this is implemented as temporary suspend-and-resume
calls as an ad hoc solution.
> It will be called by bus reset ops azx_bus_reset() as a rescue
> of codec communitation error.
>
> snd_hda_suspend & snd_hda_resume will no longer be called by azx_bus_reset.
> So snd_hda_resume will only be used in system resume and may delay resuming a
> codec.
And write why this movement is needed.
Takashi
> Signed-off-by: Mengdong Lin <mengdong.lin at intel.com>
>
> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> index 17286b3..a05af8b 100644
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -5523,6 +5523,26 @@ int snd_hda_resume(struct hda_bus *bus)
> return 0;
> }
> EXPORT_SYMBOL_HDA(snd_hda_resume);
> +
> +/**
> + * snd_hda_bus_reset - reset the codecs, i.e. suspend and resume the codecs
> + * @bus: the HDA bus
> + *
> + * Returns 0 if successful.
> + */
> +int snd_hda_bus_reset(struct hda_bus *bus)
> +{
> + struct hda_codec *codec;
> +
> + list_for_each_entry(codec, &bus->codec_list, list) {
> + cancel_delayed_work_sync(&codec->jackpoll_work);
> + if (hda_codec_is_power_on(codec))
> + hda_call_codec_suspend(codec, false);
> + hda_call_codec_resume(codec);
> + }
> + return 0;
> +}
> +EXPORT_SYMBOL_HDA(snd_hda_bus_reset);
> #endif /* CONFIG_PM */
>
> /*
> diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
> index c93f902..6061360 100644
> --- a/sound/pci/hda/hda_codec.h
> +++ b/sound/pci/hda/hda_codec.h
> @@ -1076,6 +1076,7 @@ void snd_hda_unlock_devices(struct hda_bus *bus);
> #ifdef CONFIG_PM
> int snd_hda_suspend(struct hda_bus *bus);
> int snd_hda_resume(struct hda_bus *bus);
> +int snd_hda_bus_reset(struct hda_bus *bus);
> #endif
>
> static inline
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 735567e..6f11c7a 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1659,8 +1659,7 @@ static void azx_bus_reset(struct hda_bus *bus)
> struct azx_pcm *p;
> list_for_each_entry(p, &chip->pcm_list, list)
> snd_pcm_suspend_all(p->pcm);
> - snd_hda_suspend(chip->bus);
> - snd_hda_resume(chip->bus);
> + snd_hda_bus_reset(chip->bus);
> }
> #endif
> bus->in_reset = 0;
> --
> 1.7.10.4
>
More information about the Alsa-devel
mailing list