Commit 24494d3f authored by Rakesh Ughreja's avatar Rakesh Ughreja Committed by Takashi Iwai

ALSA: hda: split snd_hda_codec_new function

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: default avatarRakesh Ughreja <rakesh.a.ughreja@intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f8a7fe1a
...@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev) ...@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev)
kfree(codec); 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 * snd_hda_codec_new - create a HDA codec
* @bus: the bus to assign * @bus: the bus to assign
...@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev) ...@@ -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, int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec **codecp) 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]; char component[31];
hda_nid_t fg; hda_nid_t fg;
int err; int err;
...@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, ...@@ -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_free = snd_hda_codec_dev_free,
}; };
dev_dbg(card->dev, "%s: entry\n", __func__);
if (snd_BUG_ON(!bus)) if (snd_BUG_ON(!bus))
return -EINVAL; return -EINVAL;
if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS)) if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
return -EINVAL; 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.dev.release = snd_hda_codec_dev_release;
codec->core.type = HDA_DEV_LEGACY;
codec->core.exec_verb = codec_exec_verb; codec->core.exec_verb = codec_exec_verb;
codec->bus = bus; codec->bus = bus;
...@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, ...@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
if (err < 0) if (err < 0)
goto error; goto error;
if (codecp)
*codecp = codec;
return 0; return 0;
error: error:
put_device(hda_codec_dev(codec)); put_device(hda_codec_dev(codec));
return err; 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 * 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) ...@@ -2991,6 +3023,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
sync_power_up_states(codec); sync_power_up_states(codec);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_build_controls);
/* /*
* PCM stuff * PCM stuff
...@@ -3196,6 +3229,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec) ...@@ -3196,6 +3229,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_parse_pcms);
/* assign all PCMs of the given codec */ /* assign all PCMs of the given codec */
int snd_hda_codec_build_pcms(struct hda_codec *codec) int snd_hda_codec_build_pcms(struct hda_codec *codec)
......
...@@ -307,6 +307,8 @@ struct hda_codec { ...@@ -307,6 +307,8 @@ struct hda_codec {
*/ */
int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
unsigned int codec_addr, struct hda_codec **codecp); 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_configure(struct hda_codec *codec);
int snd_hda_codec_update_widgets(struct hda_codec *codec); int snd_hda_codec_update_widgets(struct hda_codec *codec);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment