blob: 5b4b907508e792f81a039bb78d7caad58e69d650 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/err.h>
14#include <linux/string.h>
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/mfd/pmic8901.h>
18#include <linux/regulator/driver.h>
19#include <linux/regulator/pmic8901-regulator.h>
20#include <mach/mpp.h>
21
22/* Regulator types */
23#define REGULATOR_TYPE_LDO 0
24#define REGULATOR_TYPE_SMPS 1
25#define REGULATOR_TYPE_VS 2
26#define REGULATOR_TYPE_MPP 3
27
28/* Bank select/write macros */
29#define REGULATOR_BANK_SEL(n) ((n) << 4)
30#define REGULATOR_BANK_WRITE 0x80
31#define LDO_TEST_BANKS 7
32#define REGULATOR_BANK_MASK 0xF0
33
34/* Pin mask resource register programming */
35#define VREG_PMR_STATE_MASK 0x60
36#define VREG_PMR_STATE_HPM 0x60
37#define VREG_PMR_STATE_LPM 0x40
38#define VREG_PMR_STATE_OFF 0x20
39#define VREG_PMR_STATE_PIN_CTRL 0x20
40
41#define VREG_PMR_MODE_ACTION_MASK 0x10
42#define VREG_PMR_MODE_ACTION_SLEEP 0x10
43#define VREG_PMR_MODE_ACTION_OFF 0x00
44
45#define VREG_PMR_MODE_PIN_MASK 0x08
46#define VREG_PMR_MODE_PIN_MASKED 0x08
47
48#define VREG_PMR_CTRL_PIN2_MASK 0x04
49#define VREG_PMR_CTRL_PIN2_MASKED 0x04
50
51#define VREG_PMR_CTRL_PIN1_MASK 0x02
52#define VREG_PMR_CTRL_PIN1_MASKED 0x02
53
54#define VREG_PMR_CTRL_PIN0_MASK 0x01
55#define VREG_PMR_CTRL_PIN0_MASKED 0x01
56
57#define VREG_PMR_PIN_CTRL_ALL_MASK 0x1F
58#define VREG_PMR_PIN_CTRL_ALL_MASKED 0x1F
59
60#define REGULATOR_IS_EN(pmr_reg) \
61 ((pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_HPM || \
62 (pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_LPM)
63
64/* FTSMPS programming */
65
66/* CTRL register */
67#define SMPS_VCTRL_BAND_MASK 0xC0
68#define SMPS_VCTRL_BAND_OFF 0x00
69#define SMPS_VCTRL_BAND_1 0x40
70#define SMPS_VCTRL_BAND_2 0x80
71#define SMPS_VCTRL_BAND_3 0xC0
72#define SMPS_VCTRL_VPROG_MASK 0x3F
73
74#define SMPS_BAND_1_UV_MIN 350000
75#define SMPS_BAND_1_UV_MAX 650000
76#define SMPS_BAND_1_UV_STEP 6250
77
78#define SMPS_BAND_2_UV_MIN 700000
79#define SMPS_BAND_2_UV_MAX 1400000
80#define SMPS_BAND_2_UV_STEP 12500
81
82#define SMPS_BAND_3_UV_SETPOINT_MIN 1500000
83#define SMPS_BAND_3_UV_MIN 1400000
84#define SMPS_BAND_3_UV_MAX 3300000
85#define SMPS_BAND_3_UV_STEP 50000
86
87#define SMPS_UV_MIN SMPS_BAND_1_UV_MIN
88#define SMPS_UV_MAX SMPS_BAND_3_UV_MAX
89
90/* PWR_CNFG register */
91#define SMPS_PULL_DOWN_ENABLE_MASK 0x40
92#define SMPS_PULL_DOWN_ENABLE 0x40
93
94/* LDO programming */
95
96/* CTRL register */
97#define LDO_LOCAL_ENABLE_MASK 0x80
98#define LDO_LOCAL_ENABLE 0x80
99
100#define LDO_PULL_DOWN_ENABLE_MASK 0x40
101#define LDO_PULL_DOWN_ENABLE 0x40
102
103#define LDO_CTRL_VPROG_MASK 0x1F
104
105/* TEST register bank 2 */
106#define LDO_TEST_VPROG_UPDATE_MASK 0x08
107#define LDO_TEST_RANGE_SEL_MASK 0x04
108#define LDO_TEST_FINE_STEP_MASK 0x02
109#define LDO_TEST_FINE_STEP_SHIFT 1
110
111/* TEST register bank 4 */
112#define LDO_TEST_RANGE_EXT_MASK 0x01
113
114/* Allowable voltage ranges */
115#define PLDO_LOW_UV_MIN 750000
116#define PLDO_LOW_UV_MAX 1537500
117#define PLDO_LOW_FINE_STEP_UV 12500
118
119#define PLDO_NORM_UV_MIN 1500000
120#define PLDO_NORM_UV_MAX 3075000
121#define PLDO_NORM_FINE_STEP_UV 25000
122
123#define PLDO_HIGH_UV_MIN 1750000
124#define PLDO_HIGH_UV_MAX 4900000
125#define PLDO_HIGH_FINE_STEP_UV 50000
126
127#define NLDO_UV_MIN 750000
128#define NLDO_UV_MAX 1537500
129#define NLDO_FINE_STEP_UV 12500
130
131/* VS programming */
132
133/* CTRL register */
134#define VS_CTRL_ENABLE_MASK 0xC0
135#define VS_CTRL_DISABLE 0x00
136#define VS_CTRL_ENABLE 0x40
137#define VS_CTRL_USE_PMR 0xC0
138
139#define VS_PULL_DOWN_ENABLE_MASK 0x20
140#define VS_PULL_DOWN_ENABLE 0x20
141
142struct pm8901_vreg {
143 struct pm8901_vreg_pdata *pdata;
144 struct regulator_dev *rdev;
145 struct pm8901_chip *chip;
146 int hpm_min_load;
147 unsigned pc_vote;
148 unsigned optimum;
149 unsigned mode_initialized;
150 u16 ctrl_addr;
151 u16 pmr_addr;
152 u16 test_addr;
153 u16 pfm_ctrl_addr;
154 u16 pwr_cnfg_addr;
155 u8 type;
156 u8 ctrl_reg;
157 u8 pmr_reg;
158 u8 test_reg[LDO_TEST_BANKS];
159 u8 pfm_ctrl_reg;
160 u8 pwr_cnfg_reg;
161 u8 is_nmos;
162 u8 mpp_id;
163 u8 state;
164};
165
166/*
167 * These are used to compensate for the PMIC 8901 v1 FTS regulators which
168 * output ~10% higher than the programmed set point.
169 */
170#define IS_PMIC_8901_V1(rev) ((rev) == PM_8901_REV_1p0 || \
171 (rev) == PM_8901_REV_1p1)
172
173#define PMIC_8901_V1_SCALE(uV) ((((uV) - 62100) * 23) / 25)
174
175#define PMIC_8901_V1_SCALE_INV(uV) (((uV) * 25) / 23 + 62100)
176
177/*
178 * Band 1 of PMIC 8901 SMPS regulators only supports set points with the 3 LSB's
179 * equal to 0. This is accomplished in the macro by truncating the bits.
180 */
181#define PM8901_SMPS_BAND_1_COMPENSATE(vprog) ((vprog) & 0xF8)
182
183#define LDO(_id, _ctrl_addr, _pmr_addr, _test_addr, _is_nmos) \
184 [_id] = { \
185 .ctrl_addr = _ctrl_addr, \
186 .pmr_addr = _pmr_addr, \
187 .test_addr = _test_addr, \
188 .type = REGULATOR_TYPE_LDO, \
189 .is_nmos = _is_nmos, \
190 .hpm_min_load = PM8901_VREG_LDO_300_HPM_MIN_LOAD, \
191 }
192
193#define SMPS(_id, _ctrl_addr, _pmr_addr, _pfm_ctrl_addr, _pwr_cnfg_addr) \
194 [_id] = { \
195 .ctrl_addr = _ctrl_addr, \
196 .pmr_addr = _pmr_addr, \
197 .pfm_ctrl_addr = _pfm_ctrl_addr, \
198 .pwr_cnfg_addr = _pwr_cnfg_addr, \
199 .type = REGULATOR_TYPE_SMPS, \
200 .hpm_min_load = PM8901_VREG_FTSMPS_HPM_MIN_LOAD, \
201 }
202
203#define VS(_id, _ctrl_addr, _pmr_addr) \
204 [_id] = { \
205 .ctrl_addr = _ctrl_addr, \
206 .pmr_addr = _pmr_addr, \
207 .type = REGULATOR_TYPE_VS, \
208 }
209
210#define MPP(_id, _mpp_id) \
211 [_id] = { \
212 .mpp_id = _mpp_id, \
213 .type = REGULATOR_TYPE_MPP, \
214 }
215
216static struct pm8901_vreg pm8901_vreg[] = {
217 /* id ctrl pmr tst n/p */
218 LDO(PM8901_VREG_ID_L0, 0x02F, 0x0AB, 0x030, 1),
219 LDO(PM8901_VREG_ID_L1, 0x031, 0x0AC, 0x032, 0),
220 LDO(PM8901_VREG_ID_L2, 0x033, 0x0AD, 0x034, 0),
221 LDO(PM8901_VREG_ID_L3, 0x035, 0x0AE, 0x036, 0),
222 LDO(PM8901_VREG_ID_L4, 0x037, 0x0AF, 0x038, 0),
223 LDO(PM8901_VREG_ID_L5, 0x039, 0x0B0, 0x03A, 0),
224 LDO(PM8901_VREG_ID_L6, 0x03B, 0x0B1, 0x03C, 0),
225
226 /* id ctrl pmr pfm pwr */
227 SMPS(PM8901_VREG_ID_S0, 0x05B, 0x0A6, 0x05C, 0x0E3),
228 SMPS(PM8901_VREG_ID_S1, 0x06A, 0x0A7, 0x06B, 0x0EC),
229 SMPS(PM8901_VREG_ID_S2, 0x079, 0x0A8, 0x07A, 0x0F1),
230 SMPS(PM8901_VREG_ID_S3, 0x088, 0x0A9, 0x089, 0x0F6),
231 SMPS(PM8901_VREG_ID_S4, 0x097, 0x0AA, 0x098, 0x0FB),
232
233 /* id MPP ID */
234 MPP(PM8901_VREG_ID_MPP0, 0),
235
236 /* id ctrl pmr */
237 VS(PM8901_VREG_ID_LVS0, 0x046, 0x0B2),
238 VS(PM8901_VREG_ID_LVS1, 0x048, 0x0B3),
239 VS(PM8901_VREG_ID_LVS2, 0x04A, 0x0B4),
240 VS(PM8901_VREG_ID_LVS3, 0x04C, 0x0B5),
241 VS(PM8901_VREG_ID_MVS0, 0x052, 0x0B6),
242 VS(PM8901_VREG_ID_USB_OTG, 0x055, 0x0B7),
243 VS(PM8901_VREG_ID_HDMI_MVS, 0x058, 0x0B8),
244};
245
246static void print_write_error(struct pm8901_vreg *vreg, int rc,
247 const char *func);
248
249static int pm8901_vreg_write(struct pm8901_chip *chip,
250 u16 addr, u8 val, u8 mask, u8 *reg_save)
251{
252 int rc = 0;
253 u8 reg;
254
255 reg = (*reg_save & ~mask) | (val & mask);
256 if (reg != *reg_save)
257 rc = pm8901_write(chip, addr, &reg, 1);
258 if (!rc)
259 *reg_save = reg;
260 return rc;
261}
262
263/* Set pin control bits based on new mode. */
264static int pm8901_vreg_select_pin_ctrl(struct pm8901_vreg *vreg, u8 *pmr_reg)
265{
266 *pmr_reg |= VREG_PMR_PIN_CTRL_ALL_MASKED;
267
268 if ((*pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_PIN_CTRL) {
269 if (vreg->pdata->pin_fn == PM8901_VREG_PIN_FN_MODE)
270 *pmr_reg = (*pmr_reg & ~VREG_PMR_STATE_MASK)
271 | VREG_PMR_STATE_LPM;
272 if (vreg->pdata->pin_ctrl & PM8901_VREG_PIN_CTRL_A0)
273 *pmr_reg &= ~VREG_PMR_CTRL_PIN0_MASKED;
274 if (vreg->pdata->pin_ctrl & PM8901_VREG_PIN_CTRL_A1)
275 *pmr_reg &= ~VREG_PMR_CTRL_PIN1_MASKED;
276 if (vreg->pdata->pin_ctrl & PM8901_VREG_PIN_CTRL_D0)
277 *pmr_reg &= ~VREG_PMR_CTRL_PIN2_MASKED;
278 }
279
280 return 0;
281}
282
283static int pm8901_vreg_enable(struct regulator_dev *dev)
284{
285 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
286 struct pm8901_chip *chip = vreg->chip;
287 u8 val = VREG_PMR_STATE_HPM;
288 int rc;
289
290 if (!vreg->mode_initialized && vreg->pc_vote)
291 val = VREG_PMR_STATE_PIN_CTRL;
292 else if (vreg->optimum == REGULATOR_MODE_FAST)
293 val = VREG_PMR_STATE_HPM;
294 else if (vreg->pc_vote)
295 val = VREG_PMR_STATE_PIN_CTRL;
296 else if (vreg->optimum == REGULATOR_MODE_STANDBY)
297 val = VREG_PMR_STATE_LPM;
298
299 pm8901_vreg_select_pin_ctrl(vreg, &val);
300
301 rc = pm8901_vreg_write(chip, vreg->pmr_addr,
302 val,
303 VREG_PMR_STATE_MASK | VREG_PMR_PIN_CTRL_ALL_MASK,
304 &vreg->pmr_reg);
305 if (rc)
306 print_write_error(vreg, rc, __func__);
307
308 return rc;
309}
310
311static int pm8901_vreg_disable(struct regulator_dev *dev)
312{
313 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
314 struct pm8901_chip *chip = vreg->chip;
315 int rc;
316
317 rc = pm8901_vreg_write(chip, vreg->pmr_addr,
318 VREG_PMR_STATE_OFF | VREG_PMR_PIN_CTRL_ALL_MASKED,
319 VREG_PMR_STATE_MASK | VREG_PMR_PIN_CTRL_ALL_MASK,
320 &vreg->pmr_reg);
321 if (rc)
322 print_write_error(vreg, rc, __func__);
323
324 return rc;
325}
326
327/*
328 * Cases that count as enabled:
329 *
330 * 1. PMR register has mode == HPM or LPM.
331 * 2. Any pin control bits are unmasked.
332 * 3. The regulator is an LDO and its local enable bit is set.
333 */
334static int _pm8901_vreg_is_enabled(struct pm8901_vreg *vreg)
335{
336 if ((vreg->type == REGULATOR_TYPE_LDO)
337 && (vreg->ctrl_reg & LDO_LOCAL_ENABLE_MASK))
338 return 1;
339 else if (vreg->type == REGULATOR_TYPE_VS) {
340 if ((vreg->ctrl_reg & VS_CTRL_ENABLE_MASK) == VS_CTRL_ENABLE)
341 return 1;
342 else if ((vreg->ctrl_reg & VS_CTRL_ENABLE_MASK)
343 == VS_CTRL_DISABLE)
344 return 0;
345 }
346
347 return REGULATOR_IS_EN(vreg->pmr_reg)
348 || ((vreg->pmr_reg & VREG_PMR_PIN_CTRL_ALL_MASK)
349 != VREG_PMR_PIN_CTRL_ALL_MASKED);
350}
351
352static int pm8901_vreg_is_enabled(struct regulator_dev *dev)
353{
354 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
355
356 return _pm8901_vreg_is_enabled(vreg);
357}
358
359static int pm8901_ldo_disable(struct regulator_dev *dev)
360{
361 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
362 struct pm8901_chip *chip = vreg->chip;
363 int rc;
364
365 /* Disassert local enable bit in CTRL register. */
366 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, 0, LDO_LOCAL_ENABLE_MASK,
367 &vreg->ctrl_reg);
368 if (rc)
369 print_write_error(vreg, rc, __func__);
370
371 /* Disassert enable bit in PMR register. */
372 rc = pm8901_vreg_disable(dev);
373
374 return rc;
375}
376
377static int pm8901_pldo_set_voltage(struct pm8901_chip *chip,
378 struct pm8901_vreg *vreg, int uV)
379{
380 int vmin, rc = 0;
381 unsigned vprog, fine_step;
382 u8 range_ext, range_sel, fine_step_reg;
383
384 if (uV < PLDO_LOW_UV_MIN || uV > PLDO_HIGH_UV_MAX)
385 return -EINVAL;
386
387 if (uV < PLDO_LOW_UV_MAX + PLDO_LOW_FINE_STEP_UV) {
388 vmin = PLDO_LOW_UV_MIN;
389 fine_step = PLDO_LOW_FINE_STEP_UV;
390 range_ext = 0;
391 range_sel = LDO_TEST_RANGE_SEL_MASK;
392 } else if (uV < PLDO_NORM_UV_MAX + PLDO_NORM_FINE_STEP_UV) {
393 vmin = PLDO_NORM_UV_MIN;
394 fine_step = PLDO_NORM_FINE_STEP_UV;
395 range_ext = 0;
396 range_sel = 0;
397 } else {
398 vmin = PLDO_HIGH_UV_MIN;
399 fine_step = PLDO_HIGH_FINE_STEP_UV;
400 range_ext = LDO_TEST_RANGE_EXT_MASK;
401 range_sel = 0;
402 }
403
404 vprog = (uV - vmin) / fine_step;
405 fine_step_reg = (vprog & 1) << LDO_TEST_FINE_STEP_SHIFT;
406 vprog >>= 1;
407
408 /*
409 * Disable program voltage update if range extension, range select,
410 * or fine step have changed and the regulator is enabled.
411 */
412 if (_pm8901_vreg_is_enabled(vreg) &&
413 (((range_ext ^ vreg->test_reg[4]) & LDO_TEST_RANGE_EXT_MASK)
414 || ((range_sel ^ vreg->test_reg[2]) & LDO_TEST_RANGE_SEL_MASK)
415 || ((fine_step_reg ^ vreg->test_reg[2])
416 & LDO_TEST_FINE_STEP_MASK))) {
417 rc = pm8901_vreg_write(chip, vreg->test_addr,
418 REGULATOR_BANK_SEL(2) | REGULATOR_BANK_WRITE,
419 REGULATOR_BANK_MASK | LDO_TEST_VPROG_UPDATE_MASK,
420 &vreg->test_reg[2]);
421 if (rc)
422 goto bail;
423 }
424
425 /* Write new voltage. */
426 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, vprog,
427 LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
428 if (rc)
429 goto bail;
430
431 /* Write range extension. */
432 rc = pm8901_vreg_write(chip, vreg->test_addr,
433 range_ext | REGULATOR_BANK_SEL(4)
434 | REGULATOR_BANK_WRITE,
435 LDO_TEST_RANGE_EXT_MASK | REGULATOR_BANK_MASK,
436 &vreg->test_reg[4]);
437 if (rc)
438 goto bail;
439
440 /* Write fine step, range select and program voltage update. */
441 rc = pm8901_vreg_write(chip, vreg->test_addr,
442 fine_step_reg | range_sel | REGULATOR_BANK_SEL(2)
443 | REGULATOR_BANK_WRITE | LDO_TEST_VPROG_UPDATE_MASK,
444 LDO_TEST_FINE_STEP_MASK | LDO_TEST_RANGE_SEL_MASK
445 | REGULATOR_BANK_MASK | LDO_TEST_VPROG_UPDATE_MASK,
446 &vreg->test_reg[2]);
447bail:
448 if (rc)
449 print_write_error(vreg, rc, __func__);
450
451 return rc;
452}
453
454static int pm8901_nldo_set_voltage(struct pm8901_chip *chip,
455 struct pm8901_vreg *vreg, int uV)
456{
457 unsigned vprog, fine_step_reg;
458 int rc;
459
460 if (uV < NLDO_UV_MIN || uV > NLDO_UV_MAX)
461 return -EINVAL;
462
463 vprog = (uV - NLDO_UV_MIN) / NLDO_FINE_STEP_UV;
464 fine_step_reg = (vprog & 1) << LDO_TEST_FINE_STEP_SHIFT;
465 vprog >>= 1;
466
467 /* Write new voltage. */
468 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, vprog,
469 LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
470 if (rc)
471 print_write_error(vreg, rc, __func__);
472
473 /* Write fine step. */
474 rc = pm8901_vreg_write(chip, vreg->test_addr,
475 fine_step_reg | REGULATOR_BANK_SEL(2)
476 | REGULATOR_BANK_WRITE | LDO_TEST_VPROG_UPDATE_MASK,
477 LDO_TEST_FINE_STEP_MASK | REGULATOR_BANK_MASK
478 | LDO_TEST_VPROG_UPDATE_MASK,
479 &vreg->test_reg[2]);
480 if (rc)
481 print_write_error(vreg, rc, __func__);
482
483 return rc;
484}
485
486static int pm8901_ldo_set_voltage(struct regulator_dev *dev,
487 int min_uV, int max_uV, unsigned *selector)
488{
489 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
490 struct pm8901_chip *chip = vreg->chip;
491
492 if (vreg->is_nmos)
493 return pm8901_nldo_set_voltage(chip, vreg, min_uV);
494 else
495 return pm8901_pldo_set_voltage(chip, vreg, min_uV);
496}
497
498static int pm8901_pldo_get_voltage(struct pm8901_vreg *vreg)
499{
500 int vmin, fine_step;
501 u8 range_ext, range_sel, vprog, fine_step_reg;
502
503 fine_step_reg = vreg->test_reg[2] & LDO_TEST_FINE_STEP_MASK;
504 range_sel = vreg->test_reg[2] & LDO_TEST_RANGE_SEL_MASK;
505 range_ext = vreg->test_reg[4] & LDO_TEST_RANGE_EXT_MASK;
506 vprog = vreg->ctrl_reg & LDO_CTRL_VPROG_MASK;
507
508 vprog = (vprog << 1) | (fine_step_reg >> LDO_TEST_FINE_STEP_SHIFT);
509
510 if (range_sel) {
511 /* low range mode */
512 fine_step = PLDO_LOW_FINE_STEP_UV;
513 vmin = PLDO_LOW_UV_MIN;
514 } else if (!range_ext) {
515 /* normal mode */
516 fine_step = PLDO_NORM_FINE_STEP_UV;
517 vmin = PLDO_NORM_UV_MIN;
518 } else {
519 /* high range mode */
520 fine_step = PLDO_HIGH_FINE_STEP_UV;
521 vmin = PLDO_HIGH_UV_MIN;
522 }
523
524 return fine_step * vprog + vmin;
525}
526
527static int pm8901_nldo_get_voltage(struct pm8901_vreg *vreg)
528{
529 u8 vprog, fine_step_reg;
530
531 fine_step_reg = vreg->test_reg[2] & LDO_TEST_FINE_STEP_MASK;
532 vprog = vreg->ctrl_reg & LDO_CTRL_VPROG_MASK;
533
534 vprog = (vprog << 1) | (fine_step_reg >> LDO_TEST_FINE_STEP_SHIFT);
535
536 return NLDO_FINE_STEP_UV * vprog + NLDO_UV_MIN;
537}
538
539static int pm8901_ldo_get_voltage(struct regulator_dev *dev)
540{
541 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
542
543 if (vreg->is_nmos)
544 return pm8901_nldo_get_voltage(vreg);
545 else
546 return pm8901_pldo_get_voltage(vreg);
547}
548
549/*
550 * Optimum mode programming:
551 * REGULATOR_MODE_FAST: Go to HPM (highest priority)
552 * REGULATOR_MODE_STANDBY: Go to pin ctrl mode if there are any pin ctrl
553 * votes, else go to LPM
554 *
555 * Pin ctrl mode voting via regulator set_mode:
556 * REGULATOR_MODE_IDLE: Go to pin ctrl mode if the optimum mode is LPM, else
557 * go to HPM
558 * REGULATOR_MODE_NORMAL: Go to LPM if it is the optimum mode, else go to HPM
559 */
560static int pm8901_vreg_set_mode(struct regulator_dev *dev, unsigned int mode)
561{
562 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
563 struct pm8901_chip *chip = vreg->chip;
564 unsigned optimum = vreg->optimum;
565 unsigned pc_vote = vreg->pc_vote;
566 unsigned mode_initialized = vreg->mode_initialized;
567 u8 val = 0;
568 int rc = 0;
569
570 /* Determine new mode to go into. */
571 switch (mode) {
572 case REGULATOR_MODE_FAST:
573 val = VREG_PMR_STATE_HPM;
574 optimum = mode;
575 mode_initialized = 1;
576 break;
577
578 case REGULATOR_MODE_STANDBY:
579 if (pc_vote)
580 val = VREG_PMR_STATE_PIN_CTRL;
581 else
582 val = VREG_PMR_STATE_LPM;
583 optimum = mode;
584 mode_initialized = 1;
585 break;
586
587 case REGULATOR_MODE_IDLE:
588 if (pc_vote++)
589 goto done; /* already taken care of */
590
591 if (mode_initialized && optimum == REGULATOR_MODE_FAST)
592 val = VREG_PMR_STATE_HPM;
593 else
594 val = VREG_PMR_STATE_PIN_CTRL;
595 break;
596
597 case REGULATOR_MODE_NORMAL:
598 if (pc_vote && --pc_vote)
599 goto done; /* already taken care of */
600
601 if (optimum == REGULATOR_MODE_STANDBY)
602 val = VREG_PMR_STATE_LPM;
603 else
604 val = VREG_PMR_STATE_HPM;
605 break;
606
607 default:
608 pr_err("%s: unknown mode, mode=%u\n", __func__, mode);
609 return -EINVAL;
610 }
611
612 /* Set pin control bits based on new mode. */
613 pm8901_vreg_select_pin_ctrl(vreg, &val);
614
615 /* Only apply mode setting to hardware if currently enabled. */
616 if (pm8901_vreg_is_enabled(dev))
617 rc = pm8901_vreg_write(chip, vreg->pmr_addr, val,
618 VREG_PMR_STATE_MASK | VREG_PMR_PIN_CTRL_ALL_MASK,
619 &vreg->pmr_reg);
620
621 if (rc) {
622 print_write_error(vreg, rc, __func__);
623 return rc;
624 }
625
626done:
627 vreg->mode_initialized = mode_initialized;
628 vreg->optimum = optimum;
629 vreg->pc_vote = pc_vote;
630
631 return 0;
632}
633
634static unsigned int pm8901_vreg_get_mode(struct regulator_dev *dev)
635{
636 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
637 int pin_mask = VREG_PMR_CTRL_PIN0_MASK | VREG_PMR_CTRL_PIN1_MASK
638 | VREG_PMR_CTRL_PIN2_MASK;
639
640 if (!vreg->mode_initialized && vreg->pc_vote)
641 return REGULATOR_MODE_IDLE;
642 else if (((vreg->pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_OFF)
643 && ((vreg->pmr_reg & pin_mask) != pin_mask))
644 return REGULATOR_MODE_IDLE;
645 else if (((vreg->pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_LPM)
646 && ((vreg->pmr_reg & pin_mask) != pin_mask))
647 return REGULATOR_MODE_IDLE;
648 else if (vreg->optimum == REGULATOR_MODE_FAST)
649 return REGULATOR_MODE_FAST;
650 else if (vreg->pc_vote)
651 return REGULATOR_MODE_IDLE;
652 else if (vreg->optimum == REGULATOR_MODE_STANDBY)
653 return REGULATOR_MODE_STANDBY;
654 return REGULATOR_MODE_FAST;
655}
656
657unsigned int pm8901_vreg_get_optimum_mode(struct regulator_dev *dev,
658 int input_uV, int output_uV, int load_uA)
659{
660 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
661
662 if (load_uA <= 0) {
663 /*
664 * pm8901_vreg_get_optimum_mode is being called before consumers
665 * have specified their load currents via
666 * regulator_set_optimum_mode. Return whatever the existing mode
667 * is.
668 */
669 return pm8901_vreg_get_mode(dev);
670 }
671
672 if (load_uA >= vreg->hpm_min_load)
673 return REGULATOR_MODE_FAST;
674 return REGULATOR_MODE_STANDBY;
675}
676
677static int pm8901_smps_set_voltage(struct regulator_dev *dev,
678 int min_uV, int max_uV, unsigned *selector)
679{
680 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
681 struct pm8901_chip *chip = vreg->chip;
682 int rc;
683 u8 val, band;
684
685 if (IS_PMIC_8901_V1(pm8901_rev(chip)))
686 min_uV = PMIC_8901_V1_SCALE(min_uV);
687
688 if (min_uV < SMPS_BAND_1_UV_MIN || min_uV > SMPS_BAND_3_UV_MAX)
689 return -EINVAL;
690
691 /* Round down for set points in the gaps between bands. */
692 if (min_uV > SMPS_BAND_1_UV_MAX && min_uV < SMPS_BAND_2_UV_MIN)
693 min_uV = SMPS_BAND_1_UV_MAX;
694 else if (min_uV > SMPS_BAND_2_UV_MAX
695 && min_uV < SMPS_BAND_3_UV_SETPOINT_MIN)
696 min_uV = SMPS_BAND_2_UV_MAX;
697
698 if (min_uV < SMPS_BAND_2_UV_MIN) {
699 val = ((min_uV - SMPS_BAND_1_UV_MIN) / SMPS_BAND_1_UV_STEP);
700 val = PM8901_SMPS_BAND_1_COMPENSATE(val);
701 band = SMPS_VCTRL_BAND_1;
702 } else if (min_uV < SMPS_BAND_3_UV_SETPOINT_MIN) {
703 val = ((min_uV - SMPS_BAND_2_UV_MIN) / SMPS_BAND_2_UV_STEP);
704 band = SMPS_VCTRL_BAND_2;
705 } else {
706 val = ((min_uV - SMPS_BAND_3_UV_MIN) / SMPS_BAND_3_UV_STEP);
707 band = SMPS_VCTRL_BAND_3;
708 }
709
710 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, band | val,
711 SMPS_VCTRL_BAND_MASK | SMPS_VCTRL_VPROG_MASK,
712 &vreg->ctrl_reg);
713 if (rc)
714 goto bail;
715
716 rc = pm8901_vreg_write(chip, vreg->pfm_ctrl_addr, band | val,
717 SMPS_VCTRL_BAND_MASK | SMPS_VCTRL_VPROG_MASK,
718 &vreg->pfm_ctrl_reg);
719bail:
720 if (rc)
721 print_write_error(vreg, rc, __func__);
722
723 return rc;
724}
725
726static int pm8901_smps_get_voltage(struct regulator_dev *dev)
727{
728 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
729 struct pm8901_chip *chip = vreg->chip;
730 u8 vprog, band;
731 int ret = 0;
732
733 if ((vreg->pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_LPM) {
734 vprog = vreg->pfm_ctrl_reg & SMPS_VCTRL_VPROG_MASK;
735 band = vreg->pfm_ctrl_reg & SMPS_VCTRL_BAND_MASK;
736 } else {
737 vprog = vreg->ctrl_reg & SMPS_VCTRL_VPROG_MASK;
738 band = vreg->ctrl_reg & SMPS_VCTRL_BAND_MASK;
739 }
740
741 if (band == SMPS_VCTRL_BAND_1)
742 ret = vprog * SMPS_BAND_1_UV_STEP + SMPS_BAND_1_UV_MIN;
743 else if (band == SMPS_VCTRL_BAND_2)
744 ret = vprog * SMPS_BAND_2_UV_STEP + SMPS_BAND_2_UV_MIN;
745 else
746 ret = vprog * SMPS_BAND_3_UV_STEP + SMPS_BAND_3_UV_MIN;
747
748 if (IS_PMIC_8901_V1(pm8901_rev(chip)))
749 ret = PMIC_8901_V1_SCALE_INV(ret);
750
751 return ret;
752}
753
754static int pm8901_vs_enable(struct regulator_dev *dev)
755{
756 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
757 struct pm8901_chip *chip = vreg->chip;
758 int rc;
759
760 /* Assert enable bit in PMR register. */
761 rc = pm8901_vreg_enable(dev);
762
763 /* Make sure that switch is controlled via PMR register */
764 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, VS_CTRL_USE_PMR,
765 VS_CTRL_ENABLE_MASK, &vreg->ctrl_reg);
766 if (rc)
767 print_write_error(vreg, rc, __func__);
768
769 return rc;
770}
771
772static int pm8901_vs_disable(struct regulator_dev *dev)
773{
774 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
775 struct pm8901_chip *chip = vreg->chip;
776 int rc;
777
778 /* Disassert enable bit in PMR register. */
779 rc = pm8901_vreg_disable(dev);
780
781 /* Make sure that switch is controlled via PMR register */
782 rc = pm8901_vreg_write(chip, vreg->ctrl_addr, VS_CTRL_USE_PMR,
783 VS_CTRL_ENABLE_MASK, &vreg->ctrl_reg);
784 if (rc)
785 print_write_error(vreg, rc, __func__);
786
787 return rc;
788}
789
790static int pm8901_mpp_enable(struct regulator_dev *dev)
791{
792 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
793 int out_val;
794 int rc;
795
796 out_val = (vreg->pdata->active_high
797 ? PM_MPP_DOUT_CTL_HIGH : PM_MPP_DOUT_CTL_LOW);
798
799 rc = pm8901_mpp_config(vreg->mpp_id, PM_MPP_TYPE_D_OUTPUT,
800 PM8901_MPP_DIG_LEVEL_VPH, out_val);
801
802 if (rc)
803 pr_err("%s: pm8901_mpp_config failed, rc=%d\n", __func__, rc);
804 else
805 vreg->state = 1;
806
807 return rc;
808}
809
810static int pm8901_mpp_disable(struct regulator_dev *dev)
811{
812 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
813 int out_val;
814 int rc;
815
816 out_val = (vreg->pdata->active_high
817 ? PM_MPP_DOUT_CTL_LOW : PM_MPP_DOUT_CTL_HIGH);
818
819 rc = pm8901_mpp_config(vreg->mpp_id, PM_MPP_TYPE_D_OUTPUT,
820 PM8901_MPP_DIG_LEVEL_VPH, out_val);
821
822 if (rc)
823 pr_err("%s: pm8901_mpp_config failed, rc=%d\n", __func__, rc);
824 else
825 vreg->state = 0;
826
827 return rc;
828}
829
830static int pm8901_mpp_is_enabled(struct regulator_dev *dev)
831{
832 struct pm8901_vreg *vreg = rdev_get_drvdata(dev);
833 return vreg->state;
834}
835
836static struct regulator_ops pm8901_ldo_ops = {
837 .enable = pm8901_vreg_enable,
838 .disable = pm8901_ldo_disable,
839 .is_enabled = pm8901_vreg_is_enabled,
840 .set_voltage = pm8901_ldo_set_voltage,
841 .get_voltage = pm8901_ldo_get_voltage,
842 .set_mode = pm8901_vreg_set_mode,
843 .get_mode = pm8901_vreg_get_mode,
844 .get_optimum_mode = pm8901_vreg_get_optimum_mode,
845};
846
847static struct regulator_ops pm8901_smps_ops = {
848 .enable = pm8901_vreg_enable,
849 .disable = pm8901_vreg_disable,
850 .is_enabled = pm8901_vreg_is_enabled,
851 .set_voltage = pm8901_smps_set_voltage,
852 .get_voltage = pm8901_smps_get_voltage,
853 .set_mode = pm8901_vreg_set_mode,
854 .get_mode = pm8901_vreg_get_mode,
855 .get_optimum_mode = pm8901_vreg_get_optimum_mode,
856};
857
858static struct regulator_ops pm8901_vs_ops = {
859 .enable = pm8901_vs_enable,
860 .disable = pm8901_vs_disable,
861 .is_enabled = pm8901_vreg_is_enabled,
862 .set_mode = pm8901_vreg_set_mode,
863 .get_mode = pm8901_vreg_get_mode,
864};
865
866static struct regulator_ops pm8901_mpp_ops = {
867 .enable = pm8901_mpp_enable,
868 .disable = pm8901_mpp_disable,
869 .is_enabled = pm8901_mpp_is_enabled,
870};
871
872#define VREG_DESCRIP(_id, _name, _ops) \
873 [_id] = { \
874 .name = _name, \
875 .id = _id, \
876 .ops = _ops, \
877 .type = REGULATOR_VOLTAGE, \
878 .owner = THIS_MODULE, \
879 }
880
881static struct regulator_desc pm8901_vreg_descrip[] = {
882 VREG_DESCRIP(PM8901_VREG_ID_L0, "8901_l0", &pm8901_ldo_ops),
883 VREG_DESCRIP(PM8901_VREG_ID_L1, "8901_l1", &pm8901_ldo_ops),
884 VREG_DESCRIP(PM8901_VREG_ID_L2, "8901_l2", &pm8901_ldo_ops),
885 VREG_DESCRIP(PM8901_VREG_ID_L3, "8901_l3", &pm8901_ldo_ops),
886 VREG_DESCRIP(PM8901_VREG_ID_L4, "8901_l4", &pm8901_ldo_ops),
887 VREG_DESCRIP(PM8901_VREG_ID_L5, "8901_l5", &pm8901_ldo_ops),
888 VREG_DESCRIP(PM8901_VREG_ID_L6, "8901_l6", &pm8901_ldo_ops),
889
890 VREG_DESCRIP(PM8901_VREG_ID_S0, "8901_s0", &pm8901_smps_ops),
891 VREG_DESCRIP(PM8901_VREG_ID_S1, "8901_s1", &pm8901_smps_ops),
892 VREG_DESCRIP(PM8901_VREG_ID_S2, "8901_s2", &pm8901_smps_ops),
893 VREG_DESCRIP(PM8901_VREG_ID_S3, "8901_s3", &pm8901_smps_ops),
894 VREG_DESCRIP(PM8901_VREG_ID_S4, "8901_s4", &pm8901_smps_ops),
895
896 VREG_DESCRIP(PM8901_VREG_ID_MPP0, "8901_mpp0", &pm8901_mpp_ops),
897
898 VREG_DESCRIP(PM8901_VREG_ID_LVS0, "8901_lvs0", &pm8901_vs_ops),
899 VREG_DESCRIP(PM8901_VREG_ID_LVS1, "8901_lvs1", &pm8901_vs_ops),
900 VREG_DESCRIP(PM8901_VREG_ID_LVS2, "8901_lvs2", &pm8901_vs_ops),
901 VREG_DESCRIP(PM8901_VREG_ID_LVS3, "8901_lvs3", &pm8901_vs_ops),
902 VREG_DESCRIP(PM8901_VREG_ID_MVS0, "8901_mvs0", &pm8901_vs_ops),
903 VREG_DESCRIP(PM8901_VREG_ID_USB_OTG, "8901_usb_otg", &pm8901_vs_ops),
904 VREG_DESCRIP(PM8901_VREG_ID_HDMI_MVS, "8901_hdmi_mvs", &pm8901_vs_ops),
905};
906
907static int pm8901_init_ldo(struct pm8901_chip *chip, struct pm8901_vreg *vreg)
908{
909 int rc = 0, i;
910 u8 bank;
911
912 /* Store current regulator register values. */
913 for (i = 0; i < LDO_TEST_BANKS; i++) {
914 bank = REGULATOR_BANK_SEL(i);
915 rc = pm8901_write(chip, vreg->test_addr, &bank, 1);
916 if (rc)
917 goto bail;
918
919 rc = pm8901_read(chip, vreg->test_addr, &vreg->test_reg[i], 1);
920 if (rc)
921 goto bail;
922
923 vreg->test_reg[i] |= REGULATOR_BANK_WRITE;
924 }
925
926 /* Set pull down enable based on platform data. */
927 rc = pm8901_vreg_write(chip, vreg->ctrl_addr,
928 (vreg->pdata->pull_down_enable ? LDO_PULL_DOWN_ENABLE : 0),
929 LDO_PULL_DOWN_ENABLE_MASK, &vreg->ctrl_reg);
930bail:
931 return rc;
932}
933
934static int pm8901_init_smps(struct pm8901_chip *chip, struct pm8901_vreg *vreg)
935{
936 int rc;
937
938 /* Store current regulator register values. */
939 rc = pm8901_read(chip, vreg->pfm_ctrl_addr,
940 &vreg->pfm_ctrl_reg, 1);
941 if (rc)
942 goto bail;
943
944 rc = pm8901_read(chip, vreg->pwr_cnfg_addr,
945 &vreg->pwr_cnfg_reg, 1);
946 if (rc)
947 goto bail;
948
949 /* Set pull down enable based on platform data. */
950 rc = pm8901_vreg_write(chip, vreg->pwr_cnfg_addr,
951 (vreg->pdata->pull_down_enable ? SMPS_PULL_DOWN_ENABLE : 0),
952 SMPS_PULL_DOWN_ENABLE_MASK, &vreg->pwr_cnfg_reg);
953
954bail:
955 return rc;
956}
957
958static int pm8901_init_vs(struct pm8901_chip *chip, struct pm8901_vreg *vreg)
959{
960 int rc = 0;
961
962 /* Set pull down enable based on platform data. */
963 rc = pm8901_vreg_write(chip, vreg->ctrl_addr,
964 (vreg->pdata->pull_down_enable ? VS_PULL_DOWN_ENABLE : 0),
965 VS_PULL_DOWN_ENABLE_MASK, &vreg->ctrl_reg);
966
967 return rc;
968}
969
970static int pm8901_init_regulator(struct pm8901_chip *chip,
971 struct pm8901_vreg *vreg)
972{
973 int rc;
974
975 /* Store current regulator register values. */
976 if (vreg->type != REGULATOR_TYPE_MPP) {
977 rc = pm8901_read(chip, vreg->ctrl_addr, &vreg->ctrl_reg, 1);
978 if (rc)
979 goto bail;
980
981 rc = pm8901_read(chip, vreg->pmr_addr, &vreg->pmr_reg, 1);
982 if (rc)
983 goto bail;
984 }
985
986 /* Set initial mode based on hardware state. */
987 if ((vreg->pmr_reg & VREG_PMR_STATE_MASK) == VREG_PMR_STATE_LPM)
988 vreg->optimum = REGULATOR_MODE_STANDBY;
989 else
990 vreg->optimum = REGULATOR_MODE_FAST;
991
992 vreg->mode_initialized = 0;
993
994 if (vreg->type == REGULATOR_TYPE_LDO)
995 rc = pm8901_init_ldo(chip, vreg);
996 else if (vreg->type == REGULATOR_TYPE_SMPS)
997 rc = pm8901_init_smps(chip, vreg);
998 else if (vreg->type == REGULATOR_TYPE_VS)
999 rc = pm8901_init_vs(chip, vreg);
1000bail:
1001 if (rc)
1002 pr_err("%s: pm8901_read/write failed; initial register states "
1003 "unknown, rc=%d\n", __func__, rc);
1004
1005 return rc;
1006}
1007
1008static int __devinit pm8901_vreg_probe(struct platform_device *pdev)
1009{
1010 struct regulator_desc *rdesc;
1011 struct pm8901_chip *chip;
1012 struct pm8901_vreg *vreg;
1013 const char *reg_name = NULL;
1014 int rc = 0;
1015
1016 if (pdev == NULL)
1017 return -EINVAL;
1018
1019 if (pdev->id >= 0 && pdev->id < PM8901_VREG_MAX) {
1020 chip = dev_get_drvdata(pdev->dev.parent);
1021 rdesc = &pm8901_vreg_descrip[pdev->id];
1022 vreg = &pm8901_vreg[pdev->id];
1023 vreg->pdata = pdev->dev.platform_data;
1024 vreg->chip = chip;
1025 reg_name = pm8901_vreg_descrip[pdev->id].name;
1026
1027 rc = pm8901_init_regulator(chip, vreg);
1028 if (rc)
1029 goto bail;
1030
1031 /* Disallow idle and normal modes if pin control isn't set. */
1032 if (vreg->pdata->pin_ctrl == 0)
1033 vreg->pdata->init_data.constraints.valid_modes_mask
1034 &= ~(REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE);
1035
1036 vreg->rdev = regulator_register(rdesc, &pdev->dev,
1037 &vreg->pdata->init_data, vreg);
1038 if (IS_ERR(vreg->rdev)) {
1039 rc = PTR_ERR(vreg->rdev);
1040 pr_err("%s: regulator_register failed for %s, rc=%d\n",
1041 __func__, reg_name, rc);
1042 }
1043 } else {
1044 rc = -ENODEV;
1045 }
1046
1047bail:
1048 if (rc)
1049 pr_err("%s: error for %s, rc=%d\n", __func__, reg_name, rc);
1050
1051 return rc;
1052}
1053
1054static int __devexit pm8901_vreg_remove(struct platform_device *pdev)
1055{
1056 regulator_unregister(pm8901_vreg[pdev->id].rdev);
1057 return 0;
1058}
1059
1060static struct platform_driver pm8901_vreg_driver = {
1061 .probe = pm8901_vreg_probe,
1062 .remove = __devexit_p(pm8901_vreg_remove),
1063 .driver = {
1064 .name = "pm8901-regulator",
1065 .owner = THIS_MODULE,
1066 },
1067};
1068
1069static int __init pm8901_vreg_init(void)
1070{
1071 return platform_driver_register(&pm8901_vreg_driver);
1072}
1073
1074static void __exit pm8901_vreg_exit(void)
1075{
1076 platform_driver_unregister(&pm8901_vreg_driver);
1077}
1078
1079static void print_write_error(struct pm8901_vreg *vreg, int rc,
1080 const char *func)
1081{
1082 const char *reg_name = NULL;
1083 ptrdiff_t id = vreg - pm8901_vreg;
1084
1085 if (id >= 0 && id < PM8901_VREG_MAX)
1086 reg_name = pm8901_vreg_descrip[id].name;
1087 pr_err("%s: pm8901_vreg_write failed for %s, rc=%d\n",
1088 func, reg_name, rc);
1089}
1090
1091subsys_initcall(pm8901_vreg_init);
1092module_exit(pm8901_vreg_exit);
1093
1094MODULE_LICENSE("GPL v2");
1095MODULE_DESCRIPTION("PMIC8901 regulator driver");
1096MODULE_VERSION("1.0");
1097MODULE_ALIAS("platform:pm8901-regulator");