ALSA: hda: split snd_hda_codec_new function
authorRakesh Ughreja <rakesh.a.ughreja@intel.com>
Sat, 2 Jun 2018 03:53:56 +0000 (22:53 -0500)
committerTakashi Iwai <tiwai@suse.de>
Thu, 28 Jun 2018 05:33:29 +0000 (07:33 +0200)
Split snd_hda_codec_new into two separate functions.
snd_hda_codec_device_init allocates memory and registers with bus.
snd_hda_codec_device_new initialializes the fields and performs
snd_device_new. This enables reuse of legacy HDA codec drivers as ASoC
codec drivers.

In addition mark some functions with EXPORT_SYMBOL_GPL so that it can
be called by ASoC wrapper around the legacy HDA driver (hdac_hda).

Signed-off-by: Rakesh Ughreja <rakesh.a.ughreja@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h

index d91c87e..059cfad 100644 (file)
@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev)
        kfree(codec);
 }
 
+#define DEV_NAME_LEN 31
+
+static int snd_hda_codec_device_init(struct hda_bus *bus, struct snd_card *card,
+                       unsigned int codec_addr, struct hda_codec **codecp)
+{
+       char name[DEV_NAME_LEN];
+       struct hda_codec *codec;
+       int err;
+
+       dev_dbg(card->dev, "%s: entry\n", __func__);
+
+       if (snd_BUG_ON(!bus))
+               return -EINVAL;
+       if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
+               return -EINVAL;
+
+       codec = kzalloc(sizeof(*codec), GFP_KERNEL);
+       if (!codec)
+               return -ENOMEM;
+
+       sprintf(name, "hdaudioC%dD%d", card->number, codec_addr);
+       err = snd_hdac_device_init(&codec->core, &bus->core, name, codec_addr);
+       if (err < 0) {
+               kfree(codec);
+               return err;
+       }
+
+       codec->core.type = HDA_DEV_LEGACY;
+       *codecp = codec;
+
+       return err;
+}
+
 /**
  * snd_hda_codec_new - create a HDA codec
  * @bus: the bus to assign
@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev)
 int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
                      unsigned int codec_addr, struct hda_codec **codecp)
 {
-       struct hda_codec *codec;
+       int ret;
+
+       ret = snd_hda_codec_device_init(bus, card, codec_addr, codecp);
+       if (ret < 0)
+               return ret;
+
+       return snd_hda_codec_device_new(bus, card, codec_addr, *codecp);
+}
+EXPORT_SYMBOL_GPL(snd_hda_codec_new);
+
+int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
+                       unsigned int codec_addr, struct hda_codec *codec)
+{
        char component[31];
        hda_nid_t fg;
        int err;
@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
                .dev_free = snd_hda_codec_dev_free,
        };
 
+       dev_dbg(card->dev, "%s: entry\n", __func__);
+
        if (snd_BUG_ON(!bus))
                return -EINVAL;
        if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
                return -EINVAL;
 
-       codec = kzalloc(sizeof(*codec), GFP_KERNEL);
-       if (!codec)
-               return -ENOMEM;
-
-       sprintf(component, "hdaudioC%dD%d", card->number, codec_addr);
-       err = snd_hdac_device_init(&codec->core, &bus->core, component,
-                                  codec_addr);
-       if (err < 0) {
-               kfree(codec);
-               return err;
-       }
-
        codec->core.dev.release = snd_hda_codec_dev_release;
-       codec->core.type = HDA_DEV_LEGACY;
        codec->core.exec_verb = codec_exec_verb;
 
        codec->bus = bus;
@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
        if (err < 0)
                goto error;
 
-       if (codecp)
-               *codecp = codec;
        return 0;
 
  error:
        put_device(hda_codec_dev(codec));
        return err;
 }
-EXPORT_SYMBOL_GPL(snd_hda_codec_new);
+EXPORT_SYMBOL_GPL(snd_hda_codec_device_new);
 
 /**
  * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
@@ -2991,6 +3023,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
        sync_power_up_states(codec);
        return 0;
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_build_controls);
 
 /*
  * PCM stuff
@@ -3196,6 +3229,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_parse_pcms);
 
 /* assign all PCMs of the given codec */
 int snd_hda_codec_build_pcms(struct hda_codec *codec)
index 681c360..8bbedf7 100644 (file)
@@ -307,6 +307,8 @@ struct hda_codec {
  */
 int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
                      unsigned int codec_addr, struct hda_codec **codecp);
+int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
+                     unsigned int codec_addr, struct hda_codec *codec);
 int snd_hda_codec_configure(struct hda_codec *codec);
 int snd_hda_codec_update_widgets(struct hda_codec *codec);