]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/regulator/core.c
Merge remote-tracking branches 'regulator/topic/anatop', 'regulator/topic/disable...
[mirror_ubuntu-jammy-kernel.git] / drivers / regulator / core.c
index 47a455cfe04fb344409a1f48ac52a7c9450edad3..e225711bb8bc0009114d6ec0d95ab8d2bb2d68f3 100644 (file)
@@ -1978,9 +1978,18 @@ static int _regulator_disable(struct regulator_dev *rdev)
 
                /* we are last user */
                if (_regulator_can_change_status(rdev)) {
+                       ret = _notifier_call_chain(rdev,
+                                                  REGULATOR_EVENT_PRE_DISABLE,
+                                                  NULL);
+                       if (ret & NOTIFY_STOP_MASK)
+                               return -EINVAL;
+
                        ret = _regulator_do_disable(rdev);
                        if (ret < 0) {
                                rdev_err(rdev, "failed to disable\n");
+                               _notifier_call_chain(rdev,
+                                               REGULATOR_EVENT_ABORT_DISABLE,
+                                               NULL);
                                return ret;
                        }
                        _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
@@ -2037,9 +2046,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev)
 {
        int ret = 0;
 
+       ret = _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
+                       REGULATOR_EVENT_PRE_DISABLE, NULL);
+       if (ret & NOTIFY_STOP_MASK)
+               return -EINVAL;
+
        ret = _regulator_do_disable(rdev);
        if (ret < 0) {
                rdev_err(rdev, "failed to force disable\n");
+               _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
+                               REGULATOR_EVENT_ABORT_DISABLE, NULL);
                return ret;
        }
 
@@ -3652,7 +3668,8 @@ regulator_register(const struct regulator_desc *regulator_desc,
 
        dev_set_drvdata(&rdev->dev, rdev);
 
-       if (config->ena_gpio && gpio_is_valid(config->ena_gpio)) {
+       if ((config->ena_gpio || config->ena_gpio_initialized) &&
+           gpio_is_valid(config->ena_gpio)) {
                ret = regulator_ena_gpio_request(rdev, config);
                if (ret != 0) {
                        rdev_err(rdev, "Failed to request enable GPIO%d: %d\n",