| 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,
                            struct ktd2692_led_config_data *cfg)
 {
 
        if (led->regulator) {
                ret = regulator_enable(led->regulator);
-               if (ret)
+               if (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);
 static int ktd2692_remove(struct platform_device *pdev)
 {
        struct ktd2692_context *led = platform_get_drvdata(pdev);
-       int ret;
 
        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);
 
        return 0;