diff options
| -rw-r--r-- | drivers/regulator/core.c | 55 | ||||
| -rw-r--r-- | include/linux/regulator/driver.h | 7 |
2 files changed, 62 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 02d2e15b2262..9fafa00b8cd4 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -1725,6 +1725,61 @@ int regulator_disable_deferred(struct regulator *regulator, int ms) | |||
| 1725 | } | 1725 | } |
| 1726 | EXPORT_SYMBOL_GPL(regulator_disable_deferred); | 1726 | EXPORT_SYMBOL_GPL(regulator_disable_deferred); |
| 1727 | 1727 | ||
| 1728 | /** | ||
| 1729 | * regulator_is_enabled_regmap - standard is_enabled() for regmap users | ||
| 1730 | * | ||
| 1731 | * @rdev: regulator to operate on | ||
| 1732 | * | ||
| 1733 | * Regulators that use regmap for their register I/O can set the | ||
| 1734 | * enable_reg and enable_mask fields in their descriptor and then use | ||
| 1735 | * this as their is_enabled operation, saving some code. | ||
| 1736 | */ | ||
| 1737 | int regulator_is_enabled_regmap(struct regulator_dev *rdev) | ||
| 1738 | { | ||
| 1739 | unsigned int val; | ||
| 1740 | int ret; | ||
| 1741 | |||
| 1742 | ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val); | ||
| 1743 | if (ret != 0) | ||
| 1744 | return ret; | ||
| 1745 | |||
| 1746 | return (val & rdev->desc->enable_mask) != 0; | ||
| 1747 | } | ||
| 1748 | EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); | ||
| 1749 | |||
| 1750 | /** | ||
| 1751 | * regulator_enable_regmap - standard enable() for regmap users | ||
| 1752 | * | ||
| 1753 | * @rdev: regulator to operate on | ||
| 1754 | * | ||
| 1755 | * Regulators that use regmap for their register I/O can set the | ||
| 1756 | * enable_reg and enable_mask fields in their descriptor and then use | ||
| 1757 | * this as their enable() operation, saving some code. | ||
| 1758 | */ | ||
| 1759 | int regulator_enable_regmap(struct regulator_dev *rdev) | ||
| 1760 | { | ||
| 1761 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, | ||
| 1762 | rdev->desc->enable_mask, | ||
| 1763 | rdev->desc->enable_mask); | ||
| 1764 | } | ||
| 1765 | EXPORT_SYMBOL_GPL(regulator_enable_regmap); | ||
| 1766 | |||
| 1767 | /** | ||
| 1768 | * regulator_disable_regmap - standard disable() for regmap users | ||
| 1769 | * | ||
| 1770 | * @rdev: regulator to operate on | ||
| 1771 | * | ||
| 1772 | * Regulators that use regmap for their register I/O can set the | ||
| 1773 | * enable_reg and enable_mask fields in their descriptor and then use | ||
| 1774 | * this as their disable() operation, saving some code. | ||
| 1775 | */ | ||
| 1776 | int regulator_disable_regmap(struct regulator_dev *rdev) | ||
| 1777 | { | ||
| 1778 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, | ||
| 1779 | rdev->desc->enable_mask, 0); | ||
| 1780 | } | ||
| 1781 | EXPORT_SYMBOL_GPL(regulator_disable_regmap); | ||
| 1782 | |||
| 1728 | static int _regulator_is_enabled(struct regulator_dev *rdev) | 1783 | static int _regulator_is_enabled(struct regulator_dev *rdev) |
| 1729 | { | 1784 | { |
| 1730 | /* If we don't know then assume that the regulator is always on */ | 1785 | /* If we don't know then assume that the regulator is always on */ |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index d1c238970a6e..8160bc87be28 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
| @@ -167,6 +167,8 @@ enum regulator_type { | |||
| 167 | 167 | ||
| 168 | * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_ | 168 | * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_ |
| 169 | * @vsel_mask: Mask for register bitfield used for selector | 169 | * @vsel_mask: Mask for register bitfield used for selector |
| 170 | * @enable_reg: Register for control when using regmap enable/disable ops | ||
| 171 | * @enable_mask: Mask for control when using regmap enable/disable ops | ||
| 170 | */ | 172 | */ |
| 171 | struct regulator_desc { | 173 | struct regulator_desc { |
| 172 | const char *name; | 174 | const char *name; |
| @@ -180,6 +182,8 @@ struct regulator_desc { | |||
| 180 | 182 | ||
| 181 | unsigned int vsel_reg; | 183 | unsigned int vsel_reg; |
| 182 | unsigned int vsel_mask; | 184 | unsigned int vsel_mask; |
| 185 | unsigned int enable_reg; | ||
| 186 | unsigned int enable_mask; | ||
| 183 | }; | 187 | }; |
| 184 | 188 | ||
| 185 | /** | 189 | /** |
| @@ -258,6 +262,9 @@ int regulator_mode_to_status(unsigned int); | |||
| 258 | 262 | ||
| 259 | int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev); | 263 | int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev); |
| 260 | int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel); | 264 | int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel); |
| 265 | int regulator_is_enabled_regmap(struct regulator_dev *rdev); | ||
| 266 | int regulator_enable_regmap(struct regulator_dev *rdev); | ||
| 267 | int regulator_disable_regmap(struct regulator_dev *rdev); | ||
| 261 | 268 | ||
| 262 | void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); | 269 | void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); |
| 263 | 270 | ||
