|
@@ -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)
|