ASoC: dapm: Simplify widget clone
New DAPM widgets are created based on a provided template. When cloning the data, the name and stream name also need to be cloned. Currently the data and the names are initialized in different places. Simplify the code by having entire initialization in one place. Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com> Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20231026113549.1897368-1-amadeuszx.slawinski@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
bb341f75a0
commit
79323dc803
@ -320,7 +320,8 @@ EXPORT_SYMBOL_GPL(dapm_mark_endpoints_dirty);
|
||||
|
||||
/* create a new dapm widget */
|
||||
static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
|
||||
const struct snd_soc_dapm_widget *_widget)
|
||||
const struct snd_soc_dapm_widget *_widget,
|
||||
const char *prefix)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
@ -328,13 +329,19 @@ static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
|
||||
if (!w)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* w->name is duplicated in caller, but w->sname isn't.
|
||||
* Duplicate it here if defined
|
||||
*/
|
||||
if (prefix)
|
||||
w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, _widget->name);
|
||||
else
|
||||
w->name = kstrdup_const(_widget->name, GFP_KERNEL);
|
||||
if (!w->name) {
|
||||
kfree(w);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_widget->sname) {
|
||||
w->sname = kstrdup_const(_widget->sname, GFP_KERNEL);
|
||||
if (!w->sname) {
|
||||
kfree_const(w->name);
|
||||
kfree(w);
|
||||
return NULL;
|
||||
}
|
||||
@ -3629,20 +3636,12 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
{
|
||||
enum snd_soc_dapm_direction dir;
|
||||
struct snd_soc_dapm_widget *w;
|
||||
const char *prefix;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
if ((w = dapm_cnew_widget(widget)) == NULL)
|
||||
w = dapm_cnew_widget(widget, soc_dapm_prefix(dapm));
|
||||
if (!w)
|
||||
goto cnew_failed;
|
||||
|
||||
prefix = soc_dapm_prefix(dapm);
|
||||
if (prefix)
|
||||
w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name);
|
||||
else
|
||||
w->name = kstrdup_const(widget->name, GFP_KERNEL);
|
||||
if (!w->name)
|
||||
goto name_failed;
|
||||
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_regulator_supply:
|
||||
w->regulator = devm_regulator_get(dapm->dev, widget->name);
|
||||
@ -3767,7 +3766,6 @@ request_failed:
|
||||
dev_err_probe(dapm->dev, ret, "ASoC: Failed to request %s\n",
|
||||
w->name);
|
||||
kfree_const(w->name);
|
||||
name_failed:
|
||||
kfree_const(w->sname);
|
||||
kfree(w);
|
||||
cnew_failed:
|
||||
|
Loading…
x
Reference in New Issue
Block a user