diff options
author | Mark Brown <broonie@linaro.org> | 2013-09-01 08:50:21 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-09-01 08:50:21 -0400 |
commit | 04fcec88cdd050ae1cecf7cc7fabf50bd48b8cba (patch) | |
tree | 1ac7ccb8e6f1da49cfa998ee44f2a44def9fc5d1 | |
parent | a89f5c759857b1d1a56a4d530ad30bc1cacc58c9 (diff) | |
parent | f8f1d48be393f517a16de4271cc8b7854efd693a (diff) |
Merge remote-tracking branch 'regulator/topic/sec' into regulator-next
-rw-r--r-- | drivers/regulator/s2mps11.c | 245 | ||||
-rw-r--r-- | include/linux/mfd/samsung/s2mps11.h | 11 |
2 files changed, 211 insertions, 45 deletions
diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index 2f62564ca936..5eba2ff8c0e8 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c | |||
@@ -16,12 +16,17 @@ | |||
16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/of.h> | ||
20 | #include <linux/regmap.h> | ||
19 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
20 | #include <linux/regulator/driver.h> | 22 | #include <linux/regulator/driver.h> |
21 | #include <linux/regulator/machine.h> | 23 | #include <linux/regulator/machine.h> |
24 | #include <linux/regulator/of_regulator.h> | ||
22 | #include <linux/mfd/samsung/core.h> | 25 | #include <linux/mfd/samsung/core.h> |
23 | #include <linux/mfd/samsung/s2mps11.h> | 26 | #include <linux/mfd/samsung/s2mps11.h> |
24 | 27 | ||
28 | #define S2MPS11_REGULATOR_CNT ARRAY_SIZE(regulators) | ||
29 | |||
25 | struct s2mps11_info { | 30 | struct s2mps11_info { |
26 | struct regulator_dev *rdev[S2MPS11_REGULATOR_MAX]; | 31 | struct regulator_dev *rdev[S2MPS11_REGULATOR_MAX]; |
27 | 32 | ||
@@ -31,11 +36,6 @@ struct s2mps11_info { | |||
31 | int ramp_delay16; | 36 | int ramp_delay16; |
32 | int ramp_delay7810; | 37 | int ramp_delay7810; |
33 | int ramp_delay9; | 38 | int ramp_delay9; |
34 | |||
35 | bool buck6_ramp; | ||
36 | bool buck2_ramp; | ||
37 | bool buck3_ramp; | ||
38 | bool buck4_ramp; | ||
39 | }; | 39 | }; |
40 | 40 | ||
41 | static int get_ramp_delay(int ramp_delay) | 41 | static int get_ramp_delay(int ramp_delay) |
@@ -50,9 +50,171 @@ static int get_ramp_delay(int ramp_delay) | |||
50 | break; | 50 | break; |
51 | cnt++; | 51 | cnt++; |
52 | } | 52 | } |
53 | |||
54 | if (cnt > 3) | ||
55 | cnt = 3; | ||
56 | |||
53 | return cnt; | 57 | return cnt; |
54 | } | 58 | } |
55 | 59 | ||
60 | static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev, | ||
61 | unsigned int old_selector, | ||
62 | unsigned int new_selector) | ||
63 | { | ||
64 | struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); | ||
65 | unsigned int ramp_delay = 0; | ||
66 | int old_volt, new_volt; | ||
67 | |||
68 | switch (rdev->desc->id) { | ||
69 | case S2MPS11_BUCK2: | ||
70 | ramp_delay = s2mps11->ramp_delay2; | ||
71 | break; | ||
72 | case S2MPS11_BUCK3: | ||
73 | ramp_delay = s2mps11->ramp_delay34; | ||
74 | break; | ||
75 | case S2MPS11_BUCK4: | ||
76 | ramp_delay = s2mps11->ramp_delay34; | ||
77 | break; | ||
78 | case S2MPS11_BUCK5: | ||
79 | ramp_delay = s2mps11->ramp_delay5; | ||
80 | break; | ||
81 | case S2MPS11_BUCK6: | ||
82 | case S2MPS11_BUCK1: | ||
83 | ramp_delay = s2mps11->ramp_delay16; | ||
84 | break; | ||
85 | case S2MPS11_BUCK7: | ||
86 | case S2MPS11_BUCK8: | ||
87 | case S2MPS11_BUCK10: | ||
88 | ramp_delay = s2mps11->ramp_delay7810; | ||
89 | break; | ||
90 | case S2MPS11_BUCK9: | ||
91 | ramp_delay = s2mps11->ramp_delay9; | ||
92 | } | ||
93 | |||
94 | if (ramp_delay == 0) | ||
95 | ramp_delay = rdev->desc->ramp_delay; | ||
96 | |||
97 | old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector); | ||
98 | new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector); | ||
99 | |||
100 | return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay); | ||
101 | } | ||
102 | |||
103 | static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) | ||
104 | { | ||
105 | struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); | ||
106 | unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK; | ||
107 | unsigned int ramp_enable = 1, enable_shift = 0; | ||
108 | int ret; | ||
109 | |||
110 | switch (rdev->desc->id) { | ||
111 | case S2MPS11_BUCK1: | ||
112 | if (ramp_delay > s2mps11->ramp_delay16) | ||
113 | s2mps11->ramp_delay16 = ramp_delay; | ||
114 | else | ||
115 | ramp_delay = s2mps11->ramp_delay16; | ||
116 | |||
117 | ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT; | ||
118 | break; | ||
119 | case S2MPS11_BUCK2: | ||
120 | enable_shift = S2MPS11_BUCK2_RAMP_EN_SHIFT; | ||
121 | if (!ramp_delay) { | ||
122 | ramp_enable = 0; | ||
123 | break; | ||
124 | } | ||
125 | |||
126 | s2mps11->ramp_delay2 = ramp_delay; | ||
127 | ramp_shift = S2MPS11_BUCK2_RAMP_SHIFT; | ||
128 | ramp_reg = S2MPS11_REG_RAMP; | ||
129 | break; | ||
130 | case S2MPS11_BUCK3: | ||
131 | enable_shift = S2MPS11_BUCK3_RAMP_EN_SHIFT; | ||
132 | if (!ramp_delay) { | ||
133 | ramp_enable = 0; | ||
134 | break; | ||
135 | } | ||
136 | |||
137 | if (ramp_delay > s2mps11->ramp_delay34) | ||
138 | s2mps11->ramp_delay34 = ramp_delay; | ||
139 | else | ||
140 | ramp_delay = s2mps11->ramp_delay34; | ||
141 | |||
142 | ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT; | ||
143 | ramp_reg = S2MPS11_REG_RAMP; | ||
144 | break; | ||
145 | case S2MPS11_BUCK4: | ||
146 | enable_shift = S2MPS11_BUCK4_RAMP_EN_SHIFT; | ||
147 | if (!ramp_delay) { | ||
148 | ramp_enable = 0; | ||
149 | break; | ||
150 | } | ||
151 | |||
152 | if (ramp_delay > s2mps11->ramp_delay34) | ||
153 | s2mps11->ramp_delay34 = ramp_delay; | ||
154 | else | ||
155 | ramp_delay = s2mps11->ramp_delay34; | ||
156 | |||
157 | ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT; | ||
158 | ramp_reg = S2MPS11_REG_RAMP; | ||
159 | break; | ||
160 | case S2MPS11_BUCK5: | ||
161 | s2mps11->ramp_delay5 = ramp_delay; | ||
162 | ramp_shift = S2MPS11_BUCK5_RAMP_SHIFT; | ||
163 | break; | ||
164 | case S2MPS11_BUCK6: | ||
165 | enable_shift = S2MPS11_BUCK6_RAMP_EN_SHIFT; | ||
166 | if (!ramp_delay) { | ||
167 | ramp_enable = 0; | ||
168 | break; | ||
169 | } | ||
170 | |||
171 | if (ramp_delay > s2mps11->ramp_delay16) | ||
172 | s2mps11->ramp_delay16 = ramp_delay; | ||
173 | else | ||
174 | ramp_delay = s2mps11->ramp_delay16; | ||
175 | |||
176 | ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT; | ||
177 | break; | ||
178 | case S2MPS11_BUCK7: | ||
179 | case S2MPS11_BUCK8: | ||
180 | case S2MPS11_BUCK10: | ||
181 | if (ramp_delay > s2mps11->ramp_delay7810) | ||
182 | s2mps11->ramp_delay7810 = ramp_delay; | ||
183 | else | ||
184 | ramp_delay = s2mps11->ramp_delay7810; | ||
185 | |||
186 | ramp_shift = S2MPS11_BUCK7810_RAMP_SHIFT; | ||
187 | break; | ||
188 | case S2MPS11_BUCK9: | ||
189 | s2mps11->ramp_delay9 = ramp_delay; | ||
190 | ramp_shift = S2MPS11_BUCK9_RAMP_SHIFT; | ||
191 | break; | ||
192 | default: | ||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | if (!ramp_enable) | ||
197 | goto ramp_disable; | ||
198 | |||
199 | if (enable_shift) { | ||
200 | ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP, | ||
201 | 1 << enable_shift, 1 << enable_shift); | ||
202 | if (ret) { | ||
203 | dev_err(&rdev->dev, "failed to enable ramp rate\n"); | ||
204 | return ret; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | ramp_val = get_ramp_delay(ramp_delay); | ||
209 | |||
210 | return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift, | ||
211 | ramp_val << ramp_shift); | ||
212 | |||
213 | ramp_disable: | ||
214 | return regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP, | ||
215 | 1 << enable_shift, 0); | ||
216 | } | ||
217 | |||
56 | static struct regulator_ops s2mps11_ldo_ops = { | 218 | static struct regulator_ops s2mps11_ldo_ops = { |
57 | .list_voltage = regulator_list_voltage_linear, | 219 | .list_voltage = regulator_list_voltage_linear, |
58 | .map_voltage = regulator_map_voltage_linear, | 220 | .map_voltage = regulator_map_voltage_linear, |
@@ -72,7 +234,8 @@ static struct regulator_ops s2mps11_buck_ops = { | |||
72 | .disable = regulator_disable_regmap, | 234 | .disable = regulator_disable_regmap, |
73 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | 235 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
74 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | 236 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
75 | .set_voltage_time_sel = regulator_set_voltage_time_sel, | 237 | .set_voltage_time_sel = s2mps11_regulator_set_voltage_time_sel, |
238 | .set_ramp_delay = s2mps11_set_ramp_delay, | ||
76 | }; | 239 | }; |
77 | 240 | ||
78 | #define regulator_desc_ldo1(num) { \ | 241 | #define regulator_desc_ldo1(num) { \ |
@@ -239,59 +402,51 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) | |||
239 | { | 402 | { |
240 | struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); | 403 | struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
241 | struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); | 404 | struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); |
405 | struct of_regulator_match rdata[S2MPS11_REGULATOR_MAX]; | ||
406 | struct device_node *reg_np = NULL; | ||
242 | struct regulator_config config = { }; | 407 | struct regulator_config config = { }; |
243 | struct s2mps11_info *s2mps11; | 408 | struct s2mps11_info *s2mps11; |
244 | int i, ret; | 409 | int i, ret; |
245 | unsigned char ramp_enable, ramp_reg = 0; | ||
246 | |||
247 | if (!pdata) { | ||
248 | dev_err(pdev->dev.parent, "Platform data not supplied\n"); | ||
249 | return -ENODEV; | ||
250 | } | ||
251 | 410 | ||
252 | s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info), | 411 | s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info), |
253 | GFP_KERNEL); | 412 | GFP_KERNEL); |
254 | if (!s2mps11) | 413 | if (!s2mps11) |
255 | return -ENOMEM; | 414 | return -ENOMEM; |
256 | 415 | ||
257 | platform_set_drvdata(pdev, s2mps11); | 416 | if (!iodev->dev->of_node) { |
417 | if (pdata) { | ||
418 | goto common_reg; | ||
419 | } else { | ||
420 | dev_err(pdev->dev.parent, | ||
421 | "Platform data or DT node not supplied\n"); | ||
422 | return -ENODEV; | ||
423 | } | ||
424 | } | ||
258 | 425 | ||
259 | s2mps11->ramp_delay2 = pdata->buck2_ramp_delay; | 426 | for (i = 0; i < S2MPS11_REGULATOR_CNT; i++) |
260 | s2mps11->ramp_delay34 = pdata->buck34_ramp_delay; | 427 | rdata[i].name = regulators[i].name; |
261 | s2mps11->ramp_delay5 = pdata->buck5_ramp_delay; | 428 | |
262 | s2mps11->ramp_delay16 = pdata->buck16_ramp_delay; | 429 | reg_np = of_find_node_by_name(iodev->dev->of_node, "regulators"); |
263 | s2mps11->ramp_delay7810 = pdata->buck7810_ramp_delay; | 430 | if (!reg_np) { |
264 | s2mps11->ramp_delay9 = pdata->buck9_ramp_delay; | 431 | dev_err(&pdev->dev, "could not find regulators sub-node\n"); |
265 | 432 | return -EINVAL; | |
266 | s2mps11->buck6_ramp = pdata->buck6_ramp_enable; | ||
267 | s2mps11->buck2_ramp = pdata->buck2_ramp_enable; | ||
268 | s2mps11->buck3_ramp = pdata->buck3_ramp_enable; | ||
269 | s2mps11->buck4_ramp = pdata->buck4_ramp_enable; | ||
270 | |||
271 | ramp_enable = (s2mps11->buck2_ramp << 3) | (s2mps11->buck3_ramp << 2) | | ||
272 | (s2mps11->buck4_ramp << 1) | s2mps11->buck6_ramp ; | ||
273 | |||
274 | if (ramp_enable) { | ||
275 | if (s2mps11->buck2_ramp) | ||
276 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay2) << 6; | ||
277 | if (s2mps11->buck3_ramp || s2mps11->buck4_ramp) | ||
278 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay34) << 4; | ||
279 | sec_reg_write(iodev, S2MPS11_REG_RAMP, ramp_reg | ramp_enable); | ||
280 | } | 433 | } |
281 | 434 | ||
282 | ramp_reg &= 0x00; | 435 | of_regulator_match(&pdev->dev, reg_np, rdata, S2MPS11_REGULATOR_MAX); |
283 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay5) << 6; | ||
284 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay16) << 4; | ||
285 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay7810) << 2; | ||
286 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay9); | ||
287 | sec_reg_write(iodev, S2MPS11_REG_RAMP_BUCK, ramp_reg); | ||
288 | 436 | ||
289 | for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { | 437 | common_reg: |
438 | platform_set_drvdata(pdev, s2mps11); | ||
290 | 439 | ||
291 | config.dev = &pdev->dev; | 440 | config.dev = &pdev->dev; |
292 | config.regmap = iodev->regmap; | 441 | config.regmap = iodev->regmap; |
293 | config.init_data = pdata->regulators[i].initdata; | 442 | config.driver_data = s2mps11; |
294 | config.driver_data = s2mps11; | 443 | for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { |
444 | if (!reg_np) { | ||
445 | config.init_data = pdata->regulators[i].initdata; | ||
446 | } else { | ||
447 | config.init_data = rdata[i].init_data; | ||
448 | config.of_node = rdata[i].of_node; | ||
449 | } | ||
295 | 450 | ||
296 | s2mps11->rdev[i] = regulator_register(®ulators[i], &config); | 451 | s2mps11->rdev[i] = regulator_register(®ulators[i], &config); |
297 | if (IS_ERR(s2mps11->rdev[i])) { | 452 | if (IS_ERR(s2mps11->rdev[i])) { |
diff --git a/include/linux/mfd/samsung/s2mps11.h b/include/linux/mfd/samsung/s2mps11.h index 4e94dc65f987..d0d52ea60074 100644 --- a/include/linux/mfd/samsung/s2mps11.h +++ b/include/linux/mfd/samsung/s2mps11.h | |||
@@ -191,6 +191,17 @@ enum s2mps11_regulators { | |||
191 | #define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1) | 191 | #define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1) |
192 | #define S2MPS11_RAMP_DELAY 25000 /* uV/us */ | 192 | #define S2MPS11_RAMP_DELAY 25000 /* uV/us */ |
193 | 193 | ||
194 | |||
195 | #define S2MPS11_BUCK2_RAMP_SHIFT 6 | ||
196 | #define S2MPS11_BUCK34_RAMP_SHIFT 4 | ||
197 | #define S2MPS11_BUCK5_RAMP_SHIFT 6 | ||
198 | #define S2MPS11_BUCK16_RAMP_SHIFT 4 | ||
199 | #define S2MPS11_BUCK7810_RAMP_SHIFT 2 | ||
200 | #define S2MPS11_BUCK9_RAMP_SHIFT 0 | ||
201 | #define S2MPS11_BUCK2_RAMP_EN_SHIFT 3 | ||
202 | #define S2MPS11_BUCK3_RAMP_EN_SHIFT 2 | ||
203 | #define S2MPS11_BUCK4_RAMP_EN_SHIFT 1 | ||
204 | #define S2MPS11_BUCK6_RAMP_EN_SHIFT 0 | ||
194 | #define S2MPS11_PMIC_EN_SHIFT 6 | 205 | #define S2MPS11_PMIC_EN_SHIFT 6 |
195 | #define S2MPS11_REGULATOR_MAX (S2MPS11_REG_MAX - 3) | 206 | #define S2MPS11_REGULATOR_MAX (S2MPS11_REG_MAX - 3) |
196 | 207 | ||