if (ret != 0)
                return ret;
 
-       if (rdev->desc->enable_is_inverted)
-               return (val & rdev->desc->enable_mask) == 0;
-       else
-               return (val & rdev->desc->enable_mask) != 0;
+       val &= rdev->desc->enable_mask;
+
+       if (rdev->desc->enable_is_inverted) {
+               if (rdev->desc->enable_val)
+                       return val != rdev->desc->enable_val;
+               return val == 0;
+       } else {
+               if (rdev->desc->enable_val)
+                       return val == rdev->desc->enable_val;
+               return val != 0;
+       }
 }
 EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
 
 {
        unsigned int val;
 
-       if (rdev->desc->enable_is_inverted)
-               val = 0;
-       else
-               val = rdev->desc->enable_mask;
+       if (rdev->desc->enable_is_inverted) {
+               val = rdev->desc->disable_val;
+       } else {
+               val = rdev->desc->enable_val;
+               if (!val)
+                       val = rdev->desc->enable_mask;
+       }
 
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
                                  rdev->desc->enable_mask, val);
 {
        unsigned int val;
 
-       if (rdev->desc->enable_is_inverted)
-               val = rdev->desc->enable_mask;
-       else
-               val = 0;
+       if (rdev->desc->enable_is_inverted) {
+               val = rdev->desc->enable_val;
+               if (!val)
+                       val = rdev->desc->enable_mask;
+       } else {
+               val = rdev->desc->disable_val;
+       }
 
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
                                  rdev->desc->enable_mask, val);
 {
        unsigned int val;
 
-       if (enable)
-               val = rdev->desc->bypass_mask;
-       else
-               val = 0;
+       if (enable) {
+               val = rdev->desc->bypass_val_on;
+               if (!val)
+                       val = rdev->desc->bypass_mask;
+       } else {
+               val = rdev->desc->bypass_val_off;
+       }
 
        return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg,
                                  rdev->desc->bypass_mask, val);
 
  *                output when using regulator_set_voltage_sel_regmap
  * @enable_reg: Register for control when using regmap enable/disable ops
  * @enable_mask: Mask for control when using regmap enable/disable ops
+ * @enable_val: Enabling value for control when using regmap enable/disable ops
+ * @disable_val: Disabling value for control when using regmap enable/disable ops
  * @enable_is_inverted: A flag to indicate set enable_mask bits to disable
  *                      when using regulator_enable_regmap and friends APIs.
  * @bypass_reg: Register for control when using regmap set_bypass
  * @bypass_mask: Mask for control when using regmap set_bypass
+ * @bypass_val_on: Enabling value for control when using regmap set_bypass
+ * @bypass_val_off: Disabling value for control when using regmap set_bypass
  *
  * @enable_time: Time taken for initial enable of regulator (in uS).
  */
        unsigned int apply_bit;
        unsigned int enable_reg;
        unsigned int enable_mask;
+       unsigned int enable_val;
+       unsigned int disable_val;
        bool enable_is_inverted;
        unsigned int bypass_reg;
        unsigned int bypass_mask;
+       unsigned int bypass_val_on;
+       unsigned int bypass_val_off;
 
        unsigned int enable_time;
 };