|
@@ -996,7 +996,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
|
|
|
}
|
|
|
|
|
|
if (driver->controls)
|
|
|
- snd_soc_add_controls(codec, driver->controls,
|
|
|
+ snd_soc_add_codec_controls(codec, driver->controls,
|
|
|
driver->num_controls);
|
|
|
if (driver->dapm_routes)
|
|
|
snd_soc_dapm_add_routes(&codec->dapm, driver->dapm_routes,
|
|
@@ -1457,13 +1457,8 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* We should have a non-codec control add function but we don't */
|
|
|
if (card->controls)
|
|
|
- snd_soc_add_controls(list_first_entry(&card->codec_dev_list,
|
|
|
- struct snd_soc_codec,
|
|
|
- card_list),
|
|
|
- card->controls,
|
|
|
- card->num_controls);
|
|
|
+ snd_soc_add_card_controls(card, card->controls, card->num_controls);
|
|
|
|
|
|
if (card->dapm_routes)
|
|
|
snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
|
|
@@ -2015,9 +2010,28 @@ struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_cnew);
|
|
|
|
|
|
+static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
|
|
|
+ const struct snd_kcontrol_new *controls, int num_controls,
|
|
|
+ const char *prefix, void *data)
|
|
|
+{
|
|
|
+ int err, i;
|
|
|
+
|
|
|
+ for (i = 0; i < num_controls; i++) {
|
|
|
+ const struct snd_kcontrol_new *control = &controls[i];
|
|
|
+ err = snd_ctl_add(card, snd_soc_cnew(control, data,
|
|
|
+ control->name, prefix));
|
|
|
+ if (err < 0) {
|
|
|
+ dev_err(dev, "Failed to add %s: %d\n", control->name, err);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
- * snd_soc_add_controls - add an array of controls to a codec.
|
|
|
- * Convienience function to add a list of controls. Many codecs were
|
|
|
+ * snd_soc_add_codec_controls - add an array of controls to a codec.
|
|
|
+ * Convenience function to add a list of controls. Many codecs were
|
|
|
* duplicating this code.
|
|
|
*
|
|
|
* @codec: codec to add controls to
|
|
@@ -2026,31 +2040,19 @@ EXPORT_SYMBOL_GPL(snd_soc_cnew);
|
|
|
*
|
|
|
* Return 0 for success, else error.
|
|
|
*/
|
|
|
-int snd_soc_add_controls(struct snd_soc_codec *codec,
|
|
|
+int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
|
|
|
const struct snd_kcontrol_new *controls, int num_controls)
|
|
|
{
|
|
|
struct snd_card *card = codec->card->snd_card;
|
|
|
- int err, i;
|
|
|
|
|
|
- for (i = 0; i < num_controls; i++) {
|
|
|
- const struct snd_kcontrol_new *control = &controls[i];
|
|
|
- err = snd_ctl_add(card, snd_soc_cnew(control, codec,
|
|
|
- control->name,
|
|
|
- codec->name_prefix));
|
|
|
- if (err < 0) {
|
|
|
- dev_err(codec->dev, "%s: Failed to add %s: %d\n",
|
|
|
- codec->name, control->name, err);
|
|
|
- return err;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return snd_soc_add_controls(card, codec->dev, controls, num_controls,
|
|
|
+ codec->name_prefix, codec);
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_add_controls);
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_add_codec_controls);
|
|
|
|
|
|
/**
|
|
|
* snd_soc_add_platform_controls - add an array of controls to a platform.
|
|
|
- * Convienience function to add a list of controls.
|
|
|
+ * Convenience function to add a list of controls.
|
|
|
*
|
|
|
* @platform: platform to add controls to
|
|
|
* @controls: array of controls to add
|
|
@@ -2062,22 +2064,52 @@ int snd_soc_add_platform_controls(struct snd_soc_platform *platform,
|
|
|
const struct snd_kcontrol_new *controls, int num_controls)
|
|
|
{
|
|
|
struct snd_card *card = platform->card->snd_card;
|
|
|
- int err, i;
|
|
|
|
|
|
- for (i = 0; i < num_controls; i++) {
|
|
|
- const struct snd_kcontrol_new *control = &controls[i];
|
|
|
- err = snd_ctl_add(card, snd_soc_cnew(control, platform,
|
|
|
- control->name, NULL));
|
|
|
- if (err < 0) {
|
|
|
- dev_err(platform->dev, "Failed to add %s %d\n",control->name, err);
|
|
|
- return err;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return snd_soc_add_controls(card, platform->dev, controls, num_controls,
|
|
|
+ NULL, platform);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_add_platform_controls);
|
|
|
|
|
|
+/**
|
|
|
+ * snd_soc_add_card_controls - add an array of controls to a SoC card.
|
|
|
+ * Convenience function to add a list of controls.
|
|
|
+ *
|
|
|
+ * @soc_card: SoC card to add controls to
|
|
|
+ * @controls: array of controls to add
|
|
|
+ * @num_controls: number of elements in the array
|
|
|
+ *
|
|
|
+ * Return 0 for success, else error.
|
|
|
+ */
|
|
|
+int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
|
|
|
+ const struct snd_kcontrol_new *controls, int num_controls)
|
|
|
+{
|
|
|
+ struct snd_card *card = soc_card->snd_card;
|
|
|
+
|
|
|
+ return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
|
|
|
+ NULL, soc_card);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
|
|
|
+
|
|
|
+/**
|
|
|
+ * snd_soc_add_dai_controls - add an array of controls to a DAI.
|
|
|
+ * Convienience function to add a list of controls.
|
|
|
+ *
|
|
|
+ * @dai: DAI to add controls to
|
|
|
+ * @controls: array of controls to add
|
|
|
+ * @num_controls: number of elements in the array
|
|
|
+ *
|
|
|
+ * Return 0 for success, else error.
|
|
|
+ */
|
|
|
+int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
|
|
|
+ const struct snd_kcontrol_new *controls, int num_controls)
|
|
|
+{
|
|
|
+ struct snd_card *card = dai->card->snd_card;
|
|
|
+
|
|
|
+ return snd_soc_add_controls(card, dai->dev, controls, num_controls,
|
|
|
+ NULL, dai);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
|
|
|
+
|
|
|
/**
|
|
|
* snd_soc_info_enum_double - enumerated double mixer info callback
|
|
|
* @kcontrol: mixer control
|