Commit ee78b936 authored by Christophe JAILLET's avatar Christophe JAILLET Committed by Pavel Machek
Browse files

leds: ktd2692: Fix an error handling path



In 'ktd2692_parse_dt()', if an error occurs after a successful
'regulator_enable()' call, we should call 'regulator_enable()'.

This is the same in 'ktd2692_probe()', if an error occurs after a
successful 'ktd2692_parse_dt()' call.

Instead of adding 'regulator_enable()' in several places, implement a
resource managed solution and simplify the remove function accordingly.

Fixes: b7da8c5c ("leds: Add ktd2692 flash LED driver")
Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
parent 96a30960
Loading
Loading
Loading
Loading
+18 −9
Original line number Original line Diff line number Diff line
@@ -256,6 +256,17 @@ static void ktd2692_setup(struct ktd2692_context *led)
				 | KTD2692_REG_FLASH_CURRENT_BASE);
				 | KTD2692_REG_FLASH_CURRENT_BASE);
}
}


static void regulator_disable_action(void *_data)
{
	struct device *dev = _data;
	struct ktd2692_context *led = dev_get_drvdata(dev);
	int ret;

	ret = regulator_disable(led->regulator);
	if (ret)
		dev_err(dev, "Failed to disable supply: %d\n", ret);
}

static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
			    struct ktd2692_led_config_data *cfg)
			    struct ktd2692_led_config_data *cfg)
{
{
@@ -286,8 +297,14 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,


	if (led->regulator) {
	if (led->regulator) {
		ret = regulator_enable(led->regulator);
		ret = regulator_enable(led->regulator);
		if (ret)
		if (ret) {
			dev_err(dev, "Failed to enable supply: %d\n", ret);
			dev_err(dev, "Failed to enable supply: %d\n", ret);
		} else {
			ret = devm_add_action_or_reset(dev,
						regulator_disable_action, dev);
			if (ret)
				return ret;
		}
	}
	}


	child_node = of_get_next_available_child(np, NULL);
	child_node = of_get_next_available_child(np, NULL);
@@ -377,17 +394,9 @@ static int ktd2692_probe(struct platform_device *pdev)
static int ktd2692_remove(struct platform_device *pdev)
static int ktd2692_remove(struct platform_device *pdev)
{
{
	struct ktd2692_context *led = platform_get_drvdata(pdev);
	struct ktd2692_context *led = platform_get_drvdata(pdev);
	int ret;


	led_classdev_flash_unregister(&led->fled_cdev);
	led_classdev_flash_unregister(&led->fled_cdev);


	if (led->regulator) {
		ret = regulator_disable(led->regulator);
		if (ret)
			dev_err(&pdev->dev,
				"Failed to disable supply: %d\n", ret);
	}

	mutex_destroy(&led->lock);
	mutex_destroy(&led->lock);


	return 0;
	return 0;