Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19ab1167 authored by Jiakai Luo's avatar Jiakai Luo Committed by Greg Kroah-Hartman
Browse files

iio: adc: mxs-lradc: fix the order of two cleanup operations



commit 27b2ed5b6d53cd62fc61c3f259ae52f5cac23b66 upstream.

Smatch reports:
drivers/iio/adc/mxs-lradc-adc.c:766 mxs_lradc_adc_probe() warn:
missing unwind goto?

the order of three init operation:
1.mxs_lradc_adc_trigger_init
2.iio_triggered_buffer_setup
3.mxs_lradc_adc_hw_init

thus, the order of three cleanup operation should be:
1.mxs_lradc_adc_hw_stop
2.iio_triggered_buffer_cleanup
3.mxs_lradc_adc_trigger_remove

we exchange the order of two cleanup operations,
introducing the following differences:
1.if mxs_lradc_adc_trigger_init fails, returns directly;
2.if trigger_init succeeds but iio_triggered_buffer_setup fails,
goto err_trig and remove the trigger.

In addition, we also reorder the unwind that goes on in the
remove() callback to match the new ordering.

Fixes: 6dd112b9 ("iio: adc: mxs-lradc: Add support for ADC driver")
Signed-off-by: default avatarJiakai Luo <jkluo@hust.edu.cn>
Reviewed-by: default avatarDongliang Mu <dzm91@hust.edu.cn>
Link: https://lore.kernel.org/r/20230422133407.72908-1-jkluo@hust.edu.cn


Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b1fc302c
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -767,13 +767,13 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)

	ret = mxs_lradc_adc_trigger_init(iio);
	if (ret)
		goto err_trig;
		return ret;

	ret = iio_triggered_buffer_setup(iio, &iio_pollfunc_store_time,
					 &mxs_lradc_adc_trigger_handler,
					 &mxs_lradc_adc_buffer_ops);
	if (ret)
		return ret;
		goto err_trig;

	adc->vref_mv = mxs_lradc_adc_vref_mv[lradc->soc];

@@ -811,9 +811,9 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)

err_dev:
	mxs_lradc_adc_hw_stop(adc);
	mxs_lradc_adc_trigger_remove(iio);
err_trig:
	iio_triggered_buffer_cleanup(iio);
err_trig:
	mxs_lradc_adc_trigger_remove(iio);
	return ret;
}

@@ -824,8 +824,8 @@ static int mxs_lradc_adc_remove(struct platform_device *pdev)

	iio_device_unregister(iio);
	mxs_lradc_adc_hw_stop(adc);
	mxs_lradc_adc_trigger_remove(iio);
	iio_triggered_buffer_cleanup(iio);
	mxs_lradc_adc_trigger_remove(iio);

	return 0;
}