regulator: add support for sleep mode configuration
Laxman Dewangan [Mon, 18 Feb 2013 14:37:37 +0000 (19:37 +0530)]
Some of PMIC like Palma support different bits for configuring
rail's mode which is used in sleep mode of device.

Add support for configuring this mode bits.

Change-Id: Ib1bbc5164bf71c75c727dc759436e8dcf206f511
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/201792

drivers/regulator/core.c
include/linux/regulator/consumer.h
include/linux/regulator/driver.h
include/linux/regulator/machine.h

index 658ad13..5facefe 100644 (file)
@@ -1068,6 +1068,20 @@ static int set_machine_constraints(struct regulator_dev *rdev,
                }
        }
 
+       if (rdev->constraints->sleep_mode) {
+               if (!ops->set_sleep_mode) {
+                       rdev_err(rdev, "no set_sleep_mode operation\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               ret = ops->set_sleep_mode(rdev, rdev->constraints->sleep_mode);
+               if (ret < 0) {
+                       rdev_err(rdev, "failed to set sleep mode: %d\n", ret);
+                       goto out;
+               }
+       }
+
        /* If the constraints say the regulator should be on at this point
         * and we have control then make sure it is enabled.
         */
index 109ac78..2a6be3f 100644 (file)
@@ -71,6 +71,7 @@ struct notifier_block;
  *             in a sleep/standby state. This mode is likely to be
  *             the most noisy and may not be able to handle fast load
  *             switching.
+ *  OFF        Regulator turn off completely.
  *
  * NOTE: Most regulators will only support a subset of these modes. Some
  * will only just support NORMAL.
@@ -82,6 +83,7 @@ struct notifier_block;
 #define REGULATOR_MODE_NORMAL                  0x2
 #define REGULATOR_MODE_IDLE                    0x4
 #define REGULATOR_MODE_STANDBY                 0x8
+#define REGULATOR_MODE_OFF                     0x10
 
 /*
  * Regulator control modes.
index 2ecf124..46f1f3d 100644 (file)
@@ -113,6 +113,10 @@ struct regulator_ops {
        int (*set_mode) (struct regulator_dev *, unsigned int mode);
        unsigned int (*get_mode) (struct regulator_dev *);
 
+       /* get/set regulator sleep mode (defined in consumer.h) */
+       int (*set_sleep_mode) (struct regulator_dev *, unsigned int sleep_mode);
+       unsigned int (*get_sleep_mode) (struct regulator_dev *);
+
        /* get/set regulator control mode (defined in consumer.h) */
        int (*set_control_mode) (struct regulator_dev *, unsigned int mode);
        unsigned int (*get_control_mode) (struct regulator_dev *);
index 1cbe6fe..3f441cd 100644 (file)
@@ -128,6 +128,9 @@ struct regulation_constraints {
        /* mode to set on startup */
        unsigned int initial_mode;
 
+       /* mode to be set on sleep mode */
+       unsigned int sleep_mode;
+
        unsigned int ramp_delay;
 
        /* constraint flags */