From 68948667c97935f2cb50e72984a1b4058b92baca Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 23 Jan 2013 18:10:10 +0100 Subject: [PATCH] --- yaml --- r: 353211 b: refs/heads/master c: 1f57825077dc2fa4e3d4a4e6b3af6c75f81112e7 h: refs/heads/master i: 353209: 82ff9183fe8c8d09e097e6c203ef8679314b602e 353207: 9c4c26cf92b132f9060ea8977d4352be1acab8ae v: v3 --- [refs] | 2 +- trunk/sound/pci/hda/hda_auto_parser.c | 18 +++++++++++------- trunk/sound/pci/hda/hda_local.h | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 8ca6dcad5209..ac3760cb6cc3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3e367f155f3ba90b761497ab9e0343dc54778469 +refs/heads/master: 1f57825077dc2fa4e3d4a4e6b3af6c75f81112e7 diff --git a/trunk/sound/pci/hda/hda_auto_parser.c b/trunk/sound/pci/hda/hda_auto_parser.c index 0088bb0b04de..96a05c4c28e1 100644 --- a/trunk/sound/pci/hda/hda_auto_parser.c +++ b/trunk/sound/pci/hda/hda_auto_parser.c @@ -696,20 +696,18 @@ static void set_pin_targets(struct hda_codec *codec, snd_hda_set_pin_ctl_cache(codec, cfg->nid, cfg->val); } -void snd_hda_apply_fixup(struct hda_codec *codec, int action) +static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) { - int id = codec->fixup_id; #ifdef CONFIG_SND_DEBUG_VERBOSE const char *modelname = codec->fixup_name; #endif - int depth = 0; - - if (!codec->fixup_list) - return; while (id >= 0) { const struct hda_fixup *fix = codec->fixup_list + id; + if (fix->chained_before) + apply_fixup(codec, fix->chain_id, action, depth + 1); + switch (fix->type) { case HDA_FIXUP_PINS: if (action != HDA_FIXUP_ACT_PRE_PROBE || !fix->v.pins) @@ -749,13 +747,19 @@ void snd_hda_apply_fixup(struct hda_codec *codec, int action) codec->chip_name, fix->type); break; } - if (!fix->chained) + if (!fix->chained || fix->chained_before) break; if (++depth > 10) break; id = fix->chain_id; } } + +void snd_hda_apply_fixup(struct hda_codec *codec, int action) +{ + if (codec->fixup_list) + apply_fixup(codec, codec->fixup_id, action, 0); +} EXPORT_SYMBOL_HDA(snd_hda_apply_fixup); void snd_hda_pick_fixup(struct hda_codec *codec, diff --git a/trunk/sound/pci/hda/hda_local.h b/trunk/sound/pci/hda/hda_local.h index f92979c6b023..2ff62dcf2fcb 100644 --- a/trunk/sound/pci/hda/hda_local.h +++ b/trunk/sound/pci/hda/hda_local.h @@ -401,7 +401,8 @@ struct hda_model_fixup { struct hda_fixup { int type; - bool chained; + bool chained:1; /* call the chained fixup(s) after this */ + bool chained_before:1; /* call the chained fixup(s) before this */ int chain_id; union { const struct hda_pintbl *pins;