diff options
author | Mark Brown <broonie@sirena.org.uk> | 2013-04-27 21:13:37 -0400 |
---|---|---|
committer | Mark Brown <broonie@sirena.org.uk> | 2013-04-27 21:13:37 -0400 |
commit | 1d60a4cf975a196d585149e667f58cbca1a574fc (patch) | |
tree | 208ae4c9539f349cd5fa87ac62b79cb6569c4d62 | |
parent | 0e340ce1ddcf41ca435ef695ef004a6f587c749e (diff) | |
parent | ea88b132acdf3270b812117f622b0df044e6b76f (diff) |
Merge remote-tracking branch 'regulator/topic/enable-invert' into v3.9-rc8
-rw-r--r-- | drivers/regulator/88pm8607.c | 36 | ||||
-rw-r--r-- | drivers/regulator/core.c | 24 | ||||
-rw-r--r-- | drivers/regulator/max8649.c | 39 | ||||
-rw-r--r-- | include/linux/regulator/driver.h | 3 |
4 files changed, 33 insertions, 69 deletions
diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c index c79ab843333e..493948a38fca 100644 --- a/drivers/regulator/88pm8607.c +++ b/drivers/regulator/88pm8607.c | |||
@@ -220,35 +220,6 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index) | |||
220 | return ret; | 220 | return ret; |
221 | } | 221 | } |
222 | 222 | ||
223 | static int pm8606_preg_enable(struct regulator_dev *rdev) | ||
224 | { | ||
225 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
226 | |||
227 | return pm860x_set_bits(info->i2c, rdev->desc->enable_reg, | ||
228 | 1 << rdev->desc->enable_mask, 0); | ||
229 | } | ||
230 | |||
231 | static int pm8606_preg_disable(struct regulator_dev *rdev) | ||
232 | { | ||
233 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
234 | |||
235 | return pm860x_set_bits(info->i2c, rdev->desc->enable_reg, | ||
236 | 1 << rdev->desc->enable_mask, | ||
237 | 1 << rdev->desc->enable_mask); | ||
238 | } | ||
239 | |||
240 | static int pm8606_preg_is_enabled(struct regulator_dev *rdev) | ||
241 | { | ||
242 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
243 | int ret; | ||
244 | |||
245 | ret = pm860x_reg_read(info->i2c, rdev->desc->enable_reg); | ||
246 | if (ret < 0) | ||
247 | return ret; | ||
248 | |||
249 | return !((unsigned char)ret & (1 << rdev->desc->enable_mask)); | ||
250 | } | ||
251 | |||
252 | static struct regulator_ops pm8607_regulator_ops = { | 223 | static struct regulator_ops pm8607_regulator_ops = { |
253 | .list_voltage = pm8607_list_voltage, | 224 | .list_voltage = pm8607_list_voltage, |
254 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | 225 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
@@ -259,9 +230,9 @@ static struct regulator_ops pm8607_regulator_ops = { | |||
259 | }; | 230 | }; |
260 | 231 | ||
261 | static struct regulator_ops pm8606_preg_ops = { | 232 | static struct regulator_ops pm8606_preg_ops = { |
262 | .enable = pm8606_preg_enable, | 233 | .enable = regulator_enable_regmap, |
263 | .disable = pm8606_preg_disable, | 234 | .disable = regulator_disable_regmap, |
264 | .is_enabled = pm8606_preg_is_enabled, | 235 | .is_enabled = regulator_is_enabled_regmap, |
265 | }; | 236 | }; |
266 | 237 | ||
267 | #define PM8606_PREG(ereg, ebit) \ | 238 | #define PM8606_PREG(ereg, ebit) \ |
@@ -274,6 +245,7 @@ static struct regulator_ops pm8606_preg_ops = { | |||
274 | .owner = THIS_MODULE, \ | 245 | .owner = THIS_MODULE, \ |
275 | .enable_reg = PM8606_##ereg, \ | 246 | .enable_reg = PM8606_##ereg, \ |
276 | .enable_mask = (ebit), \ | 247 | .enable_mask = (ebit), \ |
248 | .enable_is_inverted = true, \ | ||
277 | }, \ | 249 | }, \ |
278 | } | 250 | } |
279 | 251 | ||
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6437949849b0..2434e2e1afcc 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1803,7 +1803,10 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev) | |||
1803 | if (ret != 0) | 1803 | if (ret != 0) |
1804 | return ret; | 1804 | return ret; |
1805 | 1805 | ||
1806 | return (val & rdev->desc->enable_mask) != 0; | 1806 | if (rdev->desc->enable_is_inverted) |
1807 | return (val & rdev->desc->enable_mask) == 0; | ||
1808 | else | ||
1809 | return (val & rdev->desc->enable_mask) != 0; | ||
1807 | } | 1810 | } |
1808 | EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); | 1811 | EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); |
1809 | 1812 | ||
@@ -1818,9 +1821,15 @@ EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); | |||
1818 | */ | 1821 | */ |
1819 | int regulator_enable_regmap(struct regulator_dev *rdev) | 1822 | int regulator_enable_regmap(struct regulator_dev *rdev) |
1820 | { | 1823 | { |
1824 | unsigned int val; | ||
1825 | |||
1826 | if (rdev->desc->enable_is_inverted) | ||
1827 | val = 0; | ||
1828 | else | ||
1829 | val = rdev->desc->enable_mask; | ||
1830 | |||
1821 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, | 1831 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
1822 | rdev->desc->enable_mask, | 1832 | rdev->desc->enable_mask, val); |
1823 | rdev->desc->enable_mask); | ||
1824 | } | 1833 | } |
1825 | EXPORT_SYMBOL_GPL(regulator_enable_regmap); | 1834 | EXPORT_SYMBOL_GPL(regulator_enable_regmap); |
1826 | 1835 | ||
@@ -1835,8 +1844,15 @@ EXPORT_SYMBOL_GPL(regulator_enable_regmap); | |||
1835 | */ | 1844 | */ |
1836 | int regulator_disable_regmap(struct regulator_dev *rdev) | 1845 | int regulator_disable_regmap(struct regulator_dev *rdev) |
1837 | { | 1846 | { |
1847 | unsigned int val; | ||
1848 | |||
1849 | if (rdev->desc->enable_is_inverted) | ||
1850 | val = rdev->desc->enable_mask; | ||
1851 | else | ||
1852 | val = 0; | ||
1853 | |||
1838 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, | 1854 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
1839 | rdev->desc->enable_mask, 0); | 1855 | rdev->desc->enable_mask, val); |
1840 | } | 1856 | } |
1841 | EXPORT_SYMBOL_GPL(regulator_disable_regmap); | 1857 | EXPORT_SYMBOL_GPL(regulator_disable_regmap); |
1842 | 1858 | ||
diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c index f44427003611..db6c9be10f3f 100644 --- a/drivers/regulator/max8649.c +++ b/drivers/regulator/max8649.c | |||
@@ -60,36 +60,6 @@ struct max8649_regulator_info { | |||
60 | unsigned ramp_down:1; | 60 | unsigned ramp_down:1; |
61 | }; | 61 | }; |
62 | 62 | ||
63 | /* EN_PD means pulldown on EN input */ | ||
64 | static int max8649_enable(struct regulator_dev *rdev) | ||
65 | { | ||
66 | struct max8649_regulator_info *info = rdev_get_drvdata(rdev); | ||
67 | return regmap_update_bits(info->regmap, MAX8649_CONTROL, MAX8649_EN_PD, 0); | ||
68 | } | ||
69 | |||
70 | /* | ||
71 | * Applied internal pulldown resistor on EN input pin. | ||
72 | * If pulldown EN pin outside, it would be better. | ||
73 | */ | ||
74 | static int max8649_disable(struct regulator_dev *rdev) | ||
75 | { | ||
76 | struct max8649_regulator_info *info = rdev_get_drvdata(rdev); | ||
77 | return regmap_update_bits(info->regmap, MAX8649_CONTROL, MAX8649_EN_PD, | ||
78 | MAX8649_EN_PD); | ||
79 | } | ||
80 | |||
81 | static int max8649_is_enabled(struct regulator_dev *rdev) | ||
82 | { | ||
83 | struct max8649_regulator_info *info = rdev_get_drvdata(rdev); | ||
84 | unsigned int val; | ||
85 | int ret; | ||
86 | |||
87 | ret = regmap_read(info->regmap, MAX8649_CONTROL, &val); | ||
88 | if (ret != 0) | ||
89 | return ret; | ||
90 | return !((unsigned char)val & MAX8649_EN_PD); | ||
91 | } | ||
92 | |||
93 | static int max8649_enable_time(struct regulator_dev *rdev) | 63 | static int max8649_enable_time(struct regulator_dev *rdev) |
94 | { | 64 | { |
95 | struct max8649_regulator_info *info = rdev_get_drvdata(rdev); | 65 | struct max8649_regulator_info *info = rdev_get_drvdata(rdev); |
@@ -151,9 +121,9 @@ static struct regulator_ops max8649_dcdc_ops = { | |||
151 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | 121 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
152 | .list_voltage = regulator_list_voltage_linear, | 122 | .list_voltage = regulator_list_voltage_linear, |
153 | .map_voltage = regulator_map_voltage_linear, | 123 | .map_voltage = regulator_map_voltage_linear, |
154 | .enable = max8649_enable, | 124 | .enable = regulator_enable_regmap, |
155 | .disable = max8649_disable, | 125 | .disable = regulator_disable_regmap, |
156 | .is_enabled = max8649_is_enabled, | 126 | .is_enabled = regulator_is_enabled_regmap, |
157 | .enable_time = max8649_enable_time, | 127 | .enable_time = max8649_enable_time, |
158 | .set_mode = max8649_set_mode, | 128 | .set_mode = max8649_set_mode, |
159 | .get_mode = max8649_get_mode, | 129 | .get_mode = max8649_get_mode, |
@@ -169,6 +139,9 @@ static struct regulator_desc dcdc_desc = { | |||
169 | .vsel_mask = MAX8649_VOL_MASK, | 139 | .vsel_mask = MAX8649_VOL_MASK, |
170 | .min_uV = MAX8649_DCDC_VMIN, | 140 | .min_uV = MAX8649_DCDC_VMIN, |
171 | .uV_step = MAX8649_DCDC_STEP, | 141 | .uV_step = MAX8649_DCDC_STEP, |
142 | .enable_reg = MAX8649_CONTROL, | ||
143 | .enable_mask = MAX8649_EN_PD, | ||
144 | .enable_is_inverted = true, | ||
172 | }; | 145 | }; |
173 | 146 | ||
174 | static struct regmap_config max8649_regmap_config = { | 147 | static struct regmap_config max8649_regmap_config = { |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 2acdc66f8342..0dccc91b8ab4 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -199,6 +199,8 @@ enum regulator_type { | |||
199 | * output when using regulator_set_voltage_sel_regmap | 199 | * output when using regulator_set_voltage_sel_regmap |
200 | * @enable_reg: Register for control when using regmap enable/disable ops | 200 | * @enable_reg: Register for control when using regmap enable/disable ops |
201 | * @enable_mask: Mask for control when using regmap enable/disable ops | 201 | * @enable_mask: Mask for control when using regmap enable/disable ops |
202 | * @enable_is_inverted: A flag to indicate set enable_mask bits to disable | ||
203 | * when using regulator_enable_regmap and friends APIs. | ||
202 | * @bypass_reg: Register for control when using regmap set_bypass | 204 | * @bypass_reg: Register for control when using regmap set_bypass |
203 | * @bypass_mask: Mask for control when using regmap set_bypass | 205 | * @bypass_mask: Mask for control when using regmap set_bypass |
204 | * | 206 | * |
@@ -228,6 +230,7 @@ struct regulator_desc { | |||
228 | unsigned int apply_bit; | 230 | unsigned int apply_bit; |
229 | unsigned int enable_reg; | 231 | unsigned int enable_reg; |
230 | unsigned int enable_mask; | 232 | unsigned int enable_mask; |
233 | bool enable_is_inverted; | ||
231 | unsigned int bypass_reg; | 234 | unsigned int bypass_reg; |
232 | unsigned int bypass_mask; | 235 | unsigned int bypass_mask; |
233 | 236 | ||