struct pwm_device *pwm;
        struct pwm_state pwm_state;
        struct regulator *reg_en;
+       bool regulator_enabled;
        bool enabled;
 
        int tach_count;
        mod_timer(&ctx->rpm_timer, jiffies + HZ);
 }
 
+static int pwm_fan_switch_power(struct pwm_fan_ctx *ctx, bool on)
+{
+       int ret = 0;
+
+       if (!ctx->reg_en)
+               return ret;
+
+       if (!ctx->regulator_enabled && on) {
+               ret = regulator_enable(ctx->reg_en);
+               if (ret == 0)
+                       ctx->regulator_enabled = true;
+       } else if (ctx->regulator_enabled && !on) {
+               ret = regulator_disable(ctx->reg_en);
+               if (ret == 0)
+                       ctx->regulator_enabled = false;
+       }
+       return ret;
+}
+
 static int pwm_fan_power_on(struct pwm_fan_ctx *ctx)
 {
        struct pwm_state *state = &ctx->pwm_state;
 
 static void pwm_fan_regulator_disable(void *data)
 {
-       regulator_disable(data);
+       pwm_fan_switch_power(data, false);
 }
 
 static void pwm_fan_pwm_disable(void *__ctx)
 
                ctx->reg_en = NULL;
        } else {
-               ret = regulator_enable(ctx->reg_en);
+               ret = pwm_fan_switch_power(ctx, true);
                if (ret) {
                        dev_err(dev, "Failed to enable fan supply: %d\n", ret);
                        return ret;
                }
                ret = devm_add_action_or_reset(dev, pwm_fan_regulator_disable,
-                                              ctx->reg_en);
+                                              ctx);
                if (ret)
                        return ret;
        }
                        return ret;
        }
 
-       if (ctx->reg_en) {
-               ret = regulator_disable(ctx->reg_en);
-               if (ret) {
-                       dev_err(dev, "Failed to disable fan supply: %d\n", ret);
-                       return ret;
-               }
+       ret = pwm_fan_switch_power(ctx, false);
+       if (ret) {
+               dev_err(dev, "Failed to disable fan supply: %d\n", ret);
+               return ret;
        }
 
        return 0;
        struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
        int ret;
 
-       if (ctx->reg_en) {
-               ret = regulator_enable(ctx->reg_en);
-               if (ret) {
-                       dev_err(dev, "Failed to enable fan supply: %d\n", ret);
-                       return ret;
-               }
+       ret = pwm_fan_switch_power(ctx, true);
+       if (ret) {
+               dev_err(dev, "Failed to enable fan supply: %d\n", ret);
+               return ret;
        }
 
        if (ctx->pwm_value == 0)