mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 02:30:52 +07:00
leds: ktd2692: Fix an error handling path
[ Upstream commit ee78b9360e14c276f5ceaa4a0d06f790f04ccdad ]
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: b7da8c5c72
("leds: Add ktd2692 flash LED driver")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
53cb671592
commit
57e49a0bc4
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user