[alsa-devel] [PATCH] ALSA: hda - Don't overwrite the pin default configs
David Henningsson
david.henningsson at canonical.com
Thu Nov 22 18:02:34 CET 2012
On 11/22/2012 05:51 PM, Takashi Iwai wrote:
> Since we keep the pin default config values anyway internally, we
> don't have to set the values in the codec. This patch removes the
> code writing the pincfg values.
>
> As a gratis bonus, we can remove also the code restoring the original
> pincfg values at PM resume or module free. This will give us more
> benefit, as it can reduce the unnecessary power-up of codecs.
>
> This won't change the driver functionality. The only difference would
> be that the codec proc file will show the original pincfg values
> instead of the actually referred values. The actually referred values
> can be determined from sysfs *_pin_configs files.
> (Also hda-emu was updated to follow this change.)
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
>
> David, this change may hit your QA test. As mentioned, the only
> difference is the default pincfg outputs in proc files.
Thanks. I don't think it'll hit my testing as hda-emu and
hda-jack-retask both read from the sysfs where available.
Not powering up the codecs might need some careful testing though? I
remember the ivybridge-hdmi error (which I sent a patch for recently)
was less likely to occur if codec was powered up after resume.
>
> sound/pci/hda/hda_codec.c | 45 +++------------------------------------------
> 1 file changed, 3 insertions(+), 42 deletions(-)
>
> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> index d9fd439..c8f6c3b 100644
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -991,19 +991,6 @@ static struct hda_pincfg *look_up_pincfg(struct hda_codec *codec,
> return NULL;
> }
>
> -/* write a config value for the given NID */
> -static void set_pincfg(struct hda_codec *codec, hda_nid_t nid,
> - unsigned int cfg)
> -{
> - int i;
> - for (i = 0; i < 4; i++) {
> - snd_hda_codec_write(codec, nid, 0,
> - AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 + i,
> - cfg & 0xff);
> - cfg >>= 8;
> - }
> -}
> -
> /* set the current pin config value for the given NID.
> * the value is cached, and read via snd_hda_codec_get_pincfg()
> */
> @@ -1011,12 +998,10 @@ int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
> hda_nid_t nid, unsigned int cfg)
> {
> struct hda_pincfg *pin;
> - unsigned int oldcfg;
>
> if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
> return -EINVAL;
>
> - oldcfg = snd_hda_codec_get_pincfg(codec, nid);
> pin = look_up_pincfg(codec, list, nid);
> if (!pin) {
> pin = snd_array_new(list);
> @@ -1025,13 +1010,6 @@ int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
> pin->nid = nid;
> }
> pin->cfg = cfg;
> -
> - /* change only when needed; e.g. if the pincfg is already present
> - * in user_pins[], don't write it
> - */
> - cfg = snd_hda_codec_get_pincfg(codec, nid);
> - if (oldcfg != cfg)
> - set_pincfg(codec, nid, cfg);
> return 0;
> }
>
> @@ -1080,17 +1058,6 @@ unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
> }
> EXPORT_SYMBOL_HDA(snd_hda_codec_get_pincfg);
>
> -/* restore all current pin configs */
> -static void restore_pincfgs(struct hda_codec *codec)
> -{
> - int i;
> - for (i = 0; i < codec->init_pins.used; i++) {
> - struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
> - set_pincfg(codec, pin->nid,
> - snd_hda_codec_get_pincfg(codec, pin->nid));
> - }
> -}
> -
> /**
> * snd_hda_shutup_pins - Shut up all pins
> * @codec: the HDA codec
> @@ -1152,17 +1119,13 @@ static void init_hda_cache(struct hda_cache_rec *cache,
> unsigned int record_size);
> static void free_hda_cache(struct hda_cache_rec *cache);
>
> -/* restore the initial pin cfgs and release all pincfg lists */
> -static void restore_init_pincfgs(struct hda_codec *codec)
> +/* release all pincfg lists */
> +static void free_init_pincfgs(struct hda_codec *codec)
> {
> - /* first free driver_pins and user_pins, then call restore_pincfg
> - * so that only the values in init_pins are restored
> - */
> snd_array_free(&codec->driver_pins);
> #ifdef CONFIG_SND_HDA_HWDEP
> snd_array_free(&codec->user_pins);
> #endif
> - restore_pincfgs(codec);
> snd_array_free(&codec->init_pins);
> }
>
> @@ -1205,7 +1168,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
> return;
> cancel_delayed_work_sync(&codec->jackpoll_work);
> snd_hda_jack_tbl_clear(codec);
> - restore_init_pincfgs(codec);
> + free_init_pincfgs(codec);
> #ifdef CONFIG_PM
> cancel_delayed_work(&codec->power_work);
> flush_workqueue(codec->bus->workq);
> @@ -2394,7 +2357,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
> init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head));
> /* free only driver_pins so that init_pins + user_pins are restored */
> snd_array_free(&codec->driver_pins);
> - restore_pincfgs(codec);
> snd_array_free(&codec->cvt_setups);
> snd_array_free(&codec->spdif_out);
> codec->num_pcms = 0;
> @@ -3687,7 +3649,6 @@ static void hda_call_codec_resume(struct hda_codec *codec)
> */
> hda_keep_power_on(codec);
> hda_set_power_state(codec, AC_PWRST_D0);
> - restore_pincfgs(codec); /* restore all current pin configs */
> restore_shutup_pins(codec);
> hda_exec_init_verbs(codec);
> if (codec->patch_ops.resume)
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the Alsa-devel
mailing list