blob: 15a9cb18e6b4ce053b7afe98516fe83813ef3e7b [file] [log] [blame]
David Collins5c4a5ab2011-12-02 15:01:26 -08001/*
2 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#define pr_fmt(fmt) "%s: " fmt, __func__
15
16#include <linux/module.h>
17#include <linux/err.h>
18#include <linux/string.h>
19#include <linux/kernel.h>
20#include <linux/init.h>
21#include <linux/bitops.h>
22#include <linux/mfd/pm8xxx/core.h>
23#include <linux/mfd/pm8xxx/regulator.h>
24
25/* Debug Flag Definitions */
26enum {
27 PM8XXX_VREG_DEBUG_REQUEST = BIT(0),
28 PM8XXX_VREG_DEBUG_DUPLICATE = BIT(1),
29 PM8XXX_VREG_DEBUG_INIT = BIT(2),
30 PM8XXX_VREG_DEBUG_WRITES = BIT(3), /* SSBI writes */
31};
32
33static int pm8xxx_vreg_debug_mask;
34module_param_named(
35 debug_mask, pm8xxx_vreg_debug_mask, int, S_IRUSR | S_IWUSR
36);
37
38/* Common Masks */
39#define REGULATOR_ENABLE_MASK 0x80
40#define REGULATOR_ENABLE 0x80
41#define REGULATOR_DISABLE 0x00
42
43#define REGULATOR_BANK_MASK 0xF0
44#define REGULATOR_BANK_SEL(n) ((n) << 4)
45#define REGULATOR_BANK_WRITE 0x80
46
47#define LDO_TEST_BANKS 7
48#define NLDO1200_TEST_BANKS 5
49#define SMPS_TEST_BANKS 8
50
51/*
52 * This voltage in uV is returned by get_voltage functions when there is no way
53 * to determine the current voltage level. It is needed because the regulator
54 * framework treats a 0 uV voltage as an error.
55 */
56#define VOLTAGE_UNKNOWN 1
57
58/* LDO masks and values */
59
60/* CTRL register */
61#define LDO_ENABLE_MASK 0x80
62#define LDO_DISABLE 0x00
63#define LDO_ENABLE 0x80
64#define LDO_PULL_DOWN_ENABLE_MASK 0x40
65#define LDO_PULL_DOWN_ENABLE 0x40
66
67#define LDO_CTRL_PM_MASK 0x20
68#define LDO_CTRL_PM_HPM 0x00
69#define LDO_CTRL_PM_LPM 0x20
70
71#define LDO_CTRL_VPROG_MASK 0x1F
72
73/* TEST register bank 0 */
74#define LDO_TEST_LPM_MASK 0x04
75#define LDO_TEST_LPM_SEL_CTRL 0x00
76#define LDO_TEST_LPM_SEL_TCXO 0x04
77
78/* TEST register bank 2 */
79#define LDO_TEST_VPROG_UPDATE_MASK 0x08
80#define LDO_TEST_RANGE_SEL_MASK 0x04
81#define LDO_TEST_FINE_STEP_MASK 0x02
82#define LDO_TEST_FINE_STEP_SHIFT 1
83
84/* TEST register bank 4 */
85#define LDO_TEST_RANGE_EXT_MASK 0x01
86
87/* TEST register bank 5 */
88#define LDO_TEST_PIN_CTRL_MASK 0x0F
89#define LDO_TEST_PIN_CTRL_EN3 0x08
90#define LDO_TEST_PIN_CTRL_EN2 0x04
91#define LDO_TEST_PIN_CTRL_EN1 0x02
92#define LDO_TEST_PIN_CTRL_EN0 0x01
93
94/* TEST register bank 6 */
95#define LDO_TEST_PIN_CTRL_LPM_MASK 0x0F
96
97/*
98 * If a given voltage could be output by two ranges, then the preferred one must
99 * be determined by the range limits. Specified voltage ranges should must
100 * not overlap.
101 *
102 * Allowable voltage ranges:
103 */
104#define PLDO_LOW_UV_MIN 750000
105#define PLDO_LOW_UV_MAX 1487500
106#define PLDO_LOW_UV_FINE_STEP 12500
107
108#define PLDO_NORM_UV_MIN 1500000
109#define PLDO_NORM_UV_MAX 3075000
110#define PLDO_NORM_UV_FINE_STEP 25000
111
112#define PLDO_HIGH_UV_MIN 1750000
113#define PLDO_HIGH_UV_SET_POINT_MIN 3100000
114#define PLDO_HIGH_UV_MAX 4900000
115#define PLDO_HIGH_UV_FINE_STEP 50000
116
117#define PLDO_LOW_SET_POINTS ((PLDO_LOW_UV_MAX - PLDO_LOW_UV_MIN) \
118 / PLDO_LOW_UV_FINE_STEP + 1)
119#define PLDO_NORM_SET_POINTS ((PLDO_NORM_UV_MAX - PLDO_NORM_UV_MIN) \
120 / PLDO_NORM_UV_FINE_STEP + 1)
121#define PLDO_HIGH_SET_POINTS ((PLDO_HIGH_UV_MAX \
122 - PLDO_HIGH_UV_SET_POINT_MIN) \
123 / PLDO_HIGH_UV_FINE_STEP + 1)
124#define PLDO_SET_POINTS (PLDO_LOW_SET_POINTS \
125 + PLDO_NORM_SET_POINTS \
126 + PLDO_HIGH_SET_POINTS)
127
128#define NLDO_UV_MIN 750000
129#define NLDO_UV_MAX 1537500
130#define NLDO_UV_FINE_STEP 12500
131
132#define NLDO_SET_POINTS ((NLDO_UV_MAX - NLDO_UV_MIN) \
133 / NLDO_UV_FINE_STEP + 1)
134
135/* NLDO1200 masks and values */
136
137/* CTRL register */
138#define NLDO1200_ENABLE_MASK 0x80
139#define NLDO1200_DISABLE 0x00
140#define NLDO1200_ENABLE 0x80
141
142/* Legacy mode */
143#define NLDO1200_LEGACY_PM_MASK 0x20
144#define NLDO1200_LEGACY_PM_HPM 0x00
145#define NLDO1200_LEGACY_PM_LPM 0x20
146
147/* Advanced mode */
148#define NLDO1200_CTRL_RANGE_MASK 0x40
149#define NLDO1200_CTRL_RANGE_HIGH 0x00
150#define NLDO1200_CTRL_RANGE_LOW 0x40
151#define NLDO1200_CTRL_VPROG_MASK 0x3F
152
153#define NLDO1200_LOW_UV_MIN 375000
154#define NLDO1200_LOW_UV_MAX 743750
155#define NLDO1200_LOW_UV_STEP 6250
156
157#define NLDO1200_HIGH_UV_MIN 750000
158#define NLDO1200_HIGH_UV_MAX 1537500
159#define NLDO1200_HIGH_UV_STEP 12500
160
161#define NLDO1200_LOW_SET_POINTS ((NLDO1200_LOW_UV_MAX \
162 - NLDO1200_LOW_UV_MIN) \
163 / NLDO1200_LOW_UV_STEP + 1)
164#define NLDO1200_HIGH_SET_POINTS ((NLDO1200_HIGH_UV_MAX \
165 - NLDO1200_HIGH_UV_MIN) \
166 / NLDO1200_HIGH_UV_STEP + 1)
167#define NLDO1200_SET_POINTS (NLDO1200_LOW_SET_POINTS \
168 + NLDO1200_HIGH_SET_POINTS)
169
170/* TEST register bank 0 */
171#define NLDO1200_TEST_LPM_MASK 0x04
172#define NLDO1200_TEST_LPM_SEL_CTRL 0x00
173#define NLDO1200_TEST_LPM_SEL_TCXO 0x04
174
175/* TEST register bank 1 */
176#define NLDO1200_PULL_DOWN_ENABLE_MASK 0x02
177#define NLDO1200_PULL_DOWN_ENABLE 0x02
178
179/* TEST register bank 2 */
180#define NLDO1200_ADVANCED_MODE_MASK 0x08
181#define NLDO1200_ADVANCED_MODE 0x00
182#define NLDO1200_LEGACY_MODE 0x08
183
184/* Advanced mode power mode control */
185#define NLDO1200_ADVANCED_PM_MASK 0x02
186#define NLDO1200_ADVANCED_PM_HPM 0x00
187#define NLDO1200_ADVANCED_PM_LPM 0x02
188
189#define NLDO1200_IN_ADVANCED_MODE(vreg) \
190 ((vreg->test_reg[2] & NLDO1200_ADVANCED_MODE_MASK) \
191 == NLDO1200_ADVANCED_MODE)
192
193/* SMPS masks and values */
194
195/* CTRL register */
196
197/* Legacy mode */
198#define SMPS_LEGACY_ENABLE_MASK 0x80
199#define SMPS_LEGACY_DISABLE 0x00
200#define SMPS_LEGACY_ENABLE 0x80
201#define SMPS_LEGACY_PULL_DOWN_ENABLE 0x40
202#define SMPS_LEGACY_VREF_SEL_MASK 0x20
203#define SMPS_LEGACY_VPROG_MASK 0x1F
204
205/* Advanced mode */
206#define SMPS_ADVANCED_BAND_MASK 0xC0
207#define SMPS_ADVANCED_BAND_OFF 0x00
208#define SMPS_ADVANCED_BAND_1 0x40
209#define SMPS_ADVANCED_BAND_2 0x80
210#define SMPS_ADVANCED_BAND_3 0xC0
211#define SMPS_ADVANCED_VPROG_MASK 0x3F
212
213/* Legacy mode voltage ranges */
214#define SMPS_MODE3_UV_MIN 375000
215#define SMPS_MODE3_UV_MAX 725000
216#define SMPS_MODE3_UV_STEP 25000
217
218#define SMPS_MODE2_UV_MIN 750000
219#define SMPS_MODE2_UV_MAX 1475000
220#define SMPS_MODE2_UV_STEP 25000
221
222#define SMPS_MODE1_UV_MIN 1500000
223#define SMPS_MODE1_UV_MAX 3050000
224#define SMPS_MODE1_UV_STEP 50000
225
226#define SMPS_MODE3_SET_POINTS ((SMPS_MODE3_UV_MAX \
227 - SMPS_MODE3_UV_MIN) \
228 / SMPS_MODE3_UV_STEP + 1)
229#define SMPS_MODE2_SET_POINTS ((SMPS_MODE2_UV_MAX \
230 - SMPS_MODE2_UV_MIN) \
231 / SMPS_MODE2_UV_STEP + 1)
232#define SMPS_MODE1_SET_POINTS ((SMPS_MODE1_UV_MAX \
233 - SMPS_MODE1_UV_MIN) \
234 / SMPS_MODE1_UV_STEP + 1)
235#define SMPS_LEGACY_SET_POINTS (SMPS_MODE3_SET_POINTS \
236 + SMPS_MODE2_SET_POINTS \
237 + SMPS_MODE1_SET_POINTS)
238
239/* Advanced mode voltage ranges */
240#define SMPS_BAND1_UV_MIN 375000
241#define SMPS_BAND1_UV_MAX 737500
242#define SMPS_BAND1_UV_STEP 12500
243
244#define SMPS_BAND2_UV_MIN 750000
245#define SMPS_BAND2_UV_MAX 1487500
246#define SMPS_BAND2_UV_STEP 12500
247
248#define SMPS_BAND3_UV_MIN 1500000
249#define SMPS_BAND3_UV_MAX 3075000
250#define SMPS_BAND3_UV_STEP 25000
251
252#define SMPS_BAND1_SET_POINTS ((SMPS_BAND1_UV_MAX \
253 - SMPS_BAND1_UV_MIN) \
254 / SMPS_BAND1_UV_STEP + 1)
255#define SMPS_BAND2_SET_POINTS ((SMPS_BAND2_UV_MAX \
256 - SMPS_BAND2_UV_MIN) \
257 / SMPS_BAND2_UV_STEP + 1)
258#define SMPS_BAND3_SET_POINTS ((SMPS_BAND3_UV_MAX \
259 - SMPS_BAND3_UV_MIN) \
260 / SMPS_BAND3_UV_STEP + 1)
261#define SMPS_ADVANCED_SET_POINTS (SMPS_BAND1_SET_POINTS \
262 + SMPS_BAND2_SET_POINTS \
263 + SMPS_BAND3_SET_POINTS)
264
265/* Test2 register bank 1 */
266#define SMPS_LEGACY_VLOW_SEL_MASK 0x01
267
268/* Test2 register bank 6 */
269#define SMPS_ADVANCED_PULL_DOWN_ENABLE 0x08
270
271/* Test2 register bank 7 */
272#define SMPS_ADVANCED_MODE_MASK 0x02
273#define SMPS_ADVANCED_MODE 0x02
274#define SMPS_LEGACY_MODE 0x00
275
276#define SMPS_IN_ADVANCED_MODE(vreg) \
277 ((vreg->test_reg[7] & SMPS_ADVANCED_MODE_MASK) == SMPS_ADVANCED_MODE)
278
279/* BUCK_SLEEP_CNTRL register */
280#define SMPS_PIN_CTRL_MASK 0xF0
281#define SMPS_PIN_CTRL_EN3 0x80
282#define SMPS_PIN_CTRL_EN2 0x40
283#define SMPS_PIN_CTRL_EN1 0x20
284#define SMPS_PIN_CTRL_EN0 0x10
285
286#define SMPS_PIN_CTRL_LPM_MASK 0x0F
287#define SMPS_PIN_CTRL_LPM_EN3 0x08
288#define SMPS_PIN_CTRL_LPM_EN2 0x04
289#define SMPS_PIN_CTRL_LPM_EN1 0x02
290#define SMPS_PIN_CTRL_LPM_EN0 0x01
291
292/* BUCK_CLOCK_CNTRL register */
293#define SMPS_CLK_DIVIDE2 0x40
294
295#define SMPS_CLK_CTRL_MASK 0x30
296#define SMPS_CLK_CTRL_FOLLOW_TCXO 0x00
297#define SMPS_CLK_CTRL_PWM 0x10
298#define SMPS_CLK_CTRL_PFM 0x20
299
300/* FTSMPS masks and values */
301
302/* CTRL register */
303#define FTSMPS_VCTRL_BAND_MASK 0xC0
304#define FTSMPS_VCTRL_BAND_OFF 0x00
305#define FTSMPS_VCTRL_BAND_1 0x40
306#define FTSMPS_VCTRL_BAND_2 0x80
307#define FTSMPS_VCTRL_BAND_3 0xC0
308#define FTSMPS_VCTRL_VPROG_MASK 0x3F
309
310#define FTSMPS_BAND1_UV_MIN 350000
311#define FTSMPS_BAND1_UV_MAX 650000
312/* 3 LSB's of program voltage must be 0 in band 1. */
313/* Logical step size */
314#define FTSMPS_BAND1_UV_LOG_STEP 50000
315/* Physical step size */
316#define FTSMPS_BAND1_UV_PHYS_STEP 6250
317
318#define FTSMPS_BAND2_UV_MIN 700000
319#define FTSMPS_BAND2_UV_MAX 1400000
320#define FTSMPS_BAND2_UV_STEP 12500
321
322#define FTSMPS_BAND3_UV_MIN 1400000
323#define FTSMPS_BAND3_UV_SET_POINT_MIN 1500000
324#define FTSMPS_BAND3_UV_MAX 3300000
325#define FTSMPS_BAND3_UV_STEP 50000
326
327#define FTSMPS_BAND1_SET_POINTS ((FTSMPS_BAND1_UV_MAX \
328 - FTSMPS_BAND1_UV_MIN) \
329 / FTSMPS_BAND1_UV_LOG_STEP + 1)
330#define FTSMPS_BAND2_SET_POINTS ((FTSMPS_BAND2_UV_MAX \
331 - FTSMPS_BAND2_UV_MIN) \
332 / FTSMPS_BAND2_UV_STEP + 1)
333#define FTSMPS_BAND3_SET_POINTS ((FTSMPS_BAND3_UV_MAX \
334 - FTSMPS_BAND3_UV_SET_POINT_MIN) \
335 / FTSMPS_BAND3_UV_STEP + 1)
336#define FTSMPS_SET_POINTS (FTSMPS_BAND1_SET_POINTS \
337 + FTSMPS_BAND2_SET_POINTS \
338 + FTSMPS_BAND3_SET_POINTS)
339
340/* FTS_CNFG1 register bank 0 */
341#define FTSMPS_CNFG1_PM_MASK 0x0C
342#define FTSMPS_CNFG1_PM_PWM 0x00
343#define FTSMPS_CNFG1_PM_PFM 0x08
344
345/* PWR_CNFG register */
346#define FTSMPS_PULL_DOWN_ENABLE_MASK 0x40
347#define FTSMPS_PULL_DOWN_ENABLE 0x40
348
349/* VS masks and values */
350
351/* CTRL register */
352#define VS_ENABLE_MASK 0x80
353#define VS_DISABLE 0x00
354#define VS_ENABLE 0x80
355#define VS_PULL_DOWN_ENABLE_MASK 0x40
356#define VS_PULL_DOWN_DISABLE 0x40
357#define VS_PULL_DOWN_ENABLE 0x00
358
359#define VS_PIN_CTRL_MASK 0x0F
360#define VS_PIN_CTRL_EN0 0x08
361#define VS_PIN_CTRL_EN1 0x04
362#define VS_PIN_CTRL_EN2 0x02
363#define VS_PIN_CTRL_EN3 0x01
364
365/* VS300 masks and values */
366
367/* CTRL register */
368#define VS300_CTRL_ENABLE_MASK 0xC0
369#define VS300_CTRL_DISABLE 0x00
370#define VS300_CTRL_ENABLE 0x40
371
372#define VS300_PULL_DOWN_ENABLE_MASK 0x20
373#define VS300_PULL_DOWN_ENABLE 0x20
374
375/* NCP masks and values */
376
377/* CTRL register */
378#define NCP_ENABLE_MASK 0x80
379#define NCP_DISABLE 0x00
380#define NCP_ENABLE 0x80
381#define NCP_VPROG_MASK 0x1F
382
383#define NCP_UV_MIN 1500000
384#define NCP_UV_MAX 3050000
385#define NCP_UV_STEP 50000
386
387#define NCP_SET_POINTS ((NCP_UV_MAX - NCP_UV_MIN) \
388 / NCP_UV_STEP + 1)
389
390#define vreg_err(vreg, fmt, ...) \
391 pr_err("%s: " fmt, vreg->rdesc.name, ##__VA_ARGS__)
392
393/* Determines which label to add to the print. */
394enum pm8xxx_regulator_action {
395 PM8XXX_REGULATOR_ACTION_INIT,
396 PM8XXX_REGULATOR_ACTION_ENABLE,
397 PM8XXX_REGULATOR_ACTION_DISABLE,
398 PM8XXX_REGULATOR_ACTION_VOLTAGE,
399 PM8XXX_REGULATOR_ACTION_MODE,
400 PM8XXX_REGULATOR_ACTION_PIN_CTRL,
401};
402
403/* Debug state printing */
404static void pm8xxx_vreg_show_state(struct regulator_dev *rdev,
405 enum pm8xxx_regulator_action action);
406
407/*
408 * Perform a masked write to a PMIC register only if the new value differs
409 * from the last value written to the register. This removes redundant
410 * register writing.
411 *
412 * No locking is required because registers are not shared between regulators.
413 */
414static int pm8xxx_vreg_masked_write(struct pm8xxx_vreg *vreg, u16 addr, u8 val,
415 u8 mask, u8 *reg_save)
416{
417 int rc = 0;
418 u8 reg;
419
420 reg = (*reg_save & ~mask) | (val & mask);
421 if (reg != *reg_save) {
422 rc = pm8xxx_writeb(vreg->dev->parent, addr, reg);
423
424 if (rc) {
425 pr_err("%s: pm8xxx_writeb failed; addr=0x%03X, rc=%d\n",
426 vreg->rdesc.name, addr, rc);
427 } else {
428 *reg_save = reg;
429 vreg->write_count++;
430 if (pm8xxx_vreg_debug_mask & PM8XXX_VREG_DEBUG_WRITES)
431 pr_info("%s: write(0x%03X)=0x%02X\n",
432 vreg->rdesc.name, addr, reg);
433 }
434 }
435
436 return rc;
437}
438
439/*
440 * Perform a masked write to a PMIC register without checking the previously
441 * written value. This is needed for registers that must be rewritten even if
442 * the value hasn't changed in order for changes in other registers to take
443 * effect.
444 */
445static int pm8xxx_vreg_masked_write_forced(struct pm8xxx_vreg *vreg, u16 addr,
446 u8 val, u8 mask, u8 *reg_save)
447{
448 int rc = 0;
449 u8 reg;
450
451 reg = (*reg_save & ~mask) | (val & mask);
452 rc = pm8xxx_writeb(vreg->dev->parent, addr, reg);
453
454 if (rc) {
455 pr_err("%s: pm8xxx_writeb failed; addr=0x%03X, rc=%d\n",
456 vreg->rdesc.name, addr, rc);
457 } else {
458 *reg_save = reg;
459 vreg->write_count++;
460 if (pm8xxx_vreg_debug_mask & PM8XXX_VREG_DEBUG_WRITES)
461 pr_info("%s: write(0x%03X)=0x%02X\n", vreg->rdesc.name,
462 addr, reg);
463 }
464
465 return rc;
466}
467
468static int pm8xxx_vreg_is_pin_controlled(struct pm8xxx_vreg *vreg)
469{
470 int ret = 0;
471
472 switch (vreg->type) {
473 case PM8XXX_REGULATOR_TYPE_PLDO:
474 case PM8XXX_REGULATOR_TYPE_NLDO:
475 ret = ((vreg->test_reg[5] & LDO_TEST_PIN_CTRL_MASK) << 4)
476 | (vreg->test_reg[6] & LDO_TEST_PIN_CTRL_LPM_MASK);
477 break;
478 case PM8XXX_REGULATOR_TYPE_SMPS:
479 ret = vreg->sleep_ctrl_reg
480 & (SMPS_PIN_CTRL_MASK | SMPS_PIN_CTRL_LPM_MASK);
481 break;
482 case PM8XXX_REGULATOR_TYPE_VS:
483 ret = vreg->ctrl_reg & VS_PIN_CTRL_MASK;
484 break;
485 default:
486 break;
487 }
488
489 return ret;
490}
491
492/*
493 * Returns the logical pin control enable state because the pin control options
494 * present in the hardware out of restart could be different from those desired
495 * by the consumer.
496 */
497static int pm8xxx_vreg_pin_control_is_enabled(struct regulator_dev *rdev)
498{
499 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
500 int enabled;
501
502 mutex_lock(&vreg->pc_lock);
503 enabled = vreg->is_enabled_pc;
504 mutex_unlock(&vreg->pc_lock);
505
506 return enabled;
507}
508
509/* Returns the physical enable state of the regulator. */
510static int _pm8xxx_vreg_is_enabled(struct pm8xxx_vreg *vreg)
511{
512 int rc = 0;
513
514 /*
515 * All regulator types except advanced mode SMPS, FTSMPS, and VS300 have
516 * enable bit in bit 7 of the control register.
517 */
518 switch (vreg->type) {
519 case PM8XXX_REGULATOR_TYPE_FTSMPS:
520 if ((vreg->ctrl_reg & FTSMPS_VCTRL_BAND_MASK)
521 != FTSMPS_VCTRL_BAND_OFF)
522 rc = 1;
523 break;
524 case PM8XXX_REGULATOR_TYPE_VS300:
525 if ((vreg->ctrl_reg & VS300_CTRL_ENABLE_MASK)
526 != VS300_CTRL_DISABLE)
527 rc = 1;
528 break;
529 case PM8XXX_REGULATOR_TYPE_SMPS:
530 if (SMPS_IN_ADVANCED_MODE(vreg)) {
531 if ((vreg->ctrl_reg & SMPS_ADVANCED_BAND_MASK)
532 != SMPS_ADVANCED_BAND_OFF)
533 rc = 1;
534 break;
535 }
536 /* Fall through for legacy mode SMPS. */
537 default:
538 if ((vreg->ctrl_reg & REGULATOR_ENABLE_MASK)
539 == REGULATOR_ENABLE)
540 rc = 1;
541 }
542
543 return rc;
544}
545
546/*
547 * Returns the logical enable state of the regulator which may be different from
548 * the physical enable state thanks to HPM/LPM pin control.
549 */
550static int pm8xxx_vreg_is_enabled(struct regulator_dev *rdev)
551{
552 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
553 int enabled;
554
555 if (vreg->type == PM8XXX_REGULATOR_TYPE_PLDO
556 || vreg->type == PM8XXX_REGULATOR_TYPE_NLDO
557 || vreg->type == PM8XXX_REGULATOR_TYPE_SMPS
558 || vreg->type == PM8XXX_REGULATOR_TYPE_VS) {
559 /* Pin controllable */
560 mutex_lock(&vreg->pc_lock);
561 enabled = vreg->is_enabled;
562 mutex_unlock(&vreg->pc_lock);
563 } else {
564 /* Not pin controlable */
565 enabled = _pm8xxx_vreg_is_enabled(vreg);
566 }
567
568 return enabled;
569}
570
571static int pm8xxx_pldo_get_voltage(struct regulator_dev *rdev)
572{
573 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
574 int vmin, fine_step;
575 u8 range_ext, range_sel, vprog, fine_step_reg;
576
577 mutex_lock(&vreg->pc_lock);
578
579 fine_step_reg = vreg->test_reg[2] & LDO_TEST_FINE_STEP_MASK;
580 range_sel = vreg->test_reg[2] & LDO_TEST_RANGE_SEL_MASK;
581 range_ext = vreg->test_reg[4] & LDO_TEST_RANGE_EXT_MASK;
582 vprog = vreg->ctrl_reg & LDO_CTRL_VPROG_MASK;
583
584 mutex_unlock(&vreg->pc_lock);
585
586 vprog = (vprog << 1) | (fine_step_reg >> LDO_TEST_FINE_STEP_SHIFT);
587
588 if (range_sel) {
589 /* low range mode */
590 fine_step = PLDO_LOW_UV_FINE_STEP;
591 vmin = PLDO_LOW_UV_MIN;
592 } else if (!range_ext) {
593 /* normal mode */
594 fine_step = PLDO_NORM_UV_FINE_STEP;
595 vmin = PLDO_NORM_UV_MIN;
596 } else {
597 /* high range mode */
598 fine_step = PLDO_HIGH_UV_FINE_STEP;
599 vmin = PLDO_HIGH_UV_MIN;
600 }
601
602 return fine_step * vprog + vmin;
603}
604
605static int pm8xxx_pldo_list_voltage(struct regulator_dev *rdev,
606 unsigned selector)
607{
608 int uV;
609
610 if (selector >= PLDO_SET_POINTS)
611 return 0;
612
613 if (selector < PLDO_LOW_SET_POINTS)
614 uV = selector * PLDO_LOW_UV_FINE_STEP + PLDO_LOW_UV_MIN;
615 else if (selector < (PLDO_LOW_SET_POINTS + PLDO_NORM_SET_POINTS))
616 uV = (selector - PLDO_LOW_SET_POINTS) * PLDO_NORM_UV_FINE_STEP
617 + PLDO_NORM_UV_MIN;
618 else
619 uV = (selector - PLDO_LOW_SET_POINTS - PLDO_NORM_SET_POINTS)
620 * PLDO_HIGH_UV_FINE_STEP
621 + PLDO_HIGH_UV_SET_POINT_MIN;
622
623 return uV;
624}
625
626static int pm8xxx_pldo_set_voltage(struct regulator_dev *rdev, int min_uV,
627 int max_uV, unsigned *selector)
628{
629 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
630 int rc = 0, uV = min_uV;
631 int vmin;
632 unsigned vprog, fine_step;
633 u8 range_ext, range_sel, fine_step_reg, prev_reg;
634 bool reg_changed = false;
635
636 if (uV < PLDO_LOW_UV_MIN && max_uV >= PLDO_LOW_UV_MIN)
637 uV = PLDO_LOW_UV_MIN;
638
639 if (uV < PLDO_LOW_UV_MIN || uV > PLDO_HIGH_UV_MAX) {
640 vreg_err(vreg,
641 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
642 min_uV, max_uV, PLDO_LOW_UV_MIN, PLDO_HIGH_UV_MAX);
643 return -EINVAL;
644 }
645
646 if (uV > PLDO_NORM_UV_MAX) {
647 vmin = PLDO_HIGH_UV_MIN;
648 fine_step = PLDO_HIGH_UV_FINE_STEP;
649 range_ext = LDO_TEST_RANGE_EXT_MASK;
650 range_sel = 0;
651 } else if (uV > PLDO_LOW_UV_MAX) {
652 vmin = PLDO_NORM_UV_MIN;
653 fine_step = PLDO_NORM_UV_FINE_STEP;
654 range_ext = 0;
655 range_sel = 0;
656 } else {
657 vmin = PLDO_LOW_UV_MIN;
658 fine_step = PLDO_LOW_UV_FINE_STEP;
659 range_ext = 0;
660 range_sel = LDO_TEST_RANGE_SEL_MASK;
661 }
662
663 vprog = (uV - vmin + fine_step - 1) / fine_step;
664 uV = vprog * fine_step + vmin;
665 fine_step_reg = (vprog & 1) << LDO_TEST_FINE_STEP_SHIFT;
666 vprog >>= 1;
667
668 if (uV > max_uV) {
669 vreg_err(vreg,
670 "request v=[%d, %d] cannot be met by any set point\n",
671 min_uV, max_uV);
672 return -EINVAL;
673 }
674
675 mutex_lock(&vreg->pc_lock);
676
677 /* Write fine step, range select and program voltage update. */
678 prev_reg = vreg->test_reg[2];
679 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
680 fine_step_reg | range_sel | REGULATOR_BANK_SEL(2)
681 | REGULATOR_BANK_WRITE | LDO_TEST_VPROG_UPDATE_MASK,
682 LDO_TEST_FINE_STEP_MASK | LDO_TEST_RANGE_SEL_MASK
683 | REGULATOR_BANK_MASK | LDO_TEST_VPROG_UPDATE_MASK,
684 &vreg->test_reg[2]);
685 if (rc)
686 goto bail;
687 if (prev_reg != vreg->test_reg[2])
688 reg_changed = true;
689
690 /* Write range extension. */
691 prev_reg = vreg->test_reg[4];
692 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
693 range_ext | REGULATOR_BANK_SEL(4)
694 | REGULATOR_BANK_WRITE,
695 LDO_TEST_RANGE_EXT_MASK | REGULATOR_BANK_MASK,
696 &vreg->test_reg[4]);
697 if (rc)
698 goto bail;
699 if (prev_reg != vreg->test_reg[4])
700 reg_changed = true;
701
702 /* Write new voltage. */
703 if (reg_changed) {
704 /*
705 * Force a CTRL register write even if the value hasn't changed.
706 * This is neccessary because range select, range extension, and
707 * fine step will not update until a value is written into the
708 * control register.
709 */
710 rc = pm8xxx_vreg_masked_write_forced(vreg, vreg->ctrl_addr,
711 vprog, LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
712 } else {
713 /* Only write to control register if new value is different. */
714 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, vprog,
715 LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
716 }
717bail:
718 mutex_unlock(&vreg->pc_lock);
719
720 if (rc)
721 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
722 else
723 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
724
725 return rc;
726}
727
728static int pm8xxx_nldo_get_voltage(struct regulator_dev *rdev)
729{
730 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
731 u8 vprog, fine_step_reg;
732
733 mutex_lock(&vreg->pc_lock);
734
735 fine_step_reg = vreg->test_reg[2] & LDO_TEST_FINE_STEP_MASK;
736 vprog = vreg->ctrl_reg & LDO_CTRL_VPROG_MASK;
737
738 mutex_unlock(&vreg->pc_lock);
739
740 vprog = (vprog << 1) | (fine_step_reg >> LDO_TEST_FINE_STEP_SHIFT);
741
742 return NLDO_UV_FINE_STEP * vprog + NLDO_UV_MIN;
743}
744
745static int pm8xxx_nldo_list_voltage(struct regulator_dev *rdev,
746 unsigned selector)
747{
748 if (selector >= NLDO_SET_POINTS)
749 return 0;
750
751 return selector * NLDO_UV_FINE_STEP + NLDO_UV_MIN;
752}
753
754static int pm8xxx_nldo_set_voltage(struct regulator_dev *rdev, int min_uV,
755 int max_uV, unsigned *selector)
756{
757 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
758 unsigned vprog, fine_step_reg, prev_reg;
759 int rc;
760 int uV = min_uV;
761
762 if (uV < NLDO_UV_MIN && max_uV >= NLDO_UV_MIN)
763 uV = NLDO_UV_MIN;
764
765 if (uV < NLDO_UV_MIN || uV > NLDO_UV_MAX) {
766 vreg_err(vreg,
767 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
768 min_uV, max_uV, NLDO_UV_MIN, NLDO_UV_MAX);
769 return -EINVAL;
770 }
771
772 vprog = (uV - NLDO_UV_MIN + NLDO_UV_FINE_STEP - 1) / NLDO_UV_FINE_STEP;
773 uV = vprog * NLDO_UV_FINE_STEP + NLDO_UV_MIN;
774 fine_step_reg = (vprog & 1) << LDO_TEST_FINE_STEP_SHIFT;
775 vprog >>= 1;
776
777 if (uV > max_uV) {
778 vreg_err(vreg,
779 "request v=[%d, %d] cannot be met by any set point\n",
780 min_uV, max_uV);
781 return -EINVAL;
782 }
783
784 mutex_lock(&vreg->pc_lock);
785
786 /* Write fine step. */
787 prev_reg = vreg->test_reg[2];
788 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
789 fine_step_reg | REGULATOR_BANK_SEL(2)
790 | REGULATOR_BANK_WRITE | LDO_TEST_VPROG_UPDATE_MASK,
791 LDO_TEST_FINE_STEP_MASK | REGULATOR_BANK_MASK
792 | LDO_TEST_VPROG_UPDATE_MASK,
793 &vreg->test_reg[2]);
794 if (rc)
795 goto bail;
796
797 /* Write new voltage. */
798 if (prev_reg != vreg->test_reg[2]) {
799 /*
800 * Force a CTRL register write even if the value hasn't changed.
801 * This is neccessary because fine step will not update until a
802 * value is written into the control register.
803 */
804 rc = pm8xxx_vreg_masked_write_forced(vreg, vreg->ctrl_addr,
805 vprog, LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
806 } else {
807 /* Only write to control register if new value is different. */
808 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, vprog,
809 LDO_CTRL_VPROG_MASK, &vreg->ctrl_reg);
810 }
811bail:
812 mutex_unlock(&vreg->pc_lock);
813
814 if (rc)
815 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
816 else
817 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
818
819 return rc;
820}
821
822static int _pm8xxx_nldo1200_get_voltage(struct pm8xxx_vreg *vreg)
823{
824 int uV = 0;
825 int vprog;
826
827 if (!NLDO1200_IN_ADVANCED_MODE(vreg)) {
828 pr_warn("%s: currently in legacy mode; voltage unknown.\n",
829 vreg->rdesc.name);
830 return vreg->save_uV;
831 }
832
833 vprog = vreg->ctrl_reg & NLDO1200_CTRL_VPROG_MASK;
834
835 if ((vreg->ctrl_reg & NLDO1200_CTRL_RANGE_MASK)
836 == NLDO1200_CTRL_RANGE_LOW)
837 uV = vprog * NLDO1200_LOW_UV_STEP + NLDO1200_LOW_UV_MIN;
838 else
839 uV = vprog * NLDO1200_HIGH_UV_STEP + NLDO1200_HIGH_UV_MIN;
840
841 return uV;
842}
843
844static int pm8xxx_nldo1200_get_voltage(struct regulator_dev *rdev)
845{
846 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
847
848 return _pm8xxx_nldo1200_get_voltage(vreg);
849}
850
851static int pm8xxx_nldo1200_list_voltage(struct regulator_dev *rdev,
852 unsigned selector)
853{
854 int uV;
855
856 if (selector >= NLDO1200_SET_POINTS)
857 return 0;
858
859 if (selector < NLDO1200_LOW_SET_POINTS)
860 uV = selector * NLDO1200_LOW_UV_STEP + NLDO1200_LOW_UV_MIN;
861 else
862 uV = (selector - NLDO1200_LOW_SET_POINTS)
863 * NLDO1200_HIGH_UV_STEP
864 + NLDO1200_HIGH_UV_MIN;
865
866 return uV;
867}
868
869static int _pm8xxx_nldo1200_set_voltage(struct pm8xxx_vreg *vreg, int min_uV,
870 int max_uV)
871{
872 u8 vprog, range;
873 int rc;
874 int uV = min_uV;
875
876 if (uV < NLDO1200_LOW_UV_MIN && max_uV >= NLDO1200_LOW_UV_MIN)
877 uV = NLDO1200_LOW_UV_MIN;
878
879 if (uV < NLDO1200_LOW_UV_MIN || uV > NLDO1200_HIGH_UV_MAX) {
880 vreg_err(vreg,
881 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
882 min_uV, max_uV, NLDO_UV_MIN, NLDO_UV_MAX);
883 return -EINVAL;
884 }
885
886 if (uV > NLDO1200_LOW_UV_MAX) {
887 vprog = (uV - NLDO1200_HIGH_UV_MIN + NLDO1200_HIGH_UV_STEP - 1)
888 / NLDO1200_HIGH_UV_STEP;
889 uV = vprog * NLDO1200_HIGH_UV_STEP + NLDO1200_HIGH_UV_MIN;
890 vprog &= NLDO1200_CTRL_VPROG_MASK;
891 range = NLDO1200_CTRL_RANGE_HIGH;
892 } else {
893 vprog = (uV - NLDO1200_LOW_UV_MIN + NLDO1200_LOW_UV_STEP - 1)
894 / NLDO1200_LOW_UV_STEP;
895 uV = vprog * NLDO1200_LOW_UV_STEP + NLDO1200_LOW_UV_MIN;
896 vprog &= NLDO1200_CTRL_VPROG_MASK;
897 range = NLDO1200_CTRL_RANGE_LOW;
898 }
899
900 if (uV > max_uV) {
901 vreg_err(vreg,
902 "request v=[%d, %d] cannot be met by any set point\n",
903 min_uV, max_uV);
904 return -EINVAL;
905 }
906
907 /* Set to advanced mode */
908 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
909 NLDO1200_ADVANCED_MODE | REGULATOR_BANK_SEL(2)
910 | REGULATOR_BANK_WRITE, NLDO1200_ADVANCED_MODE_MASK
911 | REGULATOR_BANK_MASK, &vreg->test_reg[2]);
912 if (rc)
913 goto bail;
914
915 /* Set voltage and range selection. */
916 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, vprog | range,
917 NLDO1200_CTRL_VPROG_MASK | NLDO1200_CTRL_RANGE_MASK,
918 &vreg->ctrl_reg);
919 if (rc)
920 goto bail;
921
922 vreg->save_uV = uV;
923
924bail:
925 if (rc)
926 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
927
928 return rc;
929}
930
931static int pm8xxx_nldo1200_set_voltage(struct regulator_dev *rdev, int min_uV,
932 int max_uV, unsigned *selector)
933{
934 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
935 int rc;
936
937 rc = _pm8xxx_nldo1200_set_voltage(vreg, min_uV, max_uV);
938
939 if (!rc)
940 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
941
942 return rc;
943}
944
945static int pm8xxx_smps_get_voltage_advanced(struct pm8xxx_vreg *vreg)
946{
947 u8 vprog, band;
948 int uV = 0;
949
950 vprog = vreg->ctrl_reg & SMPS_ADVANCED_VPROG_MASK;
951 band = vreg->ctrl_reg & SMPS_ADVANCED_BAND_MASK;
952
953 if (band == SMPS_ADVANCED_BAND_1)
954 uV = vprog * SMPS_BAND1_UV_STEP + SMPS_BAND1_UV_MIN;
955 else if (band == SMPS_ADVANCED_BAND_2)
956 uV = vprog * SMPS_BAND2_UV_STEP + SMPS_BAND2_UV_MIN;
957 else if (band == SMPS_ADVANCED_BAND_3)
958 uV = vprog * SMPS_BAND3_UV_STEP + SMPS_BAND3_UV_MIN;
959 else if (vreg->save_uV > 0)
960 uV = vreg->save_uV;
961 else
962 uV = VOLTAGE_UNKNOWN;
963
964 return uV;
965}
966
967static int pm8xxx_smps_get_voltage_legacy(struct pm8xxx_vreg *vreg)
968{
969 u8 vlow, vref, vprog;
970 int uV;
971
972 vlow = vreg->test_reg[1] & SMPS_LEGACY_VLOW_SEL_MASK;
973 vref = vreg->ctrl_reg & SMPS_LEGACY_VREF_SEL_MASK;
974 vprog = vreg->ctrl_reg & SMPS_LEGACY_VPROG_MASK;
975
976 if (vlow && vref) {
977 /* mode 3 */
978 uV = vprog * SMPS_MODE3_UV_STEP + SMPS_MODE3_UV_MIN;
979 } else if (vref) {
980 /* mode 2 */
981 uV = vprog * SMPS_MODE2_UV_STEP + SMPS_MODE2_UV_MIN;
982 } else {
983 /* mode 1 */
984 uV = vprog * SMPS_MODE1_UV_STEP + SMPS_MODE1_UV_MIN;
985 }
986
987 return uV;
988}
989
990static int _pm8xxx_smps_get_voltage(struct pm8xxx_vreg *vreg)
991{
992 if (SMPS_IN_ADVANCED_MODE(vreg))
993 return pm8xxx_smps_get_voltage_advanced(vreg);
994
995 return pm8xxx_smps_get_voltage_legacy(vreg);
996}
997
998static int pm8xxx_smps_list_voltage(struct regulator_dev *rdev,
999 unsigned selector)
1000{
1001 int uV;
1002
1003 if (selector >= SMPS_ADVANCED_SET_POINTS)
1004 return 0;
1005
1006 if (selector < SMPS_BAND1_SET_POINTS)
1007 uV = selector * SMPS_BAND1_UV_STEP + SMPS_BAND1_UV_MIN;
1008 else if (selector < (SMPS_BAND1_SET_POINTS + SMPS_BAND2_SET_POINTS))
1009 uV = (selector - SMPS_BAND1_SET_POINTS) * SMPS_BAND2_UV_STEP
1010 + SMPS_BAND2_UV_MIN;
1011 else
1012 uV = (selector - SMPS_BAND1_SET_POINTS - SMPS_BAND2_SET_POINTS)
1013 * SMPS_BAND3_UV_STEP
1014 + SMPS_BAND3_UV_MIN;
1015
1016 return uV;
1017}
1018
1019static int pm8xxx_smps_get_voltage(struct regulator_dev *rdev)
1020{
1021 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1022 int uV;
1023
1024 mutex_lock(&vreg->pc_lock);
1025 uV = _pm8xxx_smps_get_voltage(vreg);
1026 mutex_unlock(&vreg->pc_lock);
1027
1028 return uV;
1029}
1030
1031static int pm8xxx_smps_set_voltage_advanced(struct pm8xxx_vreg *vreg,
1032 int min_uV, int max_uV, int force_on)
1033{
1034 u8 vprog, band;
1035 int rc;
1036 int uV = min_uV;
1037
1038 if (uV < SMPS_BAND1_UV_MIN && max_uV >= SMPS_BAND1_UV_MIN)
1039 uV = SMPS_BAND1_UV_MIN;
1040
1041 if (uV < SMPS_BAND1_UV_MIN || uV > SMPS_BAND3_UV_MAX) {
1042 vreg_err(vreg,
1043 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
1044 min_uV, max_uV, SMPS_BAND1_UV_MIN, SMPS_BAND3_UV_MAX);
1045 return -EINVAL;
1046 }
1047
1048 if (uV > SMPS_BAND2_UV_MAX) {
1049 vprog = (uV - SMPS_BAND3_UV_MIN + SMPS_BAND3_UV_STEP - 1)
1050 / SMPS_BAND3_UV_STEP;
1051 band = SMPS_ADVANCED_BAND_3;
1052 uV = SMPS_BAND3_UV_MIN + vprog * SMPS_BAND3_UV_STEP;
1053 } else if (uV > SMPS_BAND1_UV_MAX) {
1054 vprog = (uV - SMPS_BAND2_UV_MIN + SMPS_BAND2_UV_STEP - 1)
1055 / SMPS_BAND2_UV_STEP;
1056 band = SMPS_ADVANCED_BAND_2;
1057 uV = SMPS_BAND2_UV_MIN + vprog * SMPS_BAND2_UV_STEP;
1058 } else {
1059 vprog = (uV - SMPS_BAND1_UV_MIN + SMPS_BAND1_UV_STEP - 1)
1060 / SMPS_BAND1_UV_STEP;
1061 band = SMPS_ADVANCED_BAND_1;
1062 uV = SMPS_BAND1_UV_MIN + vprog * SMPS_BAND1_UV_STEP;
1063 }
1064
1065 if (uV > max_uV) {
1066 vreg_err(vreg,
1067 "request v=[%d, %d] cannot be met by any set point\n",
1068 min_uV, max_uV);
1069 return -EINVAL;
1070 }
1071
1072 /* Do not set band if regulator currently disabled. */
1073 if (!_pm8xxx_vreg_is_enabled(vreg) && !force_on)
1074 band = SMPS_ADVANCED_BAND_OFF;
1075
1076 /* Set advanced mode bit to 1. */
1077 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr, SMPS_ADVANCED_MODE
1078 | REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(7),
1079 SMPS_ADVANCED_MODE_MASK | REGULATOR_BANK_MASK,
1080 &vreg->test_reg[7]);
1081 if (rc)
1082 goto bail;
1083
1084 /* Set voltage and voltage band. */
1085 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, band | vprog,
1086 SMPS_ADVANCED_BAND_MASK | SMPS_ADVANCED_VPROG_MASK,
1087 &vreg->ctrl_reg);
1088 if (rc)
1089 goto bail;
1090
1091 vreg->save_uV = uV;
1092
1093bail:
1094 if (rc)
1095 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1096
1097 return rc;
1098}
1099
1100static int pm8xxx_smps_set_voltage_legacy(struct pm8xxx_vreg *vreg, int min_uV,
1101 int max_uV)
1102{
1103 u8 vlow, vref, vprog, pd, en;
1104 int rc;
1105 int uV = min_uV;
1106
1107 if (uV < SMPS_MODE3_UV_MIN && max_uV >= SMPS_MODE3_UV_MIN)
1108 uV = SMPS_MODE3_UV_MIN;
1109
1110 if (uV < SMPS_MODE3_UV_MIN || uV > SMPS_MODE1_UV_MAX) {
1111 vreg_err(vreg,
1112 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
1113 min_uV, max_uV, SMPS_MODE3_UV_MIN, SMPS_MODE1_UV_MAX);
1114 return -EINVAL;
1115 }
1116
1117 if (uV > SMPS_MODE2_UV_MAX) {
1118 vprog = (uV - SMPS_MODE1_UV_MIN + SMPS_MODE1_UV_STEP - 1)
1119 / SMPS_MODE1_UV_STEP;
1120 vref = 0;
1121 vlow = 0;
1122 uV = SMPS_MODE1_UV_MIN + vprog * SMPS_MODE1_UV_STEP;
1123 } else if (uV > SMPS_MODE3_UV_MAX) {
1124 vprog = (uV - SMPS_MODE2_UV_MIN + SMPS_MODE2_UV_STEP - 1)
1125 / SMPS_MODE2_UV_STEP;
1126 vref = SMPS_LEGACY_VREF_SEL_MASK;
1127 vlow = 0;
1128 uV = SMPS_MODE2_UV_MIN + vprog * SMPS_MODE2_UV_STEP;
1129 } else {
1130 vprog = (uV - SMPS_MODE3_UV_MIN + SMPS_MODE3_UV_STEP - 1)
1131 / SMPS_MODE3_UV_STEP;
1132 vref = SMPS_LEGACY_VREF_SEL_MASK;
1133 vlow = SMPS_LEGACY_VLOW_SEL_MASK;
1134 uV = SMPS_MODE3_UV_MIN + vprog * SMPS_MODE3_UV_STEP;
1135 }
1136
1137 if (uV > max_uV) {
1138 vreg_err(vreg,
1139 "request v=[%d, %d] cannot be met by any set point\n",
1140 min_uV, max_uV);
1141 return -EINVAL;
1142 }
1143
1144 /* set vlow bit for ultra low voltage mode */
1145 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1146 vlow | REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(1),
1147 REGULATOR_BANK_MASK | SMPS_LEGACY_VLOW_SEL_MASK,
1148 &vreg->test_reg[1]);
1149 if (rc)
1150 goto bail;
1151
1152 /* Set advanced mode bit to 0. */
1153 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr, SMPS_LEGACY_MODE
1154 | REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(7),
1155 SMPS_ADVANCED_MODE_MASK | REGULATOR_BANK_MASK,
1156 &vreg->test_reg[7]);
1157 if (rc)
1158 goto bail;
1159
1160 en = (_pm8xxx_vreg_is_enabled(vreg) ? SMPS_LEGACY_ENABLE : 0);
1161 pd = (vreg->pdata.pull_down_enable ? SMPS_LEGACY_PULL_DOWN_ENABLE : 0);
1162
1163 /* Set voltage (and the rest of the control register). */
1164 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1165 en | pd | vref | vprog,
1166 SMPS_LEGACY_ENABLE_MASK | SMPS_LEGACY_PULL_DOWN_ENABLE
1167 | SMPS_LEGACY_VREF_SEL_MASK | SMPS_LEGACY_VPROG_MASK,
1168 &vreg->ctrl_reg);
1169
1170 vreg->save_uV = uV;
1171
1172bail:
1173 if (rc)
1174 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1175
1176 return rc;
1177}
1178
1179static int pm8xxx_smps_set_voltage(struct regulator_dev *rdev, int min_uV,
1180 int max_uV, unsigned *selector)
1181{
1182 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1183 int rc = 0;
1184
1185 mutex_lock(&vreg->pc_lock);
1186
1187 if (SMPS_IN_ADVANCED_MODE(vreg) || !pm8xxx_vreg_is_pin_controlled(vreg))
1188 rc = pm8xxx_smps_set_voltage_advanced(vreg, min_uV, max_uV, 0);
1189 else
1190 rc = pm8xxx_smps_set_voltage_legacy(vreg, min_uV, max_uV);
1191
1192 mutex_unlock(&vreg->pc_lock);
1193
1194 if (!rc)
1195 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
1196
1197 return rc;
1198}
1199
1200static int _pm8xxx_ftsmps_get_voltage(struct pm8xxx_vreg *vreg)
1201{
1202 u8 vprog, band;
1203 int uV = 0;
1204
1205 if ((vreg->test_reg[0] & FTSMPS_CNFG1_PM_MASK) == FTSMPS_CNFG1_PM_PFM) {
1206 vprog = vreg->pfm_ctrl_reg & FTSMPS_VCTRL_VPROG_MASK;
1207 band = vreg->pfm_ctrl_reg & FTSMPS_VCTRL_BAND_MASK;
1208 if (band == FTSMPS_VCTRL_BAND_OFF && vprog == 0) {
1209 /* PWM_VCTRL overrides PFM_VCTRL */
1210 vprog = vreg->ctrl_reg & FTSMPS_VCTRL_VPROG_MASK;
1211 band = vreg->ctrl_reg & FTSMPS_VCTRL_BAND_MASK;
1212 }
1213 } else {
1214 vprog = vreg->ctrl_reg & FTSMPS_VCTRL_VPROG_MASK;
1215 band = vreg->ctrl_reg & FTSMPS_VCTRL_BAND_MASK;
1216 }
1217
1218 if (band == FTSMPS_VCTRL_BAND_1)
1219 uV = vprog * FTSMPS_BAND1_UV_PHYS_STEP + FTSMPS_BAND1_UV_MIN;
1220 else if (band == FTSMPS_VCTRL_BAND_2)
1221 uV = vprog * FTSMPS_BAND2_UV_STEP + FTSMPS_BAND2_UV_MIN;
1222 else if (band == FTSMPS_VCTRL_BAND_3)
1223 uV = vprog * FTSMPS_BAND3_UV_STEP + FTSMPS_BAND3_UV_MIN;
1224 else if (vreg->save_uV > 0)
1225 uV = vreg->save_uV;
1226 else
1227 uV = VOLTAGE_UNKNOWN;
1228
1229 return uV;
1230}
1231
1232static int pm8xxx_ftsmps_get_voltage(struct regulator_dev *rdev)
1233{
1234 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1235
1236 return _pm8xxx_ftsmps_get_voltage(vreg);
1237}
1238
1239static int pm8xxx_ftsmps_list_voltage(struct regulator_dev *rdev,
1240 unsigned selector)
1241{
1242 int uV;
1243
1244 if (selector >= FTSMPS_SET_POINTS)
1245 return 0;
1246
1247 if (selector < FTSMPS_BAND1_SET_POINTS)
1248 uV = selector * FTSMPS_BAND1_UV_LOG_STEP + FTSMPS_BAND1_UV_MIN;
1249 else if (selector < (FTSMPS_BAND1_SET_POINTS + FTSMPS_BAND2_SET_POINTS))
1250 uV = (selector - FTSMPS_BAND1_SET_POINTS) * FTSMPS_BAND2_UV_STEP
1251 + FTSMPS_BAND2_UV_MIN;
1252 else
1253 uV = (selector - FTSMPS_BAND1_SET_POINTS
1254 - FTSMPS_BAND2_SET_POINTS)
1255 * FTSMPS_BAND3_UV_STEP
1256 + FTSMPS_BAND3_UV_SET_POINT_MIN;
1257
1258 return uV;
1259}
1260
1261static int _pm8xxx_ftsmps_set_voltage(struct pm8xxx_vreg *vreg, int min_uV,
1262 int max_uV, int force_on)
1263{
1264 int rc = 0;
1265 u8 vprog, band;
1266 int uV = min_uV;
1267
1268 if (uV < FTSMPS_BAND1_UV_MIN && max_uV >= FTSMPS_BAND1_UV_MIN)
1269 uV = FTSMPS_BAND1_UV_MIN;
1270
1271 if (uV < FTSMPS_BAND1_UV_MIN || uV > FTSMPS_BAND3_UV_MAX) {
1272 vreg_err(vreg,
1273 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
1274 min_uV, max_uV, FTSMPS_BAND1_UV_MIN,
1275 FTSMPS_BAND3_UV_MAX);
1276 return -EINVAL;
1277 }
1278
1279 /* Round up for set points in the gaps between bands. */
1280 if (uV > FTSMPS_BAND1_UV_MAX && uV < FTSMPS_BAND2_UV_MIN)
1281 uV = FTSMPS_BAND2_UV_MIN;
1282 else if (uV > FTSMPS_BAND2_UV_MAX
1283 && uV < FTSMPS_BAND3_UV_SET_POINT_MIN)
1284 uV = FTSMPS_BAND3_UV_SET_POINT_MIN;
1285
1286 if (uV > FTSMPS_BAND2_UV_MAX) {
1287 vprog = (uV - FTSMPS_BAND3_UV_MIN + FTSMPS_BAND3_UV_STEP - 1)
1288 / FTSMPS_BAND3_UV_STEP;
1289 band = FTSMPS_VCTRL_BAND_3;
1290 uV = FTSMPS_BAND3_UV_MIN + vprog * FTSMPS_BAND3_UV_STEP;
1291 } else if (uV > FTSMPS_BAND1_UV_MAX) {
1292 vprog = (uV - FTSMPS_BAND2_UV_MIN + FTSMPS_BAND2_UV_STEP - 1)
1293 / FTSMPS_BAND2_UV_STEP;
1294 band = FTSMPS_VCTRL_BAND_2;
1295 uV = FTSMPS_BAND2_UV_MIN + vprog * FTSMPS_BAND2_UV_STEP;
1296 } else {
1297 vprog = (uV - FTSMPS_BAND1_UV_MIN
1298 + FTSMPS_BAND1_UV_LOG_STEP - 1)
1299 / FTSMPS_BAND1_UV_LOG_STEP;
1300 uV = FTSMPS_BAND1_UV_MIN + vprog * FTSMPS_BAND1_UV_LOG_STEP;
1301 vprog *= FTSMPS_BAND1_UV_LOG_STEP / FTSMPS_BAND1_UV_PHYS_STEP;
1302 band = FTSMPS_VCTRL_BAND_1;
1303 }
1304
1305 if (uV > max_uV) {
1306 vreg_err(vreg,
1307 "request v=[%d, %d] cannot be met by any set point\n",
1308 min_uV, max_uV);
1309 return -EINVAL;
1310 }
1311
1312 /*
1313 * Do not set voltage if regulator is currently disabled because doing
1314 * so will enable it.
1315 */
1316 if (_pm8xxx_vreg_is_enabled(vreg) || force_on) {
1317 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1318 band | vprog,
1319 FTSMPS_VCTRL_BAND_MASK | FTSMPS_VCTRL_VPROG_MASK,
1320 &vreg->ctrl_reg);
1321 if (rc)
1322 goto bail;
1323
1324 /* Program PFM_VCTRL as 0x00 so that PWM_VCTRL overrides it. */
1325 rc = pm8xxx_vreg_masked_write(vreg, vreg->pfm_ctrl_addr, 0x00,
1326 FTSMPS_VCTRL_BAND_MASK | FTSMPS_VCTRL_VPROG_MASK,
1327 &vreg->pfm_ctrl_reg);
1328 if (rc)
1329 goto bail;
1330 }
1331
1332 vreg->save_uV = uV;
1333
1334bail:
1335 if (rc)
1336 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1337
1338 return rc;
1339}
1340
1341static int pm8xxx_ftsmps_set_voltage(struct regulator_dev *rdev, int min_uV,
1342 int max_uV, unsigned *selector)
1343{
1344 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1345 int rc;
1346
1347 rc = _pm8xxx_ftsmps_set_voltage(vreg, min_uV, max_uV, 0);
1348
1349 if (!rc)
1350 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
1351
1352 return rc;
1353}
1354
1355static int pm8xxx_ncp_get_voltage(struct regulator_dev *rdev)
1356{
1357 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1358 u8 vprog;
1359
1360 vprog = vreg->ctrl_reg & NCP_VPROG_MASK;
1361
1362 return NCP_UV_MIN + vprog * NCP_UV_STEP;
1363}
1364
1365static int pm8xxx_ncp_list_voltage(struct regulator_dev *rdev,
1366 unsigned selector)
1367{
1368 if (selector >= NCP_SET_POINTS)
1369 return 0;
1370
1371 return selector * NCP_UV_STEP + NCP_UV_MIN;
1372}
1373
1374static int pm8xxx_ncp_set_voltage(struct regulator_dev *rdev, int min_uV,
1375 int max_uV, unsigned *selector)
1376{
1377 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1378 int rc;
1379 int uV = min_uV;
1380 u8 val;
1381
1382 if (uV < NCP_UV_MIN && max_uV >= NCP_UV_MIN)
1383 uV = NCP_UV_MIN;
1384
1385 if (uV < NCP_UV_MIN || uV > NCP_UV_MAX) {
1386 vreg_err(vreg,
1387 "request v=[%d, %d] is outside possible v=[%d, %d]\n",
1388 min_uV, max_uV, NCP_UV_MIN, NCP_UV_MAX);
1389 return -EINVAL;
1390 }
1391
1392 val = (uV - NCP_UV_MIN + NCP_UV_STEP - 1) / NCP_UV_STEP;
1393 uV = val * NCP_UV_STEP + NCP_UV_MIN;
1394
1395 if (uV > max_uV) {
1396 vreg_err(vreg,
1397 "request v=[%d, %d] cannot be met by any set point\n",
1398 min_uV, max_uV);
1399 return -EINVAL;
1400 }
1401
1402 /* voltage setting */
1403 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, val,
1404 NCP_VPROG_MASK, &vreg->ctrl_reg);
1405 if (rc)
1406 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1407 else
1408 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_VOLTAGE);
1409
1410 return rc;
1411}
1412
1413static unsigned int pm8xxx_ldo_get_mode(struct regulator_dev *rdev)
1414{
1415 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1416 unsigned int mode = 0;
1417
1418 mutex_lock(&vreg->pc_lock);
1419 mode = vreg->mode;
1420 mutex_unlock(&vreg->pc_lock);
1421
1422 return mode;
1423}
1424
1425static int pm8xxx_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
1426{
1427 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1428 int rc = 0;
1429
1430 if (mode != REGULATOR_MODE_NORMAL && mode != REGULATOR_MODE_IDLE) {
1431 vreg_err(vreg, "invalid mode: %u\n", mode);
1432 return -EINVAL;
1433 }
1434
1435 mutex_lock(&vreg->pc_lock);
1436
1437 if (mode == REGULATOR_MODE_NORMAL
1438 || (vreg->is_enabled_pc
1439 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE)) {
1440 /* HPM */
1441 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1442 LDO_CTRL_PM_HPM, LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
1443 } else {
1444 /* LPM */
1445 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1446 LDO_CTRL_PM_LPM, LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
1447 if (rc)
1448 goto bail;
1449
1450 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1451 LDO_TEST_LPM_SEL_CTRL | REGULATOR_BANK_WRITE
1452 | REGULATOR_BANK_SEL(0),
1453 LDO_TEST_LPM_MASK | REGULATOR_BANK_MASK,
1454 &vreg->test_reg[0]);
1455 }
1456
1457bail:
1458 if (!rc)
1459 vreg->mode = mode;
1460
1461 mutex_unlock(&vreg->pc_lock);
1462
1463 if (rc)
1464 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1465 else
1466 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_MODE);
1467
1468 return rc;
1469}
1470
1471static unsigned int pm8xxx_nldo1200_get_mode(struct regulator_dev *rdev)
1472{
1473 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1474 unsigned int mode = 0;
1475
1476 if (NLDO1200_IN_ADVANCED_MODE(vreg)) {
1477 /* Advanced mode */
1478 if ((vreg->test_reg[2] & NLDO1200_ADVANCED_PM_MASK)
1479 == NLDO1200_ADVANCED_PM_LPM)
1480 mode = REGULATOR_MODE_IDLE;
1481 else
1482 mode = REGULATOR_MODE_NORMAL;
1483 } else {
1484 /* Legacy mode */
1485 if ((vreg->ctrl_reg & NLDO1200_LEGACY_PM_MASK)
1486 == NLDO1200_LEGACY_PM_LPM)
1487 mode = REGULATOR_MODE_IDLE;
1488 else
1489 mode = REGULATOR_MODE_NORMAL;
1490 }
1491
1492 return mode;
1493}
1494
1495static int pm8xxx_nldo1200_set_mode(struct regulator_dev *rdev,
1496 unsigned int mode)
1497{
1498 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1499 int rc = 0;
1500
1501 if (mode != REGULATOR_MODE_NORMAL && mode != REGULATOR_MODE_IDLE) {
1502 vreg_err(vreg, "invalid mode: %u\n", mode);
1503 return -EINVAL;
1504 }
1505
1506 /*
1507 * Make sure that advanced mode is in use. If it isn't, then set it
1508 * and update the voltage accordingly.
1509 */
1510 if (!NLDO1200_IN_ADVANCED_MODE(vreg)) {
1511 rc = _pm8xxx_nldo1200_set_voltage(vreg, vreg->save_uV,
1512 vreg->save_uV);
1513 if (rc)
1514 goto bail;
1515 }
1516
1517 if (mode == REGULATOR_MODE_NORMAL) {
1518 /* HPM */
1519 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1520 NLDO1200_ADVANCED_PM_HPM | REGULATOR_BANK_WRITE
1521 | REGULATOR_BANK_SEL(2), NLDO1200_ADVANCED_PM_MASK
1522 | REGULATOR_BANK_MASK, &vreg->test_reg[2]);
1523 } else {
1524 /* LPM */
1525 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1526 NLDO1200_ADVANCED_PM_LPM | REGULATOR_BANK_WRITE
1527 | REGULATOR_BANK_SEL(2), NLDO1200_ADVANCED_PM_MASK
1528 | REGULATOR_BANK_MASK, &vreg->test_reg[2]);
1529 }
1530
1531bail:
1532 if (rc)
1533 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1534 else
1535 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_MODE);
1536
1537 return rc;
1538}
1539
1540static unsigned int pm8xxx_smps_get_mode(struct regulator_dev *rdev)
1541{
1542 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1543 unsigned int mode = 0;
1544
1545 mutex_lock(&vreg->pc_lock);
1546 mode = vreg->mode;
1547 mutex_unlock(&vreg->pc_lock);
1548
1549 return mode;
1550}
1551
1552static int pm8xxx_smps_set_mode(struct regulator_dev *rdev, unsigned int mode)
1553{
1554 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1555 int rc = 0;
1556
1557 if (mode != REGULATOR_MODE_NORMAL && mode != REGULATOR_MODE_IDLE) {
1558 vreg_err(vreg, "invalid mode: %u\n", mode);
1559 return -EINVAL;
1560 }
1561
1562 mutex_lock(&vreg->pc_lock);
1563
1564 if (mode == REGULATOR_MODE_NORMAL
1565 || (vreg->is_enabled_pc
1566 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE)) {
1567 /* HPM */
1568 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr,
1569 SMPS_CLK_CTRL_PWM, SMPS_CLK_CTRL_MASK,
1570 &vreg->clk_ctrl_reg);
1571 } else {
1572 /* LPM */
1573 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr,
1574 SMPS_CLK_CTRL_PFM, SMPS_CLK_CTRL_MASK,
1575 &vreg->clk_ctrl_reg);
1576 }
1577
1578 if (!rc)
1579 vreg->mode = mode;
1580
1581 mutex_unlock(&vreg->pc_lock);
1582
1583 if (rc)
1584 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1585 else
1586 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_MODE);
1587
1588 return rc;
1589}
1590
1591static unsigned int pm8xxx_ftsmps_get_mode(struct regulator_dev *rdev)
1592{
1593 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1594 unsigned int mode = 0;
1595
1596 if ((vreg->test_reg[0] & FTSMPS_CNFG1_PM_MASK) == FTSMPS_CNFG1_PM_PFM)
1597 mode = REGULATOR_MODE_IDLE;
1598 else
1599 mode = REGULATOR_MODE_NORMAL;
1600
1601 return mode;
1602}
1603
1604static int pm8xxx_ftsmps_set_mode(struct regulator_dev *rdev, unsigned int mode)
1605{
1606 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1607 int rc = 0;
1608
1609 if (mode == REGULATOR_MODE_NORMAL) {
1610 /* HPM */
1611 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1612 FTSMPS_CNFG1_PM_PWM | REGULATOR_BANK_WRITE
1613 | REGULATOR_BANK_SEL(0), FTSMPS_CNFG1_PM_MASK
1614 | REGULATOR_BANK_MASK, &vreg->test_reg[0]);
1615 } else if (mode == REGULATOR_MODE_IDLE) {
1616 /* LPM */
1617 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1618 FTSMPS_CNFG1_PM_PFM | REGULATOR_BANK_WRITE
1619 | REGULATOR_BANK_SEL(0), FTSMPS_CNFG1_PM_MASK
1620 | REGULATOR_BANK_MASK, &vreg->test_reg[0]);
1621 } else {
1622 vreg_err(vreg, "invalid mode: %u\n", mode);
1623 return -EINVAL;
1624 }
1625
1626 if (rc)
1627 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1628 else
1629 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_MODE);
1630
1631 return rc;
1632}
1633
1634static unsigned int pm8xxx_vreg_get_optimum_mode(struct regulator_dev *rdev,
1635 int input_uV, int output_uV, int load_uA)
1636{
1637 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1638 unsigned int mode;
1639
1640 if (load_uA + vreg->pdata.system_uA >= vreg->hpm_min_load)
1641 mode = REGULATOR_MODE_NORMAL;
1642 else
1643 mode = REGULATOR_MODE_IDLE;
1644
1645 return mode;
1646}
1647
1648static int pm8xxx_ldo_enable(struct regulator_dev *rdev)
1649{
1650 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1651 int rc, val;
1652
1653 mutex_lock(&vreg->pc_lock);
1654
1655 /*
1656 * Choose HPM if previously set to HPM or if pin control is enabled in
1657 * on/off mode.
1658 */
1659 val = LDO_CTRL_PM_LPM;
1660 if (vreg->mode == REGULATOR_MODE_NORMAL
1661 || (vreg->is_enabled_pc
1662 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE))
1663 val = LDO_CTRL_PM_HPM;
1664
1665 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, val | LDO_ENABLE,
1666 LDO_ENABLE_MASK | LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
1667
1668 if (!rc)
1669 vreg->is_enabled = true;
1670
1671 mutex_unlock(&vreg->pc_lock);
1672
1673 if (rc)
1674 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1675 else
1676 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1677
1678 return rc;
1679}
1680
1681static int pm8xxx_ldo_disable(struct regulator_dev *rdev)
1682{
1683 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1684 int rc;
1685
1686 mutex_lock(&vreg->pc_lock);
1687
1688 /*
1689 * Only disable the regulator if it isn't still required for HPM/LPM
1690 * pin control.
1691 */
1692 if (!vreg->is_enabled_pc
1693 || vreg->pdata.pin_fn != PM8XXX_VREG_PIN_FN_MODE) {
1694 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1695 LDO_DISABLE, LDO_ENABLE_MASK, &vreg->ctrl_reg);
1696 if (rc)
1697 goto bail;
1698 }
1699
1700 /* Change to LPM if HPM/LPM pin control is enabled. */
1701 if (vreg->is_enabled_pc
1702 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_MODE) {
1703 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1704 LDO_CTRL_PM_LPM, LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
1705 if (rc)
1706 goto bail;
1707
1708 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
1709 LDO_TEST_LPM_SEL_CTRL | REGULATOR_BANK_WRITE
1710 | REGULATOR_BANK_SEL(0),
1711 LDO_TEST_LPM_MASK | REGULATOR_BANK_MASK,
1712 &vreg->test_reg[0]);
1713 }
1714
1715 if (!rc)
1716 vreg->is_enabled = false;
1717bail:
1718 mutex_unlock(&vreg->pc_lock);
1719
1720 if (rc)
1721 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1722 else
1723 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1724
1725 return rc;
1726}
1727
1728static int pm8xxx_nldo1200_enable(struct regulator_dev *rdev)
1729{
1730 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1731 int rc;
1732
1733 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, NLDO1200_ENABLE,
1734 NLDO1200_ENABLE_MASK, &vreg->ctrl_reg);
1735
1736 if (rc)
1737 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1738 else
1739 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1740
1741 return rc;
1742}
1743
1744static int pm8xxx_nldo1200_disable(struct regulator_dev *rdev)
1745{
1746 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1747 int rc;
1748
1749 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, NLDO1200_DISABLE,
1750 NLDO1200_ENABLE_MASK, &vreg->ctrl_reg);
1751
1752 if (rc)
1753 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1754 else
1755 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1756
1757 return rc;
1758}
1759
1760static int pm8xxx_smps_enable(struct regulator_dev *rdev)
1761{
1762 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1763 int rc = 0;
1764 int val;
1765
1766 mutex_lock(&vreg->pc_lock);
1767
1768 if (SMPS_IN_ADVANCED_MODE(vreg)
1769 || !pm8xxx_vreg_is_pin_controlled(vreg)) {
1770 /* Enable in advanced mode if not using pin control. */
1771 rc = pm8xxx_smps_set_voltage_advanced(vreg, vreg->save_uV,
1772 vreg->save_uV, 1);
1773 } else {
1774 rc = pm8xxx_smps_set_voltage_legacy(vreg, vreg->save_uV,
1775 vreg->save_uV);
1776 if (rc)
1777 goto bail;
1778
1779 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1780 SMPS_LEGACY_ENABLE, SMPS_LEGACY_ENABLE_MASK,
1781 &vreg->ctrl_reg);
1782 }
1783
1784 /*
1785 * Choose HPM if previously set to HPM or if pin control is enabled in
1786 * on/off mode.
1787 */
1788 val = SMPS_CLK_CTRL_PFM;
1789 if (vreg->mode == REGULATOR_MODE_NORMAL
1790 || (vreg->is_enabled_pc
1791 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE))
1792 val = SMPS_CLK_CTRL_PWM;
1793
1794 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr, val,
1795 SMPS_CLK_CTRL_MASK, &vreg->clk_ctrl_reg);
1796
1797 if (!rc)
1798 vreg->is_enabled = true;
1799bail:
1800 mutex_unlock(&vreg->pc_lock);
1801
1802 if (rc)
1803 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1804 else
1805 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1806
1807 return rc;
1808}
1809
1810static int pm8xxx_smps_disable(struct regulator_dev *rdev)
1811{
1812 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1813 int rc;
1814
1815 mutex_lock(&vreg->pc_lock);
1816
1817 if (SMPS_IN_ADVANCED_MODE(vreg)) {
1818 /* Change SMPS to legacy mode before disabling. */
1819 rc = pm8xxx_smps_set_voltage_legacy(vreg, vreg->save_uV,
1820 vreg->save_uV);
1821 if (rc)
1822 goto bail;
1823 }
1824
1825 /*
1826 * Only disable the regulator if it isn't still required for HPM/LPM
1827 * pin control.
1828 */
1829 if (!vreg->is_enabled_pc
1830 || vreg->pdata.pin_fn != PM8XXX_VREG_PIN_FN_MODE) {
1831 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1832 SMPS_LEGACY_DISABLE, SMPS_LEGACY_ENABLE_MASK,
1833 &vreg->ctrl_reg);
1834 if (rc)
1835 goto bail;
1836 }
1837
1838 /* Change to LPM if HPM/LPM pin control is enabled. */
1839 if (vreg->is_enabled_pc
1840 && vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_MODE)
1841 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr,
1842 SMPS_CLK_CTRL_PFM, SMPS_CLK_CTRL_MASK,
1843 &vreg->clk_ctrl_reg);
1844
1845 if (!rc)
1846 vreg->is_enabled = false;
1847
1848bail:
1849 mutex_unlock(&vreg->pc_lock);
1850
1851 if (rc)
1852 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1853 else
1854 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1855
1856 return rc;
1857}
1858
1859static int pm8xxx_ftsmps_enable(struct regulator_dev *rdev)
1860{
1861 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1862 int rc;
1863
1864 rc = _pm8xxx_ftsmps_set_voltage(vreg, vreg->save_uV, vreg->save_uV, 1);
1865
1866 if (rc)
1867 vreg_err(vreg, "set voltage failed, rc=%d\n", rc);
1868 else
1869 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1870
1871 return rc;
1872}
1873
1874static int pm8xxx_ftsmps_disable(struct regulator_dev *rdev)
1875{
1876 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1877 int rc;
1878
1879 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
1880 FTSMPS_VCTRL_BAND_OFF, FTSMPS_VCTRL_BAND_MASK, &vreg->ctrl_reg);
1881 if (rc)
1882 goto bail;
1883
1884 rc = pm8xxx_vreg_masked_write(vreg, vreg->pfm_ctrl_addr,
1885 FTSMPS_VCTRL_BAND_OFF, FTSMPS_VCTRL_BAND_MASK,
1886 &vreg->pfm_ctrl_reg);
1887bail:
1888 if (rc)
1889 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1890 else
1891 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1892
1893 return rc;
1894}
1895
1896static int pm8xxx_vs_enable(struct regulator_dev *rdev)
1897{
1898 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1899 int rc;
1900
1901 mutex_lock(&vreg->pc_lock);
1902
1903 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, VS_ENABLE,
1904 VS_ENABLE_MASK, &vreg->ctrl_reg);
1905
1906 if (!rc)
1907 vreg->is_enabled = true;
1908
1909 mutex_unlock(&vreg->pc_lock);
1910
1911 if (rc)
1912 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1913 else
1914 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1915
1916 return rc;
1917}
1918
1919static int pm8xxx_vs_disable(struct regulator_dev *rdev)
1920{
1921 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1922 int rc;
1923
1924 mutex_lock(&vreg->pc_lock);
1925
1926 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, VS_DISABLE,
1927 VS_ENABLE_MASK, &vreg->ctrl_reg);
1928
1929 if (!rc)
1930 vreg->is_enabled = false;
1931
1932 mutex_unlock(&vreg->pc_lock);
1933
1934 if (rc)
1935 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1936 else
1937 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1938
1939 return rc;
1940}
1941
1942static int pm8xxx_vs300_enable(struct regulator_dev *rdev)
1943{
1944 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1945 int rc;
1946
1947 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, VS300_CTRL_ENABLE,
1948 VS300_CTRL_ENABLE_MASK, &vreg->ctrl_reg);
1949
1950 if (rc)
1951 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1952 else
1953 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1954
1955 return rc;
1956}
1957
1958static int pm8xxx_vs300_disable(struct regulator_dev *rdev)
1959{
1960 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1961 int rc;
1962
1963 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, VS300_CTRL_DISABLE,
1964 VS300_CTRL_ENABLE_MASK, &vreg->ctrl_reg);
1965
1966 if (rc)
1967 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1968 else
1969 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
1970
1971 return rc;
1972}
1973
1974static int pm8xxx_ncp_enable(struct regulator_dev *rdev)
1975{
1976 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1977 int rc;
1978
1979 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, NCP_ENABLE,
1980 NCP_ENABLE_MASK, &vreg->ctrl_reg);
1981
1982 if (rc)
1983 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
1984 else
1985 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_ENABLE);
1986
1987 return rc;
1988}
1989
1990static int pm8xxx_ncp_disable(struct regulator_dev *rdev)
1991{
1992 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
1993 int rc;
1994
1995 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, NCP_DISABLE,
1996 NCP_ENABLE_MASK, &vreg->ctrl_reg);
1997
1998 if (rc)
1999 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2000 else
2001 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_DISABLE);
2002
2003 return rc;
2004}
2005
2006static int pm8xxx_ldo_pin_control_enable(struct regulator_dev *rdev)
2007{
2008 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2009 int rc = 0;
2010 int bank;
2011 u8 val = 0;
2012 u8 mask;
2013
2014 mutex_lock(&vreg->pc_lock);
2015
2016 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN0)
2017 val |= LDO_TEST_PIN_CTRL_EN0;
2018 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN1)
2019 val |= LDO_TEST_PIN_CTRL_EN1;
2020 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN2)
2021 val |= LDO_TEST_PIN_CTRL_EN2;
2022 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN3)
2023 val |= LDO_TEST_PIN_CTRL_EN3;
2024
2025 bank = (vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE ? 5 : 6);
2026 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2027 val | REGULATOR_BANK_SEL(bank) | REGULATOR_BANK_WRITE,
2028 LDO_TEST_PIN_CTRL_MASK | REGULATOR_BANK_MASK,
2029 &vreg->test_reg[bank]);
2030 if (rc)
2031 goto bail;
2032
2033 /* Unset pin control bits in unused bank. */
2034 bank = (bank == 5 ? 6 : 5);
2035 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2036 REGULATOR_BANK_SEL(bank) | REGULATOR_BANK_WRITE,
2037 LDO_TEST_PIN_CTRL_MASK | REGULATOR_BANK_MASK,
2038 &vreg->test_reg[bank]);
2039 if (rc)
2040 goto bail;
2041
2042 val = LDO_TEST_LPM_SEL_CTRL | REGULATOR_BANK_WRITE
2043 | REGULATOR_BANK_SEL(0);
2044 mask = LDO_TEST_LPM_MASK | REGULATOR_BANK_MASK;
2045 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr, val, mask,
2046 &vreg->test_reg[0]);
2047 if (rc)
2048 goto bail;
2049
2050 if (vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE) {
2051 /* Pin control ON/OFF */
2052 val = LDO_CTRL_PM_HPM;
2053 /* Leave physically enabled if already enabled. */
2054 val |= (vreg->is_enabled ? LDO_ENABLE : LDO_DISABLE);
2055 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, val,
2056 LDO_ENABLE_MASK | LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
2057 if (rc)
2058 goto bail;
2059 } else {
2060 /* Pin control LPM/HPM */
2061 val = LDO_ENABLE;
2062 /* Leave in HPM if already enabled in HPM. */
2063 val |= (vreg->is_enabled && vreg->mode == REGULATOR_MODE_NORMAL
2064 ? LDO_CTRL_PM_HPM : LDO_CTRL_PM_LPM);
2065 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, val,
2066 LDO_ENABLE_MASK | LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
2067 if (rc)
2068 goto bail;
2069 }
2070
2071bail:
2072 if (!rc)
2073 vreg->is_enabled_pc = true;
2074
2075 mutex_unlock(&vreg->pc_lock);
2076
2077 if (rc)
2078 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2079 else
2080 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2081
2082 return rc;
2083}
2084
2085static int pm8xxx_ldo_pin_control_disable(struct regulator_dev *rdev)
2086{
2087 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2088 int rc;
2089
2090 mutex_lock(&vreg->pc_lock);
2091
2092 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2093 REGULATOR_BANK_SEL(5) | REGULATOR_BANK_WRITE,
2094 LDO_TEST_PIN_CTRL_MASK | REGULATOR_BANK_MASK,
2095 &vreg->test_reg[5]);
2096 if (rc)
2097 goto bail;
2098
2099 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2100 REGULATOR_BANK_SEL(6) | REGULATOR_BANK_WRITE,
2101 LDO_TEST_PIN_CTRL_MASK | REGULATOR_BANK_MASK,
2102 &vreg->test_reg[6]);
2103
2104 /*
2105 * Physically disable the regulator if it was enabled in HPM/LPM pin
2106 * control mode previously and it logically should not be enabled.
2107 */
2108 if ((vreg->ctrl_reg & LDO_ENABLE_MASK) == LDO_ENABLE
2109 && !vreg->is_enabled) {
2110 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2111 LDO_DISABLE, LDO_ENABLE_MASK, &vreg->ctrl_reg);
2112 if (rc)
2113 goto bail;
2114 }
2115
2116 /* Change to LPM if LPM was enabled. */
2117 if (vreg->is_enabled && vreg->mode == REGULATOR_MODE_IDLE) {
2118 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2119 LDO_CTRL_PM_LPM, LDO_CTRL_PM_MASK, &vreg->ctrl_reg);
2120 if (rc)
2121 goto bail;
2122
2123 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2124 LDO_TEST_LPM_SEL_CTRL | REGULATOR_BANK_WRITE
2125 | REGULATOR_BANK_SEL(0),
2126 LDO_TEST_LPM_MASK | REGULATOR_BANK_MASK,
2127 &vreg->test_reg[0]);
2128 if (rc)
2129 goto bail;
2130 }
2131
2132bail:
2133 if (!rc)
2134 vreg->is_enabled_pc = false;
2135
2136 mutex_unlock(&vreg->pc_lock);
2137
2138 if (rc)
2139 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2140 else
2141 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2142
2143 return rc;
2144}
2145
2146static int pm8xxx_smps_pin_control_enable(struct regulator_dev *rdev)
2147{
2148 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2149 int rc = 0;
2150 u8 val = 0;
2151
2152 mutex_lock(&vreg->pc_lock);
2153
2154 if (vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE) {
2155 /* Pin control ON/OFF */
2156 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN0)
2157 val |= SMPS_PIN_CTRL_EN0;
2158 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN1)
2159 val |= SMPS_PIN_CTRL_EN1;
2160 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN2)
2161 val |= SMPS_PIN_CTRL_EN2;
2162 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN3)
2163 val |= SMPS_PIN_CTRL_EN3;
2164 } else {
2165 /* Pin control LPM/HPM */
2166 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN0)
2167 val |= SMPS_PIN_CTRL_LPM_EN0;
2168 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN1)
2169 val |= SMPS_PIN_CTRL_LPM_EN1;
2170 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN2)
2171 val |= SMPS_PIN_CTRL_LPM_EN2;
2172 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN3)
2173 val |= SMPS_PIN_CTRL_LPM_EN3;
2174 }
2175
2176 rc = pm8xxx_smps_set_voltage_legacy(vreg, vreg->save_uV, vreg->save_uV);
2177 if (rc)
2178 goto bail;
2179
2180 rc = pm8xxx_vreg_masked_write(vreg, vreg->sleep_ctrl_addr, val,
2181 SMPS_PIN_CTRL_MASK | SMPS_PIN_CTRL_LPM_MASK,
2182 &vreg->sleep_ctrl_reg);
2183 if (rc)
2184 goto bail;
2185
2186 /*
2187 * Physically enable the regulator if using HPM/LPM pin control mode or
2188 * if the regulator should be logically left on.
2189 */
2190 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2191 ((vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_MODE
2192 || vreg->is_enabled) ?
2193 SMPS_LEGACY_ENABLE : SMPS_LEGACY_DISABLE),
2194 SMPS_LEGACY_ENABLE_MASK, &vreg->ctrl_reg);
2195 if (rc)
2196 goto bail;
2197
2198 /*
2199 * Set regulator to HPM if using on/off pin control or if the regulator
2200 * is already enabled in HPM. Otherwise, set it to LPM.
2201 */
2202 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr,
2203 (vreg->pdata.pin_fn == PM8XXX_VREG_PIN_FN_ENABLE
2204 || (vreg->is_enabled
2205 && vreg->mode == REGULATOR_MODE_NORMAL)
2206 ? SMPS_CLK_CTRL_PWM : SMPS_CLK_CTRL_PFM),
2207 SMPS_CLK_CTRL_MASK, &vreg->clk_ctrl_reg);
2208
2209bail:
2210 if (!rc)
2211 vreg->is_enabled_pc = true;
2212
2213 mutex_unlock(&vreg->pc_lock);
2214
2215 if (rc)
2216 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2217 else
2218 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2219
2220 return rc;
2221}
2222
2223static int pm8xxx_smps_pin_control_disable(struct regulator_dev *rdev)
2224{
2225 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2226 int rc;
2227
2228 mutex_lock(&vreg->pc_lock);
2229
2230 rc = pm8xxx_vreg_masked_write(vreg, vreg->sleep_ctrl_addr, 0,
2231 SMPS_PIN_CTRL_MASK | SMPS_PIN_CTRL_LPM_MASK,
2232 &vreg->sleep_ctrl_reg);
2233 if (rc)
2234 goto bail;
2235
2236 /*
2237 * Physically disable the regulator if it was enabled in HPM/LPM pin
2238 * control mode previously and it logically should not be enabled.
2239 */
2240 if ((vreg->ctrl_reg & SMPS_LEGACY_ENABLE_MASK) == SMPS_LEGACY_ENABLE
2241 && vreg->is_enabled == false) {
2242 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2243 SMPS_LEGACY_DISABLE, SMPS_LEGACY_ENABLE_MASK,
2244 &vreg->ctrl_reg);
2245 if (rc)
2246 goto bail;
2247 }
2248
2249 /* Change to LPM if LPM was enabled. */
2250 if (vreg->is_enabled && vreg->mode == REGULATOR_MODE_IDLE) {
2251 rc = pm8xxx_vreg_masked_write(vreg, vreg->clk_ctrl_addr,
2252 SMPS_CLK_CTRL_PFM, SMPS_CLK_CTRL_MASK,
2253 &vreg->clk_ctrl_reg);
2254 if (rc)
2255 goto bail;
2256 }
2257
2258 rc = pm8xxx_smps_set_voltage_advanced(vreg, vreg->save_uV,
2259 vreg->save_uV, 0);
2260
2261bail:
2262 if (!rc)
2263 vreg->is_enabled_pc = false;
2264
2265 mutex_unlock(&vreg->pc_lock);
2266
2267 if (rc)
2268 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2269 else
2270 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2271
2272 return rc;
2273}
2274
2275static int pm8xxx_vs_pin_control_enable(struct regulator_dev *rdev)
2276{
2277 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2278 int rc;
2279 u8 val = 0;
2280
2281 mutex_lock(&vreg->pc_lock);
2282
2283 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN0)
2284 val |= VS_PIN_CTRL_EN0;
2285 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN1)
2286 val |= VS_PIN_CTRL_EN1;
2287 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN2)
2288 val |= VS_PIN_CTRL_EN2;
2289 if (vreg->pdata.pin_ctrl & PM8XXX_VREG_PIN_CTRL_EN3)
2290 val |= VS_PIN_CTRL_EN3;
2291
2292 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, val,
2293 VS_PIN_CTRL_MASK | VS_ENABLE_MASK, &vreg->ctrl_reg);
2294
2295 if (!rc)
2296 vreg->is_enabled_pc = true;
2297
2298 mutex_unlock(&vreg->pc_lock);
2299
2300 if (rc)
2301 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2302 else
2303 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2304
2305 return rc;
2306}
2307
2308static int pm8xxx_vs_pin_control_disable(struct regulator_dev *rdev)
2309{
2310 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2311 int rc;
2312
2313 mutex_lock(&vreg->pc_lock);
2314
2315 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr, 0,
2316 VS_PIN_CTRL_MASK, &vreg->ctrl_reg);
2317
2318 if (!rc)
2319 vreg->is_enabled_pc = false;
2320
2321 mutex_unlock(&vreg->pc_lock);
2322
2323 if (rc)
2324 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2325 else
2326 pm8xxx_vreg_show_state(rdev, PM8XXX_REGULATOR_ACTION_PIN_CTRL);
2327
2328 return rc;
2329}
2330
2331static int pm8xxx_enable_time(struct regulator_dev *rdev)
2332{
2333 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2334
2335 return vreg->pdata.enable_time;
2336}
2337
2338static const char const *pm8xxx_print_actions[] = {
2339 [PM8XXX_REGULATOR_ACTION_INIT] = "initial ",
2340 [PM8XXX_REGULATOR_ACTION_ENABLE] = "enable ",
2341 [PM8XXX_REGULATOR_ACTION_DISABLE] = "disable ",
2342 [PM8XXX_REGULATOR_ACTION_VOLTAGE] = "set voltage",
2343 [PM8XXX_REGULATOR_ACTION_MODE] = "set mode ",
2344 [PM8XXX_REGULATOR_ACTION_PIN_CTRL] = "pin control",
2345};
2346
2347static void pm8xxx_vreg_show_state(struct regulator_dev *rdev,
2348 enum pm8xxx_regulator_action action)
2349{
2350 struct pm8xxx_vreg *vreg = rdev_get_drvdata(rdev);
2351 int uV, pc;
2352 unsigned int mode;
2353 const char *pc_en0 = "", *pc_en1 = "", *pc_en2 = "", *pc_en3 = "";
2354 const char *pc_total = "";
2355 const char *action_label = pm8xxx_print_actions[action];
2356 const char *enable_label;
2357
2358 mutex_lock(&vreg->pc_lock);
2359
2360 /*
2361 * Do not print unless REQUEST is specified and SSBI writes have taken
2362 * place, or DUPLICATE is specified.
2363 */
2364 if (!((pm8xxx_vreg_debug_mask & PM8XXX_VREG_DEBUG_DUPLICATE)
2365 || ((pm8xxx_vreg_debug_mask & PM8XXX_VREG_DEBUG_REQUEST)
2366 && (vreg->write_count != vreg->prev_write_count)))) {
2367 mutex_unlock(&vreg->pc_lock);
2368 return;
2369 }
2370
2371 vreg->prev_write_count = vreg->write_count;
2372
2373 pc = vreg->pdata.pin_ctrl;
2374 if (vreg->is_enabled_pc) {
2375 if (pc & PM8XXX_VREG_PIN_CTRL_EN0)
2376 pc_en0 = " EN0";
2377 if (pc & PM8XXX_VREG_PIN_CTRL_EN1)
2378 pc_en1 = " EN1";
2379 if (pc & PM8XXX_VREG_PIN_CTRL_EN2)
2380 pc_en2 = " EN2";
2381 if (pc & PM8XXX_VREG_PIN_CTRL_EN3)
2382 pc_en3 = " EN3";
2383 if (pc == PM8XXX_VREG_PIN_CTRL_NONE)
2384 pc_total = " none";
2385 } else {
2386 pc_total = " none";
2387 }
2388
2389 mutex_unlock(&vreg->pc_lock);
2390
2391 enable_label = pm8xxx_vreg_is_enabled(rdev) ? "on " : "off";
2392
2393 switch (vreg->type) {
2394 case PM8XXX_REGULATOR_TYPE_PLDO:
2395 uV = pm8xxx_pldo_get_voltage(rdev);
2396 mode = pm8xxx_ldo_get_mode(rdev);
2397 pr_info("%s %-9s: %s, v=%7d uV, mode=%s, pc=%s%s%s%s%s\n",
2398 action_label, vreg->rdesc.name, enable_label, uV,
2399 (mode == REGULATOR_MODE_NORMAL ? "HPM" : "LPM"),
2400 pc_en0, pc_en1, pc_en2, pc_en3, pc_total);
2401 break;
2402 case PM8XXX_REGULATOR_TYPE_NLDO:
2403 uV = pm8xxx_nldo_get_voltage(rdev);
2404 mode = pm8xxx_ldo_get_mode(rdev);
2405 pr_info("%s %-9s: %s, v=%7d uV, mode=%s, pc=%s%s%s%s%s\n",
2406 action_label, vreg->rdesc.name, enable_label, uV,
2407 (mode == REGULATOR_MODE_NORMAL ? "HPM" : "LPM"),
2408 pc_en0, pc_en1, pc_en2, pc_en3, pc_total);
2409 break;
2410 case PM8XXX_REGULATOR_TYPE_NLDO1200:
2411 uV = pm8xxx_nldo1200_get_voltage(rdev);
2412 mode = pm8xxx_nldo1200_get_mode(rdev);
2413 pr_info("%s %-9s: %s, v=%7d uV, mode=%s\n",
2414 action_label, vreg->rdesc.name, enable_label, uV,
2415 (mode == REGULATOR_MODE_NORMAL ? "HPM" : "LPM"));
2416 break;
2417 case PM8XXX_REGULATOR_TYPE_SMPS:
2418 uV = pm8xxx_smps_get_voltage(rdev);
2419 mode = pm8xxx_smps_get_mode(rdev);
2420 pr_info("%s %-9s: %s, v=%7d uV, mode=%s, pc=%s%s%s%s%s\n",
2421 action_label, vreg->rdesc.name, enable_label, uV,
2422 (mode == REGULATOR_MODE_NORMAL ? "HPM" : "LPM"),
2423 pc_en0, pc_en1, pc_en2, pc_en3, pc_total);
2424 break;
2425 case PM8XXX_REGULATOR_TYPE_FTSMPS:
2426 uV = pm8xxx_ftsmps_get_voltage(rdev);
2427 mode = pm8xxx_ftsmps_get_mode(rdev);
2428 pr_info("%s %-9s: %s, v=%7d uV, mode=%s\n",
2429 action_label, vreg->rdesc.name, enable_label, uV,
2430 (mode == REGULATOR_MODE_NORMAL ? "HPM" : "LPM"));
2431 break;
2432 case PM8XXX_REGULATOR_TYPE_VS:
2433 pr_info("%s %-9s: %s, pc=%s%s%s%s%s\n",
2434 action_label, vreg->rdesc.name, enable_label,
2435 pc_en0, pc_en1, pc_en2, pc_en3, pc_total);
2436 break;
2437 case PM8XXX_REGULATOR_TYPE_VS300:
2438 pr_info("%s %-9s: %s\n",
2439 action_label, vreg->rdesc.name, enable_label);
2440 break;
2441 case PM8XXX_REGULATOR_TYPE_NCP:
2442 uV = pm8xxx_ncp_get_voltage(rdev);
2443 pr_info("%s %-9s: %s, v=%7d uV\n",
2444 action_label, vreg->rdesc.name, enable_label, uV);
2445 break;
2446 default:
2447 break;
2448 }
2449}
2450
2451/* Real regulator operations. */
2452static struct regulator_ops pm8xxx_pldo_ops = {
2453 .enable = pm8xxx_ldo_enable,
2454 .disable = pm8xxx_ldo_disable,
2455 .is_enabled = pm8xxx_vreg_is_enabled,
2456 .set_voltage = pm8xxx_pldo_set_voltage,
2457 .get_voltage = pm8xxx_pldo_get_voltage,
2458 .list_voltage = pm8xxx_pldo_list_voltage,
2459 .set_mode = pm8xxx_ldo_set_mode,
2460 .get_mode = pm8xxx_ldo_get_mode,
2461 .get_optimum_mode = pm8xxx_vreg_get_optimum_mode,
2462 .enable_time = pm8xxx_enable_time,
2463};
2464
2465static struct regulator_ops pm8xxx_nldo_ops = {
2466 .enable = pm8xxx_ldo_enable,
2467 .disable = pm8xxx_ldo_disable,
2468 .is_enabled = pm8xxx_vreg_is_enabled,
2469 .set_voltage = pm8xxx_nldo_set_voltage,
2470 .get_voltage = pm8xxx_nldo_get_voltage,
2471 .list_voltage = pm8xxx_nldo_list_voltage,
2472 .set_mode = pm8xxx_ldo_set_mode,
2473 .get_mode = pm8xxx_ldo_get_mode,
2474 .get_optimum_mode = pm8xxx_vreg_get_optimum_mode,
2475 .enable_time = pm8xxx_enable_time,
2476};
2477
2478static struct regulator_ops pm8xxx_nldo1200_ops = {
2479 .enable = pm8xxx_nldo1200_enable,
2480 .disable = pm8xxx_nldo1200_disable,
2481 .is_enabled = pm8xxx_vreg_is_enabled,
2482 .set_voltage = pm8xxx_nldo1200_set_voltage,
2483 .get_voltage = pm8xxx_nldo1200_get_voltage,
2484 .list_voltage = pm8xxx_nldo1200_list_voltage,
2485 .set_mode = pm8xxx_nldo1200_set_mode,
2486 .get_mode = pm8xxx_nldo1200_get_mode,
2487 .get_optimum_mode = pm8xxx_vreg_get_optimum_mode,
2488 .enable_time = pm8xxx_enable_time,
2489};
2490
2491static struct regulator_ops pm8xxx_smps_ops = {
2492 .enable = pm8xxx_smps_enable,
2493 .disable = pm8xxx_smps_disable,
2494 .is_enabled = pm8xxx_vreg_is_enabled,
2495 .set_voltage = pm8xxx_smps_set_voltage,
2496 .get_voltage = pm8xxx_smps_get_voltage,
2497 .list_voltage = pm8xxx_smps_list_voltage,
2498 .set_mode = pm8xxx_smps_set_mode,
2499 .get_mode = pm8xxx_smps_get_mode,
2500 .get_optimum_mode = pm8xxx_vreg_get_optimum_mode,
2501 .enable_time = pm8xxx_enable_time,
2502};
2503
2504static struct regulator_ops pm8xxx_ftsmps_ops = {
2505 .enable = pm8xxx_ftsmps_enable,
2506 .disable = pm8xxx_ftsmps_disable,
2507 .is_enabled = pm8xxx_vreg_is_enabled,
2508 .set_voltage = pm8xxx_ftsmps_set_voltage,
2509 .get_voltage = pm8xxx_ftsmps_get_voltage,
2510 .list_voltage = pm8xxx_ftsmps_list_voltage,
2511 .set_mode = pm8xxx_ftsmps_set_mode,
2512 .get_mode = pm8xxx_ftsmps_get_mode,
2513 .get_optimum_mode = pm8xxx_vreg_get_optimum_mode,
2514 .enable_time = pm8xxx_enable_time,
2515};
2516
2517static struct regulator_ops pm8xxx_vs_ops = {
2518 .enable = pm8xxx_vs_enable,
2519 .disable = pm8xxx_vs_disable,
2520 .is_enabled = pm8xxx_vreg_is_enabled,
2521 .enable_time = pm8xxx_enable_time,
2522};
2523
2524static struct regulator_ops pm8xxx_vs300_ops = {
2525 .enable = pm8xxx_vs300_enable,
2526 .disable = pm8xxx_vs300_disable,
2527 .is_enabled = pm8xxx_vreg_is_enabled,
2528 .enable_time = pm8xxx_enable_time,
2529};
2530
2531static struct regulator_ops pm8xxx_ncp_ops = {
2532 .enable = pm8xxx_ncp_enable,
2533 .disable = pm8xxx_ncp_disable,
2534 .is_enabled = pm8xxx_vreg_is_enabled,
2535 .set_voltage = pm8xxx_ncp_set_voltage,
2536 .get_voltage = pm8xxx_ncp_get_voltage,
2537 .list_voltage = pm8xxx_ncp_list_voltage,
2538 .enable_time = pm8xxx_enable_time,
2539};
2540
2541/* Pin control regulator operations. */
2542static struct regulator_ops pm8xxx_ldo_pc_ops = {
2543 .enable = pm8xxx_ldo_pin_control_enable,
2544 .disable = pm8xxx_ldo_pin_control_disable,
2545 .is_enabled = pm8xxx_vreg_pin_control_is_enabled,
2546};
2547
2548static struct regulator_ops pm8xxx_smps_pc_ops = {
2549 .enable = pm8xxx_smps_pin_control_enable,
2550 .disable = pm8xxx_smps_pin_control_disable,
2551 .is_enabled = pm8xxx_vreg_pin_control_is_enabled,
2552};
2553
2554static struct regulator_ops pm8xxx_vs_pc_ops = {
2555 .enable = pm8xxx_vs_pin_control_enable,
2556 .disable = pm8xxx_vs_pin_control_disable,
2557 .is_enabled = pm8xxx_vreg_pin_control_is_enabled,
2558};
2559
2560static struct regulator_ops *pm8xxx_reg_ops[PM8XXX_REGULATOR_TYPE_MAX] = {
2561 [PM8XXX_REGULATOR_TYPE_PLDO] = &pm8xxx_pldo_ops,
2562 [PM8XXX_REGULATOR_TYPE_NLDO] = &pm8xxx_nldo_ops,
2563 [PM8XXX_REGULATOR_TYPE_NLDO1200] = &pm8xxx_nldo1200_ops,
2564 [PM8XXX_REGULATOR_TYPE_SMPS] = &pm8xxx_smps_ops,
2565 [PM8XXX_REGULATOR_TYPE_FTSMPS] = &pm8xxx_ftsmps_ops,
2566 [PM8XXX_REGULATOR_TYPE_VS] = &pm8xxx_vs_ops,
2567 [PM8XXX_REGULATOR_TYPE_VS300] = &pm8xxx_vs300_ops,
2568 [PM8XXX_REGULATOR_TYPE_NCP] = &pm8xxx_ncp_ops,
2569};
2570
2571static struct regulator_ops *pm8xxx_reg_pc_ops[PM8XXX_REGULATOR_TYPE_MAX] = {
2572 [PM8XXX_REGULATOR_TYPE_PLDO] = &pm8xxx_ldo_pc_ops,
2573 [PM8XXX_REGULATOR_TYPE_NLDO] = &pm8xxx_ldo_pc_ops,
2574 [PM8XXX_REGULATOR_TYPE_SMPS] = &pm8xxx_smps_pc_ops,
2575 [PM8XXX_REGULATOR_TYPE_VS] = &pm8xxx_vs_pc_ops,
2576};
2577
2578static unsigned pm8xxx_n_voltages[PM8XXX_REGULATOR_TYPE_MAX] = {
2579 [PM8XXX_REGULATOR_TYPE_PLDO] = PLDO_SET_POINTS,
2580 [PM8XXX_REGULATOR_TYPE_NLDO] = NLDO_SET_POINTS,
2581 [PM8XXX_REGULATOR_TYPE_NLDO1200] = NLDO1200_SET_POINTS,
2582 [PM8XXX_REGULATOR_TYPE_SMPS] = SMPS_ADVANCED_SET_POINTS,
2583 [PM8XXX_REGULATOR_TYPE_FTSMPS] = FTSMPS_SET_POINTS,
2584 [PM8XXX_REGULATOR_TYPE_VS] = 0,
2585 [PM8XXX_REGULATOR_TYPE_VS300] = 0,
2586 [PM8XXX_REGULATOR_TYPE_NCP] = NCP_SET_POINTS,
2587};
2588
2589static int pm8xxx_init_ldo(struct pm8xxx_vreg *vreg, bool is_real)
2590{
2591 int rc = 0;
2592 int i;
2593 u8 bank;
2594
2595 /* Save the current control register state. */
2596 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2597 if (rc)
2598 goto bail;
2599
2600 /* Save the current test register state. */
2601 for (i = 0; i < LDO_TEST_BANKS; i++) {
2602 bank = REGULATOR_BANK_SEL(i);
2603 rc = pm8xxx_writeb(vreg->dev->parent, vreg->test_addr, bank);
2604 if (rc)
2605 goto bail;
2606
2607 rc = pm8xxx_readb(vreg->dev->parent, vreg->test_addr,
2608 &vreg->test_reg[i]);
2609 if (rc)
2610 goto bail;
2611 vreg->test_reg[i] |= REGULATOR_BANK_WRITE;
2612 }
2613
2614 if (is_real) {
2615 /* Set pull down enable based on platform data. */
2616 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2617 (vreg->pdata.pull_down_enable ? LDO_PULL_DOWN_ENABLE : 0),
2618 LDO_PULL_DOWN_ENABLE_MASK, &vreg->ctrl_reg);
2619
2620 vreg->is_enabled = !!_pm8xxx_vreg_is_enabled(vreg);
2621
2622 vreg->mode = ((vreg->ctrl_reg & LDO_CTRL_PM_MASK)
2623 == LDO_CTRL_PM_LPM ?
2624 REGULATOR_MODE_IDLE : REGULATOR_MODE_NORMAL);
2625 }
2626bail:
2627 if (rc)
2628 vreg_err(vreg, "pm8xxx_readb/writeb failed, rc=%d\n", rc);
2629
2630 return rc;
2631}
2632
2633static int pm8xxx_init_nldo1200(struct pm8xxx_vreg *vreg)
2634{
2635 int rc = 0;
2636 int i;
2637 u8 bank;
2638
2639 /* Save the current control register state. */
2640 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2641 if (rc)
2642 goto bail;
2643
2644 /* Save the current test register state. */
2645 for (i = 0; i < LDO_TEST_BANKS; i++) {
2646 bank = REGULATOR_BANK_SEL(i);
2647 rc = pm8xxx_writeb(vreg->dev->parent, vreg->test_addr, bank);
2648 if (rc)
2649 goto bail;
2650
2651 rc = pm8xxx_readb(vreg->dev->parent, vreg->test_addr,
2652 &vreg->test_reg[i]);
2653 if (rc)
2654 goto bail;
2655 vreg->test_reg[i] |= REGULATOR_BANK_WRITE;
2656 }
2657
2658 vreg->save_uV = _pm8xxx_nldo1200_get_voltage(vreg);
2659
2660 /* Set pull down enable based on platform data. */
2661 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2662 (vreg->pdata.pull_down_enable ? NLDO1200_PULL_DOWN_ENABLE : 0)
2663 | REGULATOR_BANK_SEL(1) | REGULATOR_BANK_WRITE,
2664 NLDO1200_PULL_DOWN_ENABLE_MASK | REGULATOR_BANK_MASK,
2665 &vreg->test_reg[1]);
2666
2667bail:
2668 if (rc)
2669 vreg_err(vreg, "pm8xxx_readb/writeb failed, rc=%d\n", rc);
2670
2671 return rc;
2672}
2673
2674static int pm8xxx_init_smps(struct pm8xxx_vreg *vreg, bool is_real)
2675{
2676 int rc = 0;
2677 int i;
2678 u8 bank;
2679
2680 /* Save the current control register state. */
2681 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2682 if (rc)
2683 goto bail;
2684
2685 /* Save the current test2 register state. */
2686 for (i = 0; i < SMPS_TEST_BANKS; i++) {
2687 bank = REGULATOR_BANK_SEL(i);
2688 rc = pm8xxx_writeb(vreg->dev->parent, vreg->test_addr, bank);
2689 if (rc)
2690 goto bail;
2691
2692 rc = pm8xxx_readb(vreg->dev->parent, vreg->test_addr,
2693 &vreg->test_reg[i]);
2694 if (rc)
2695 goto bail;
2696 vreg->test_reg[i] |= REGULATOR_BANK_WRITE;
2697 }
2698
2699 /* Save the current clock control register state. */
2700 rc = pm8xxx_readb(vreg->dev->parent, vreg->clk_ctrl_addr,
2701 &vreg->clk_ctrl_reg);
2702 if (rc)
2703 goto bail;
2704
2705 /* Save the current sleep control register state. */
2706 rc = pm8xxx_readb(vreg->dev->parent, vreg->sleep_ctrl_addr,
2707 &vreg->sleep_ctrl_reg);
2708 if (rc)
2709 goto bail;
2710
2711 vreg->save_uV = _pm8xxx_smps_get_voltage(vreg);
2712
2713 if (is_real) {
2714 /* Set advanced mode pull down enable based on platform data. */
2715 rc = pm8xxx_vreg_masked_write(vreg, vreg->test_addr,
2716 (vreg->pdata.pull_down_enable
2717 ? SMPS_ADVANCED_PULL_DOWN_ENABLE : 0)
2718 | REGULATOR_BANK_SEL(6) | REGULATOR_BANK_WRITE,
2719 REGULATOR_BANK_MASK | SMPS_ADVANCED_PULL_DOWN_ENABLE,
2720 &vreg->test_reg[6]);
2721 if (rc)
2722 goto bail;
2723
2724 vreg->is_enabled = !!_pm8xxx_vreg_is_enabled(vreg);
2725
2726 vreg->mode = ((vreg->clk_ctrl_reg & SMPS_CLK_CTRL_MASK)
2727 == SMPS_CLK_CTRL_PFM ?
2728 REGULATOR_MODE_IDLE : REGULATOR_MODE_NORMAL);
2729 }
2730
2731 if (!SMPS_IN_ADVANCED_MODE(vreg) && is_real) {
2732 /* Set legacy mode pull down enable based on platform data. */
2733 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2734 (vreg->pdata.pull_down_enable
2735 ? SMPS_LEGACY_PULL_DOWN_ENABLE : 0),
2736 SMPS_LEGACY_PULL_DOWN_ENABLE, &vreg->ctrl_reg);
2737 if (rc)
2738 goto bail;
2739 }
2740
2741bail:
2742 if (rc)
2743 vreg_err(vreg, "pm8xxx_readb/writeb failed, rc=%d\n", rc);
2744
2745 return rc;
2746}
2747
2748static int pm8xxx_init_ftsmps(struct pm8xxx_vreg *vreg)
2749{
2750 int rc, i;
2751 u8 bank;
2752
2753 /* Save the current control register state. */
2754 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2755 if (rc)
2756 goto bail;
2757
2758 /* Store current regulator register values. */
2759 rc = pm8xxx_readb(vreg->dev->parent, vreg->pfm_ctrl_addr,
2760 &vreg->pfm_ctrl_reg);
2761 if (rc)
2762 goto bail;
2763
2764 rc = pm8xxx_readb(vreg->dev->parent, vreg->pwr_cnfg_addr,
2765 &vreg->pwr_cnfg_reg);
2766 if (rc)
2767 goto bail;
2768
2769 /* Save the current fts_cnfg1 register state (uses 'test' member). */
2770 for (i = 0; i < SMPS_TEST_BANKS; i++) {
2771 bank = REGULATOR_BANK_SEL(i);
2772 rc = pm8xxx_writeb(vreg->dev->parent, vreg->test_addr, bank);
2773 if (rc)
2774 goto bail;
2775
2776 rc = pm8xxx_readb(vreg->dev->parent, vreg->test_addr,
2777 &vreg->test_reg[i]);
2778 if (rc)
2779 goto bail;
2780 vreg->test_reg[i] |= REGULATOR_BANK_WRITE;
2781 }
2782
2783 vreg->save_uV = _pm8xxx_ftsmps_get_voltage(vreg);
2784
2785 /* Set pull down enable based on platform data. */
2786 rc = pm8xxx_vreg_masked_write(vreg, vreg->pwr_cnfg_addr,
2787 (vreg->pdata.pull_down_enable ? FTSMPS_PULL_DOWN_ENABLE : 0),
2788 FTSMPS_PULL_DOWN_ENABLE_MASK, &vreg->pwr_cnfg_reg);
2789
2790bail:
2791 if (rc)
2792 vreg_err(vreg, "pm8xxx_readb/writeb failed, rc=%d\n", rc);
2793
2794 return rc;
2795}
2796
2797static int pm8xxx_init_vs(struct pm8xxx_vreg *vreg, bool is_real)
2798{
2799 int rc = 0;
2800
2801 /* Save the current control register state. */
2802 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2803 if (rc) {
2804 vreg_err(vreg, "pm8xxx_readb failed, rc=%d\n", rc);
2805 return rc;
2806 }
2807
2808 if (is_real) {
2809 /* Set pull down enable based on platform data. */
2810 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2811 (vreg->pdata.pull_down_enable ? VS_PULL_DOWN_ENABLE
2812 : VS_PULL_DOWN_DISABLE),
2813 VS_PULL_DOWN_ENABLE_MASK, &vreg->ctrl_reg);
2814
2815 if (rc)
2816 vreg_err(vreg,
2817 "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2818
2819 vreg->is_enabled = !!_pm8xxx_vreg_is_enabled(vreg);
2820 }
2821
2822 return rc;
2823}
2824
2825static int pm8xxx_init_vs300(struct pm8xxx_vreg *vreg)
2826{
2827 int rc;
2828
2829 /* Save the current control register state. */
2830 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2831 if (rc) {
2832 vreg_err(vreg, "pm8xxx_readb failed, rc=%d\n", rc);
2833 return rc;
2834 }
2835
2836 /* Set pull down enable based on platform data. */
2837 rc = pm8xxx_vreg_masked_write(vreg, vreg->ctrl_addr,
2838 (vreg->pdata.pull_down_enable ? VS300_PULL_DOWN_ENABLE : 0),
2839 VS300_PULL_DOWN_ENABLE_MASK, &vreg->ctrl_reg);
2840
2841 if (rc)
2842 vreg_err(vreg, "pm8xxx_vreg_masked_write failed, rc=%d\n", rc);
2843
2844 return rc;
2845}
2846
2847static int pm8xxx_init_ncp(struct pm8xxx_vreg *vreg)
2848{
2849 int rc;
2850
2851 /* Save the current control register state. */
2852 rc = pm8xxx_readb(vreg->dev->parent, vreg->ctrl_addr, &vreg->ctrl_reg);
2853 if (rc) {
2854 vreg_err(vreg, "pm8xxx_readb failed, rc=%d\n", rc);
2855 return rc;
2856 }
2857
2858 return rc;
2859}
2860
2861static int __devinit pm8xxx_vreg_probe(struct platform_device *pdev)
2862{
2863 struct pm8xxx_regulator_core_platform_data *core_data;
2864 const struct pm8xxx_regulator_platform_data *pdata;
2865 enum pm8xxx_vreg_pin_function pin_fn;
2866 struct regulator_desc *rdesc;
2867 struct pm8xxx_vreg *vreg;
2868 unsigned pin_ctrl;
2869 int rc = 0;
2870
2871 if (pdev == NULL) {
2872 pr_err("no platform device specified\n");
2873 return -EINVAL;
2874 }
2875
2876 core_data = pdev->dev.platform_data;
2877 if (core_data == NULL) {
2878 pr_err("no core data specified\n");
2879 return -EINVAL;
2880 }
2881
2882 pdata = core_data->pdata;
2883 vreg = core_data->vreg;
2884 if (pdata == NULL) {
2885 pr_err("no pdata specified\n");
2886 return -EINVAL;
2887 } else if (vreg == NULL) {
2888 pr_err("no vreg specified\n");
2889 return -EINVAL;
2890 }
2891
2892 if (vreg->rdesc.name == NULL) {
2893 pr_err("regulator name missing\n");
2894 return -EINVAL;
2895 } else if (vreg->type < 0 || vreg->type > PM8XXX_REGULATOR_TYPE_MAX) {
2896 pr_err("%s: regulator type=%d is invalid\n", vreg->rdesc.name,
2897 vreg->type);
2898 return -EINVAL;
2899 } else if (core_data->is_pin_controlled
2900 && pm8xxx_reg_pc_ops[vreg->type] == NULL) {
2901 pr_err("%s: regulator type=%d does not support pin control\n",
2902 vreg->rdesc.name, vreg->type);
2903 return -EINVAL;
2904 } else if (core_data->is_pin_controlled
2905 && vreg->rdesc_pc.name == NULL) {
2906 pr_err("%s: regulator pin control name missing\n",
2907 vreg->rdesc.name);
2908 return -EINVAL;
2909 }
2910
2911 if (core_data->is_pin_controlled)
2912 rdesc = &vreg->rdesc_pc;
2913 else
2914 rdesc = &vreg->rdesc;
2915 if (!pdata) {
2916 pr_err("%s requires platform data\n", vreg->rdesc.name);
2917 return -EINVAL;
2918 }
2919
2920 rdesc->id = pdev->id;
2921 rdesc->owner = THIS_MODULE;
2922 rdesc->type = REGULATOR_VOLTAGE;
2923 if (core_data->is_pin_controlled) {
2924 rdesc->ops = pm8xxx_reg_pc_ops[vreg->type];
2925 rdesc->n_voltages = 0;
2926 } else {
2927 rdesc->ops = pm8xxx_reg_ops[vreg->type];
2928 rdesc->n_voltages = pm8xxx_n_voltages[vreg->type];
2929 }
2930
2931 mutex_lock(&vreg->pc_lock);
2932
2933 if (!core_data->is_pin_controlled) {
2934 /* Do not modify pin control and pin function values. */
2935 pin_ctrl = vreg->pdata.pin_ctrl;
2936 pin_fn = vreg->pdata.pin_fn;
2937 memcpy(&(vreg->pdata), pdata,
2938 sizeof(struct pm8xxx_regulator_platform_data));
2939 vreg->pdata.pin_ctrl = pin_ctrl;
2940 vreg->pdata.pin_fn = pin_fn;
2941 vreg->dev = &pdev->dev;
2942 } else {
2943 /* Pin control regulator */
2944 if ((pdata->pin_ctrl & PM8XXX_VREG_PIN_CTRL_ALL)
2945 == PM8XXX_VREG_PIN_CTRL_NONE) {
2946 pr_err("%s: no pin control input specified\n",
2947 vreg->rdesc.name);
2948 mutex_unlock(&vreg->pc_lock);
2949 return -EINVAL;
2950 }
2951 vreg->pdata.pin_ctrl = pdata->pin_ctrl;
2952 vreg->pdata.pin_fn = pdata->pin_fn;
2953 vreg->dev_pc = &pdev->dev;
2954 if (!vreg->dev)
2955 vreg->dev = &pdev->dev;
2956 }
2957
2958 /* Initialize register values. */
2959 switch (vreg->type) {
2960 case PM8XXX_REGULATOR_TYPE_PLDO:
2961 case PM8XXX_REGULATOR_TYPE_NLDO:
2962 rc = pm8xxx_init_ldo(vreg, !core_data->is_pin_controlled);
2963 break;
2964 case PM8XXX_REGULATOR_TYPE_NLDO1200:
2965 rc = pm8xxx_init_nldo1200(vreg);
2966 break;
2967 case PM8XXX_REGULATOR_TYPE_SMPS:
2968 rc = pm8xxx_init_smps(vreg, !core_data->is_pin_controlled);
2969 break;
2970 case PM8XXX_REGULATOR_TYPE_FTSMPS:
2971 rc = pm8xxx_init_ftsmps(vreg);
2972 break;
2973 case PM8XXX_REGULATOR_TYPE_VS:
2974 rc = pm8xxx_init_vs(vreg, !core_data->is_pin_controlled);
2975 break;
2976 case PM8XXX_REGULATOR_TYPE_VS300:
2977 rc = pm8xxx_init_vs300(vreg);
2978 break;
2979 case PM8XXX_REGULATOR_TYPE_NCP:
2980 rc = pm8xxx_init_ncp(vreg);
2981 break;
2982 default:
2983 break;
2984 }
2985
2986 mutex_unlock(&vreg->pc_lock);
2987
2988 if (rc)
2989 goto bail;
2990
2991 if (!core_data->is_pin_controlled) {
2992 vreg->rdev = regulator_register(rdesc, &pdev->dev,
2993 &(pdata->init_data), vreg);
2994 if (IS_ERR(vreg->rdev)) {
2995 rc = PTR_ERR(vreg->rdev);
2996 vreg->rdev = NULL;
2997 pr_err("regulator_register failed: %s, rc=%d\n",
2998 vreg->rdesc.name, rc);
2999 }
3000 } else {
3001 vreg->rdev_pc = regulator_register(rdesc, &pdev->dev,
3002 &(pdata->init_data), vreg);
3003 if (IS_ERR(vreg->rdev_pc)) {
3004 rc = PTR_ERR(vreg->rdev_pc);
3005 vreg->rdev_pc = NULL;
3006 pr_err("regulator_register failed: %s, rc=%d\n",
3007 vreg->rdesc.name, rc);
3008 }
3009 }
3010 if ((pm8xxx_vreg_debug_mask & PM8XXX_VREG_DEBUG_INIT) && !rc
3011 && vreg->rdev)
3012 pm8xxx_vreg_show_state(vreg->rdev,
3013 PM8XXX_REGULATOR_ACTION_INIT);
3014
3015 platform_set_drvdata(pdev, core_data);
3016
3017bail:
3018 if (rc)
3019 pr_err("error for %s, rc=%d\n", vreg->rdesc.name, rc);
3020
3021 return rc;
3022}
3023
3024static int __devexit pm8xxx_vreg_remove(struct platform_device *pdev)
3025{
3026 struct pm8xxx_regulator_core_platform_data *core_data;
3027
3028 core_data = platform_get_drvdata(pdev);
3029 platform_set_drvdata(pdev, NULL);
3030
3031 if (core_data) {
3032 if (core_data->is_pin_controlled)
3033 regulator_unregister(core_data->vreg->rdev_pc);
3034 else
3035 regulator_unregister(core_data->vreg->rdev);
3036 }
3037
3038 return 0;
3039}
3040
3041static struct platform_driver pm8xxx_vreg_driver = {
3042 .probe = pm8xxx_vreg_probe,
3043 .remove = __devexit_p(pm8xxx_vreg_remove),
3044 .driver = {
3045 .name = PM8XXX_REGULATOR_DEV_NAME,
3046 .owner = THIS_MODULE,
3047 },
3048};
3049
3050static int __init pm8xxx_vreg_init(void)
3051{
3052 return platform_driver_register(&pm8xxx_vreg_driver);
3053}
3054postcore_initcall(pm8xxx_vreg_init);
3055
3056static void __exit pm8xxx_vreg_exit(void)
3057{
3058 platform_driver_unregister(&pm8xxx_vreg_driver);
3059}
3060module_exit(pm8xxx_vreg_exit);
3061
3062MODULE_LICENSE("GPL v2");
3063MODULE_DESCRIPTION("PMIC PM8XXX regulator driver");
3064MODULE_VERSION("1.0");
3065MODULE_ALIAS("platform:" PM8XXX_REGULATOR_DEV_NAME);