ALSA: hda - Update mixer name for the lower codec address
authorTakashi Iwai <tiwai@suse.de>
Thu, 15 Oct 2015 12:06:14 +0000 (14:06 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 15 Oct 2015 12:10:25 +0000 (14:10 +0200)
In most cases, we prefer the onboard codec as the primary device, thus
it's better to set it as the mixer name.  Currently, however, the
mixer name is updated per the device instantiation order, and user
gets often HDMI/DP or other seen as a mixer chip name.  Also, if a
codec name is renamed by the driver, the old chip name might be left
still as the mixer name.

This patch addresses these issues by remembering the chip address that
was referred as the mixer name.  When a codec with the same or lower
address gives its name, renew the mixer name accordingly, as it's
either the update of the codec name or we get likely the more
appropriate chip as the reference.

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

index ef6b8f836a873e6b1f4b9da5ac980f6414f20d90..021bcce594473c0dcf38e8ac34a1fb50d323e15b 100644 (file)
@@ -61,10 +61,12 @@ int snd_hda_codec_set_name(struct hda_codec *codec, const char *name)
                return err;
 
        /* update the mixer name */
-       if (!*codec->card->mixername) {
+       if (!*codec->card->mixername ||
+           codec->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;
        }
 
        return 0;
index 2eeaf5ea20f9c1e73c20e33a2e7d12a65e92a79f..0e55c6a6cc7e9fc98de4445fac556f4bee682afc 100644 (file)
@@ -851,6 +851,7 @@ 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 b6d937784afa817bd62c230ea62665fe325767df..891864ac60f58603cf496a26d81876ff7fc2c30a 100644 (file)
@@ -257,6 +257,7 @@ 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,