ALSA: hda - consolidate chip rename functions
authorTakashi Iwai <tiwai@suse.de>
Thu, 1 Oct 2015 15:59:43 +0000 (17:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 15 Oct 2015 12:05:28 +0000 (14:05 +0200)
A few multiple codec drivers do renaming the chip_name string but all
these are open-coded and some of them have even no error check.  Let's
make common helpers to do it properly.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hdaudio.h
sound/hda/hdac_device.c
sound/pci/hda/hda_bind.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_sysfs.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_via.c

index 26e956f4b7c6e3fbc0367ec8a97d7b4011324fb8..49df61c7afdcb0931023fd51f0462b59683a6cf8 100644 (file)
@@ -117,6 +117,7 @@ int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
 void snd_hdac_device_exit(struct hdac_device *dev);
 int snd_hdac_device_register(struct hdac_device *codec);
 void snd_hdac_device_unregister(struct hdac_device *codec);
+int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name);
 
 int snd_hdac_refresh_widgets(struct hdac_device *codec);
 int snd_hdac_refresh_widget_sysfs(struct hdac_device *codec);
index b3b0ad289df184ffb88370bc4594955a9ee02794..4b06b26cee06411d490d8ff49c1c2429f033dc4c 100644 (file)
@@ -163,6 +163,28 @@ void snd_hdac_device_unregister(struct hdac_device *codec)
 }
 EXPORT_SYMBOL_GPL(snd_hdac_device_unregister);
 
+/**
+ * snd_hdac_device_set_chip_name - set/update the codec name
+ * @codec: the HDAC device
+ * @name: name string to set
+ *
+ * Returns 0 if the name is set or updated, or a negative error code.
+ */
+int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name)
+{
+       char *newname;
+
+       if (!name)
+               return 0;
+       newname = kstrdup(name, GFP_KERNEL);
+       if (!newname)
+               return -ENOMEM;
+       kfree(codec->chip_name);
+       codec->chip_name = newname;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(snd_hdac_device_set_chip_name);
+
 /**
  * snd_hdac_make_cmd - compose a 32bit command word to be sent to the
  *     HD-audio controller
index d5ac25cc7fee1fbc87b577da634f9f13706091a5..ef6b8f836a873e6b1f4b9da5ac980f6414f20d90 100644 (file)
@@ -45,15 +45,31 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
                codec->patch_ops.unsol_event(codec, ev);
 }
 
-/* reset the codec name from the preset */
-static int codec_refresh_name(struct hda_codec *codec, const char *name)
+/**
+ * snd_hda_codec_set_name - set the codec name
+ * @codec: the HDA codec
+ * @name: name string to set
+ */
+int snd_hda_codec_set_name(struct hda_codec *codec, const char *name)
 {
-       if (name) {
-               kfree(codec->core.chip_name);
-               codec->core.chip_name = kstrdup(name, GFP_KERNEL);
+       int err;
+
+       if (!name)
+               return 0;
+       err = snd_hdac_device_set_chip_name(&codec->core, name);
+       if (err < 0)
+               return err;
+
+       /* update the mixer name */
+       if (!*codec->card->mixername) {
+               snprintf(codec->card->mixername,
+                        sizeof(codec->card->mixername), "%s %s",
+                        codec->core.vendor_name, codec->core.chip_name);
        }
-       return codec->core.chip_name ? 0 : -ENOMEM;
+
+       return 0;
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_set_name);
 
 static int hda_codec_driver_probe(struct device *dev)
 {
@@ -64,7 +80,7 @@ static int hda_codec_driver_probe(struct device *dev)
        if (WARN_ON(!codec->preset))
                return -EINVAL;
 
-       err = codec_refresh_name(codec, codec->preset->name);
+       err = snd_hda_codec_set_name(codec, codec->preset->name);
        if (err < 0)
                goto error;
        err = snd_hdac_regmap_init(&codec->core);
@@ -251,11 +267,6 @@ int snd_hda_codec_configure(struct hda_codec *codec)
                }
        }
 
-       /* audio codec should override the mixer name */
-       if (codec->core.afg || !*codec->card->mixername)
-               snprintf(codec->card->mixername,
-                        sizeof(codec->card->mixername), "%s %s",
-                        codec->core.vendor_name, codec->core.chip_name);
        return 0;
 
  error:
index 95991e463abba23b4959e95b2ab7d05086084725..b6d937784afa817bd62c230ea62665fe325767df 100644 (file)
@@ -463,6 +463,8 @@ void snd_hda_unlock_devices(struct hda_bus *bus);
 void snd_hda_bus_reset(struct hda_bus *bus);
 void snd_hda_bus_reset_codecs(struct hda_bus *bus);
 
+int snd_hda_codec_set_name(struct hda_codec *codec, const char *name);
+
 /*
  * power management
  */
index a6e3d9b511ab5f0a2bfa446cbb004c002b81f029..64e0d1d81ca5afd66625669079bdce05fa23dc63 100644 (file)
@@ -595,8 +595,7 @@ static void parse_model_mode(char *buf, struct hda_bus *bus,
 static void parse_chip_name_mode(char *buf, struct hda_bus *bus,
                                 struct hda_codec **codecp)
 {
-       kfree((*codecp)->core.chip_name);
-       (*codecp)->core.chip_name = kstrdup(buf, GFP_KERNEL);
+       snd_hda_codec_set_name(*codecp, buf);
 }
 
 #define DEFINE_PARSE_ID_MODE(name) \
index 16b8dcba5c12d2d13ed7c80c4e6f93df69d9944f..e1ffb0202ebc81315c9238a7f7c4ec719d6993a6 100644 (file)
@@ -822,17 +822,7 @@ static const struct hda_codec_ops alc_patch_ops = {
 };
 
 
-/* replace the codec chip_name with the given string */
-static int alc_codec_rename(struct hda_codec *codec, const char *name)
-{
-       kfree(codec->core.chip_name);
-       codec->core.chip_name = kstrdup(name, GFP_KERNEL);
-       if (!codec->core.chip_name) {
-               alc_free(codec);
-               return -ENOMEM;
-       }
-       return 0;
-}
+#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
 
 /*
  * Rename codecs appropriately from COEF value or subvendor id
index da5366405eda55a6eccbca0e14bce5631c851cdc..d714a57e94600501a6807d8e96219ce77e572328 100644 (file)
@@ -785,21 +785,11 @@ static int patch_vt1708S(struct hda_codec *codec)
        override_mic_boost(codec, 0x1e, 0, 3, 40);
 
        /* correct names for VT1708BCE */
-       if (get_codec_type(codec) == VT1708BCE) {
-               kfree(codec->core.chip_name);
-               codec->core.chip_name = kstrdup("VT1708BCE", GFP_KERNEL);
-               snprintf(codec->card->mixername,
-                        sizeof(codec->card->mixername),
-                        "%s %s", codec->core.vendor_name, codec->core.chip_name);
-       }
+       if (get_codec_type(codec) == VT1708BCE)
+               snd_hda_codec_set_name(codec, "VT1708BCE");
        /* correct names for VT1705 */
-       if (codec->core.vendor_id == 0x11064397) {
-               kfree(codec->core.chip_name);
-               codec->core.chip_name = kstrdup("VT1705", GFP_KERNEL);
-               snprintf(codec->card->mixername,
-                        sizeof(codec->card->mixername),
-                        "%s %s", codec->core.vendor_name, codec->core.chip_name);
-       }
+       if (codec->core.vendor_id == 0x11064397)
+               snd_hda_codec_set_name(codec, "VT1705");
 
        /* automatic parse from the BIOS config */
        err = via_parse_auto_config(codec);