blob: 9ebd131b2ec68ddaddf67b555b3095a16dd96a85 [file] [log] [blame]
Sundar R IYERc789ca22010-07-13 21:48:56 +05301/*
2 * Copyright (C) ST-Ericsson SA 2010
3 *
4 * License Terms: GNU General Public License v2
5 *
Bengt Jonssone1159e62010-12-10 11:08:44 +01006 * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
7 * Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
Lee Jones547f3842013-03-28 16:11:14 +00008 * Daniel Willerud <daniel.willerud@stericsson.com> for ST-Ericsson
Sundar R IYERc789ca22010-07-13 21:48:56 +05309 *
10 * AB8500 peripheral regulators
11 *
Bengt Jonssone1159e62010-12-10 11:08:44 +010012 * AB8500 supports the following regulators:
Bengt Jonssonea05ef32011-03-10 14:43:31 +010013 * VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
Lee Jones547f3842013-03-28 16:11:14 +000014 *
15 * AB8505 supports the following regulators:
16 * VAUX1/2/3/4/5/6, VINTCORE, VADC, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
Sundar R IYERc789ca22010-07-13 21:48:56 +053017 */
18#include <linux/init.h>
19#include <linux/kernel.h>
Paul Gortmaker65602c32011-07-17 16:28:23 -040020#include <linux/module.h>
Sundar R IYERc789ca22010-07-13 21:48:56 +053021#include <linux/err.h>
22#include <linux/platform_device.h>
Mattias Wallin47c16972010-09-10 17:47:56 +020023#include <linux/mfd/abx500.h>
Linus Walleijee66e652011-12-02 14:16:33 +010024#include <linux/mfd/abx500/ab8500.h>
Lee Jones3a8334b2012-05-17 14:45:16 +010025#include <linux/of.h>
26#include <linux/regulator/of_regulator.h>
Sundar R IYERc789ca22010-07-13 21:48:56 +053027#include <linux/regulator/driver.h>
28#include <linux/regulator/machine.h>
29#include <linux/regulator/ab8500.h>
Lee Jones3a8334b2012-05-17 14:45:16 +010030#include <linux/slab.h>
Sundar R IYERc789ca22010-07-13 21:48:56 +053031
32/**
Lee Jones3fe52282013-04-02 13:24:12 +010033 * struct ab8500_shared_mode - is used when mode is shared between
34 * two regulators.
35 * @shared_regulator: pointer to the other sharing regulator
36 * @lp_mode_req: low power mode requested by this regulator
37 */
38struct ab8500_shared_mode {
39 struct ab8500_regulator_info *shared_regulator;
40 bool lp_mode_req;
41};
42
43/**
Sundar R IYERc789ca22010-07-13 21:48:56 +053044 * struct ab8500_regulator_info - ab8500 regulator information
Bengt Jonssone1159e62010-12-10 11:08:44 +010045 * @dev: device pointer
Sundar R IYERc789ca22010-07-13 21:48:56 +053046 * @desc: regulator description
Sundar R IYERc789ca22010-07-13 21:48:56 +053047 * @regulator_dev: regulator device
Lee Jones3fe52282013-04-02 13:24:12 +010048 * @shared_mode: used when mode is shared between two regulators
Bengt Jonsson7ce46692013-03-21 15:59:00 +000049 * @load_lp_uA: maximum load in idle (low power) mode
Mattias Wallin47c16972010-09-10 17:47:56 +020050 * @update_bank: bank to control on/off
Sundar R IYERc789ca22010-07-13 21:48:56 +053051 * @update_reg: register to control on/off
Emeric Vigierbd28a152013-03-21 15:58:59 +000052 * @update_mask: mask to enable/disable and set mode of regulator
53 * @update_val: bits holding the regulator current mode
54 * @update_val_idle: bits to enable the regulator in idle (low power) mode
55 * @update_val_normal: bits to enable the regulator in normal (high power) mode
Lee Jones3fe52282013-04-02 13:24:12 +010056 * @mode_bank: bank with location of mode register
57 * @mode_reg: mode register
58 * @mode_mask: mask for setting mode
59 * @mode_val_idle: mode setting for low power
60 * @mode_val_normal: mode setting for normal power
Mattias Wallin47c16972010-09-10 17:47:56 +020061 * @voltage_bank: bank to control regulator voltage
Sundar R IYERc789ca22010-07-13 21:48:56 +053062 * @voltage_reg: register to control regulator voltage
63 * @voltage_mask: mask to control regulator voltage
Linus Walleija0a70142012-08-20 18:41:35 +020064 * @voltage_shift: shift to control regulator voltage
Sundar R IYERc789ca22010-07-13 21:48:56 +053065 */
66struct ab8500_regulator_info {
67 struct device *dev;
68 struct regulator_desc desc;
Sundar R IYERc789ca22010-07-13 21:48:56 +053069 struct regulator_dev *regulator;
Lee Jones3fe52282013-04-02 13:24:12 +010070 struct ab8500_shared_mode *shared_mode;
Bengt Jonsson7ce46692013-03-21 15:59:00 +000071 int load_lp_uA;
Mattias Wallin47c16972010-09-10 17:47:56 +020072 u8 update_bank;
73 u8 update_reg;
Bengt Jonssone1159e62010-12-10 11:08:44 +010074 u8 update_mask;
Emeric Vigierbd28a152013-03-21 15:58:59 +000075 u8 update_val;
76 u8 update_val_idle;
77 u8 update_val_normal;
Lee Jones3fe52282013-04-02 13:24:12 +010078 u8 mode_bank;
79 u8 mode_reg;
80 u8 mode_mask;
81 u8 mode_val_idle;
82 u8 mode_val_normal;
Mattias Wallin47c16972010-09-10 17:47:56 +020083 u8 voltage_bank;
84 u8 voltage_reg;
85 u8 voltage_mask;
Linus Walleija0a70142012-08-20 18:41:35 +020086 u8 voltage_shift;
Lee Jonesd7607ba2013-04-02 13:24:11 +010087 struct {
88 u8 voltage_limit;
89 u8 voltage_bank;
90 u8 voltage_reg;
91 u8 voltage_mask;
92 u8 voltage_shift;
93 } expand_register;
Sundar R IYERc789ca22010-07-13 21:48:56 +053094};
95
96/* voltage tables for the vauxn/vintcore supplies */
Axel Linec1cc4d2012-05-20 10:33:35 +080097static const unsigned int ldo_vauxn_voltages[] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +053098 1100000,
99 1200000,
100 1300000,
101 1400000,
102 1500000,
103 1800000,
104 1850000,
105 1900000,
106 2500000,
107 2650000,
108 2700000,
109 2750000,
110 2800000,
111 2900000,
112 3000000,
113 3300000,
114};
115
Axel Linec1cc4d2012-05-20 10:33:35 +0800116static const unsigned int ldo_vaux3_voltages[] = {
Bengt Jonsson2b751512010-12-10 11:08:43 +0100117 1200000,
118 1500000,
119 1800000,
120 2100000,
121 2500000,
122 2750000,
123 2790000,
124 2910000,
125};
126
Lee Jones62ab4112013-03-28 16:11:18 +0000127static const unsigned int ldo_vaux56_voltages[] = {
Lee Jones547f3842013-03-28 16:11:14 +0000128 1800000,
129 1050000,
130 1100000,
131 1200000,
132 1500000,
133 2200000,
134 2500000,
135 2790000,
136};
137
Lee Jones62ab4112013-03-28 16:11:18 +0000138static const unsigned int ldo_vaux3_ab8540_voltages[] = {
Lee Jonesae0a9a32013-03-28 16:11:16 +0000139 1200000,
140 1500000,
141 1800000,
142 2100000,
143 2500000,
144 2750000,
145 2790000,
146 2910000,
147 3050000,
148};
149
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +0100150static const unsigned int ldo_vaux56_ab8540_voltages[] = {
151 750000, 760000, 770000, 780000, 790000, 800000,
152 810000, 820000, 830000, 840000, 850000, 860000,
153 870000, 880000, 890000, 900000, 910000, 920000,
154 930000, 940000, 950000, 960000, 970000, 980000,
155 990000, 1000000, 1010000, 1020000, 1030000,
156 1040000, 1050000, 1060000, 1070000, 1080000,
157 1090000, 1100000, 1110000, 1120000, 1130000,
158 1140000, 1150000, 1160000, 1170000, 1180000,
159 1190000, 1200000, 1210000, 1220000, 1230000,
160 1240000, 1250000, 1260000, 1270000, 1280000,
161 1290000, 1300000, 1310000, 1320000, 1330000,
162 1340000, 1350000, 1360000, 1800000, 2790000,
163};
164
Axel Linec1cc4d2012-05-20 10:33:35 +0800165static const unsigned int ldo_vintcore_voltages[] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530166 1200000,
167 1225000,
168 1250000,
169 1275000,
170 1300000,
171 1325000,
172 1350000,
173};
174
Lee Jones62ab4112013-03-28 16:11:18 +0000175static const unsigned int ldo_sdio_voltages[] = {
Lee Jonesae0a9a32013-03-28 16:11:16 +0000176 1160000,
177 1050000,
178 1100000,
179 1500000,
180 1800000,
181 2200000,
182 2910000,
183 3050000,
184};
185
Lee Jonesb080c782013-03-28 16:11:17 +0000186static const unsigned int fixed_1200000_voltage[] = {
187 1200000,
188};
189
190static const unsigned int fixed_1800000_voltage[] = {
191 1800000,
192};
193
194static const unsigned int fixed_2000000_voltage[] = {
195 2000000,
196};
197
198static const unsigned int fixed_2050000_voltage[] = {
199 2050000,
200};
201
202static const unsigned int fixed_3300000_voltage[] = {
203 3300000,
204};
205
Lee Jones8a3b1b82013-04-02 13:24:09 +0100206static const unsigned int ldo_vana_voltages[] = {
207 1050000,
208 1075000,
209 1100000,
210 1125000,
211 1150000,
212 1175000,
213 1200000,
214 1225000,
215};
216
217static const unsigned int ldo_vaudio_voltages[] = {
218 2000000,
219 2100000,
220 2200000,
221 2300000,
222 2400000,
223 2500000,
224 2600000,
225 2600000, /* Duplicated in Vaudio and IsoUicc Control register. */
226};
227
Lee Jones4c84b4d2013-04-02 13:24:13 +0100228static const unsigned int ldo_vdmic_voltages[] = {
229 1800000,
230 1900000,
231 2000000,
232 2850000,
233};
234
Lee Jones3fe52282013-04-02 13:24:12 +0100235static DEFINE_MUTEX(shared_mode_mutex);
236static struct ab8500_shared_mode ldo_anamic1_shared;
237static struct ab8500_shared_mode ldo_anamic2_shared;
Lee Jones4c84b4d2013-04-02 13:24:13 +0100238static struct ab8500_shared_mode ab8540_ldo_anamic1_shared;
239static struct ab8500_shared_mode ab8540_ldo_anamic2_shared;
Lee Jones3fe52282013-04-02 13:24:12 +0100240
Sundar R IYERc789ca22010-07-13 21:48:56 +0530241static int ab8500_regulator_enable(struct regulator_dev *rdev)
242{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100243 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530244 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
245
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100246 if (info == NULL) {
247 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530248 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100249 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530250
Mattias Wallin47c16972010-09-10 17:47:56 +0200251 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonssone1159e62010-12-10 11:08:44 +0100252 info->update_bank, info->update_reg,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000253 info->update_mask, info->update_val);
Axel Linf71bf522013-03-26 16:13:14 +0800254 if (ret < 0) {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530255 dev_err(rdev_get_dev(rdev),
256 "couldn't set enable bits for regulator\n");
Axel Linf71bf522013-03-26 16:13:14 +0800257 return ret;
258 }
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100259
260 dev_vdbg(rdev_get_dev(rdev),
261 "%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
262 info->desc.name, info->update_bank, info->update_reg,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000263 info->update_mask, info->update_val);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100264
Sundar R IYERc789ca22010-07-13 21:48:56 +0530265 return ret;
266}
267
268static int ab8500_regulator_disable(struct regulator_dev *rdev)
269{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100270 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530271 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
272
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100273 if (info == NULL) {
274 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530275 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100276 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530277
Mattias Wallin47c16972010-09-10 17:47:56 +0200278 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonssone1159e62010-12-10 11:08:44 +0100279 info->update_bank, info->update_reg,
280 info->update_mask, 0x0);
Axel Linf71bf522013-03-26 16:13:14 +0800281 if (ret < 0) {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530282 dev_err(rdev_get_dev(rdev),
283 "couldn't set disable bits for regulator\n");
Axel Linf71bf522013-03-26 16:13:14 +0800284 return ret;
285 }
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100286
287 dev_vdbg(rdev_get_dev(rdev),
288 "%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
289 info->desc.name, info->update_bank, info->update_reg,
290 info->update_mask, 0x0);
291
Sundar R IYERc789ca22010-07-13 21:48:56 +0530292 return ret;
293}
294
Axel Lin438e6952013-04-07 23:12:28 +0800295static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
296{
297 int ret;
298 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
299 u8 regval;
300
301 if (info == NULL) {
302 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
303 return -EINVAL;
304 }
305
306 ret = abx500_get_register_interruptible(info->dev,
307 info->update_bank, info->update_reg, &regval);
308 if (ret < 0) {
309 dev_err(rdev_get_dev(rdev),
310 "couldn't read 0x%x register\n", info->update_reg);
311 return ret;
312 }
313
314 dev_vdbg(rdev_get_dev(rdev),
315 "%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
316 " 0x%x\n",
317 info->desc.name, info->update_bank, info->update_reg,
318 info->update_mask, regval);
319
320 if (regval & info->update_mask)
321 return 1;
322 else
323 return 0;
324}
325
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000326static unsigned int ab8500_regulator_get_optimum_mode(
327 struct regulator_dev *rdev, int input_uV,
328 int output_uV, int load_uA)
329{
330 unsigned int mode;
331
332 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
333
334 if (info == NULL) {
335 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
336 return -EINVAL;
337 }
338
339 if (load_uA <= info->load_lp_uA)
340 mode = REGULATOR_MODE_IDLE;
341 else
342 mode = REGULATOR_MODE_NORMAL;
343
344 return mode;
345}
346
Emeric Vigierbd28a152013-03-21 15:58:59 +0000347static int ab8500_regulator_set_mode(struct regulator_dev *rdev,
348 unsigned int mode)
349{
Lee Jones3fe52282013-04-02 13:24:12 +0100350 int ret = 0;
351 u8 bank;
352 u8 reg;
353 u8 mask;
354 u8 val;
355 bool dmr = false; /* Dedicated mode register */
Emeric Vigierbd28a152013-03-21 15:58:59 +0000356 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
357
358 if (info == NULL) {
359 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
360 return -EINVAL;
361 }
362
Lee Jones3fe52282013-04-02 13:24:12 +0100363 if (info->shared_mode) {
364 /*
365 * Special case where mode is shared between two regulators.
366 */
367 struct ab8500_shared_mode *sm = info->shared_mode;
368 mutex_lock(&shared_mode_mutex);
369
370 if (mode == REGULATOR_MODE_IDLE) {
371 sm->lp_mode_req = true; /* Low power mode requested */
372 if (!((sm->shared_regulator)->
373 shared_mode->lp_mode_req)) {
374 mutex_unlock(&shared_mode_mutex);
375 return 0; /* Other regulator prevent LP mode */
376 }
377 } else {
378 sm->lp_mode_req = false;
379 }
Emeric Vigierbd28a152013-03-21 15:58:59 +0000380 }
381
Lee Jones3fe52282013-04-02 13:24:12 +0100382 if (info->mode_mask) {
383 /* Dedicated register for handling mode */
384
385 dmr = true;
386
387 switch (mode) {
388 case REGULATOR_MODE_NORMAL:
389 val = info->mode_val_normal;
390 break;
391 case REGULATOR_MODE_IDLE:
392 val = info->mode_val_idle;
393 break;
394 default:
395 if (info->shared_mode)
396 mutex_unlock(&shared_mode_mutex);
397 return -EINVAL;
398 }
399
400 bank = info->mode_bank;
401 reg = info->mode_reg;
402 mask = info->mode_mask;
403 } else {
404 /* Mode register same as enable register */
405
406 switch (mode) {
407 case REGULATOR_MODE_NORMAL:
408 info->update_val = info->update_val_normal;
409 val = info->update_val_normal;
410 break;
411 case REGULATOR_MODE_IDLE:
412 info->update_val = info->update_val_idle;
413 val = info->update_val_idle;
414 break;
415 default:
416 if (info->shared_mode)
417 mutex_unlock(&shared_mode_mutex);
418 return -EINVAL;
419 }
420
421 bank = info->update_bank;
422 reg = info->update_reg;
423 mask = info->update_mask;
424 }
425
Axel Lin438e6952013-04-07 23:12:28 +0800426 if (dmr || ab8500_regulator_is_enabled(rdev)) {
Emeric Vigierbd28a152013-03-21 15:58:59 +0000427 ret = abx500_mask_and_set_register_interruptible(info->dev,
Lee Jones3fe52282013-04-02 13:24:12 +0100428 bank, reg, mask, val);
429 if (ret < 0)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000430 dev_err(rdev_get_dev(rdev),
431 "couldn't set regulator mode\n");
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000432
433 dev_vdbg(rdev_get_dev(rdev),
434 "%s-set_mode (bank, reg, mask, value): "
435 "0x%x, 0x%x, 0x%x, 0x%x\n",
Lee Jones3fe52282013-04-02 13:24:12 +0100436 info->desc.name, bank, reg,
437 mask, val);
Emeric Vigierbd28a152013-03-21 15:58:59 +0000438 }
439
Lee Jones3fe52282013-04-02 13:24:12 +0100440 if (info->shared_mode)
441 mutex_unlock(&shared_mode_mutex);
Axel Lin742a7322013-03-28 17:23:00 +0800442
Lee Jones3fe52282013-04-02 13:24:12 +0100443 return ret;
Emeric Vigierbd28a152013-03-21 15:58:59 +0000444}
445
446static unsigned int ab8500_regulator_get_mode(struct regulator_dev *rdev)
447{
448 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
449 int ret;
Lee Jones3fe52282013-04-02 13:24:12 +0100450 u8 val;
451 u8 val_normal;
452 u8 val_idle;
Emeric Vigierbd28a152013-03-21 15:58:59 +0000453
454 if (info == NULL) {
455 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
456 return -EINVAL;
457 }
458
Lee Jones3fe52282013-04-02 13:24:12 +0100459 /* Need special handling for shared mode */
460 if (info->shared_mode) {
461 if (info->shared_mode->lp_mode_req)
462 return REGULATOR_MODE_IDLE;
463 else
464 return REGULATOR_MODE_NORMAL;
465 }
466
467 if (info->mode_mask) {
468 /* Dedicated register for handling mode */
469 ret = abx500_get_register_interruptible(info->dev,
470 info->mode_bank, info->mode_reg, &val);
471 val = val & info->mode_mask;
472
473 val_normal = info->mode_val_normal;
474 val_idle = info->mode_val_idle;
475 } else {
476 /* Mode register same as enable register */
477 val = info->update_val;
478 val_normal = info->update_val_normal;
479 val_idle = info->update_val_idle;
480 }
481
482 if (val == val_normal)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000483 ret = REGULATOR_MODE_NORMAL;
Lee Jones3fe52282013-04-02 13:24:12 +0100484 else if (val == val_idle)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000485 ret = REGULATOR_MODE_IDLE;
486 else
487 ret = -EINVAL;
488
489 return ret;
490}
491
Axel Lin3bf6e902012-02-24 17:15:45 +0800492static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +0530493{
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100494 int ret, val;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530495 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100496 u8 regval;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530497
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100498 if (info == NULL) {
499 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530500 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100501 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530502
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100503 ret = abx500_get_register_interruptible(info->dev,
504 info->voltage_bank, info->voltage_reg, &regval);
Sundar R IYERc789ca22010-07-13 21:48:56 +0530505 if (ret < 0) {
506 dev_err(rdev_get_dev(rdev),
507 "couldn't read voltage reg for regulator\n");
508 return ret;
509 }
510
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100511 dev_vdbg(rdev_get_dev(rdev),
Linus Walleija0a70142012-08-20 18:41:35 +0200512 "%s-get_voltage (bank, reg, mask, shift, value): "
513 "0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
514 info->desc.name, info->voltage_bank,
515 info->voltage_reg, info->voltage_mask,
516 info->voltage_shift, regval);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100517
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100518 val = regval & info->voltage_mask;
Linus Walleija0a70142012-08-20 18:41:35 +0200519 return val >> info->voltage_shift;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530520}
521
Lee Jonesd7607ba2013-04-02 13:24:11 +0100522static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev)
523{
524 int ret, val;
525 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
526 u8 regval, regval_expand;
527
528 if (info == NULL) {
529 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
530 return -EINVAL;
531 }
532
533 ret = abx500_get_register_interruptible(info->dev,
534 info->voltage_bank, info->voltage_reg, &regval);
535
536 if (ret < 0) {
537 dev_err(rdev_get_dev(rdev),
538 "couldn't read voltage reg for regulator\n");
539 return ret;
540 }
541
542 ret = abx500_get_register_interruptible(info->dev,
543 info->expand_register.voltage_bank,
544 info->expand_register.voltage_reg, &regval_expand);
545
546 if (ret < 0) {
547 dev_err(rdev_get_dev(rdev),
548 "couldn't read voltage reg for regulator\n");
549 return ret;
550 }
551
552 dev_vdbg(rdev_get_dev(rdev),
553 "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
554 " 0x%x\n",
555 info->desc.name, info->voltage_bank, info->voltage_reg,
556 info->voltage_mask, regval);
557 dev_vdbg(rdev_get_dev(rdev),
558 "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
559 " 0x%x\n",
560 info->desc.name, info->expand_register.voltage_bank,
561 info->expand_register.voltage_reg,
562 info->expand_register.voltage_mask, regval_expand);
563
564 if (regval_expand&(info->expand_register.voltage_mask))
565 /* Vaux3 has a different layout */
566 val = info->expand_register.voltage_limit;
567 else
568 val = (regval & info->voltage_mask) >> info->voltage_shift;
569
570 return val;
571}
572
Axel Linae713d32012-03-20 09:51:08 +0800573static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
574 unsigned selector)
Sundar R IYERc789ca22010-07-13 21:48:56 +0530575{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100576 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530577 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100578 u8 regval;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530579
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100580 if (info == NULL) {
581 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530582 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100583 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530584
Sundar R IYERc789ca22010-07-13 21:48:56 +0530585 /* set the registers for the request */
Linus Walleija0a70142012-08-20 18:41:35 +0200586 regval = (u8)selector << info->voltage_shift;
Mattias Wallin47c16972010-09-10 17:47:56 +0200587 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100588 info->voltage_bank, info->voltage_reg,
589 info->voltage_mask, regval);
Sundar R IYERc789ca22010-07-13 21:48:56 +0530590 if (ret < 0)
591 dev_err(rdev_get_dev(rdev),
592 "couldn't set voltage reg for regulator\n");
593
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100594 dev_vdbg(rdev_get_dev(rdev),
595 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
596 " 0x%x\n",
597 info->desc.name, info->voltage_bank, info->voltage_reg,
598 info->voltage_mask, regval);
599
Sundar R IYERc789ca22010-07-13 21:48:56 +0530600 return ret;
601}
602
Lee Jonesd7607ba2013-04-02 13:24:11 +0100603static int ab8540_aux3_regulator_set_voltage_sel(struct regulator_dev *rdev,
604 unsigned selector)
605{
606 int ret;
607 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
608 u8 regval;
609
610 if (info == NULL) {
611 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
612 return -EINVAL;
613 }
614
615 if (selector >= info->expand_register.voltage_limit) {
616 /* Vaux3 bit4 has different layout */
617 regval = (u8)selector << info->expand_register.voltage_shift;
618 ret = abx500_mask_and_set_register_interruptible(info->dev,
619 info->expand_register.voltage_bank,
620 info->expand_register.voltage_reg,
621 info->expand_register.voltage_mask,
622 regval);
623 } else {
624 /* set the registers for the request */
625 regval = (u8)selector << info->voltage_shift;
626 ret = abx500_mask_and_set_register_interruptible(info->dev,
627 info->voltage_bank, info->voltage_reg,
628 info->voltage_mask, regval);
629 }
630 if (ret < 0)
631 dev_err(rdev_get_dev(rdev),
632 "couldn't set voltage reg for regulator\n");
633
634 dev_vdbg(rdev_get_dev(rdev),
635 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
636 " 0x%x\n",
637 info->desc.name, info->voltage_bank, info->voltage_reg,
638 info->voltage_mask, regval);
639
640 return ret;
641}
642
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000643static struct regulator_ops ab8500_regulator_volt_mode_ops = {
644 .enable = ab8500_regulator_enable,
645 .disable = ab8500_regulator_disable,
646 .is_enabled = ab8500_regulator_is_enabled,
647 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
648 .set_mode = ab8500_regulator_set_mode,
649 .get_mode = ab8500_regulator_get_mode,
650 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
651 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
652 .list_voltage = regulator_list_voltage_table,
Sundar R IYERc789ca22010-07-13 21:48:56 +0530653};
654
Lee Jonesd7607ba2013-04-02 13:24:11 +0100655static struct regulator_ops ab8540_aux3_regulator_volt_mode_ops = {
656 .enable = ab8500_regulator_enable,
657 .disable = ab8500_regulator_disable,
658 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
659 .set_mode = ab8500_regulator_set_mode,
660 .get_mode = ab8500_regulator_get_mode,
661 .is_enabled = ab8500_regulator_is_enabled,
662 .get_voltage_sel = ab8540_aux3_regulator_get_voltage_sel,
663 .set_voltage_sel = ab8540_aux3_regulator_set_voltage_sel,
664 .list_voltage = regulator_list_voltage_table,
Lee Jonesd7607ba2013-04-02 13:24:11 +0100665};
666
Lee Jones8a3b1b82013-04-02 13:24:09 +0100667static struct regulator_ops ab8500_regulator_volt_ops = {
668 .enable = ab8500_regulator_enable,
669 .disable = ab8500_regulator_disable,
670 .is_enabled = ab8500_regulator_is_enabled,
671 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
672 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
673 .list_voltage = regulator_list_voltage_table,
Lee Jones8a3b1b82013-04-02 13:24:09 +0100674};
675
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000676static struct regulator_ops ab8500_regulator_mode_ops = {
677 .enable = ab8500_regulator_enable,
678 .disable = ab8500_regulator_disable,
679 .is_enabled = ab8500_regulator_is_enabled,
680 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
681 .set_mode = ab8500_regulator_set_mode,
682 .get_mode = ab8500_regulator_get_mode,
Axel Lind7816ab2013-04-02 13:24:22 +0100683 .list_voltage = regulator_list_voltage_table,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000684};
685
686static struct regulator_ops ab8500_regulator_ops = {
687 .enable = ab8500_regulator_enable,
688 .disable = ab8500_regulator_disable,
689 .is_enabled = ab8500_regulator_is_enabled,
Axel Lind7816ab2013-04-02 13:24:22 +0100690 .list_voltage = regulator_list_voltage_table,
Sundar R IYERc789ca22010-07-13 21:48:56 +0530691};
692
Lee Jones3fe52282013-04-02 13:24:12 +0100693static struct regulator_ops ab8500_regulator_anamic_mode_ops = {
694 .enable = ab8500_regulator_enable,
695 .disable = ab8500_regulator_disable,
696 .is_enabled = ab8500_regulator_is_enabled,
697 .set_mode = ab8500_regulator_set_mode,
698 .get_mode = ab8500_regulator_get_mode,
699 .list_voltage = regulator_list_voltage_table,
700};
701
Lee Jones8e6a8d72013-03-28 16:11:11 +0000702/* AB8500 regulator information */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100703static struct ab8500_regulator_info
704 ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530705 /*
Bengt Jonssone1159e62010-12-10 11:08:44 +0100706 * Variable Voltage Regulators
707 * name, min mV, max mV,
708 * update bank, reg, mask, enable val
Axel Linec1cc4d2012-05-20 10:33:35 +0800709 * volt bank, reg, mask
Sundar R IYERc789ca22010-07-13 21:48:56 +0530710 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100711 [AB8500_LDO_AUX1] = {
712 .desc = {
713 .name = "LDO-AUX1",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000714 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100715 .type = REGULATOR_VOLTAGE,
716 .id = AB8500_LDO_AUX1,
717 .owner = THIS_MODULE,
718 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800719 .volt_table = ldo_vauxn_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800720 .enable_time = 200,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100721 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000722 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100723 .update_bank = 0x04,
724 .update_reg = 0x09,
725 .update_mask = 0x03,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000726 .update_val = 0x01,
727 .update_val_idle = 0x03,
728 .update_val_normal = 0x01,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100729 .voltage_bank = 0x04,
730 .voltage_reg = 0x1f,
731 .voltage_mask = 0x0f,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100732 },
733 [AB8500_LDO_AUX2] = {
734 .desc = {
735 .name = "LDO-AUX2",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000736 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100737 .type = REGULATOR_VOLTAGE,
738 .id = AB8500_LDO_AUX2,
739 .owner = THIS_MODULE,
740 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800741 .volt_table = ldo_vauxn_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800742 .enable_time = 200,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100743 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000744 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100745 .update_bank = 0x04,
746 .update_reg = 0x09,
747 .update_mask = 0x0c,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000748 .update_val = 0x04,
749 .update_val_idle = 0x0c,
750 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100751 .voltage_bank = 0x04,
752 .voltage_reg = 0x20,
753 .voltage_mask = 0x0f,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100754 },
755 [AB8500_LDO_AUX3] = {
756 .desc = {
757 .name = "LDO-AUX3",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000758 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100759 .type = REGULATOR_VOLTAGE,
760 .id = AB8500_LDO_AUX3,
761 .owner = THIS_MODULE,
762 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800763 .volt_table = ldo_vaux3_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800764 .enable_time = 450,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100765 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000766 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100767 .update_bank = 0x04,
768 .update_reg = 0x0a,
769 .update_mask = 0x03,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000770 .update_val = 0x01,
771 .update_val_idle = 0x03,
772 .update_val_normal = 0x01,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100773 .voltage_bank = 0x04,
774 .voltage_reg = 0x21,
775 .voltage_mask = 0x07,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100776 },
777 [AB8500_LDO_INTCORE] = {
778 .desc = {
779 .name = "LDO-INTCORE",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000780 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100781 .type = REGULATOR_VOLTAGE,
782 .id = AB8500_LDO_INTCORE,
783 .owner = THIS_MODULE,
784 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800785 .volt_table = ldo_vintcore_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800786 .enable_time = 750,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100787 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000788 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100789 .update_bank = 0x03,
790 .update_reg = 0x80,
791 .update_mask = 0x44,
Lee Jonescc40dc22013-03-21 15:59:41 +0000792 .update_val = 0x44,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000793 .update_val_idle = 0x44,
794 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100795 .voltage_bank = 0x03,
796 .voltage_reg = 0x80,
797 .voltage_mask = 0x38,
Linus Walleija0a70142012-08-20 18:41:35 +0200798 .voltage_shift = 3,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100799 },
Sundar R IYERc789ca22010-07-13 21:48:56 +0530800
801 /*
Bengt Jonssone1159e62010-12-10 11:08:44 +0100802 * Fixed Voltage Regulators
803 * name, fixed mV,
804 * update bank, reg, mask, enable val
Sundar R IYERc789ca22010-07-13 21:48:56 +0530805 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100806 [AB8500_LDO_TVOUT] = {
807 .desc = {
808 .name = "LDO-TVOUT",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000809 .ops = &ab8500_regulator_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100810 .type = REGULATOR_VOLTAGE,
811 .id = AB8500_LDO_TVOUT,
812 .owner = THIS_MODULE,
813 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +0000814 .volt_table = fixed_2000000_voltage,
Lee Jonesed3c1382013-03-28 16:11:12 +0000815 .enable_time = 500,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100816 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000817 .load_lp_uA = 1000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100818 .update_bank = 0x03,
819 .update_reg = 0x80,
820 .update_mask = 0x82,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000821 .update_val = 0x02,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000822 .update_val_idle = 0x82,
823 .update_val_normal = 0x02,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100824 },
825 [AB8500_LDO_AUDIO] = {
826 .desc = {
827 .name = "LDO-AUDIO",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000828 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100829 .type = REGULATOR_VOLTAGE,
830 .id = AB8500_LDO_AUDIO,
831 .owner = THIS_MODULE,
832 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800833 .enable_time = 140,
Lee Jonesb080c782013-03-28 16:11:17 +0000834 .volt_table = fixed_2000000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100835 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100836 .update_bank = 0x03,
837 .update_reg = 0x83,
838 .update_mask = 0x02,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000839 .update_val = 0x02,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100840 },
841 [AB8500_LDO_ANAMIC1] = {
842 .desc = {
843 .name = "LDO-ANAMIC1",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000844 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100845 .type = REGULATOR_VOLTAGE,
846 .id = AB8500_LDO_ANAMIC1,
847 .owner = THIS_MODULE,
848 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800849 .enable_time = 500,
Lee Jonesb080c782013-03-28 16:11:17 +0000850 .volt_table = fixed_2050000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100851 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100852 .update_bank = 0x03,
853 .update_reg = 0x83,
854 .update_mask = 0x08,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000855 .update_val = 0x08,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100856 },
857 [AB8500_LDO_ANAMIC2] = {
858 .desc = {
859 .name = "LDO-ANAMIC2",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000860 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100861 .type = REGULATOR_VOLTAGE,
862 .id = AB8500_LDO_ANAMIC2,
863 .owner = THIS_MODULE,
864 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800865 .enable_time = 500,
Lee Jonesb080c782013-03-28 16:11:17 +0000866 .volt_table = fixed_2050000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100867 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100868 .update_bank = 0x03,
869 .update_reg = 0x83,
870 .update_mask = 0x10,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000871 .update_val = 0x10,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100872 },
873 [AB8500_LDO_DMIC] = {
874 .desc = {
875 .name = "LDO-DMIC",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000876 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100877 .type = REGULATOR_VOLTAGE,
878 .id = AB8500_LDO_DMIC,
879 .owner = THIS_MODULE,
880 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800881 .enable_time = 420,
Lee Jonesb080c782013-03-28 16:11:17 +0000882 .volt_table = fixed_1800000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100883 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100884 .update_bank = 0x03,
885 .update_reg = 0x83,
886 .update_mask = 0x04,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000887 .update_val = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100888 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000889
890 /*
891 * Regulators with fixed voltage and normal/idle modes
892 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100893 [AB8500_LDO_ANA] = {
894 .desc = {
895 .name = "LDO-ANA",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000896 .ops = &ab8500_regulator_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100897 .type = REGULATOR_VOLTAGE,
898 .id = AB8500_LDO_ANA,
899 .owner = THIS_MODULE,
900 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800901 .enable_time = 140,
Lee Jonesb080c782013-03-28 16:11:17 +0000902 .volt_table = fixed_1200000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100903 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000904 .load_lp_uA = 1000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100905 .update_bank = 0x04,
906 .update_reg = 0x06,
907 .update_mask = 0x0c,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000908 .update_val = 0x04,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000909 .update_val_idle = 0x0c,
910 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100911 },
Lee Jones8e6a8d72013-03-28 16:11:11 +0000912};
Bengt Jonsson6909b452010-12-10 11:08:47 +0100913
Lee Jones547f3842013-03-28 16:11:14 +0000914/* AB8505 regulator information */
915static struct ab8500_regulator_info
916 ab8505_regulator_info[AB8505_NUM_REGULATORS] = {
917 /*
918 * Variable Voltage Regulators
919 * name, min mV, max mV,
920 * update bank, reg, mask, enable val
Lee Jonesd3193102013-04-02 13:24:18 +0100921 * volt bank, reg, mask
Lee Jones547f3842013-03-28 16:11:14 +0000922 */
923 [AB8505_LDO_AUX1] = {
924 .desc = {
925 .name = "LDO-AUX1",
926 .ops = &ab8500_regulator_volt_mode_ops,
927 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100928 .id = AB8505_LDO_AUX1,
Lee Jones547f3842013-03-28 16:11:14 +0000929 .owner = THIS_MODULE,
930 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000931 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000932 },
Lee Jones547f3842013-03-28 16:11:14 +0000933 .load_lp_uA = 5000,
934 .update_bank = 0x04,
935 .update_reg = 0x09,
936 .update_mask = 0x03,
937 .update_val = 0x01,
938 .update_val_idle = 0x03,
939 .update_val_normal = 0x01,
940 .voltage_bank = 0x04,
941 .voltage_reg = 0x1f,
942 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +0000943 },
944 [AB8505_LDO_AUX2] = {
945 .desc = {
946 .name = "LDO-AUX2",
947 .ops = &ab8500_regulator_volt_mode_ops,
948 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100949 .id = AB8505_LDO_AUX2,
Lee Jones547f3842013-03-28 16:11:14 +0000950 .owner = THIS_MODULE,
951 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000952 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000953 },
Lee Jones547f3842013-03-28 16:11:14 +0000954 .load_lp_uA = 5000,
955 .update_bank = 0x04,
956 .update_reg = 0x09,
957 .update_mask = 0x0c,
958 .update_val = 0x04,
959 .update_val_idle = 0x0c,
960 .update_val_normal = 0x04,
961 .voltage_bank = 0x04,
962 .voltage_reg = 0x20,
963 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +0000964 },
965 [AB8505_LDO_AUX3] = {
966 .desc = {
967 .name = "LDO-AUX3",
968 .ops = &ab8500_regulator_volt_mode_ops,
969 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100970 .id = AB8505_LDO_AUX3,
Lee Jones547f3842013-03-28 16:11:14 +0000971 .owner = THIS_MODULE,
972 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000973 .volt_table = ldo_vaux3_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000974 },
Lee Jones547f3842013-03-28 16:11:14 +0000975 .load_lp_uA = 5000,
976 .update_bank = 0x04,
977 .update_reg = 0x0a,
978 .update_mask = 0x03,
979 .update_val = 0x01,
980 .update_val_idle = 0x03,
981 .update_val_normal = 0x01,
982 .voltage_bank = 0x04,
983 .voltage_reg = 0x21,
984 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +0000985 },
986 [AB8505_LDO_AUX4] = {
987 .desc = {
988 .name = "LDO-AUX4",
989 .ops = &ab8500_regulator_volt_mode_ops,
990 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100991 .id = AB8505_LDO_AUX4,
Lee Jones547f3842013-03-28 16:11:14 +0000992 .owner = THIS_MODULE,
993 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000994 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000995 },
Lee Jones547f3842013-03-28 16:11:14 +0000996 .load_lp_uA = 5000,
997 /* values for Vaux4Regu register */
998 .update_bank = 0x04,
999 .update_reg = 0x2e,
1000 .update_mask = 0x03,
1001 .update_val = 0x01,
1002 .update_val_idle = 0x03,
1003 .update_val_normal = 0x01,
1004 /* values for Vaux4SEL register */
1005 .voltage_bank = 0x04,
1006 .voltage_reg = 0x2f,
1007 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +00001008 },
1009 [AB8505_LDO_AUX5] = {
1010 .desc = {
1011 .name = "LDO-AUX5",
1012 .ops = &ab8500_regulator_volt_mode_ops,
1013 .type = REGULATOR_VOLTAGE,
1014 .id = AB8505_LDO_AUX5,
1015 .owner = THIS_MODULE,
1016 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001017 .volt_table = ldo_vaux56_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001018 },
Lee Jones547f3842013-03-28 16:11:14 +00001019 .load_lp_uA = 2000,
1020 /* values for CtrlVaux5 register */
1021 .update_bank = 0x01,
1022 .update_reg = 0x55,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001023 .update_mask = 0x18,
1024 .update_val = 0x10,
1025 .update_val_idle = 0x18,
1026 .update_val_normal = 0x10,
Lee Jones547f3842013-03-28 16:11:14 +00001027 .voltage_bank = 0x01,
1028 .voltage_reg = 0x55,
1029 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +00001030 },
1031 [AB8505_LDO_AUX6] = {
1032 .desc = {
1033 .name = "LDO-AUX6",
1034 .ops = &ab8500_regulator_volt_mode_ops,
1035 .type = REGULATOR_VOLTAGE,
1036 .id = AB8505_LDO_AUX6,
1037 .owner = THIS_MODULE,
1038 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001039 .volt_table = ldo_vaux56_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001040 },
Lee Jones547f3842013-03-28 16:11:14 +00001041 .load_lp_uA = 2000,
1042 /* values for CtrlVaux6 register */
1043 .update_bank = 0x01,
1044 .update_reg = 0x56,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001045 .update_mask = 0x18,
1046 .update_val = 0x10,
1047 .update_val_idle = 0x18,
1048 .update_val_normal = 0x10,
Lee Jones547f3842013-03-28 16:11:14 +00001049 .voltage_bank = 0x01,
1050 .voltage_reg = 0x56,
1051 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +00001052 },
1053 [AB8505_LDO_INTCORE] = {
1054 .desc = {
1055 .name = "LDO-INTCORE",
1056 .ops = &ab8500_regulator_volt_mode_ops,
1057 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001058 .id = AB8505_LDO_INTCORE,
Lee Jones547f3842013-03-28 16:11:14 +00001059 .owner = THIS_MODULE,
1060 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001061 .volt_table = ldo_vintcore_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001062 },
Lee Jones547f3842013-03-28 16:11:14 +00001063 .load_lp_uA = 5000,
1064 .update_bank = 0x03,
1065 .update_reg = 0x80,
1066 .update_mask = 0x44,
1067 .update_val = 0x04,
1068 .update_val_idle = 0x44,
1069 .update_val_normal = 0x04,
1070 .voltage_bank = 0x03,
1071 .voltage_reg = 0x80,
1072 .voltage_mask = 0x38,
Lee Jones547f3842013-03-28 16:11:14 +00001073 .voltage_shift = 3,
1074 },
1075
1076 /*
1077 * Fixed Voltage Regulators
1078 * name, fixed mV,
1079 * update bank, reg, mask, enable val
1080 */
1081 [AB8505_LDO_ADC] = {
1082 .desc = {
1083 .name = "LDO-ADC",
1084 .ops = &ab8500_regulator_mode_ops,
1085 .type = REGULATOR_VOLTAGE,
1086 .id = AB8505_LDO_ADC,
1087 .owner = THIS_MODULE,
1088 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001089 .volt_table = fixed_2000000_voltage,
Lee Jonesa4d68462013-04-02 13:24:16 +01001090 .enable_time = 10000,
Lee Jones547f3842013-03-28 16:11:14 +00001091 },
Lee Jones547f3842013-03-28 16:11:14 +00001092 .load_lp_uA = 1000,
1093 .update_bank = 0x03,
1094 .update_reg = 0x80,
1095 .update_mask = 0x82,
1096 .update_val = 0x02,
1097 .update_val_idle = 0x82,
1098 .update_val_normal = 0x02,
1099 },
1100 [AB8505_LDO_USB] = {
1101 .desc = {
1102 .name = "LDO-USB",
1103 .ops = &ab8500_regulator_mode_ops,
1104 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001105 .id = AB8505_LDO_USB,
Lee Jones547f3842013-03-28 16:11:14 +00001106 .owner = THIS_MODULE,
1107 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001108 .volt_table = fixed_3300000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001109 },
Lee Jones547f3842013-03-28 16:11:14 +00001110 .update_bank = 0x03,
1111 .update_reg = 0x82,
1112 .update_mask = 0x03,
1113 .update_val = 0x01,
1114 .update_val_idle = 0x03,
1115 .update_val_normal = 0x01,
1116 },
1117 [AB8505_LDO_AUDIO] = {
1118 .desc = {
1119 .name = "LDO-AUDIO",
Lee Jones8a3b1b82013-04-02 13:24:09 +01001120 .ops = &ab8500_regulator_volt_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001121 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001122 .id = AB8505_LDO_AUDIO,
Lee Jones547f3842013-03-28 16:11:14 +00001123 .owner = THIS_MODULE,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001124 .n_voltages = ARRAY_SIZE(ldo_vaudio_voltages),
1125 .volt_table = ldo_vaudio_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001126 },
Lee Jones547f3842013-03-28 16:11:14 +00001127 .update_bank = 0x03,
1128 .update_reg = 0x83,
1129 .update_mask = 0x02,
1130 .update_val = 0x02,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001131 .voltage_bank = 0x01,
1132 .voltage_reg = 0x57,
1133 .voltage_mask = 0x7,
1134 .voltage_shift = 4,
Lee Jones547f3842013-03-28 16:11:14 +00001135 },
1136 [AB8505_LDO_ANAMIC1] = {
1137 .desc = {
1138 .name = "LDO-ANAMIC1",
Lee Jones3fe52282013-04-02 13:24:12 +01001139 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001140 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001141 .id = AB8505_LDO_ANAMIC1,
Lee Jones547f3842013-03-28 16:11:14 +00001142 .owner = THIS_MODULE,
1143 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001144 .volt_table = fixed_2050000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001145 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001146 .shared_mode = &ldo_anamic1_shared,
Lee Jones547f3842013-03-28 16:11:14 +00001147 .update_bank = 0x03,
1148 .update_reg = 0x83,
1149 .update_mask = 0x08,
1150 .update_val = 0x08,
Lee Jones3fe52282013-04-02 13:24:12 +01001151 .mode_bank = 0x01,
1152 .mode_reg = 0x54,
1153 .mode_mask = 0x04,
1154 .mode_val_idle = 0x04,
1155 .mode_val_normal = 0x00,
Lee Jones547f3842013-03-28 16:11:14 +00001156 },
1157 [AB8505_LDO_ANAMIC2] = {
1158 .desc = {
1159 .name = "LDO-ANAMIC2",
Lee Jones3fe52282013-04-02 13:24:12 +01001160 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001161 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001162 .id = AB8505_LDO_ANAMIC2,
Lee Jones547f3842013-03-28 16:11:14 +00001163 .owner = THIS_MODULE,
1164 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001165 .volt_table = fixed_2050000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001166 },
Lee Jones3fe52282013-04-02 13:24:12 +01001167 .shared_mode = &ldo_anamic2_shared,
Lee Jones547f3842013-03-28 16:11:14 +00001168 .update_bank = 0x03,
1169 .update_reg = 0x83,
1170 .update_mask = 0x10,
1171 .update_val = 0x10,
Lee Jones3fe52282013-04-02 13:24:12 +01001172 .mode_bank = 0x01,
1173 .mode_reg = 0x54,
1174 .mode_mask = 0x04,
1175 .mode_val_idle = 0x04,
1176 .mode_val_normal = 0x00,
Lee Jones547f3842013-03-28 16:11:14 +00001177 },
1178 [AB8505_LDO_AUX8] = {
1179 .desc = {
1180 .name = "LDO-AUX8",
1181 .ops = &ab8500_regulator_ops,
1182 .type = REGULATOR_VOLTAGE,
1183 .id = AB8505_LDO_AUX8,
1184 .owner = THIS_MODULE,
1185 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001186 .volt_table = fixed_1800000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001187 },
Lee Jones547f3842013-03-28 16:11:14 +00001188 .update_bank = 0x03,
1189 .update_reg = 0x83,
1190 .update_mask = 0x04,
1191 .update_val = 0x04,
1192 },
1193 /*
1194 * Regulators with fixed voltage and normal/idle modes
1195 */
1196 [AB8505_LDO_ANA] = {
1197 .desc = {
1198 .name = "LDO-ANA",
Lee Jones8a3b1b82013-04-02 13:24:09 +01001199 .ops = &ab8500_regulator_volt_mode_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001200 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001201 .id = AB8505_LDO_ANA,
Lee Jones547f3842013-03-28 16:11:14 +00001202 .owner = THIS_MODULE,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001203 .n_voltages = ARRAY_SIZE(ldo_vana_voltages),
1204 .volt_table = ldo_vana_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001205 },
Lee Jones547f3842013-03-28 16:11:14 +00001206 .load_lp_uA = 1000,
1207 .update_bank = 0x04,
1208 .update_reg = 0x06,
1209 .update_mask = 0x0c,
1210 .update_val = 0x04,
1211 .update_val_idle = 0x0c,
1212 .update_val_normal = 0x04,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001213 .voltage_bank = 0x04,
1214 .voltage_reg = 0x29,
1215 .voltage_mask = 0x7,
Lee Jones547f3842013-03-28 16:11:14 +00001216 },
1217};
1218
Lee Jones8e6a8d72013-03-28 16:11:11 +00001219/* AB9540 regulator information */
1220static struct ab8500_regulator_info
1221 ab9540_regulator_info[AB9540_NUM_REGULATORS] = {
1222 /*
1223 * Variable Voltage Regulators
1224 * name, min mV, max mV,
1225 * update bank, reg, mask, enable val
Lee Jonesd3193102013-04-02 13:24:18 +01001226 * volt bank, reg, mask
Lee Jones8e6a8d72013-03-28 16:11:11 +00001227 */
1228 [AB9540_LDO_AUX1] = {
1229 .desc = {
1230 .name = "LDO-AUX1",
1231 .ops = &ab8500_regulator_volt_mode_ops,
1232 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001233 .id = AB9540_LDO_AUX1,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001234 .owner = THIS_MODULE,
1235 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001236 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001237 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001238 .load_lp_uA = 5000,
1239 .update_bank = 0x04,
1240 .update_reg = 0x09,
1241 .update_mask = 0x03,
1242 .update_val = 0x01,
1243 .update_val_idle = 0x03,
1244 .update_val_normal = 0x01,
1245 .voltage_bank = 0x04,
1246 .voltage_reg = 0x1f,
1247 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001248 },
1249 [AB9540_LDO_AUX2] = {
1250 .desc = {
1251 .name = "LDO-AUX2",
1252 .ops = &ab8500_regulator_volt_mode_ops,
1253 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001254 .id = AB9540_LDO_AUX2,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001255 .owner = THIS_MODULE,
1256 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001257 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001258 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001259 .load_lp_uA = 5000,
1260 .update_bank = 0x04,
1261 .update_reg = 0x09,
1262 .update_mask = 0x0c,
1263 .update_val = 0x04,
1264 .update_val_idle = 0x0c,
1265 .update_val_normal = 0x04,
1266 .voltage_bank = 0x04,
1267 .voltage_reg = 0x20,
1268 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001269 },
1270 [AB9540_LDO_AUX3] = {
1271 .desc = {
1272 .name = "LDO-AUX3",
1273 .ops = &ab8500_regulator_volt_mode_ops,
1274 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001275 .id = AB9540_LDO_AUX3,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001276 .owner = THIS_MODULE,
1277 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001278 .volt_table = ldo_vaux3_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001279 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001280 .load_lp_uA = 5000,
1281 .update_bank = 0x04,
1282 .update_reg = 0x0a,
1283 .update_mask = 0x03,
1284 .update_val = 0x01,
1285 .update_val_idle = 0x03,
1286 .update_val_normal = 0x01,
1287 .voltage_bank = 0x04,
1288 .voltage_reg = 0x21,
1289 .voltage_mask = 0x07,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001290 },
1291 [AB9540_LDO_AUX4] = {
1292 .desc = {
1293 .name = "LDO-AUX4",
1294 .ops = &ab8500_regulator_volt_mode_ops,
1295 .type = REGULATOR_VOLTAGE,
1296 .id = AB9540_LDO_AUX4,
1297 .owner = THIS_MODULE,
1298 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001299 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001300 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001301 .load_lp_uA = 5000,
1302 /* values for Vaux4Regu register */
1303 .update_bank = 0x04,
1304 .update_reg = 0x2e,
1305 .update_mask = 0x03,
1306 .update_val = 0x01,
1307 .update_val_idle = 0x03,
1308 .update_val_normal = 0x01,
1309 /* values for Vaux4SEL register */
1310 .voltage_bank = 0x04,
1311 .voltage_reg = 0x2f,
1312 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001313 },
1314 [AB9540_LDO_INTCORE] = {
1315 .desc = {
1316 .name = "LDO-INTCORE",
1317 .ops = &ab8500_regulator_volt_mode_ops,
1318 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001319 .id = AB9540_LDO_INTCORE,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001320 .owner = THIS_MODULE,
1321 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001322 .volt_table = ldo_vintcore_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001323 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001324 .load_lp_uA = 5000,
1325 .update_bank = 0x03,
1326 .update_reg = 0x80,
1327 .update_mask = 0x44,
1328 .update_val = 0x44,
1329 .update_val_idle = 0x44,
1330 .update_val_normal = 0x04,
1331 .voltage_bank = 0x03,
1332 .voltage_reg = 0x80,
1333 .voltage_mask = 0x38,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001334 .voltage_shift = 3,
1335 },
Bengt Jonsson6909b452010-12-10 11:08:47 +01001336
Lee Jones8e6a8d72013-03-28 16:11:11 +00001337 /*
1338 * Fixed Voltage Regulators
1339 * name, fixed mV,
1340 * update bank, reg, mask, enable val
1341 */
1342 [AB9540_LDO_TVOUT] = {
1343 .desc = {
1344 .name = "LDO-TVOUT",
1345 .ops = &ab8500_regulator_mode_ops,
1346 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001347 .id = AB9540_LDO_TVOUT,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001348 .owner = THIS_MODULE,
1349 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001350 .volt_table = fixed_2000000_voltage,
Lee Jonesa4d68462013-04-02 13:24:16 +01001351 .enable_time = 10000,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001352 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001353 .load_lp_uA = 1000,
1354 .update_bank = 0x03,
1355 .update_reg = 0x80,
1356 .update_mask = 0x82,
1357 .update_val = 0x02,
1358 .update_val_idle = 0x82,
1359 .update_val_normal = 0x02,
1360 },
1361 [AB9540_LDO_USB] = {
1362 .desc = {
1363 .name = "LDO-USB",
1364 .ops = &ab8500_regulator_ops,
1365 .type = REGULATOR_VOLTAGE,
1366 .id = AB9540_LDO_USB,
1367 .owner = THIS_MODULE,
1368 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001369 .volt_table = fixed_3300000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001370 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001371 .update_bank = 0x03,
1372 .update_reg = 0x82,
1373 .update_mask = 0x03,
1374 .update_val = 0x01,
1375 .update_val_idle = 0x03,
1376 .update_val_normal = 0x01,
1377 },
1378 [AB9540_LDO_AUDIO] = {
1379 .desc = {
1380 .name = "LDO-AUDIO",
1381 .ops = &ab8500_regulator_ops,
1382 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001383 .id = AB9540_LDO_AUDIO,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001384 .owner = THIS_MODULE,
1385 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001386 .volt_table = fixed_2000000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001387 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001388 .update_bank = 0x03,
1389 .update_reg = 0x83,
1390 .update_mask = 0x02,
1391 .update_val = 0x02,
1392 },
1393 [AB9540_LDO_ANAMIC1] = {
1394 .desc = {
1395 .name = "LDO-ANAMIC1",
1396 .ops = &ab8500_regulator_ops,
1397 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001398 .id = AB9540_LDO_ANAMIC1,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001399 .owner = THIS_MODULE,
1400 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001401 .volt_table = fixed_2050000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001402 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001403 .update_bank = 0x03,
1404 .update_reg = 0x83,
1405 .update_mask = 0x08,
1406 .update_val = 0x08,
1407 },
1408 [AB9540_LDO_ANAMIC2] = {
1409 .desc = {
1410 .name = "LDO-ANAMIC2",
1411 .ops = &ab8500_regulator_ops,
1412 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001413 .id = AB9540_LDO_ANAMIC2,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001414 .owner = THIS_MODULE,
1415 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001416 .volt_table = fixed_2050000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001417 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001418 .update_bank = 0x03,
1419 .update_reg = 0x83,
1420 .update_mask = 0x10,
1421 .update_val = 0x10,
1422 },
1423 [AB9540_LDO_DMIC] = {
1424 .desc = {
1425 .name = "LDO-DMIC",
1426 .ops = &ab8500_regulator_ops,
1427 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001428 .id = AB9540_LDO_DMIC,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001429 .owner = THIS_MODULE,
1430 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001431 .volt_table = fixed_1800000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001432 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001433 .update_bank = 0x03,
1434 .update_reg = 0x83,
1435 .update_mask = 0x04,
1436 .update_val = 0x04,
1437 },
1438
1439 /*
1440 * Regulators with fixed voltage and normal/idle modes
1441 */
1442 [AB9540_LDO_ANA] = {
1443 .desc = {
1444 .name = "LDO-ANA",
1445 .ops = &ab8500_regulator_mode_ops,
1446 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001447 .id = AB9540_LDO_ANA,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001448 .owner = THIS_MODULE,
1449 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001450 .volt_table = fixed_1200000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001451 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001452 .load_lp_uA = 1000,
1453 .update_bank = 0x04,
1454 .update_reg = 0x06,
1455 .update_mask = 0x0c,
1456 .update_val = 0x08,
1457 .update_val_idle = 0x0c,
1458 .update_val_normal = 0x08,
1459 },
Sundar R IYERc789ca22010-07-13 21:48:56 +05301460};
1461
Lee Jonesae0a9a32013-03-28 16:11:16 +00001462/* AB8540 regulator information */
1463static struct ab8500_regulator_info
1464 ab8540_regulator_info[AB8540_NUM_REGULATORS] = {
1465 /*
1466 * Variable Voltage Regulators
1467 * name, min mV, max mV,
1468 * update bank, reg, mask, enable val
Lee Jonesd3193102013-04-02 13:24:18 +01001469 * volt bank, reg, mask
Lee Jonesae0a9a32013-03-28 16:11:16 +00001470 */
1471 [AB8540_LDO_AUX1] = {
1472 .desc = {
1473 .name = "LDO-AUX1",
1474 .ops = &ab8500_regulator_volt_mode_ops,
1475 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001476 .id = AB8540_LDO_AUX1,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001477 .owner = THIS_MODULE,
1478 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001479 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001480 },
1481 .load_lp_uA = 5000,
1482 .update_bank = 0x04,
1483 .update_reg = 0x09,
1484 .update_mask = 0x03,
1485 .update_val = 0x01,
1486 .update_val_idle = 0x03,
1487 .update_val_normal = 0x01,
1488 .voltage_bank = 0x04,
1489 .voltage_reg = 0x1f,
1490 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001491 },
1492 [AB8540_LDO_AUX2] = {
1493 .desc = {
1494 .name = "LDO-AUX2",
1495 .ops = &ab8500_regulator_volt_mode_ops,
1496 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001497 .id = AB8540_LDO_AUX2,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001498 .owner = THIS_MODULE,
1499 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001500 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001501 },
1502 .load_lp_uA = 5000,
1503 .update_bank = 0x04,
1504 .update_reg = 0x09,
1505 .update_mask = 0x0c,
1506 .update_val = 0x04,
1507 .update_val_idle = 0x0c,
1508 .update_val_normal = 0x04,
1509 .voltage_bank = 0x04,
1510 .voltage_reg = 0x20,
1511 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001512 },
1513 [AB8540_LDO_AUX3] = {
1514 .desc = {
1515 .name = "LDO-AUX3",
Lee Jonesd7607ba2013-04-02 13:24:11 +01001516 .ops = &ab8540_aux3_regulator_volt_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001517 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001518 .id = AB8540_LDO_AUX3,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001519 .owner = THIS_MODULE,
1520 .n_voltages = ARRAY_SIZE(ldo_vaux3_ab8540_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001521 .volt_table = ldo_vaux3_ab8540_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001522 },
1523 .load_lp_uA = 5000,
1524 .update_bank = 0x04,
1525 .update_reg = 0x0a,
1526 .update_mask = 0x03,
1527 .update_val = 0x01,
1528 .update_val_idle = 0x03,
1529 .update_val_normal = 0x01,
1530 .voltage_bank = 0x04,
1531 .voltage_reg = 0x21,
1532 .voltage_mask = 0x07,
Lee Jonesd7607ba2013-04-02 13:24:11 +01001533 .expand_register = {
1534 .voltage_limit = 8,
1535 .voltage_bank = 0x04,
1536 .voltage_reg = 0x01,
1537 .voltage_mask = 0x10,
1538 .voltage_shift = 1,
1539 }
Lee Jonesae0a9a32013-03-28 16:11:16 +00001540 },
1541 [AB8540_LDO_AUX4] = {
1542 .desc = {
1543 .name = "LDO-AUX4",
1544 .ops = &ab8500_regulator_volt_mode_ops,
1545 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001546 .id = AB8540_LDO_AUX4,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001547 .owner = THIS_MODULE,
1548 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001549 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001550 },
1551 .load_lp_uA = 5000,
1552 /* values for Vaux4Regu register */
1553 .update_bank = 0x04,
1554 .update_reg = 0x2e,
1555 .update_mask = 0x03,
1556 .update_val = 0x01,
1557 .update_val_idle = 0x03,
1558 .update_val_normal = 0x01,
1559 /* values for Vaux4SEL register */
1560 .voltage_bank = 0x04,
1561 .voltage_reg = 0x2f,
1562 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001563 },
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001564 [AB8540_LDO_AUX5] = {
1565 .desc = {
1566 .name = "LDO-AUX5",
1567 .ops = &ab8500_regulator_volt_mode_ops,
1568 .type = REGULATOR_VOLTAGE,
1569 .id = AB8540_LDO_AUX5,
1570 .owner = THIS_MODULE,
1571 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
Lee Jonesd3193102013-04-02 13:24:18 +01001572 .volt_table = ldo_vaux56_ab8540_voltages,
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001573 },
1574 .load_lp_uA = 20000,
1575 /* values for Vaux5Regu register */
1576 .update_bank = 0x04,
1577 .update_reg = 0x32,
1578 .update_mask = 0x03,
1579 .update_val = 0x01,
1580 .update_val_idle = 0x03,
1581 .update_val_normal = 0x01,
1582 /* values for Vaux5SEL register */
1583 .voltage_bank = 0x04,
1584 .voltage_reg = 0x33,
1585 .voltage_mask = 0x3f,
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001586 },
1587 [AB8540_LDO_AUX6] = {
1588 .desc = {
1589 .name = "LDO-AUX6",
1590 .ops = &ab8500_regulator_volt_mode_ops,
1591 .type = REGULATOR_VOLTAGE,
1592 .id = AB8540_LDO_AUX6,
1593 .owner = THIS_MODULE,
1594 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
Lee Jonesd3193102013-04-02 13:24:18 +01001595 .volt_table = ldo_vaux56_ab8540_voltages,
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001596 },
1597 .load_lp_uA = 20000,
1598 /* values for Vaux6Regu register */
1599 .update_bank = 0x04,
1600 .update_reg = 0x35,
1601 .update_mask = 0x03,
1602 .update_val = 0x01,
1603 .update_val_idle = 0x03,
1604 .update_val_normal = 0x01,
1605 /* values for Vaux6SEL register */
1606 .voltage_bank = 0x04,
1607 .voltage_reg = 0x36,
1608 .voltage_mask = 0x3f,
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001609 },
Lee Jonesae0a9a32013-03-28 16:11:16 +00001610 [AB8540_LDO_INTCORE] = {
1611 .desc = {
1612 .name = "LDO-INTCORE",
1613 .ops = &ab8500_regulator_volt_mode_ops,
1614 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001615 .id = AB8540_LDO_INTCORE,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001616 .owner = THIS_MODULE,
1617 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001618 .volt_table = ldo_vintcore_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001619 },
1620 .load_lp_uA = 5000,
1621 .update_bank = 0x03,
1622 .update_reg = 0x80,
1623 .update_mask = 0x44,
1624 .update_val = 0x44,
1625 .update_val_idle = 0x44,
1626 .update_val_normal = 0x04,
1627 .voltage_bank = 0x03,
1628 .voltage_reg = 0x80,
1629 .voltage_mask = 0x38,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001630 .voltage_shift = 3,
1631 },
1632
1633 /*
1634 * Fixed Voltage Regulators
1635 * name, fixed mV,
1636 * update bank, reg, mask, enable val
1637 */
1638 [AB8540_LDO_TVOUT] = {
1639 .desc = {
1640 .name = "LDO-TVOUT",
1641 .ops = &ab8500_regulator_mode_ops,
1642 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001643 .id = AB8540_LDO_TVOUT,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001644 .owner = THIS_MODULE,
1645 .n_voltages = 1,
Axel Linaca45e92013-04-02 13:24:23 +01001646 .volt_table = fixed_2000000_voltage,
Lee Jonesa4d68462013-04-02 13:24:16 +01001647 .enable_time = 10000,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001648 },
Lee Jonesae0a9a32013-03-28 16:11:16 +00001649 .load_lp_uA = 1000,
1650 .update_bank = 0x03,
1651 .update_reg = 0x80,
1652 .update_mask = 0x82,
1653 .update_val = 0x02,
1654 .update_val_idle = 0x82,
1655 .update_val_normal = 0x02,
1656 },
1657 [AB8540_LDO_AUDIO] = {
1658 .desc = {
1659 .name = "LDO-AUDIO",
1660 .ops = &ab8500_regulator_ops,
1661 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001662 .id = AB8540_LDO_AUDIO,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001663 .owner = THIS_MODULE,
1664 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001665 .volt_table = fixed_2000000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001666 },
1667 .update_bank = 0x03,
1668 .update_reg = 0x83,
1669 .update_mask = 0x02,
1670 .update_val = 0x02,
1671 },
1672 [AB8540_LDO_ANAMIC1] = {
1673 .desc = {
1674 .name = "LDO-ANAMIC1",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001675 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001676 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001677 .id = AB8540_LDO_ANAMIC1,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001678 .owner = THIS_MODULE,
1679 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001680 .volt_table = fixed_2050000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001681 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001682 .shared_mode = &ab8540_ldo_anamic1_shared,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001683 .update_bank = 0x03,
1684 .update_reg = 0x83,
1685 .update_mask = 0x08,
1686 .update_val = 0x08,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001687 .mode_bank = 0x03,
1688 .mode_reg = 0x83,
1689 .mode_mask = 0x20,
1690 .mode_val_idle = 0x20,
1691 .mode_val_normal = 0x00,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001692 },
1693 [AB8540_LDO_ANAMIC2] = {
1694 .desc = {
1695 .name = "LDO-ANAMIC2",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001696 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001697 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001698 .id = AB8540_LDO_ANAMIC2,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001699 .owner = THIS_MODULE,
1700 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001701 .volt_table = fixed_2050000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001702 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001703 .shared_mode = &ab8540_ldo_anamic2_shared,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001704 .update_bank = 0x03,
1705 .update_reg = 0x83,
1706 .update_mask = 0x10,
1707 .update_val = 0x10,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001708 .mode_bank = 0x03,
1709 .mode_reg = 0x83,
1710 .mode_mask = 0x20,
1711 .mode_val_idle = 0x20,
1712 .mode_val_normal = 0x00,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001713 },
1714 [AB8540_LDO_DMIC] = {
1715 .desc = {
1716 .name = "LDO-DMIC",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001717 .ops = &ab8500_regulator_volt_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001718 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001719 .id = AB8540_LDO_DMIC,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001720 .owner = THIS_MODULE,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001721 .n_voltages = ARRAY_SIZE(ldo_vdmic_voltages),
Lee Jonesd3193102013-04-02 13:24:18 +01001722 .volt_table = ldo_vdmic_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001723 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001724 .load_lp_uA = 1000,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001725 .update_bank = 0x03,
1726 .update_reg = 0x83,
1727 .update_mask = 0x04,
1728 .update_val = 0x04,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001729 .voltage_bank = 0x03,
1730 .voltage_reg = 0x83,
1731 .voltage_mask = 0xc0,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001732 },
1733
1734 /*
1735 * Regulators with fixed voltage and normal/idle modes
1736 */
1737 [AB8540_LDO_ANA] = {
1738 .desc = {
1739 .name = "LDO-ANA",
1740 .ops = &ab8500_regulator_mode_ops,
1741 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001742 .id = AB8540_LDO_ANA,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001743 .owner = THIS_MODULE,
1744 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001745 .volt_table = fixed_1200000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001746 },
1747 .load_lp_uA = 1000,
1748 .update_bank = 0x04,
1749 .update_reg = 0x06,
1750 .update_mask = 0x0c,
1751 .update_val = 0x04,
1752 .update_val_idle = 0x0c,
1753 .update_val_normal = 0x04,
1754 },
1755 [AB8540_LDO_SDIO] = {
1756 .desc = {
1757 .name = "LDO-SDIO",
1758 .ops = &ab8500_regulator_volt_mode_ops,
1759 .type = REGULATOR_VOLTAGE,
1760 .id = AB8540_LDO_SDIO,
1761 .owner = THIS_MODULE,
Lee Jones62ab4112013-03-28 16:11:18 +00001762 .n_voltages = ARRAY_SIZE(ldo_sdio_voltages),
1763 .volt_table = ldo_sdio_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001764 },
Lee Jonesae0a9a32013-03-28 16:11:16 +00001765 .load_lp_uA = 5000,
1766 .update_bank = 0x03,
1767 .update_reg = 0x88,
1768 .update_mask = 0x30,
1769 .update_val = 0x10,
1770 .update_val_idle = 0x30,
1771 .update_val_normal = 0x10,
1772 .voltage_bank = 0x03,
1773 .voltage_reg = 0x88,
1774 .voltage_mask = 0x07,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001775 },
1776};
1777
Lee Jones3fe52282013-04-02 13:24:12 +01001778static struct ab8500_shared_mode ldo_anamic1_shared = {
1779 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC2],
1780};
1781
1782static struct ab8500_shared_mode ldo_anamic2_shared = {
1783 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC1],
1784};
1785
Lee Jones4c84b4d2013-04-02 13:24:13 +01001786static struct ab8500_shared_mode ab8540_ldo_anamic1_shared = {
1787 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC2],
1788};
1789
1790static struct ab8500_shared_mode ab8540_ldo_anamic2_shared = {
1791 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC1],
1792};
1793
Bengt Jonsson79568b942011-03-11 11:54:46 +01001794struct ab8500_reg_init {
1795 u8 bank;
1796 u8 addr;
1797 u8 mask;
1798};
1799
1800#define REG_INIT(_id, _bank, _addr, _mask) \
1801 [_id] = { \
1802 .bank = _bank, \
1803 .addr = _addr, \
1804 .mask = _mask, \
1805 }
1806
Lee Jones8e6a8d72013-03-28 16:11:11 +00001807/* AB8500 register init */
Bengt Jonsson79568b942011-03-11 11:54:46 +01001808static struct ab8500_reg_init ab8500_reg_init[] = {
1809 /*
Lee Jones33bc8f42013-03-21 15:59:02 +00001810 * 0x30, VanaRequestCtrl
Bengt Jonsson79568b942011-03-11 11:54:46 +01001811 * 0xc0, VextSupply1RequestCtrl
1812 */
Lee Jones43a59112013-03-21 15:59:15 +00001813 REG_INIT(AB8500_REGUREQUESTCTRL2, 0x03, 0x04, 0xf0),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001814 /*
1815 * 0x03, VextSupply2RequestCtrl
1816 * 0x0c, VextSupply3RequestCtrl
1817 * 0x30, Vaux1RequestCtrl
1818 * 0xc0, Vaux2RequestCtrl
1819 */
1820 REG_INIT(AB8500_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
1821 /*
1822 * 0x03, Vaux3RequestCtrl
1823 * 0x04, SwHPReq
1824 */
1825 REG_INIT(AB8500_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
1826 /*
1827 * 0x08, VanaSysClkReq1HPValid
1828 * 0x20, Vaux1SysClkReq1HPValid
1829 * 0x40, Vaux2SysClkReq1HPValid
1830 * 0x80, Vaux3SysClkReq1HPValid
1831 */
Lee Jones43a59112013-03-21 15:59:15 +00001832 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001833 /*
1834 * 0x10, VextSupply1SysClkReq1HPValid
1835 * 0x20, VextSupply2SysClkReq1HPValid
1836 * 0x40, VextSupply3SysClkReq1HPValid
1837 */
Lee Jones43a59112013-03-21 15:59:15 +00001838 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x70),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001839 /*
1840 * 0x08, VanaHwHPReq1Valid
1841 * 0x20, Vaux1HwHPReq1Valid
1842 * 0x40, Vaux2HwHPReq1Valid
1843 * 0x80, Vaux3HwHPReq1Valid
1844 */
Lee Jones43a59112013-03-21 15:59:15 +00001845 REG_INIT(AB8500_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001846 /*
1847 * 0x01, VextSupply1HwHPReq1Valid
1848 * 0x02, VextSupply2HwHPReq1Valid
1849 * 0x04, VextSupply3HwHPReq1Valid
1850 */
Lee Jones43a59112013-03-21 15:59:15 +00001851 REG_INIT(AB8500_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001852 /*
1853 * 0x08, VanaHwHPReq2Valid
1854 * 0x20, Vaux1HwHPReq2Valid
1855 * 0x40, Vaux2HwHPReq2Valid
1856 * 0x80, Vaux3HwHPReq2Valid
1857 */
Lee Jones43a59112013-03-21 15:59:15 +00001858 REG_INIT(AB8500_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001859 /*
1860 * 0x01, VextSupply1HwHPReq2Valid
1861 * 0x02, VextSupply2HwHPReq2Valid
1862 * 0x04, VextSupply3HwHPReq2Valid
1863 */
Lee Jones43a59112013-03-21 15:59:15 +00001864 REG_INIT(AB8500_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001865 /*
1866 * 0x20, VanaSwHPReqValid
1867 * 0x80, Vaux1SwHPReqValid
1868 */
Lee Jones43a59112013-03-21 15:59:15 +00001869 REG_INIT(AB8500_REGUSWHPREQVALID1, 0x03, 0x0d, 0xa0),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001870 /*
1871 * 0x01, Vaux2SwHPReqValid
1872 * 0x02, Vaux3SwHPReqValid
1873 * 0x04, VextSupply1SwHPReqValid
1874 * 0x08, VextSupply2SwHPReqValid
1875 * 0x10, VextSupply3SwHPReqValid
1876 */
Lee Jones43a59112013-03-21 15:59:15 +00001877 REG_INIT(AB8500_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001878 /*
1879 * 0x02, SysClkReq2Valid1
Lee Jones43a59112013-03-21 15:59:15 +00001880 * 0x04, SysClkReq3Valid1
1881 * 0x08, SysClkReq4Valid1
1882 * 0x10, SysClkReq5Valid1
1883 * 0x20, SysClkReq6Valid1
1884 * 0x40, SysClkReq7Valid1
Bengt Jonsson79568b942011-03-11 11:54:46 +01001885 * 0x80, SysClkReq8Valid1
1886 */
1887 REG_INIT(AB8500_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
1888 /*
1889 * 0x02, SysClkReq2Valid2
Lee Jones43a59112013-03-21 15:59:15 +00001890 * 0x04, SysClkReq3Valid2
1891 * 0x08, SysClkReq4Valid2
1892 * 0x10, SysClkReq5Valid2
1893 * 0x20, SysClkReq6Valid2
1894 * 0x40, SysClkReq7Valid2
Bengt Jonsson79568b942011-03-11 11:54:46 +01001895 * 0x80, SysClkReq8Valid2
1896 */
1897 REG_INIT(AB8500_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
1898 /*
1899 * 0x02, VTVoutEna
1900 * 0x04, Vintcore12Ena
1901 * 0x38, Vintcore12Sel
1902 * 0x40, Vintcore12LP
1903 * 0x80, VTVoutLP
1904 */
1905 REG_INIT(AB8500_REGUMISC1, 0x03, 0x80, 0xfe),
1906 /*
1907 * 0x02, VaudioEna
1908 * 0x04, VdmicEna
1909 * 0x08, Vamic1Ena
1910 * 0x10, Vamic2Ena
1911 */
1912 REG_INIT(AB8500_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
1913 /*
1914 * 0x01, Vamic1_dzout
1915 * 0x02, Vamic2_dzout
1916 */
1917 REG_INIT(AB8500_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
1918 /*
Lee Jones43a59112013-03-21 15:59:15 +00001919 * 0x03, VpllRegu (NOTE! PRCMU register bits)
Lee Jones33bc8f42013-03-21 15:59:02 +00001920 * 0x0c, VanaRegu
Bengt Jonsson79568b942011-03-11 11:54:46 +01001921 */
1922 REG_INIT(AB8500_VPLLVANAREGU, 0x04, 0x06, 0x0f),
1923 /*
1924 * 0x01, VrefDDREna
1925 * 0x02, VrefDDRSleepMode
1926 */
1927 REG_INIT(AB8500_VREFDDR, 0x04, 0x07, 0x03),
1928 /*
1929 * 0x03, VextSupply1Regu
1930 * 0x0c, VextSupply2Regu
1931 * 0x30, VextSupply3Regu
1932 * 0x40, ExtSupply2Bypass
1933 * 0x80, ExtSupply3Bypass
1934 */
1935 REG_INIT(AB8500_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
1936 /*
1937 * 0x03, Vaux1Regu
1938 * 0x0c, Vaux2Regu
1939 */
1940 REG_INIT(AB8500_VAUX12REGU, 0x04, 0x09, 0x0f),
1941 /*
1942 * 0x03, Vaux3Regu
1943 */
Lee Jones43a59112013-03-21 15:59:15 +00001944 REG_INIT(AB8500_VRF1VAUX3REGU, 0x04, 0x0a, 0x03),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001945 /*
1946 * 0x0f, Vaux1Sel
1947 */
1948 REG_INIT(AB8500_VAUX1SEL, 0x04, 0x1f, 0x0f),
1949 /*
1950 * 0x0f, Vaux2Sel
1951 */
1952 REG_INIT(AB8500_VAUX2SEL, 0x04, 0x20, 0x0f),
1953 /*
1954 * 0x07, Vaux3Sel
1955 */
Lee Jones43a59112013-03-21 15:59:15 +00001956 REG_INIT(AB8500_VRF1VAUX3SEL, 0x04, 0x21, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001957 /*
1958 * 0x01, VextSupply12LP
1959 */
1960 REG_INIT(AB8500_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
1961 /*
1962 * 0x04, Vaux1Disch
1963 * 0x08, Vaux2Disch
1964 * 0x10, Vaux3Disch
1965 * 0x20, Vintcore12Disch
1966 * 0x40, VTVoutDisch
1967 * 0x80, VaudioDisch
1968 */
Lee Jones43a59112013-03-21 15:59:15 +00001969 REG_INIT(AB8500_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001970 /*
1971 * 0x02, VanaDisch
1972 * 0x04, VdmicPullDownEna
1973 * 0x10, VdmicDisch
1974 */
Lee Jones43a59112013-03-21 15:59:15 +00001975 REG_INIT(AB8500_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001976};
1977
Lee Jones547f3842013-03-28 16:11:14 +00001978/* AB8505 register init */
1979static struct ab8500_reg_init ab8505_reg_init[] = {
1980 /*
1981 * 0x03, VarmRequestCtrl
1982 * 0x0c, VsmpsCRequestCtrl
1983 * 0x30, VsmpsARequestCtrl
1984 * 0xc0, VsmpsBRequestCtrl
1985 */
1986 REG_INIT(AB8505_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
1987 /*
1988 * 0x03, VsafeRequestCtrl
1989 * 0x0c, VpllRequestCtrl
1990 * 0x30, VanaRequestCtrl
1991 */
1992 REG_INIT(AB8505_REGUREQUESTCTRL2, 0x03, 0x04, 0x3f),
1993 /*
1994 * 0x30, Vaux1RequestCtrl
1995 * 0xc0, Vaux2RequestCtrl
1996 */
1997 REG_INIT(AB8505_REGUREQUESTCTRL3, 0x03, 0x05, 0xf0),
1998 /*
1999 * 0x03, Vaux3RequestCtrl
2000 * 0x04, SwHPReq
2001 */
2002 REG_INIT(AB8505_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2003 /*
2004 * 0x01, VsmpsASysClkReq1HPValid
2005 * 0x02, VsmpsBSysClkReq1HPValid
2006 * 0x04, VsafeSysClkReq1HPValid
2007 * 0x08, VanaSysClkReq1HPValid
2008 * 0x10, VpllSysClkReq1HPValid
2009 * 0x20, Vaux1SysClkReq1HPValid
2010 * 0x40, Vaux2SysClkReq1HPValid
2011 * 0x80, Vaux3SysClkReq1HPValid
2012 */
2013 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2014 /*
2015 * 0x01, VsmpsCSysClkReq1HPValid
2016 * 0x02, VarmSysClkReq1HPValid
2017 * 0x04, VbbSysClkReq1HPValid
2018 * 0x08, VsmpsMSysClkReq1HPValid
2019 */
2020 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x0f),
2021 /*
2022 * 0x01, VsmpsAHwHPReq1Valid
2023 * 0x02, VsmpsBHwHPReq1Valid
2024 * 0x04, VsafeHwHPReq1Valid
2025 * 0x08, VanaHwHPReq1Valid
2026 * 0x10, VpllHwHPReq1Valid
2027 * 0x20, Vaux1HwHPReq1Valid
2028 * 0x40, Vaux2HwHPReq1Valid
2029 * 0x80, Vaux3HwHPReq1Valid
2030 */
2031 REG_INIT(AB8505_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2032 /*
2033 * 0x08, VsmpsMHwHPReq1Valid
2034 */
2035 REG_INIT(AB8505_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x08),
2036 /*
2037 * 0x01, VsmpsAHwHPReq2Valid
2038 * 0x02, VsmpsBHwHPReq2Valid
2039 * 0x04, VsafeHwHPReq2Valid
2040 * 0x08, VanaHwHPReq2Valid
2041 * 0x10, VpllHwHPReq2Valid
2042 * 0x20, Vaux1HwHPReq2Valid
2043 * 0x40, Vaux2HwHPReq2Valid
2044 * 0x80, Vaux3HwHPReq2Valid
2045 */
2046 REG_INIT(AB8505_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2047 /*
2048 * 0x08, VsmpsMHwHPReq2Valid
2049 */
2050 REG_INIT(AB8505_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x08),
2051 /*
2052 * 0x01, VsmpsCSwHPReqValid
2053 * 0x02, VarmSwHPReqValid
2054 * 0x04, VsmpsASwHPReqValid
2055 * 0x08, VsmpsBSwHPReqValid
2056 * 0x10, VsafeSwHPReqValid
2057 * 0x20, VanaSwHPReqValid
2058 * 0x40, VpllSwHPReqValid
2059 * 0x80, Vaux1SwHPReqValid
2060 */
2061 REG_INIT(AB8505_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2062 /*
2063 * 0x01, Vaux2SwHPReqValid
2064 * 0x02, Vaux3SwHPReqValid
2065 * 0x20, VsmpsMSwHPReqValid
2066 */
2067 REG_INIT(AB8505_REGUSWHPREQVALID2, 0x03, 0x0e, 0x23),
2068 /*
2069 * 0x02, SysClkReq2Valid1
2070 * 0x04, SysClkReq3Valid1
2071 * 0x08, SysClkReq4Valid1
2072 */
2073 REG_INIT(AB8505_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0x0e),
2074 /*
2075 * 0x02, SysClkReq2Valid2
2076 * 0x04, SysClkReq3Valid2
2077 * 0x08, SysClkReq4Valid2
2078 */
2079 REG_INIT(AB8505_REGUSYSCLKREQVALID2, 0x03, 0x10, 0x0e),
2080 /*
2081 * 0x01, Vaux4SwHPReqValid
2082 * 0x02, Vaux4HwHPReq2Valid
2083 * 0x04, Vaux4HwHPReq1Valid
2084 * 0x08, Vaux4SysClkReq1HPValid
2085 */
2086 REG_INIT(AB8505_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2087 /*
2088 * 0x02, VadcEna
2089 * 0x04, VintCore12Ena
2090 * 0x38, VintCore12Sel
2091 * 0x40, VintCore12LP
2092 * 0x80, VadcLP
2093 */
2094 REG_INIT(AB8505_REGUMISC1, 0x03, 0x80, 0xfe),
2095 /*
2096 * 0x02, VaudioEna
2097 * 0x04, VdmicEna
2098 * 0x08, Vamic1Ena
2099 * 0x10, Vamic2Ena
2100 */
2101 REG_INIT(AB8505_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2102 /*
2103 * 0x01, Vamic1_dzout
2104 * 0x02, Vamic2_dzout
2105 */
2106 REG_INIT(AB8505_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2107 /*
2108 * 0x03, VsmpsARegu
2109 * 0x0c, VsmpsASelCtrl
2110 * 0x10, VsmpsAAutoMode
2111 * 0x20, VsmpsAPWMMode
2112 */
2113 REG_INIT(AB8505_VSMPSAREGU, 0x04, 0x03, 0x3f),
2114 /*
2115 * 0x03, VsmpsBRegu
2116 * 0x0c, VsmpsBSelCtrl
2117 * 0x10, VsmpsBAutoMode
2118 * 0x20, VsmpsBPWMMode
2119 */
2120 REG_INIT(AB8505_VSMPSBREGU, 0x04, 0x04, 0x3f),
2121 /*
2122 * 0x03, VsafeRegu
2123 * 0x0c, VsafeSelCtrl
2124 * 0x10, VsafeAutoMode
2125 * 0x20, VsafePWMMode
2126 */
2127 REG_INIT(AB8505_VSAFEREGU, 0x04, 0x05, 0x3f),
2128 /*
2129 * 0x03, VpllRegu (NOTE! PRCMU register bits)
2130 * 0x0c, VanaRegu
2131 */
2132 REG_INIT(AB8505_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2133 /*
2134 * 0x03, VextSupply1Regu
2135 * 0x0c, VextSupply2Regu
2136 * 0x30, VextSupply3Regu
2137 * 0x40, ExtSupply2Bypass
2138 * 0x80, ExtSupply3Bypass
2139 */
2140 REG_INIT(AB8505_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2141 /*
2142 * 0x03, Vaux1Regu
2143 * 0x0c, Vaux2Regu
2144 */
2145 REG_INIT(AB8505_VAUX12REGU, 0x04, 0x09, 0x0f),
2146 /*
2147 * 0x0f, Vaux3Regu
2148 */
2149 REG_INIT(AB8505_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2150 /*
2151 * 0x3f, VsmpsASel1
2152 */
2153 REG_INIT(AB8505_VSMPSASEL1, 0x04, 0x13, 0x3f),
2154 /*
2155 * 0x3f, VsmpsASel2
2156 */
2157 REG_INIT(AB8505_VSMPSASEL2, 0x04, 0x14, 0x3f),
2158 /*
2159 * 0x3f, VsmpsASel3
2160 */
2161 REG_INIT(AB8505_VSMPSASEL3, 0x04, 0x15, 0x3f),
2162 /*
2163 * 0x3f, VsmpsBSel1
2164 */
2165 REG_INIT(AB8505_VSMPSBSEL1, 0x04, 0x17, 0x3f),
2166 /*
2167 * 0x3f, VsmpsBSel2
2168 */
2169 REG_INIT(AB8505_VSMPSBSEL2, 0x04, 0x18, 0x3f),
2170 /*
2171 * 0x3f, VsmpsBSel3
2172 */
2173 REG_INIT(AB8505_VSMPSBSEL3, 0x04, 0x19, 0x3f),
2174 /*
2175 * 0x7f, VsafeSel1
2176 */
2177 REG_INIT(AB8505_VSAFESEL1, 0x04, 0x1b, 0x7f),
2178 /*
2179 * 0x3f, VsafeSel2
2180 */
2181 REG_INIT(AB8505_VSAFESEL2, 0x04, 0x1c, 0x7f),
2182 /*
2183 * 0x3f, VsafeSel3
2184 */
2185 REG_INIT(AB8505_VSAFESEL3, 0x04, 0x1d, 0x7f),
2186 /*
2187 * 0x0f, Vaux1Sel
2188 */
2189 REG_INIT(AB8505_VAUX1SEL, 0x04, 0x1f, 0x0f),
2190 /*
2191 * 0x0f, Vaux2Sel
2192 */
2193 REG_INIT(AB8505_VAUX2SEL, 0x04, 0x20, 0x0f),
2194 /*
2195 * 0x07, Vaux3Sel
2196 * 0x30, VRF1Sel
2197 */
2198 REG_INIT(AB8505_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2199 /*
2200 * 0x03, Vaux4RequestCtrl
2201 */
2202 REG_INIT(AB8505_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2203 /*
2204 * 0x03, Vaux4Regu
2205 */
2206 REG_INIT(AB8505_VAUX4REGU, 0x04, 0x2e, 0x03),
2207 /*
2208 * 0x0f, Vaux4Sel
2209 */
2210 REG_INIT(AB8505_VAUX4SEL, 0x04, 0x2f, 0x0f),
2211 /*
2212 * 0x04, Vaux1Disch
2213 * 0x08, Vaux2Disch
2214 * 0x10, Vaux3Disch
2215 * 0x20, Vintcore12Disch
2216 * 0x40, VTVoutDisch
2217 * 0x80, VaudioDisch
2218 */
2219 REG_INIT(AB8505_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
2220 /*
2221 * 0x02, VanaDisch
2222 * 0x04, VdmicPullDownEna
2223 * 0x10, VdmicDisch
2224 */
2225 REG_INIT(AB8505_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
2226 /*
2227 * 0x01, Vaux4Disch
2228 */
2229 REG_INIT(AB8505_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2230 /*
2231 * 0x07, Vaux5Sel
2232 * 0x08, Vaux5LP
2233 * 0x10, Vaux5Ena
2234 * 0x20, Vaux5Disch
2235 * 0x40, Vaux5DisSfst
2236 * 0x80, Vaux5DisPulld
2237 */
2238 REG_INIT(AB8505_CTRLVAUX5, 0x01, 0x55, 0xff),
2239 /*
2240 * 0x07, Vaux6Sel
2241 * 0x08, Vaux6LP
2242 * 0x10, Vaux6Ena
2243 * 0x80, Vaux6DisPulld
2244 */
2245 REG_INIT(AB8505_CTRLVAUX6, 0x01, 0x56, 0x9f),
2246};
2247
Lee Jones8e6a8d72013-03-28 16:11:11 +00002248/* AB9540 register init */
2249static struct ab8500_reg_init ab9540_reg_init[] = {
2250 /*
2251 * 0x03, VarmRequestCtrl
2252 * 0x0c, VapeRequestCtrl
2253 * 0x30, Vsmps1RequestCtrl
2254 * 0xc0, Vsmps2RequestCtrl
2255 */
2256 REG_INIT(AB9540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2257 /*
2258 * 0x03, Vsmps3RequestCtrl
2259 * 0x0c, VpllRequestCtrl
2260 * 0x30, VanaRequestCtrl
2261 * 0xc0, VextSupply1RequestCtrl
2262 */
2263 REG_INIT(AB9540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2264 /*
2265 * 0x03, VextSupply2RequestCtrl
2266 * 0x0c, VextSupply3RequestCtrl
2267 * 0x30, Vaux1RequestCtrl
2268 * 0xc0, Vaux2RequestCtrl
2269 */
2270 REG_INIT(AB9540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2271 /*
2272 * 0x03, Vaux3RequestCtrl
2273 * 0x04, SwHPReq
2274 */
2275 REG_INIT(AB9540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2276 /*
2277 * 0x01, Vsmps1SysClkReq1HPValid
2278 * 0x02, Vsmps2SysClkReq1HPValid
2279 * 0x04, Vsmps3SysClkReq1HPValid
2280 * 0x08, VanaSysClkReq1HPValid
2281 * 0x10, VpllSysClkReq1HPValid
2282 * 0x20, Vaux1SysClkReq1HPValid
2283 * 0x40, Vaux2SysClkReq1HPValid
2284 * 0x80, Vaux3SysClkReq1HPValid
2285 */
2286 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2287 /*
2288 * 0x01, VapeSysClkReq1HPValid
2289 * 0x02, VarmSysClkReq1HPValid
2290 * 0x04, VbbSysClkReq1HPValid
2291 * 0x08, VmodSysClkReq1HPValid
2292 * 0x10, VextSupply1SysClkReq1HPValid
2293 * 0x20, VextSupply2SysClkReq1HPValid
2294 * 0x40, VextSupply3SysClkReq1HPValid
2295 */
2296 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x7f),
2297 /*
2298 * 0x01, Vsmps1HwHPReq1Valid
2299 * 0x02, Vsmps2HwHPReq1Valid
2300 * 0x04, Vsmps3HwHPReq1Valid
2301 * 0x08, VanaHwHPReq1Valid
2302 * 0x10, VpllHwHPReq1Valid
2303 * 0x20, Vaux1HwHPReq1Valid
2304 * 0x40, Vaux2HwHPReq1Valid
2305 * 0x80, Vaux3HwHPReq1Valid
2306 */
2307 REG_INIT(AB9540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2308 /*
2309 * 0x01, VextSupply1HwHPReq1Valid
2310 * 0x02, VextSupply2HwHPReq1Valid
2311 * 0x04, VextSupply3HwHPReq1Valid
2312 * 0x08, VmodHwHPReq1Valid
2313 */
2314 REG_INIT(AB9540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x0f),
2315 /*
2316 * 0x01, Vsmps1HwHPReq2Valid
2317 * 0x02, Vsmps2HwHPReq2Valid
2318 * 0x03, Vsmps3HwHPReq2Valid
2319 * 0x08, VanaHwHPReq2Valid
2320 * 0x10, VpllHwHPReq2Valid
2321 * 0x20, Vaux1HwHPReq2Valid
2322 * 0x40, Vaux2HwHPReq2Valid
2323 * 0x80, Vaux3HwHPReq2Valid
2324 */
2325 REG_INIT(AB9540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2326 /*
2327 * 0x01, VextSupply1HwHPReq2Valid
2328 * 0x02, VextSupply2HwHPReq2Valid
2329 * 0x04, VextSupply3HwHPReq2Valid
2330 * 0x08, VmodHwHPReq2Valid
2331 */
2332 REG_INIT(AB9540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x0f),
2333 /*
2334 * 0x01, VapeSwHPReqValid
2335 * 0x02, VarmSwHPReqValid
2336 * 0x04, Vsmps1SwHPReqValid
2337 * 0x08, Vsmps2SwHPReqValid
2338 * 0x10, Vsmps3SwHPReqValid
2339 * 0x20, VanaSwHPReqValid
2340 * 0x40, VpllSwHPReqValid
2341 * 0x80, Vaux1SwHPReqValid
2342 */
2343 REG_INIT(AB9540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2344 /*
2345 * 0x01, Vaux2SwHPReqValid
2346 * 0x02, Vaux3SwHPReqValid
2347 * 0x04, VextSupply1SwHPReqValid
2348 * 0x08, VextSupply2SwHPReqValid
2349 * 0x10, VextSupply3SwHPReqValid
2350 * 0x20, VmodSwHPReqValid
2351 */
2352 REG_INIT(AB9540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x3f),
2353 /*
2354 * 0x02, SysClkReq2Valid1
2355 * ...
2356 * 0x80, SysClkReq8Valid1
2357 */
2358 REG_INIT(AB9540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
2359 /*
2360 * 0x02, SysClkReq2Valid2
2361 * ...
2362 * 0x80, SysClkReq8Valid2
2363 */
2364 REG_INIT(AB9540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
2365 /*
2366 * 0x01, Vaux4SwHPReqValid
2367 * 0x02, Vaux4HwHPReq2Valid
2368 * 0x04, Vaux4HwHPReq1Valid
2369 * 0x08, Vaux4SysClkReq1HPValid
2370 */
2371 REG_INIT(AB9540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2372 /*
2373 * 0x02, VTVoutEna
2374 * 0x04, Vintcore12Ena
2375 * 0x38, Vintcore12Sel
2376 * 0x40, Vintcore12LP
2377 * 0x80, VTVoutLP
2378 */
2379 REG_INIT(AB9540_REGUMISC1, 0x03, 0x80, 0xfe),
2380 /*
2381 * 0x02, VaudioEna
2382 * 0x04, VdmicEna
2383 * 0x08, Vamic1Ena
2384 * 0x10, Vamic2Ena
2385 */
2386 REG_INIT(AB9540_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2387 /*
2388 * 0x01, Vamic1_dzout
2389 * 0x02, Vamic2_dzout
2390 */
2391 REG_INIT(AB9540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2392 /*
2393 * 0x03, Vsmps1Regu
2394 * 0x0c, Vsmps1SelCtrl
2395 * 0x10, Vsmps1AutoMode
2396 * 0x20, Vsmps1PWMMode
2397 */
2398 REG_INIT(AB9540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2399 /*
2400 * 0x03, Vsmps2Regu
2401 * 0x0c, Vsmps2SelCtrl
2402 * 0x10, Vsmps2AutoMode
2403 * 0x20, Vsmps2PWMMode
2404 */
2405 REG_INIT(AB9540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2406 /*
2407 * 0x03, Vsmps3Regu
2408 * 0x0c, Vsmps3SelCtrl
2409 * NOTE! PRCMU register
2410 */
2411 REG_INIT(AB9540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2412 /*
2413 * 0x03, VpllRegu
2414 * 0x0c, VanaRegu
2415 */
2416 REG_INIT(AB9540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2417 /*
2418 * 0x03, VextSupply1Regu
2419 * 0x0c, VextSupply2Regu
2420 * 0x30, VextSupply3Regu
2421 * 0x40, ExtSupply2Bypass
2422 * 0x80, ExtSupply3Bypass
2423 */
2424 REG_INIT(AB9540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2425 /*
2426 * 0x03, Vaux1Regu
2427 * 0x0c, Vaux2Regu
2428 */
2429 REG_INIT(AB9540_VAUX12REGU, 0x04, 0x09, 0x0f),
2430 /*
2431 * 0x0c, Vrf1Regu
2432 * 0x03, Vaux3Regu
2433 */
2434 REG_INIT(AB9540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2435 /*
2436 * 0x3f, Vsmps1Sel1
2437 */
2438 REG_INIT(AB9540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2439 /*
2440 * 0x3f, Vsmps1Sel2
2441 */
2442 REG_INIT(AB9540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2443 /*
2444 * 0x3f, Vsmps1Sel3
2445 */
2446 REG_INIT(AB9540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2447 /*
2448 * 0x3f, Vsmps2Sel1
2449 */
2450 REG_INIT(AB9540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2451 /*
2452 * 0x3f, Vsmps2Sel2
2453 */
2454 REG_INIT(AB9540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2455 /*
2456 * 0x3f, Vsmps2Sel3
2457 */
2458 REG_INIT(AB9540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2459 /*
2460 * 0x7f, Vsmps3Sel1
2461 * NOTE! PRCMU register
2462 */
2463 REG_INIT(AB9540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2464 /*
2465 * 0x7f, Vsmps3Sel2
2466 * NOTE! PRCMU register
2467 */
2468 REG_INIT(AB9540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2469 /*
2470 * 0x0f, Vaux1Sel
2471 */
2472 REG_INIT(AB9540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2473 /*
2474 * 0x0f, Vaux2Sel
2475 */
2476 REG_INIT(AB9540_VAUX2SEL, 0x04, 0x20, 0x0f),
2477 /*
2478 * 0x07, Vaux3Sel
2479 * 0x30, Vrf1Sel
2480 */
2481 REG_INIT(AB9540_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2482 /*
2483 * 0x01, VextSupply12LP
2484 */
2485 REG_INIT(AB9540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2486 /*
2487 * 0x03, Vaux4RequestCtrl
2488 */
2489 REG_INIT(AB9540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2490 /*
2491 * 0x03, Vaux4Regu
2492 */
2493 REG_INIT(AB9540_VAUX4REGU, 0x04, 0x2e, 0x03),
2494 /*
2495 * 0x08, Vaux4Sel
2496 */
2497 REG_INIT(AB9540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2498 /*
2499 * 0x01, VpllDisch
2500 * 0x02, Vrf1Disch
2501 * 0x04, Vaux1Disch
2502 * 0x08, Vaux2Disch
2503 * 0x10, Vaux3Disch
2504 * 0x20, Vintcore12Disch
2505 * 0x40, VTVoutDisch
2506 * 0x80, VaudioDisch
2507 */
2508 REG_INIT(AB9540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2509 /*
2510 * 0x01, VsimDisch
2511 * 0x02, VanaDisch
2512 * 0x04, VdmicPullDownEna
2513 * 0x08, VpllPullDownEna
2514 * 0x10, VdmicDisch
2515 */
2516 REG_INIT(AB9540_REGUCTRLDISCH2, 0x04, 0x44, 0x1f),
2517 /*
2518 * 0x01, Vaux4Disch
2519 */
2520 REG_INIT(AB9540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2521};
2522
Lee Jonesae0a9a32013-03-28 16:11:16 +00002523/* AB8540 register init */
2524static struct ab8500_reg_init ab8540_reg_init[] = {
2525 /*
2526 * 0x01, VSimSycClkReq1Valid
2527 * 0x02, VSimSycClkReq2Valid
2528 * 0x04, VSimSycClkReq3Valid
2529 * 0x08, VSimSycClkReq4Valid
2530 * 0x10, VSimSycClkReq5Valid
2531 * 0x20, VSimSycClkReq6Valid
2532 * 0x40, VSimSycClkReq7Valid
2533 * 0x80, VSimSycClkReq8Valid
2534 */
2535 REG_INIT(AB8540_VSIMSYSCLKCTRL, 0x02, 0x33, 0xff),
2536 /*
2537 * 0x03, VarmRequestCtrl
2538 * 0x0c, VapeRequestCtrl
2539 * 0x30, Vsmps1RequestCtrl
2540 * 0xc0, Vsmps2RequestCtrl
2541 */
2542 REG_INIT(AB8540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2543 /*
2544 * 0x03, Vsmps3RequestCtrl
2545 * 0x0c, VpllRequestCtrl
2546 * 0x30, VanaRequestCtrl
2547 * 0xc0, VextSupply1RequestCtrl
2548 */
2549 REG_INIT(AB8540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2550 /*
2551 * 0x03, VextSupply2RequestCtrl
2552 * 0x0c, VextSupply3RequestCtrl
2553 * 0x30, Vaux1RequestCtrl
2554 * 0xc0, Vaux2RequestCtrl
2555 */
2556 REG_INIT(AB8540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2557 /*
2558 * 0x03, Vaux3RequestCtrl
2559 * 0x04, SwHPReq
2560 */
2561 REG_INIT(AB8540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2562 /*
2563 * 0x01, Vsmps1SysClkReq1HPValid
2564 * 0x02, Vsmps2SysClkReq1HPValid
2565 * 0x04, Vsmps3SysClkReq1HPValid
2566 * 0x08, VanaSysClkReq1HPValid
2567 * 0x10, VpllSysClkReq1HPValid
2568 * 0x20, Vaux1SysClkReq1HPValid
2569 * 0x40, Vaux2SysClkReq1HPValid
2570 * 0x80, Vaux3SysClkReq1HPValid
2571 */
2572 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2573 /*
2574 * 0x01, VapeSysClkReq1HPValid
2575 * 0x02, VarmSysClkReq1HPValid
2576 * 0x04, VbbSysClkReq1HPValid
2577 * 0x10, VextSupply1SysClkReq1HPValid
2578 * 0x20, VextSupply2SysClkReq1HPValid
2579 * 0x40, VextSupply3SysClkReq1HPValid
2580 */
2581 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x77),
2582 /*
2583 * 0x01, Vsmps1HwHPReq1Valid
2584 * 0x02, Vsmps2HwHPReq1Valid
2585 * 0x04, Vsmps3HwHPReq1Valid
2586 * 0x08, VanaHwHPReq1Valid
2587 * 0x10, VpllHwHPReq1Valid
2588 * 0x20, Vaux1HwHPReq1Valid
2589 * 0x40, Vaux2HwHPReq1Valid
2590 * 0x80, Vaux3HwHPReq1Valid
2591 */
2592 REG_INIT(AB8540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2593 /*
2594 * 0x01, VextSupply1HwHPReq1Valid
2595 * 0x02, VextSupply2HwHPReq1Valid
2596 * 0x04, VextSupply3HwHPReq1Valid
2597 */
2598 REG_INIT(AB8540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
2599 /*
2600 * 0x01, Vsmps1HwHPReq2Valid
2601 * 0x02, Vsmps2HwHPReq2Valid
2602 * 0x03, Vsmps3HwHPReq2Valid
2603 * 0x08, VanaHwHPReq2Valid
2604 * 0x10, VpllHwHPReq2Valid
2605 * 0x20, Vaux1HwHPReq2Valid
2606 * 0x40, Vaux2HwHPReq2Valid
2607 * 0x80, Vaux3HwHPReq2Valid
2608 */
2609 REG_INIT(AB8540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2610 /*
2611 * 0x01, VextSupply1HwHPReq2Valid
2612 * 0x02, VextSupply2HwHPReq2Valid
2613 * 0x04, VextSupply3HwHPReq2Valid
2614 */
2615 REG_INIT(AB8540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
2616 /*
2617 * 0x01, VapeSwHPReqValid
2618 * 0x02, VarmSwHPReqValid
2619 * 0x04, Vsmps1SwHPReqValid
2620 * 0x08, Vsmps2SwHPReqValid
2621 * 0x10, Vsmps3SwHPReqValid
2622 * 0x20, VanaSwHPReqValid
2623 * 0x40, VpllSwHPReqValid
2624 * 0x80, Vaux1SwHPReqValid
2625 */
2626 REG_INIT(AB8540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2627 /*
2628 * 0x01, Vaux2SwHPReqValid
2629 * 0x02, Vaux3SwHPReqValid
2630 * 0x04, VextSupply1SwHPReqValid
2631 * 0x08, VextSupply2SwHPReqValid
2632 * 0x10, VextSupply3SwHPReqValid
2633 */
2634 REG_INIT(AB8540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
2635 /*
2636 * 0x02, SysClkReq2Valid1
2637 * ...
2638 * 0x80, SysClkReq8Valid1
2639 */
2640 REG_INIT(AB8540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xff),
2641 /*
2642 * 0x02, SysClkReq2Valid2
2643 * ...
2644 * 0x80, SysClkReq8Valid2
2645 */
2646 REG_INIT(AB8540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xff),
2647 /*
2648 * 0x01, Vaux4SwHPReqValid
2649 * 0x02, Vaux4HwHPReq2Valid
2650 * 0x04, Vaux4HwHPReq1Valid
2651 * 0x08, Vaux4SysClkReq1HPValid
2652 */
2653 REG_INIT(AB8540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2654 /*
2655 * 0x01, Vaux5SwHPReqValid
2656 * 0x02, Vaux5HwHPReq2Valid
2657 * 0x04, Vaux5HwHPReq1Valid
2658 * 0x08, Vaux5SysClkReq1HPValid
2659 */
2660 REG_INIT(AB8540_REGUVAUX5REQVALID, 0x03, 0x12, 0x0f),
2661 /*
2662 * 0x01, Vaux6SwHPReqValid
2663 * 0x02, Vaux6HwHPReq2Valid
2664 * 0x04, Vaux6HwHPReq1Valid
2665 * 0x08, Vaux6SysClkReq1HPValid
2666 */
2667 REG_INIT(AB8540_REGUVAUX6REQVALID, 0x03, 0x13, 0x0f),
2668 /*
2669 * 0x01, VclkbSwHPReqValid
2670 * 0x02, VclkbHwHPReq2Valid
2671 * 0x04, VclkbHwHPReq1Valid
2672 * 0x08, VclkbSysClkReq1HPValid
2673 */
2674 REG_INIT(AB8540_REGUVCLKBREQVALID, 0x03, 0x14, 0x0f),
2675 /*
2676 * 0x01, Vrf1SwHPReqValid
2677 * 0x02, Vrf1HwHPReq2Valid
2678 * 0x04, Vrf1HwHPReq1Valid
2679 * 0x08, Vrf1SysClkReq1HPValid
2680 */
2681 REG_INIT(AB8540_REGUVRF1REQVALID, 0x03, 0x15, 0x0f),
2682 /*
2683 * 0x02, VTVoutEna
2684 * 0x04, Vintcore12Ena
2685 * 0x38, Vintcore12Sel
2686 * 0x40, Vintcore12LP
2687 * 0x80, VTVoutLP
2688 */
2689 REG_INIT(AB8540_REGUMISC1, 0x03, 0x80, 0xfe),
2690 /*
2691 * 0x02, VaudioEna
2692 * 0x04, VdmicEna
2693 * 0x08, Vamic1Ena
2694 * 0x10, Vamic2Ena
2695 * 0x20, Vamic12LP
2696 * 0xC0, VdmicSel
2697 */
2698 REG_INIT(AB8540_VAUDIOSUPPLY, 0x03, 0x83, 0xfe),
2699 /*
2700 * 0x01, Vamic1_dzout
2701 * 0x02, Vamic2_dzout
2702 */
2703 REG_INIT(AB8540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2704 /*
2705 * 0x07, VHSICSel
2706 * 0x08, VHSICOffState
2707 * 0x10, VHSIEna
2708 * 0x20, VHSICLP
2709 */
2710 REG_INIT(AB8540_VHSIC, 0x03, 0x87, 0x3f),
2711 /*
2712 * 0x07, VSDIOSel
2713 * 0x08, VSDIOOffState
2714 * 0x10, VSDIOEna
2715 * 0x20, VSDIOLP
2716 */
2717 REG_INIT(AB8540_VSDIO, 0x03, 0x88, 0x3f),
2718 /*
2719 * 0x03, Vsmps1Regu
2720 * 0x0c, Vsmps1SelCtrl
2721 * 0x10, Vsmps1AutoMode
2722 * 0x20, Vsmps1PWMMode
2723 */
2724 REG_INIT(AB8540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2725 /*
2726 * 0x03, Vsmps2Regu
2727 * 0x0c, Vsmps2SelCtrl
2728 * 0x10, Vsmps2AutoMode
2729 * 0x20, Vsmps2PWMMode
2730 */
2731 REG_INIT(AB8540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2732 /*
2733 * 0x03, Vsmps3Regu
2734 * 0x0c, Vsmps3SelCtrl
2735 * 0x10, Vsmps3AutoMode
2736 * 0x20, Vsmps3PWMMode
2737 * NOTE! PRCMU register
2738 */
2739 REG_INIT(AB8540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2740 /*
2741 * 0x03, VpllRegu
2742 * 0x0c, VanaRegu
2743 */
2744 REG_INIT(AB8540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2745 /*
2746 * 0x03, VextSupply1Regu
2747 * 0x0c, VextSupply2Regu
2748 * 0x30, VextSupply3Regu
2749 * 0x40, ExtSupply2Bypass
2750 * 0x80, ExtSupply3Bypass
2751 */
2752 REG_INIT(AB8540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2753 /*
2754 * 0x03, Vaux1Regu
2755 * 0x0c, Vaux2Regu
2756 */
2757 REG_INIT(AB8540_VAUX12REGU, 0x04, 0x09, 0x0f),
2758 /*
2759 * 0x0c, VRF1Regu
2760 * 0x03, Vaux3Regu
2761 */
2762 REG_INIT(AB8540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2763 /*
2764 * 0x3f, Vsmps1Sel1
2765 */
2766 REG_INIT(AB8540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2767 /*
2768 * 0x3f, Vsmps1Sel2
2769 */
2770 REG_INIT(AB8540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2771 /*
2772 * 0x3f, Vsmps1Sel3
2773 */
2774 REG_INIT(AB8540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2775 /*
2776 * 0x3f, Vsmps2Sel1
2777 */
2778 REG_INIT(AB8540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2779 /*
2780 * 0x3f, Vsmps2Sel2
2781 */
2782 REG_INIT(AB8540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2783 /*
2784 * 0x3f, Vsmps2Sel3
2785 */
2786 REG_INIT(AB8540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2787 /*
2788 * 0x7f, Vsmps3Sel1
2789 * NOTE! PRCMU register
2790 */
2791 REG_INIT(AB8540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2792 /*
2793 * 0x7f, Vsmps3Sel2
2794 * NOTE! PRCMU register
2795 */
2796 REG_INIT(AB8540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2797 /*
2798 * 0x0f, Vaux1Sel
2799 */
2800 REG_INIT(AB8540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2801 /*
2802 * 0x0f, Vaux2Sel
2803 */
2804 REG_INIT(AB8540_VAUX2SEL, 0x04, 0x20, 0x0f),
2805 /*
2806 * 0x07, Vaux3Sel
2807 * 0x70, Vrf1Sel
2808 */
2809 REG_INIT(AB8540_VRF1VAUX3SEL, 0x04, 0x21, 0x77),
2810 /*
2811 * 0x01, VextSupply12LP
2812 */
2813 REG_INIT(AB8540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2814 /*
2815 * 0x07, Vanasel
2816 * 0x30, Vpllsel
2817 */
2818 REG_INIT(AB8540_VANAVPLLSEL, 0x04, 0x29, 0x37),
2819 /*
2820 * 0x03, Vaux4RequestCtrl
2821 */
2822 REG_INIT(AB8540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2823 /*
2824 * 0x03, Vaux4Regu
2825 */
2826 REG_INIT(AB8540_VAUX4REGU, 0x04, 0x2e, 0x03),
2827 /*
2828 * 0x0f, Vaux4Sel
2829 */
2830 REG_INIT(AB8540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2831 /*
2832 * 0x03, Vaux5RequestCtrl
2833 */
2834 REG_INIT(AB8540_VAUX5REQCTRL, 0x04, 0x31, 0x03),
2835 /*
2836 * 0x03, Vaux5Regu
2837 */
2838 REG_INIT(AB8540_VAUX5REGU, 0x04, 0x32, 0x03),
2839 /*
2840 * 0x3f, Vaux5Sel
2841 */
2842 REG_INIT(AB8540_VAUX5SEL, 0x04, 0x33, 0x3f),
2843 /*
2844 * 0x03, Vaux6RequestCtrl
2845 */
2846 REG_INIT(AB8540_VAUX6REQCTRL, 0x04, 0x34, 0x03),
2847 /*
2848 * 0x03, Vaux6Regu
2849 */
2850 REG_INIT(AB8540_VAUX6REGU, 0x04, 0x35, 0x03),
2851 /*
2852 * 0x3f, Vaux6Sel
2853 */
2854 REG_INIT(AB8540_VAUX6SEL, 0x04, 0x36, 0x3f),
2855 /*
2856 * 0x03, VCLKBRequestCtrl
2857 */
2858 REG_INIT(AB8540_VCLKBREQCTRL, 0x04, 0x37, 0x03),
2859 /*
2860 * 0x03, VCLKBRegu
2861 */
2862 REG_INIT(AB8540_VCLKBREGU, 0x04, 0x38, 0x03),
2863 /*
2864 * 0x07, VCLKBSel
2865 */
2866 REG_INIT(AB8540_VCLKBSEL, 0x04, 0x39, 0x07),
2867 /*
2868 * 0x03, Vrf1RequestCtrl
2869 */
2870 REG_INIT(AB8540_VRF1REQCTRL, 0x04, 0x3a, 0x03),
2871 /*
2872 * 0x01, VpllDisch
2873 * 0x02, Vrf1Disch
2874 * 0x04, Vaux1Disch
2875 * 0x08, Vaux2Disch
2876 * 0x10, Vaux3Disch
2877 * 0x20, Vintcore12Disch
2878 * 0x40, VTVoutDisch
2879 * 0x80, VaudioDisch
2880 */
2881 REG_INIT(AB8540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2882 /*
2883 * 0x02, VanaDisch
2884 * 0x04, VdmicPullDownEna
2885 * 0x08, VpllPullDownEna
2886 * 0x10, VdmicDisch
2887 */
2888 REG_INIT(AB8540_REGUCTRLDISCH2, 0x04, 0x44, 0x1e),
2889 /*
2890 * 0x01, Vaux4Disch
2891 */
2892 REG_INIT(AB8540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2893 /*
2894 * 0x01, Vaux5Disch
2895 * 0x02, Vaux6Disch
2896 * 0x04, VCLKBDisch
2897 */
2898 REG_INIT(AB8540_REGUCTRLDISCH4, 0x04, 0x49, 0x07),
2899};
2900
Lee Jonesda45edc2013-04-02 13:24:20 +01002901static struct of_regulator_match ab8500_regulator_match[] = {
2902 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8500_LDO_AUX1, },
2903 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8500_LDO_AUX2, },
2904 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8500_LDO_AUX3, },
2905 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, },
2906 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8500_LDO_TVOUT, },
2907 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8500_LDO_AUDIO, },
2908 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, },
2909 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, },
2910 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8500_LDO_DMIC, },
2911 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8500_LDO_ANA, },
2912};
2913
2914static struct of_regulator_match ab8505_regulator_match[] = {
2915 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8505_LDO_AUX1, },
2916 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8505_LDO_AUX2, },
2917 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8505_LDO_AUX3, },
2918 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8505_LDO_AUX4, },
2919 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8505_LDO_AUX5, },
2920 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8505_LDO_AUX6, },
2921 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8505_LDO_INTCORE, },
2922 { .name = "ab8500_ldo_adc", .driver_data = (void *) AB8505_LDO_ADC, },
2923 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8505_LDO_AUDIO, },
2924 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8505_LDO_ANAMIC1, },
2925 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8505_LDO_ANAMIC2, },
2926 { .name = "ab8500_ldo_aux8", .driver_data = (void *) AB8505_LDO_AUX8, },
2927 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8505_LDO_ANA, },
2928};
2929
2930static struct of_regulator_match ab8540_regulator_match[] = {
2931 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8540_LDO_AUX1, },
2932 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8540_LDO_AUX2, },
2933 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8540_LDO_AUX3, },
2934 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8540_LDO_AUX4, },
2935 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8540_LDO_AUX5, },
2936 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8540_LDO_AUX6, },
2937 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8540_LDO_INTCORE, },
2938 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8540_LDO_TVOUT, },
2939 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8540_LDO_AUDIO, },
2940 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8540_LDO_ANAMIC1, },
2941 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8540_LDO_ANAMIC2, },
2942 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8540_LDO_DMIC, },
2943 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8540_LDO_ANA, },
2944 { .name = "ab8500_ldo_sdio", .driver_data = (void *) AB8540_LDO_SDIO, },
2945};
2946
2947static struct of_regulator_match ab9540_regulator_match[] = {
2948 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB9540_LDO_AUX1, },
2949 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB9540_LDO_AUX2, },
2950 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB9540_LDO_AUX3, },
2951 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB9540_LDO_AUX4, },
2952 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB9540_LDO_INTCORE, },
2953 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB9540_LDO_TVOUT, },
2954 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB9540_LDO_AUDIO, },
2955 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB9540_LDO_ANAMIC1, },
2956 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB9540_LDO_ANAMIC2, },
2957 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB9540_LDO_DMIC, },
2958 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB9540_LDO_ANA, },
2959};
2960
Lee Jones33aeb492013-04-02 13:24:14 +01002961static struct {
2962 struct ab8500_regulator_info *info;
2963 int info_size;
2964 struct ab8500_reg_init *init;
2965 int init_size;
2966 struct of_regulator_match *match;
2967 int match_size;
2968} abx500_regulator;
2969
Lee Jonesda45edc2013-04-02 13:24:20 +01002970static void abx500_get_regulator_info(struct ab8500 *ab8500)
2971{
2972 if (is_ab9540(ab8500)) {
2973 abx500_regulator.info = ab9540_regulator_info;
2974 abx500_regulator.info_size = ARRAY_SIZE(ab9540_regulator_info);
2975 abx500_regulator.init = ab9540_reg_init;
2976 abx500_regulator.init_size = AB9540_NUM_REGULATOR_REGISTERS;
2977 abx500_regulator.match = ab9540_regulator_match;
2978 abx500_regulator.match_size = ARRAY_SIZE(ab9540_regulator_match);
2979 } else if (is_ab8505(ab8500)) {
2980 abx500_regulator.info = ab8505_regulator_info;
2981 abx500_regulator.info_size = ARRAY_SIZE(ab8505_regulator_info);
2982 abx500_regulator.init = ab8505_reg_init;
2983 abx500_regulator.init_size = AB8505_NUM_REGULATOR_REGISTERS;
2984 abx500_regulator.match = ab8505_regulator_match;
2985 abx500_regulator.match_size = ARRAY_SIZE(ab8505_regulator_match);
2986 } else if (is_ab8540(ab8500)) {
2987 abx500_regulator.info = ab8540_regulator_info;
2988 abx500_regulator.info_size = ARRAY_SIZE(ab8540_regulator_info);
2989 abx500_regulator.init = ab8540_reg_init;
2990 abx500_regulator.init_size = AB8540_NUM_REGULATOR_REGISTERS;
2991 abx500_regulator.match = ab8540_regulator_match;
2992 abx500_regulator.match_size = ARRAY_SIZE(ab8540_regulator_match);
2993 } else {
2994 abx500_regulator.info = ab8500_regulator_info;
2995 abx500_regulator.info_size = ARRAY_SIZE(ab8500_regulator_info);
2996 abx500_regulator.init = ab8500_reg_init;
2997 abx500_regulator.init_size = AB8500_NUM_REGULATOR_REGISTERS;
2998 abx500_regulator.match = ab8500_regulator_match;
2999 abx500_regulator.match_size = ARRAY_SIZE(ab8500_regulator_match);
3000 }
3001}
3002
Lee Jones3c1b8432013-03-21 15:59:01 +00003003static int ab8500_regulator_init_registers(struct platform_device *pdev,
3004 int id, int mask, int value)
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003005{
Lee Jones33aeb492013-04-02 13:24:14 +01003006 struct ab8500_reg_init *reg_init = abx500_regulator.init;
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003007 int err;
3008
Lee Jones3c1b8432013-03-21 15:59:01 +00003009 BUG_ON(value & ~mask);
Lee Jonesb54969a2013-03-28 16:11:10 +00003010 BUG_ON(mask & ~reg_init[id].mask);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003011
Lee Jones3c1b8432013-03-21 15:59:01 +00003012 /* initialize register */
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003013 err = abx500_mask_and_set_register_interruptible(
3014 &pdev->dev,
Lee Jonesb54969a2013-03-28 16:11:10 +00003015 reg_init[id].bank,
3016 reg_init[id].addr,
Lee Jones3c1b8432013-03-21 15:59:01 +00003017 mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003018 if (err < 0) {
3019 dev_err(&pdev->dev,
3020 "Failed to initialize 0x%02x, 0x%02x.\n",
Lee Jonesb54969a2013-03-28 16:11:10 +00003021 reg_init[id].bank,
3022 reg_init[id].addr);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003023 return err;
3024 }
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003025 dev_vdbg(&pdev->dev,
Lee Jones3c1b8432013-03-21 15:59:01 +00003026 " init: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
Lee Jonesb54969a2013-03-28 16:11:10 +00003027 reg_init[id].bank,
3028 reg_init[id].addr,
Lee Jones3c1b8432013-03-21 15:59:01 +00003029 mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003030
3031 return 0;
3032}
3033
Bill Pembertona5023572012-11-19 13:22:22 -05003034static int ab8500_regulator_register(struct platform_device *pdev,
Lee Jonesb54969a2013-03-28 16:11:10 +00003035 struct regulator_init_data *init_data,
Lee Jonesb54969a2013-03-28 16:11:10 +00003036 int id, struct device_node *np)
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003037{
Lee Jones8e6a8d72013-03-28 16:11:11 +00003038 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003039 struct ab8500_regulator_info *info = NULL;
3040 struct regulator_config config = { };
3041 int err;
3042
3043 /* assign per-regulator data */
Lee Jones33aeb492013-04-02 13:24:14 +01003044 info = &abx500_regulator.info[id];
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003045 info->dev = &pdev->dev;
3046
3047 config.dev = &pdev->dev;
3048 config.init_data = init_data;
3049 config.driver_data = info;
3050 config.of_node = np;
3051
3052 /* fix for hardware before ab8500v2.0 */
Lee Jones8e6a8d72013-03-28 16:11:11 +00003053 if (is_ab8500_1p1_or_earlier(ab8500)) {
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003054 if (info->desc.id == AB8500_LDO_AUX3) {
3055 info->desc.n_voltages =
3056 ARRAY_SIZE(ldo_vauxn_voltages);
Axel Linec1cc4d2012-05-20 10:33:35 +08003057 info->desc.volt_table = ldo_vauxn_voltages;
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003058 info->voltage_mask = 0xf;
3059 }
3060 }
3061
3062 /* register regulator with framework */
3063 info->regulator = regulator_register(&info->desc, &config);
3064 if (IS_ERR(info->regulator)) {
3065 err = PTR_ERR(info->regulator);
3066 dev_err(&pdev->dev, "failed to register regulator %s\n",
3067 info->desc.name);
3068 /* when we fail, un-register all earlier regulators */
3069 while (--id >= 0) {
Lee Jones33aeb492013-04-02 13:24:14 +01003070 info = &abx500_regulator.info[id];
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003071 regulator_unregister(info->regulator);
3072 }
3073 return err;
3074 }
3075
3076 return 0;
3077}
3078
Bill Pembertona5023572012-11-19 13:22:22 -05003079static int
Lee Jonesb54969a2013-03-28 16:11:10 +00003080ab8500_regulator_of_probe(struct platform_device *pdev,
Lee Jonesb54969a2013-03-28 16:11:10 +00003081 struct device_node *np)
Lee Jones3a8334b2012-05-17 14:45:16 +01003082{
Lee Jones33aeb492013-04-02 13:24:14 +01003083 struct of_regulator_match *match = abx500_regulator.match;
Lee Jones3a8334b2012-05-17 14:45:16 +01003084 int err, i;
3085
Lee Jones33aeb492013-04-02 13:24:14 +01003086 for (i = 0; i < abx500_regulator.info_size; i++) {
Lee Jones3a8334b2012-05-17 14:45:16 +01003087 err = ab8500_regulator_register(
Lee Jones33aeb492013-04-02 13:24:14 +01003088 pdev, match[i].init_data, i, match[i].of_node);
Lee Jones3a8334b2012-05-17 14:45:16 +01003089 if (err)
3090 return err;
3091 }
3092
3093 return 0;
3094}
3095
Bill Pembertona5023572012-11-19 13:22:22 -05003096static int ab8500_regulator_probe(struct platform_device *pdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303097{
3098 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Lee Jones3a8334b2012-05-17 14:45:16 +01003099 struct device_node *np = pdev->dev.of_node;
Bengt Jonsson732805a2013-03-21 15:59:03 +00003100 struct ab8500_platform_data *ppdata;
3101 struct ab8500_regulator_platform_data *pdata;
Sundar R IYERc789ca22010-07-13 21:48:56 +05303102 int i, err;
Lee Jonesb54969a2013-03-28 16:11:10 +00003103
Lee Jones33aeb492013-04-02 13:24:14 +01003104 if (!ab8500) {
3105 dev_err(&pdev->dev, "null mfd parent\n");
3106 return -EINVAL;
Lee Jones8e6a8d72013-03-28 16:11:11 +00003107 }
Sundar R IYERc789ca22010-07-13 21:48:56 +05303108
Lee Jones33aeb492013-04-02 13:24:14 +01003109 abx500_get_regulator_info(ab8500);
3110
Lee Jones3a8334b2012-05-17 14:45:16 +01003111 if (np) {
Lee Jones33aeb492013-04-02 13:24:14 +01003112 err = of_regulator_match(&pdev->dev, np,
3113 abx500_regulator.match,
3114 abx500_regulator.match_size);
Lee Jones3a8334b2012-05-17 14:45:16 +01003115 if (err < 0) {
3116 dev_err(&pdev->dev,
3117 "Error parsing regulator init data: %d\n", err);
3118 return err;
3119 }
3120
Lee Jones33aeb492013-04-02 13:24:14 +01003121 err = ab8500_regulator_of_probe(pdev, np);
Lee Jones3a8334b2012-05-17 14:45:16 +01003122 return err;
3123 }
3124
Bengt Jonsson732805a2013-03-21 15:59:03 +00003125 ppdata = dev_get_platdata(ab8500->dev);
3126 if (!ppdata) {
3127 dev_err(&pdev->dev, "null parent pdata\n");
3128 return -EINVAL;
3129 }
3130
3131 pdata = ppdata->regulator;
Bengt Jonssonfc24b422010-12-10 11:08:45 +01003132 if (!pdata) {
3133 dev_err(&pdev->dev, "null pdata\n");
3134 return -EINVAL;
3135 }
Sundar R IYERc789ca22010-07-13 21:48:56 +05303136
Bengt Jonssoncb189b02010-12-10 11:08:40 +01003137 /* make sure the platform data has the correct size */
Lee Jones33aeb492013-04-02 13:24:14 +01003138 if (pdata->num_regulator != abx500_regulator.info_size) {
Bengt Jonsson79568b942011-03-11 11:54:46 +01003139 dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
Bengt Jonssoncb189b02010-12-10 11:08:40 +01003140 return -EINVAL;
3141 }
3142
Lee Jonesda0b0c42013-03-28 16:11:09 +00003143 /* initialize debug (initial state is recorded with this call) */
3144 err = ab8500_regulator_debug_init(pdev);
3145 if (err)
3146 return err;
3147
Bengt Jonsson79568b942011-03-11 11:54:46 +01003148 /* initialize registers */
Bengt Jonsson732805a2013-03-21 15:59:03 +00003149 for (i = 0; i < pdata->num_reg_init; i++) {
Lee Jones3c1b8432013-03-21 15:59:01 +00003150 int id, mask, value;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003151
Bengt Jonsson732805a2013-03-21 15:59:03 +00003152 id = pdata->reg_init[i].id;
3153 mask = pdata->reg_init[i].mask;
3154 value = pdata->reg_init[i].value;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003155
3156 /* check for configuration errors */
Lee Jones33aeb492013-04-02 13:24:14 +01003157 BUG_ON(id >= abx500_regulator.init_size);
Bengt Jonsson79568b942011-03-11 11:54:46 +01003158
Lee Jones33aeb492013-04-02 13:24:14 +01003159 err = ab8500_regulator_init_registers(pdev, id, mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003160 if (err < 0)
Bengt Jonsson79568b942011-03-11 11:54:46 +01003161 return err;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003162 }
3163
Rabin Vincentf7eae372013-04-02 13:24:08 +01003164 if (!is_ab8505(ab8500)) {
3165 /* register external regulators (before Vaux1, 2 and 3) */
3166 err = ab8500_ext_regulator_init(pdev);
3167 if (err)
3168 return err;
3169 }
Lee Jonesd1a82002013-03-28 16:11:01 +00003170
Sundar R IYERc789ca22010-07-13 21:48:56 +05303171 /* register all regulators */
Lee Jones33aeb492013-04-02 13:24:14 +01003172 for (i = 0; i < abx500_regulator.info_size; i++) {
Lee Jonesb54969a2013-03-28 16:11:10 +00003173 err = ab8500_regulator_register(pdev, &pdata->regulator[i],
Lee Jones33aeb492013-04-02 13:24:14 +01003174 i, NULL);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003175 if (err < 0)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303176 return err;
Sundar R IYERc789ca22010-07-13 21:48:56 +05303177 }
3178
3179 return 0;
3180}
3181
Bill Pemberton8dc995f2012-11-19 13:26:10 -05003182static int ab8500_regulator_remove(struct platform_device *pdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303183{
Lee Jonesd1a82002013-03-28 16:11:01 +00003184 int i, err;
Lee Jones8e6a8d72013-03-28 16:11:11 +00003185 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Sundar R IYERc789ca22010-07-13 21:48:56 +05303186
Lee Jones33aeb492013-04-02 13:24:14 +01003187 for (i = 0; i < abx500_regulator.info_size; i++) {
Sundar R IYERc789ca22010-07-13 21:48:56 +05303188 struct ab8500_regulator_info *info = NULL;
Lee Jones33aeb492013-04-02 13:24:14 +01003189 info = &abx500_regulator.info[i];
Bengt Jonsson09aefa12010-12-10 11:08:46 +01003190
3191 dev_vdbg(rdev_get_dev(info->regulator),
3192 "%s-remove\n", info->desc.name);
3193
Sundar R IYERc789ca22010-07-13 21:48:56 +05303194 regulator_unregister(info->regulator);
3195 }
3196
Rabin Vincentf7eae372013-04-02 13:24:08 +01003197 if (!is_ab8505(ab8500)) {
3198 /* remove external regulators (after Vaux1, 2 and 3) */
3199 err = ab8500_ext_regulator_exit(pdev);
3200 if (err)
3201 return err;
3202 }
Lee Jonesd1a82002013-03-28 16:11:01 +00003203
Lee Jonesda0b0c42013-03-28 16:11:09 +00003204 /* remove regulator debug */
3205 err = ab8500_regulator_debug_exit(pdev);
3206 if (err)
3207 return err;
3208
Sundar R IYERc789ca22010-07-13 21:48:56 +05303209 return 0;
3210}
3211
3212static struct platform_driver ab8500_regulator_driver = {
3213 .probe = ab8500_regulator_probe,
Bill Pemberton5eb9f2b2012-11-19 13:20:42 -05003214 .remove = ab8500_regulator_remove,
Sundar R IYERc789ca22010-07-13 21:48:56 +05303215 .driver = {
3216 .name = "ab8500-regulator",
3217 .owner = THIS_MODULE,
Sundar R IYERc789ca22010-07-13 21:48:56 +05303218 },
3219};
3220
3221static int __init ab8500_regulator_init(void)
3222{
3223 int ret;
3224
3225 ret = platform_driver_register(&ab8500_regulator_driver);
3226 if (ret != 0)
3227 pr_err("Failed to register ab8500 regulator: %d\n", ret);
3228
3229 return ret;
3230}
3231subsys_initcall(ab8500_regulator_init);
3232
3233static void __exit ab8500_regulator_exit(void)
3234{
3235 platform_driver_unregister(&ab8500_regulator_driver);
3236}
3237module_exit(ab8500_regulator_exit);
3238
3239MODULE_LICENSE("GPL v2");
3240MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
Bengt Jonsson732805a2013-03-21 15:59:03 +00003241MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
Lee Jones547f3842013-03-28 16:11:14 +00003242MODULE_AUTHOR("Daniel Willerud <daniel.willerud@stericsson.com>");
Sundar R IYERc789ca22010-07-13 21:48:56 +05303243MODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
3244MODULE_ALIAS("platform:ab8500-regulator");