diff options
Diffstat (limited to 'sound/soc/soc-topology.c')
| -rw-r--r-- | sound/soc/soc-topology.c | 27 | 
1 files changed, 19 insertions, 8 deletions
| diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 9e89633676b7..6eaa00c21011 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -1261,17 +1261,29 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,  		list_add(&routes[i]->dobj.list, &tplg->comp->dobj_list);  		ret = soc_tplg_add_route(tplg, routes[i]); -		if (ret < 0) +		if (ret < 0) { +			/* +			 * this route was added to the list, it will +			 * be freed in remove_route() so increment the +			 * counter to skip it in the error handling +			 * below. +			 */ +			i++;  			break; +		}  		/* add route, but keep going if some fail */  		snd_soc_dapm_add_routes(dapm, routes[i], 1);  	} -	/* free memory allocated for all dapm routes in case of error */ -	if (ret < 0) -		for (i = 0; i < count ; i++) -			kfree(routes[i]); +	/* +	 * free memory allocated for all dapm routes not added to the +	 * list in case of error +	 */ +	if (ret < 0) { +		while (i < count) +			kfree(routes[i++]); +	}  	/*  	 * free pointer to array of dapm routes as this is no longer needed. @@ -1359,7 +1371,6 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(  		if (err < 0) {  			dev_err(tplg->dev, "ASoC: failed to init %s\n",  				mc->hdr.name); -			soc_tplg_free_tlv(tplg, &kc[i]);  			goto err_sm;  		}  	} @@ -1367,6 +1378,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(  err_sm:  	for (; i >= 0; i--) { +		soc_tplg_free_tlv(tplg, &kc[i]);  		sm = (struct soc_mixer_control *)kc[i].private_value;  		kfree(sm);  		kfree(kc[i].name); @@ -1851,7 +1863,7 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,  	list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list);  	/* register the DAI to the component */ -	dai = snd_soc_register_dai(tplg->comp, dai_drv, false); +	dai = devm_snd_soc_register_dai(tplg->comp->dev, tplg->comp, dai_drv, false);  	if (!dai)  		return -ENOMEM; @@ -1859,7 +1871,6 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,  	ret = snd_soc_dapm_new_dai_widgets(dapm, dai);  	if (ret != 0) {  		dev_err(dai->dev, "Failed to create DAI widgets %d\n", ret); -		snd_soc_unregister_dai(dai);  		return ret;  	} |