diff options
-rw-r--r-- | drivers/regulator/core.c | 44 | ||||
-rw-r--r-- | include/linux/regulator/driver.h | 9 |
2 files changed, 53 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index bca1e5989243..02d2e15b2262 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1838,6 +1838,50 @@ int regulator_is_supported_voltage(struct regulator *regulator, | |||
1838 | } | 1838 | } |
1839 | EXPORT_SYMBOL_GPL(regulator_is_supported_voltage); | 1839 | EXPORT_SYMBOL_GPL(regulator_is_supported_voltage); |
1840 | 1840 | ||
1841 | /** | ||
1842 | * regulator_get_voltage_sel_regmap - standard get_voltage_sel for regmap users | ||
1843 | * | ||
1844 | * @rdev: regulator to operate on | ||
1845 | * | ||
1846 | * Regulators that use regmap for their register I/O can set the | ||
1847 | * vsel_reg and vsel_mask fields in their descriptor and then use this | ||
1848 | * as their get_voltage_vsel operation, saving some code. | ||
1849 | */ | ||
1850 | int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev) | ||
1851 | { | ||
1852 | unsigned int val; | ||
1853 | int ret; | ||
1854 | |||
1855 | ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val); | ||
1856 | if (ret != 0) | ||
1857 | return ret; | ||
1858 | |||
1859 | val &= rdev->desc->vsel_mask; | ||
1860 | val >>= ffs(rdev->desc->vsel_mask) - 1; | ||
1861 | |||
1862 | return val; | ||
1863 | } | ||
1864 | EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_regmap); | ||
1865 | |||
1866 | /** | ||
1867 | * regulator_set_voltage_sel_regmap - standard set_voltage_sel for regmap users | ||
1868 | * | ||
1869 | * @rdev: regulator to operate on | ||
1870 | * @sel: Selector to set | ||
1871 | * | ||
1872 | * Regulators that use regmap for their register I/O can set the | ||
1873 | * vsel_reg and vsel_mask fields in their descriptor and then use this | ||
1874 | * as their set_voltage_vsel operation, saving some code. | ||
1875 | */ | ||
1876 | int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel) | ||
1877 | { | ||
1878 | sel <<= ffs(rdev->desc->vsel_mask) - 1; | ||
1879 | |||
1880 | return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, | ||
1881 | rdev->desc->vsel_mask, sel); | ||
1882 | } | ||
1883 | EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_regmap); | ||
1884 | |||
1841 | static int _regulator_do_set_voltage(struct regulator_dev *rdev, | 1885 | static int _regulator_do_set_voltage(struct regulator_dev *rdev, |
1842 | int min_uV, int max_uV) | 1886 | int min_uV, int max_uV) |
1843 | { | 1887 | { |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 2e753731217b..d1c238970a6e 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -164,6 +164,9 @@ enum regulator_type { | |||
164 | * @irq: Interrupt number for the regulator. | 164 | * @irq: Interrupt number for the regulator. |
165 | * @type: Indicates if the regulator is a voltage or current regulator. | 165 | * @type: Indicates if the regulator is a voltage or current regulator. |
166 | * @owner: Module providing the regulator, used for refcounting. | 166 | * @owner: Module providing the regulator, used for refcounting. |
167 | |||
168 | * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_ | ||
169 | * @vsel_mask: Mask for register bitfield used for selector | ||
167 | */ | 170 | */ |
168 | struct regulator_desc { | 171 | struct regulator_desc { |
169 | const char *name; | 172 | const char *name; |
@@ -174,6 +177,9 @@ struct regulator_desc { | |||
174 | int irq; | 177 | int irq; |
175 | enum regulator_type type; | 178 | enum regulator_type type; |
176 | struct module *owner; | 179 | struct module *owner; |
180 | |||
181 | unsigned int vsel_reg; | ||
182 | unsigned int vsel_mask; | ||
177 | }; | 183 | }; |
178 | 184 | ||
179 | /** | 185 | /** |
@@ -250,6 +256,9 @@ int rdev_get_id(struct regulator_dev *rdev); | |||
250 | 256 | ||
251 | int regulator_mode_to_status(unsigned int); | 257 | int regulator_mode_to_status(unsigned int); |
252 | 258 | ||
259 | int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev); | ||
260 | int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel); | ||
261 | |||
253 | void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); | 262 | void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); |
254 | 263 | ||
255 | #endif | 264 | #endif |