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