ALSA: hda - Fix bogus codec address check for mixer name assignment
authorTakashi Iwai <tiwai@suse.de>
Sat, 17 Oct 2015 16:25:38 +0000 (18:25 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sat, 17 Oct 2015 16:34:18 +0000 (18:34 +0200)
The recent commit [7fbe824a0f0e: ALSA: hda - Update mixer name for the
lower codec address] tried to improve the mixer chip name assignment
in the order of codec address.  However, this fix was utterly bogus;
it checks the field set in each codec, thus this value is reset at
each codec creation, of course.  For really handling this priority,
the assignment has to be remembered in the common place, namely in
hda_bus, instead of hda_codec.

Fixes: 7fbe824a0f0e ('ALSA: hda - Update mixer name for the lower codec address')
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_bind.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_controller.c

index 021bcce594473c0dcf38e8ac34a1fb50d323e15b..57800a498f7b16a847c013650a82d33650182a60 100644 (file)
@@ -62,11 +62,11 @@ int snd_hda_codec_set_name(struct hda_codec *codec, const char *name)
 
        /* update the mixer name */
        if (!*codec->card->mixername ||
-           codec->mixer_assigned >= codec->core.addr) {
+           codec->bus->mixer_assigned >= codec->core.addr) {
                snprintf(codec->card->mixername,
                         sizeof(codec->card->mixername), "%s %s",
                         codec->core.vendor_name, codec->core.chip_name);
-               codec->mixer_assigned = codec->core.addr;
+               codec->bus->mixer_assigned = codec->core.addr;
        }
 
        return 0;
index 0e55c6a6cc7e9fc98de4445fac556f4bee682afc..2eeaf5ea20f9c1e73c20e33a2e7d12a65e92a79f 100644 (file)
@@ -851,7 +851,6 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
        INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work);
        codec->depop_delay = -1;
        codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
-       codec->mixer_assigned = -1;
 
 #ifdef CONFIG_PM
        codec->power_jiffies = jiffies;
index 891864ac60f58603cf496a26d81876ff7fc2c30a..864ea68024915ab79121ce90a36adf9015334320 100644 (file)
@@ -69,6 +69,7 @@ struct hda_bus {
        unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
 
        int primary_dig_out_type;       /* primary digital out PCM type */
+       unsigned int mixer_assigned;    /* codec addr for mixer name */
 };
 
 /* from hdac_bus to hda_bus */
@@ -257,7 +258,6 @@ struct hda_codec {
        unsigned long power_off_acct;
        unsigned long power_jiffies;
 #endif
-       unsigned int mixer_assigned;
 
        /* filter the requested power state per nid */
        unsigned int (*power_filter)(struct hda_codec *codec, hda_nid_t nid,
index 944455997fdcc8fd80758b4fb5794488543bd966..d6b93a20361b01695f3964add27e5c384749f00a 100644 (file)
@@ -1045,6 +1045,7 @@ int azx_bus_init(struct azx *chip, const char *model,
        mutex_init(&bus->prepare_mutex);
        bus->pci = chip->pci;
        bus->modelname = model;
+       bus->mixer_assigned = -1;
        bus->core.snoop = azx_snoop(chip);
        if (chip->get_position[0] != azx_get_pos_lpib ||
            chip->get_position[1] != azx_get_pos_lpib)