Commit 5e70b8e2 authored by Phillip Potter's avatar Phillip Potter Committed by Greg Kroah-Hartman
Browse files

ASoC: rt5645: add error checking to rt5645_probe function



Check for return value from various snd_soc_dapm_* calls, as many of
them can return errors and this should be handled. Also, reintroduce
the allocation failure check for rt5645->eq_param as well. Make all
areas where return values are checked lead to the end of the function
in the case of an error. Finally, introduce a comment explaining how
resources here are actually eventually cleaned up by the caller.

Cc: Mark Brown <broonie@kernel.org>
Signed-off-by: default avatarPhillip Potter <phil@philpotter.co.uk>
Link: https://lore.kernel.org/r/20210503115736.2104747-56-gregkh@linuxfoundation.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1e0ce842
Loading
Loading
Loading
Loading
+39 −9
Original line number Diff line number Diff line
@@ -3388,30 +3388,44 @@ static int rt5645_probe(struct snd_soc_component *component)
{
	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
	struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
	int ret = 0;

	rt5645->component = component;

	switch (rt5645->codec_type) {
	case CODEC_TYPE_RT5645:
		snd_soc_dapm_new_controls(dapm,
		ret = snd_soc_dapm_new_controls(dapm,
			rt5645_specific_dapm_widgets,
			ARRAY_SIZE(rt5645_specific_dapm_widgets));
		snd_soc_dapm_add_routes(dapm,
		if (ret < 0)
			goto exit;

		ret = snd_soc_dapm_add_routes(dapm,
			rt5645_specific_dapm_routes,
			ARRAY_SIZE(rt5645_specific_dapm_routes));
		if (ret < 0)
			goto exit;

		if (rt5645->v_id < 3) {
			snd_soc_dapm_add_routes(dapm,
			ret = snd_soc_dapm_add_routes(dapm,
				rt5645_old_dapm_routes,
				ARRAY_SIZE(rt5645_old_dapm_routes));
			if (ret < 0)
				goto exit;
		}
		break;
	case CODEC_TYPE_RT5650:
		snd_soc_dapm_new_controls(dapm,
		ret = snd_soc_dapm_new_controls(dapm,
			rt5650_specific_dapm_widgets,
			ARRAY_SIZE(rt5650_specific_dapm_widgets));
		snd_soc_dapm_add_routes(dapm,
		if (ret < 0)
			goto exit;

		ret = snd_soc_dapm_add_routes(dapm,
			rt5650_specific_dapm_routes,
			ARRAY_SIZE(rt5650_specific_dapm_routes));
		if (ret < 0)
			goto exit;
		break;
	}

@@ -3419,9 +3433,17 @@ static int rt5645_probe(struct snd_soc_component *component)

	/* for JD function */
	if (rt5645->pdata.jd_mode) {
		snd_soc_dapm_force_enable_pin(dapm, "JD Power");
		snd_soc_dapm_force_enable_pin(dapm, "LDO2");
		snd_soc_dapm_sync(dapm);
		ret = snd_soc_dapm_force_enable_pin(dapm, "JD Power");
		if (ret < 0)
			goto exit;

		ret = snd_soc_dapm_force_enable_pin(dapm, "LDO2");
		if (ret < 0)
			goto exit;

		ret = snd_soc_dapm_sync(dapm);
		if (ret < 0)
			goto exit;
	}

	if (rt5645->pdata.long_name)
@@ -3431,7 +3453,15 @@ static int rt5645_probe(struct snd_soc_component *component)
		RT5645_HWEQ_NUM, sizeof(struct rt5645_eq_param_s),
		GFP_KERNEL);

	return 0;
	if (!rt5645->eq_param)
		ret = -ENOMEM;
exit:
	/*
	 * If there was an error above, everything will be cleaned up by the
	 * caller if we return an error here.  This will be done with a later
	 * call to rt5645_remove().
	 */
	return ret;
}

static void rt5645_remove(struct snd_soc_component *component)