]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
regulator: Add interface to change VSEL volatile attribute
authorAlex Frid <afrid@nvidia.com>
Tue, 11 Feb 2014 02:27:44 +0000 (18:27 -0800)
committerAleksandr Frid <afrid@nvidia.com>
Thu, 13 Feb 2014 19:07:53 +0000 (11:07 -0800)
Defined regulator device driver callback to specify access attribute
for the voltage selector register as either volatile or cached.
Implemented the respective public interface that uses the callback if
it is present, or updates regmap cache layer if the VSEL access is
based on regmap framework.

Bug 1454969

Change-Id: I2bb955d1c67d480ec20fdd783e37fd576fb88313
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/365705
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
drivers/regulator/core.c
include/linux/regulator/consumer.h
include/linux/regulator/driver.h

index e8dfbdd4662a96bb5ed4b153d06d7d7ad1da5dcd..5d343bbc71554a9c4f0fa82b1fbc2708ef7cc5d3 100644 (file)
@@ -3377,6 +3377,35 @@ out:
 }
 EXPORT_SYMBOL_GPL(regulator_set_optimum_mode);
 
+/**
+ * regulator_set_vsel_volatile - set voltage selector access mode
+ *
+ * @regulator: regulator source.
+ * @is_volatile: voltage selector volatile attribute to set.
+ *
+ * Set regulator voltage selector access attribute as volatile or cached.
+ *
+ * Returns 0 on success, an errno on failure.
+ */
+int regulator_set_vsel_volatile(struct regulator *regulator, bool is_volatile)
+{
+       int ret = -ENOSYS;
+       struct regulator_dev *rdev = regulator->rdev;
+
+       mutex_lock(&rdev->mutex);
+       if (rdev->desc->ops->set_vsel_volatile)
+               /* Use driver callback if provided */
+               ret = rdev->desc->ops->set_vsel_volatile(rdev, is_volatile);
+       else if (rdev->regmap) {
+               /* No callback, but regmap user - set regmap cache directly */
+               ret = regcache_volatile_set(rdev->regmap, rdev->desc->vsel_reg,
+                                           is_volatile);
+       }
+       mutex_unlock(&rdev->mutex);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(regulator_set_vsel_volatile);
+
 /**
  * regulator_set_bypass_regmap - Default set_bypass() using regmap
  *
index 5b1b7a74a68baba19564ac3a1ea66eb2821013d3..92463e7c3d270d9f2570531749b609d4f2aca444 100644 (file)
@@ -203,6 +203,8 @@ int regulator_set_mode(struct regulator *regulator, unsigned int mode);
 unsigned int regulator_get_mode(struct regulator *regulator);
 int regulator_set_optimum_mode(struct regulator *regulator, int load_uA);
 
+int regulator_set_vsel_volatile(struct regulator *regulator, bool is_volatile);
+
 int regulator_allow_bypass(struct regulator *regulator, bool allow);
 
 int regulator_set_control_mode(struct regulator *regulator, unsigned int mode);
@@ -385,6 +387,12 @@ static inline int regulator_set_optimum_mode(struct regulator *regulator,
        return REGULATOR_MODE_NORMAL;
 }
 
+static inline int regulator_set_vsel_volatile(struct regulator *regulator,
+                                             bool is_volatile)
+{
+       return 0;
+}
+
 static inline int regulator_allow_bypass(struct regulator *regulator,
                                         bool allow)
 {
index ef5bb248dac4d92d658ab11628b31e4d79ead5c6..2b77afe43c8e1b3cd9629d21e9bf09847c631cd8 100644 (file)
@@ -169,6 +169,9 @@ struct regulator_ops {
        unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,
                                          int output_uV, int load_uA);
 
+       /* set regulator voltage selector access as volatile or cached */
+       int (*set_vsel_volatile) (struct regulator_dev *, bool is_volatile);
+
        /* control and report on bypass mode */
        int (*set_bypass)(struct regulator_dev *dev, bool enable);
        int (*get_bypass)(struct regulator_dev *dev, bool *enable);