[alsa-devel] [PATCH 1/2] ALSA: hda - Refactor quirk picking and change quirk priority

Takashi Iwai tiwai at suse.de
Tue Jul 22 14:30:19 CEST 2014


At Tue, 22 Jul 2014 14:09:34 +0200,
David Henningsson wrote:
> 
> Previously, calling one quirk function first and another later
> would make the latter one take priority, this is now changed
> to make the former take priority.
> 
> By adding two special values for fixup_id we can also get rid of the
> fixup_forced flag.

Applied both patches.  Thanks.


Takashi

> 
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>  sound/pci/hda/hda_auto_parser.c | 15 ++++++++-------
>  sound/pci/hda/hda_codec.c       |  1 +
>  sound/pci/hda/hda_codec.h       |  1 -
>  sound/pci/hda/hda_local.h       |  2 ++
>  sound/pci/hda/patch_cirrus.c    |  4 +++-
>  sound/pci/hda/patch_sigmatel.c  |  4 +++-
>  6 files changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c
> index a979019..51dea49 100644
> --- a/sound/pci/hda/hda_auto_parser.c
> +++ b/sound/pci/hda/hda_auto_parser.c
> @@ -854,7 +854,7 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec,
>  {
>  	const struct snd_hda_pin_quirk *pq;
>  
> -	if (codec->fixup_forced)
> +	if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
>  		return;
>  
>  	for (pq = pin_quirk; pq->subvendor; pq++) {
> @@ -880,14 +880,17 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
>  			const struct hda_fixup *fixlist)
>  {
>  	const struct snd_pci_quirk *q;
> -	int id = -1;
> +	int id = HDA_FIXUP_ID_NOT_SET;
>  	const char *name = NULL;
>  
> +	if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
> +		return;
> +
>  	/* when model=nofixup is given, don't pick up any fixups */
>  	if (codec->modelname && !strcmp(codec->modelname, "nofixup")) {
>  		codec->fixup_list = NULL;
> -		codec->fixup_id = -1;
> -		codec->fixup_forced = 1;
> +		codec->fixup_name = NULL;
> +		codec->fixup_id = HDA_FIXUP_ID_NO_FIXUP;
>  		return;
>  	}
>  
> @@ -897,13 +900,12 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
>  				codec->fixup_id = models->id;
>  				codec->fixup_name = models->name;
>  				codec->fixup_list = fixlist;
> -				codec->fixup_forced = 1;
>  				return;
>  			}
>  			models++;
>  		}
>  	}
> -	if (id < 0 && quirk) {
> +	if (quirk) {
>  		q = snd_pci_quirk_lookup(codec->bus->pci, quirk);
>  		if (q) {
>  			id = q->value;
> @@ -927,7 +929,6 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
>  		}
>  	}
>  
> -	codec->fixup_forced = 0;
>  	codec->fixup_id = id;
>  	if (id >= 0) {
>  		codec->fixup_list = fixlist;
> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> index 47a6177..ec6a7d0 100644
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -1476,6 +1476,7 @@ int snd_hda_codec_new(struct hda_bus *bus,
>  
>  	INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work);
>  	codec->depop_delay = -1;
> +	codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
>  
>  #ifdef CONFIG_PM
>  	spin_lock_init(&codec->power_lock);
> diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
> index f84a40e..bbc5a13 100644
> --- a/sound/pci/hda/hda_codec.h
> +++ b/sound/pci/hda/hda_codec.h
> @@ -402,7 +402,6 @@ struct hda_codec {
>  
>  	/* fix-up list */
>  	int fixup_id;
> -	unsigned int fixup_forced:1; /* fixup explicitly set by user */
>  	const struct hda_fixup *fixup_list;
>  	const char *fixup_name;
>  
> diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h
> index aa374ad..364bb41 100644
> --- a/sound/pci/hda/hda_local.h
> +++ b/sound/pci/hda/hda_local.h
> @@ -438,6 +438,8 @@ struct snd_hda_pin_quirk {
>  
>  #endif
>  
> +#define HDA_FIXUP_ID_NOT_SET -1
> +#define HDA_FIXUP_ID_NO_FIXUP -2
>  
>  /* fixup types */
>  enum {
> diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c
> index 387f0b5..3db724e 100644
> --- a/sound/pci/hda/patch_cirrus.c
> +++ b/sound/pci/hda/patch_cirrus.c
> @@ -657,8 +657,10 @@ static void cs4208_fixup_mac(struct hda_codec *codec,
>  {
>  	if (action != HDA_FIXUP_ACT_PRE_PROBE)
>  		return;
> +
> +	codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
>  	snd_hda_pick_fixup(codec, NULL, cs4208_mac_fixup_tbl, cs4208_fixups);
> -	if (codec->fixup_id < 0 || codec->fixup_id == CS4208_MAC_AUTO)
> +	if (codec->fixup_id == HDA_FIXUP_ID_NOT_SET)
>  		codec->fixup_id = CS4208_GPIO0; /* default fixup */
>  	snd_hda_apply_fixup(codec, action);
>  }
> diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
> index 946ae40..8dc6815 100644
> --- a/sound/pci/hda/patch_sigmatel.c
> +++ b/sound/pci/hda/patch_sigmatel.c
> @@ -3449,9 +3449,11 @@ static void stac922x_fixup_intel_mac_auto(struct hda_codec *codec,
>  {
>  	if (action != HDA_FIXUP_ACT_PRE_PROBE)
>  		return;
> +
> +	codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
>  	snd_hda_pick_fixup(codec, NULL, stac922x_intel_mac_fixup_tbl,
>  			   stac922x_fixups);
> -	if (codec->fixup_id != STAC_INTEL_MAC_AUTO)
> +	if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
>  		snd_hda_apply_fixup(codec, action);
>  }
>  
> -- 
> 1.9.1
> 


More information about the Alsa-devel mailing list