aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@sirena.org.uk>2013-04-27 21:13:37 -0400
committerMark Brown <broonie@sirena.org.uk>2013-04-27 21:13:37 -0400
commit1d60a4cf975a196d585149e667f58cbca1a574fc (patch)
tree208ae4c9539f349cd5fa87ac62b79cb6569c4d62
parent0e340ce1ddcf41ca435ef695ef004a6f587c749e (diff)
parentea88b132acdf3270b812117f622b0df044e6b76f (diff)
Merge remote-tracking branch 'regulator/topic/enable-invert' into v3.9-rc8
-rw-r--r--drivers/regulator/88pm8607.c36
-rw-r--r--drivers/regulator/core.c24
-rw-r--r--drivers/regulator/max8649.c39
-rw-r--r--include/linux/regulator/driver.h3
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
223static 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
231static 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
240static 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
252static struct regulator_ops pm8607_regulator_ops = { 223static 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
261static struct regulator_ops pm8606_preg_ops = { 232static 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}
1808EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); 1811EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
1809 1812
@@ -1818,9 +1821,15 @@ EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
1818 */ 1821 */
1819int regulator_enable_regmap(struct regulator_dev *rdev) 1822int 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}
1825EXPORT_SYMBOL_GPL(regulator_enable_regmap); 1834EXPORT_SYMBOL_GPL(regulator_enable_regmap);
1826 1835
@@ -1835,8 +1844,15 @@ EXPORT_SYMBOL_GPL(regulator_enable_regmap);
1835 */ 1844 */
1836int regulator_disable_regmap(struct regulator_dev *rdev) 1845int 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}
1841EXPORT_SYMBOL_GPL(regulator_disable_regmap); 1857EXPORT_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 */
64static 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 */
74static 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
81static 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
93static int max8649_enable_time(struct regulator_dev *rdev) 63static 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
174static struct regmap_config max8649_regmap_config = { 147static 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