blob: 433cac4396df056ace0ba1611d35138093586d6a [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
Emeric Vigierbd28a152013-03-21 15:58:59 +000049 * @is_enabled: status of regulator (on/off)
Bengt Jonsson7ce46692013-03-21 15:59:00 +000050 * @load_lp_uA: maximum load in idle (low power) mode
Mattias Wallin47c16972010-09-10 17:47:56 +020051 * @update_bank: bank to control on/off
Sundar R IYERc789ca22010-07-13 21:48:56 +053052 * @update_reg: register to control on/off
Emeric Vigierbd28a152013-03-21 15:58:59 +000053 * @update_mask: mask to enable/disable and set mode of regulator
54 * @update_val: bits holding the regulator current mode
55 * @update_val_idle: bits to enable the regulator in idle (low power) mode
56 * @update_val_normal: bits to enable the regulator in normal (high power) mode
Lee Jones3fe52282013-04-02 13:24:12 +010057 * @mode_bank: bank with location of mode register
58 * @mode_reg: mode register
59 * @mode_mask: mask for setting mode
60 * @mode_val_idle: mode setting for low power
61 * @mode_val_normal: mode setting for normal power
Mattias Wallin47c16972010-09-10 17:47:56 +020062 * @voltage_bank: bank to control regulator voltage
Sundar R IYERc789ca22010-07-13 21:48:56 +053063 * @voltage_reg: register to control regulator voltage
64 * @voltage_mask: mask to control regulator voltage
Linus Walleija0a70142012-08-20 18:41:35 +020065 * @voltage_shift: shift to control regulator voltage
Sundar R IYERc789ca22010-07-13 21:48:56 +053066 */
67struct ab8500_regulator_info {
68 struct device *dev;
69 struct regulator_desc desc;
Sundar R IYERc789ca22010-07-13 21:48:56 +053070 struct regulator_dev *regulator;
Lee Jones3fe52282013-04-02 13:24:12 +010071 struct ab8500_shared_mode *shared_mode;
Emeric Vigierbd28a152013-03-21 15:58:59 +000072 bool is_enabled;
Bengt Jonsson7ce46692013-03-21 15:59:00 +000073 int load_lp_uA;
Mattias Wallin47c16972010-09-10 17:47:56 +020074 u8 update_bank;
75 u8 update_reg;
Bengt Jonssone1159e62010-12-10 11:08:44 +010076 u8 update_mask;
Emeric Vigierbd28a152013-03-21 15:58:59 +000077 u8 update_val;
78 u8 update_val_idle;
79 u8 update_val_normal;
Lee Jones3fe52282013-04-02 13:24:12 +010080 u8 mode_bank;
81 u8 mode_reg;
82 u8 mode_mask;
83 u8 mode_val_idle;
84 u8 mode_val_normal;
Mattias Wallin47c16972010-09-10 17:47:56 +020085 u8 voltage_bank;
86 u8 voltage_reg;
87 u8 voltage_mask;
Linus Walleija0a70142012-08-20 18:41:35 +020088 u8 voltage_shift;
Lee Jonesd7607ba2013-04-02 13:24:11 +010089 struct {
90 u8 voltage_limit;
91 u8 voltage_bank;
92 u8 voltage_reg;
93 u8 voltage_mask;
94 u8 voltage_shift;
95 } expand_register;
Sundar R IYERc789ca22010-07-13 21:48:56 +053096};
97
98/* voltage tables for the vauxn/vintcore supplies */
Axel Linec1cc4d2012-05-20 10:33:35 +080099static const unsigned int ldo_vauxn_voltages[] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530100 1100000,
101 1200000,
102 1300000,
103 1400000,
104 1500000,
105 1800000,
106 1850000,
107 1900000,
108 2500000,
109 2650000,
110 2700000,
111 2750000,
112 2800000,
113 2900000,
114 3000000,
115 3300000,
116};
117
Axel Linec1cc4d2012-05-20 10:33:35 +0800118static const unsigned int ldo_vaux3_voltages[] = {
Bengt Jonsson2b751512010-12-10 11:08:43 +0100119 1200000,
120 1500000,
121 1800000,
122 2100000,
123 2500000,
124 2750000,
125 2790000,
126 2910000,
127};
128
Lee Jones62ab4112013-03-28 16:11:18 +0000129static const unsigned int ldo_vaux56_voltages[] = {
Lee Jones547f3842013-03-28 16:11:14 +0000130 1800000,
131 1050000,
132 1100000,
133 1200000,
134 1500000,
135 2200000,
136 2500000,
137 2790000,
138};
139
Lee Jones62ab4112013-03-28 16:11:18 +0000140static const unsigned int ldo_vaux3_ab8540_voltages[] = {
Lee Jonesae0a9a32013-03-28 16:11:16 +0000141 1200000,
142 1500000,
143 1800000,
144 2100000,
145 2500000,
146 2750000,
147 2790000,
148 2910000,
149 3050000,
150};
151
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +0100152static const unsigned int ldo_vaux56_ab8540_voltages[] = {
153 750000, 760000, 770000, 780000, 790000, 800000,
154 810000, 820000, 830000, 840000, 850000, 860000,
155 870000, 880000, 890000, 900000, 910000, 920000,
156 930000, 940000, 950000, 960000, 970000, 980000,
157 990000, 1000000, 1010000, 1020000, 1030000,
158 1040000, 1050000, 1060000, 1070000, 1080000,
159 1090000, 1100000, 1110000, 1120000, 1130000,
160 1140000, 1150000, 1160000, 1170000, 1180000,
161 1190000, 1200000, 1210000, 1220000, 1230000,
162 1240000, 1250000, 1260000, 1270000, 1280000,
163 1290000, 1300000, 1310000, 1320000, 1330000,
164 1340000, 1350000, 1360000, 1800000, 2790000,
165};
166
Axel Linec1cc4d2012-05-20 10:33:35 +0800167static const unsigned int ldo_vintcore_voltages[] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530168 1200000,
169 1225000,
170 1250000,
171 1275000,
172 1300000,
173 1325000,
174 1350000,
175};
176
Lee Jones62ab4112013-03-28 16:11:18 +0000177static const unsigned int ldo_sdio_voltages[] = {
Lee Jonesae0a9a32013-03-28 16:11:16 +0000178 1160000,
179 1050000,
180 1100000,
181 1500000,
182 1800000,
183 2200000,
184 2910000,
185 3050000,
186};
187
Lee Jonesb080c782013-03-28 16:11:17 +0000188static const unsigned int fixed_1200000_voltage[] = {
189 1200000,
190};
191
192static const unsigned int fixed_1800000_voltage[] = {
193 1800000,
194};
195
196static const unsigned int fixed_2000000_voltage[] = {
197 2000000,
198};
199
200static const unsigned int fixed_2050000_voltage[] = {
201 2050000,
202};
203
204static const unsigned int fixed_3300000_voltage[] = {
205 3300000,
206};
207
Lee Jones8a3b1b82013-04-02 13:24:09 +0100208static const unsigned int ldo_vana_voltages[] = {
209 1050000,
210 1075000,
211 1100000,
212 1125000,
213 1150000,
214 1175000,
215 1200000,
216 1225000,
217};
218
219static const unsigned int ldo_vaudio_voltages[] = {
220 2000000,
221 2100000,
222 2200000,
223 2300000,
224 2400000,
225 2500000,
226 2600000,
227 2600000, /* Duplicated in Vaudio and IsoUicc Control register. */
228};
229
Lee Jones4c84b4d2013-04-02 13:24:13 +0100230static const unsigned int ldo_vdmic_voltages[] = {
231 1800000,
232 1900000,
233 2000000,
234 2850000,
235};
236
Lee Jones3fe52282013-04-02 13:24:12 +0100237static DEFINE_MUTEX(shared_mode_mutex);
238static struct ab8500_shared_mode ldo_anamic1_shared;
239static struct ab8500_shared_mode ldo_anamic2_shared;
Lee Jones4c84b4d2013-04-02 13:24:13 +0100240static struct ab8500_shared_mode ab8540_ldo_anamic1_shared;
241static struct ab8500_shared_mode ab8540_ldo_anamic2_shared;
Lee Jones3fe52282013-04-02 13:24:12 +0100242
Sundar R IYERc789ca22010-07-13 21:48:56 +0530243static int ab8500_regulator_enable(struct regulator_dev *rdev)
244{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100245 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530246 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
247
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100248 if (info == NULL) {
249 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530250 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100251 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530252
Mattias Wallin47c16972010-09-10 17:47:56 +0200253 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonssone1159e62010-12-10 11:08:44 +0100254 info->update_bank, info->update_reg,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000255 info->update_mask, info->update_val);
Axel Linf71bf522013-03-26 16:13:14 +0800256 if (ret < 0) {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530257 dev_err(rdev_get_dev(rdev),
258 "couldn't set enable bits for regulator\n");
Axel Linf71bf522013-03-26 16:13:14 +0800259 return ret;
260 }
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100261
Emeric Vigierbd28a152013-03-21 15:58:59 +0000262 info->is_enabled = true;
263
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100264 dev_vdbg(rdev_get_dev(rdev),
265 "%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
266 info->desc.name, info->update_bank, info->update_reg,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000267 info->update_mask, info->update_val);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100268
Sundar R IYERc789ca22010-07-13 21:48:56 +0530269 return ret;
270}
271
272static int ab8500_regulator_disable(struct regulator_dev *rdev)
273{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100274 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530275 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
276
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100277 if (info == NULL) {
278 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530279 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100280 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530281
Mattias Wallin47c16972010-09-10 17:47:56 +0200282 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonssone1159e62010-12-10 11:08:44 +0100283 info->update_bank, info->update_reg,
284 info->update_mask, 0x0);
Axel Linf71bf522013-03-26 16:13:14 +0800285 if (ret < 0) {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530286 dev_err(rdev_get_dev(rdev),
287 "couldn't set disable bits for regulator\n");
Axel Linf71bf522013-03-26 16:13:14 +0800288 return ret;
289 }
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100290
Emeric Vigierbd28a152013-03-21 15:58:59 +0000291 info->is_enabled = false;
292
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100293 dev_vdbg(rdev_get_dev(rdev),
294 "%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
295 info->desc.name, info->update_bank, info->update_reg,
296 info->update_mask, 0x0);
297
Sundar R IYERc789ca22010-07-13 21:48:56 +0530298 return ret;
299}
300
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000301static unsigned int ab8500_regulator_get_optimum_mode(
302 struct regulator_dev *rdev, int input_uV,
303 int output_uV, int load_uA)
304{
305 unsigned int mode;
306
307 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
308
309 if (info == NULL) {
310 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
311 return -EINVAL;
312 }
313
314 if (load_uA <= info->load_lp_uA)
315 mode = REGULATOR_MODE_IDLE;
316 else
317 mode = REGULATOR_MODE_NORMAL;
318
319 return mode;
320}
321
Emeric Vigierbd28a152013-03-21 15:58:59 +0000322static int ab8500_regulator_set_mode(struct regulator_dev *rdev,
323 unsigned int mode)
324{
Lee Jones3fe52282013-04-02 13:24:12 +0100325 int ret = 0;
326 u8 bank;
327 u8 reg;
328 u8 mask;
329 u8 val;
330 bool dmr = false; /* Dedicated mode register */
Emeric Vigierbd28a152013-03-21 15:58:59 +0000331 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
332
333 if (info == NULL) {
334 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
335 return -EINVAL;
336 }
337
Lee Jones3fe52282013-04-02 13:24:12 +0100338 if (info->shared_mode) {
339 /*
340 * Special case where mode is shared between two regulators.
341 */
342 struct ab8500_shared_mode *sm = info->shared_mode;
343 mutex_lock(&shared_mode_mutex);
344
345 if (mode == REGULATOR_MODE_IDLE) {
346 sm->lp_mode_req = true; /* Low power mode requested */
347 if (!((sm->shared_regulator)->
348 shared_mode->lp_mode_req)) {
349 mutex_unlock(&shared_mode_mutex);
350 return 0; /* Other regulator prevent LP mode */
351 }
352 } else {
353 sm->lp_mode_req = false;
354 }
Emeric Vigierbd28a152013-03-21 15:58:59 +0000355 }
356
Lee Jones3fe52282013-04-02 13:24:12 +0100357 if (info->mode_mask) {
358 /* Dedicated register for handling mode */
359
360 dmr = true;
361
362 switch (mode) {
363 case REGULATOR_MODE_NORMAL:
364 val = info->mode_val_normal;
365 break;
366 case REGULATOR_MODE_IDLE:
367 val = info->mode_val_idle;
368 break;
369 default:
370 if (info->shared_mode)
371 mutex_unlock(&shared_mode_mutex);
372 return -EINVAL;
373 }
374
375 bank = info->mode_bank;
376 reg = info->mode_reg;
377 mask = info->mode_mask;
378 } else {
379 /* Mode register same as enable register */
380
381 switch (mode) {
382 case REGULATOR_MODE_NORMAL:
383 info->update_val = info->update_val_normal;
384 val = info->update_val_normal;
385 break;
386 case REGULATOR_MODE_IDLE:
387 info->update_val = info->update_val_idle;
388 val = info->update_val_idle;
389 break;
390 default:
391 if (info->shared_mode)
392 mutex_unlock(&shared_mode_mutex);
393 return -EINVAL;
394 }
395
396 bank = info->update_bank;
397 reg = info->update_reg;
398 mask = info->update_mask;
399 }
400
401 if (info->is_enabled || dmr) {
Emeric Vigierbd28a152013-03-21 15:58:59 +0000402 ret = abx500_mask_and_set_register_interruptible(info->dev,
Lee Jones3fe52282013-04-02 13:24:12 +0100403 bank, reg, mask, val);
404 if (ret < 0)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000405 dev_err(rdev_get_dev(rdev),
406 "couldn't set regulator mode\n");
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000407
408 dev_vdbg(rdev_get_dev(rdev),
409 "%s-set_mode (bank, reg, mask, value): "
410 "0x%x, 0x%x, 0x%x, 0x%x\n",
Lee Jones3fe52282013-04-02 13:24:12 +0100411 info->desc.name, bank, reg,
412 mask, val);
Emeric Vigierbd28a152013-03-21 15:58:59 +0000413 }
414
Lee Jones3fe52282013-04-02 13:24:12 +0100415 if (info->shared_mode)
416 mutex_unlock(&shared_mode_mutex);
Axel Lin742a7322013-03-28 17:23:00 +0800417
Lee Jones3fe52282013-04-02 13:24:12 +0100418 return ret;
Emeric Vigierbd28a152013-03-21 15:58:59 +0000419}
420
421static unsigned int ab8500_regulator_get_mode(struct regulator_dev *rdev)
422{
423 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
424 int ret;
Lee Jones3fe52282013-04-02 13:24:12 +0100425 u8 val;
426 u8 val_normal;
427 u8 val_idle;
Emeric Vigierbd28a152013-03-21 15:58:59 +0000428
429 if (info == NULL) {
430 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
431 return -EINVAL;
432 }
433
Lee Jones3fe52282013-04-02 13:24:12 +0100434 /* Need special handling for shared mode */
435 if (info->shared_mode) {
436 if (info->shared_mode->lp_mode_req)
437 return REGULATOR_MODE_IDLE;
438 else
439 return REGULATOR_MODE_NORMAL;
440 }
441
442 if (info->mode_mask) {
443 /* Dedicated register for handling mode */
444 ret = abx500_get_register_interruptible(info->dev,
445 info->mode_bank, info->mode_reg, &val);
446 val = val & info->mode_mask;
447
448 val_normal = info->mode_val_normal;
449 val_idle = info->mode_val_idle;
450 } else {
451 /* Mode register same as enable register */
452 val = info->update_val;
453 val_normal = info->update_val_normal;
454 val_idle = info->update_val_idle;
455 }
456
457 if (val == val_normal)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000458 ret = REGULATOR_MODE_NORMAL;
Lee Jones3fe52282013-04-02 13:24:12 +0100459 else if (val == val_idle)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000460 ret = REGULATOR_MODE_IDLE;
461 else
462 ret = -EINVAL;
463
464 return ret;
465}
466
Sundar R IYERc789ca22010-07-13 21:48:56 +0530467static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
468{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100469 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530470 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100471 u8 regval;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530472
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100473 if (info == NULL) {
474 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530475 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100476 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530477
Mattias Wallin47c16972010-09-10 17:47:56 +0200478 ret = abx500_get_register_interruptible(info->dev,
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100479 info->update_bank, info->update_reg, &regval);
Sundar R IYERc789ca22010-07-13 21:48:56 +0530480 if (ret < 0) {
481 dev_err(rdev_get_dev(rdev),
482 "couldn't read 0x%x register\n", info->update_reg);
483 return ret;
484 }
485
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100486 dev_vdbg(rdev_get_dev(rdev),
487 "%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
488 " 0x%x\n",
489 info->desc.name, info->update_bank, info->update_reg,
490 info->update_mask, regval);
491
492 if (regval & info->update_mask)
Emeric Vigierbd28a152013-03-21 15:58:59 +0000493 info->is_enabled = true;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530494 else
Emeric Vigierbd28a152013-03-21 15:58:59 +0000495 info->is_enabled = false;
496
497 return info->is_enabled;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530498}
499
Axel Lin3bf6e902012-02-24 17:15:45 +0800500static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +0530501{
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100502 int ret, val;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530503 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100504 u8 regval;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530505
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100506 if (info == NULL) {
507 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530508 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100509 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530510
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100511 ret = abx500_get_register_interruptible(info->dev,
512 info->voltage_bank, info->voltage_reg, &regval);
Sundar R IYERc789ca22010-07-13 21:48:56 +0530513 if (ret < 0) {
514 dev_err(rdev_get_dev(rdev),
515 "couldn't read voltage reg for regulator\n");
516 return ret;
517 }
518
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100519 dev_vdbg(rdev_get_dev(rdev),
Linus Walleija0a70142012-08-20 18:41:35 +0200520 "%s-get_voltage (bank, reg, mask, shift, value): "
521 "0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
522 info->desc.name, info->voltage_bank,
523 info->voltage_reg, info->voltage_mask,
524 info->voltage_shift, regval);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100525
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100526 val = regval & info->voltage_mask;
Linus Walleija0a70142012-08-20 18:41:35 +0200527 return val >> info->voltage_shift;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530528}
529
Lee Jonesd7607ba2013-04-02 13:24:11 +0100530static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev)
531{
532 int ret, val;
533 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
534 u8 regval, regval_expand;
535
536 if (info == NULL) {
537 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
538 return -EINVAL;
539 }
540
541 ret = abx500_get_register_interruptible(info->dev,
542 info->voltage_bank, info->voltage_reg, &regval);
543
544 if (ret < 0) {
545 dev_err(rdev_get_dev(rdev),
546 "couldn't read voltage reg for regulator\n");
547 return ret;
548 }
549
550 ret = abx500_get_register_interruptible(info->dev,
551 info->expand_register.voltage_bank,
552 info->expand_register.voltage_reg, &regval_expand);
553
554 if (ret < 0) {
555 dev_err(rdev_get_dev(rdev),
556 "couldn't read voltage reg for regulator\n");
557 return ret;
558 }
559
560 dev_vdbg(rdev_get_dev(rdev),
561 "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
562 " 0x%x\n",
563 info->desc.name, info->voltage_bank, info->voltage_reg,
564 info->voltage_mask, regval);
565 dev_vdbg(rdev_get_dev(rdev),
566 "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
567 " 0x%x\n",
568 info->desc.name, info->expand_register.voltage_bank,
569 info->expand_register.voltage_reg,
570 info->expand_register.voltage_mask, regval_expand);
571
572 if (regval_expand&(info->expand_register.voltage_mask))
573 /* Vaux3 has a different layout */
574 val = info->expand_register.voltage_limit;
575 else
576 val = (regval & info->voltage_mask) >> info->voltage_shift;
577
578 return val;
579}
580
Axel Linae713d32012-03-20 09:51:08 +0800581static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
582 unsigned selector)
Sundar R IYERc789ca22010-07-13 21:48:56 +0530583{
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100584 int ret;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530585 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100586 u8 regval;
Sundar R IYERc789ca22010-07-13 21:48:56 +0530587
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100588 if (info == NULL) {
589 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
Sundar R IYERc789ca22010-07-13 21:48:56 +0530590 return -EINVAL;
Bengt Jonssonfc24b422010-12-10 11:08:45 +0100591 }
Sundar R IYERc789ca22010-07-13 21:48:56 +0530592
Sundar R IYERc789ca22010-07-13 21:48:56 +0530593 /* set the registers for the request */
Linus Walleija0a70142012-08-20 18:41:35 +0200594 regval = (u8)selector << info->voltage_shift;
Mattias Wallin47c16972010-09-10 17:47:56 +0200595 ret = abx500_mask_and_set_register_interruptible(info->dev,
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100596 info->voltage_bank, info->voltage_reg,
597 info->voltage_mask, regval);
Sundar R IYERc789ca22010-07-13 21:48:56 +0530598 if (ret < 0)
599 dev_err(rdev_get_dev(rdev),
600 "couldn't set voltage reg for regulator\n");
601
Bengt Jonsson09aefa12010-12-10 11:08:46 +0100602 dev_vdbg(rdev_get_dev(rdev),
603 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
604 " 0x%x\n",
605 info->desc.name, info->voltage_bank, info->voltage_reg,
606 info->voltage_mask, regval);
607
Sundar R IYERc789ca22010-07-13 21:48:56 +0530608 return ret;
609}
610
Lee Jonesd7607ba2013-04-02 13:24:11 +0100611static int ab8540_aux3_regulator_set_voltage_sel(struct regulator_dev *rdev,
612 unsigned selector)
613{
614 int ret;
615 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
616 u8 regval;
617
618 if (info == NULL) {
619 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
620 return -EINVAL;
621 }
622
623 if (selector >= info->expand_register.voltage_limit) {
624 /* Vaux3 bit4 has different layout */
625 regval = (u8)selector << info->expand_register.voltage_shift;
626 ret = abx500_mask_and_set_register_interruptible(info->dev,
627 info->expand_register.voltage_bank,
628 info->expand_register.voltage_reg,
629 info->expand_register.voltage_mask,
630 regval);
631 } else {
632 /* set the registers for the request */
633 regval = (u8)selector << info->voltage_shift;
634 ret = abx500_mask_and_set_register_interruptible(info->dev,
635 info->voltage_bank, info->voltage_reg,
636 info->voltage_mask, regval);
637 }
638 if (ret < 0)
639 dev_err(rdev_get_dev(rdev),
640 "couldn't set voltage reg for regulator\n");
641
642 dev_vdbg(rdev_get_dev(rdev),
643 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
644 " 0x%x\n",
645 info->desc.name, info->voltage_bank, info->voltage_reg,
646 info->voltage_mask, regval);
647
648 return ret;
649}
650
651static int ab8500_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
652 unsigned int old_sel,
653 unsigned int new_sel)
654{
655 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
656
657 return info->delay;
658}
659
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000660static struct regulator_ops ab8500_regulator_volt_mode_ops = {
661 .enable = ab8500_regulator_enable,
662 .disable = ab8500_regulator_disable,
663 .is_enabled = ab8500_regulator_is_enabled,
664 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
665 .set_mode = ab8500_regulator_set_mode,
666 .get_mode = ab8500_regulator_get_mode,
667 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
668 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
669 .list_voltage = regulator_list_voltage_table,
Sundar R IYERc789ca22010-07-13 21:48:56 +0530670};
671
Lee Jonesd7607ba2013-04-02 13:24:11 +0100672static struct regulator_ops ab8540_aux3_regulator_volt_mode_ops = {
673 .enable = ab8500_regulator_enable,
674 .disable = ab8500_regulator_disable,
675 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
676 .set_mode = ab8500_regulator_set_mode,
677 .get_mode = ab8500_regulator_get_mode,
678 .is_enabled = ab8500_regulator_is_enabled,
679 .get_voltage_sel = ab8540_aux3_regulator_get_voltage_sel,
680 .set_voltage_sel = ab8540_aux3_regulator_set_voltage_sel,
681 .list_voltage = regulator_list_voltage_table,
682 .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
683};
684
Lee Jones8a3b1b82013-04-02 13:24:09 +0100685static struct regulator_ops ab8500_regulator_volt_ops = {
686 .enable = ab8500_regulator_enable,
687 .disable = ab8500_regulator_disable,
688 .is_enabled = ab8500_regulator_is_enabled,
689 .get_voltage_sel = ab8500_regulator_get_voltage_sel,
690 .set_voltage_sel = ab8500_regulator_set_voltage_sel,
691 .list_voltage = regulator_list_voltage_table,
692 .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
693};
694
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000695static struct regulator_ops ab8500_regulator_mode_ops = {
696 .enable = ab8500_regulator_enable,
697 .disable = ab8500_regulator_disable,
698 .is_enabled = ab8500_regulator_is_enabled,
699 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
700 .set_mode = ab8500_regulator_set_mode,
701 .get_mode = ab8500_regulator_get_mode,
Axel Lin5689e832013-03-25 14:59:00 +0800702 .list_voltage = regulator_list_voltage_linear,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000703};
704
705static struct regulator_ops ab8500_regulator_ops = {
706 .enable = ab8500_regulator_enable,
707 .disable = ab8500_regulator_disable,
708 .is_enabled = ab8500_regulator_is_enabled,
Axel Lin5689e832013-03-25 14:59:00 +0800709 .list_voltage = regulator_list_voltage_linear,
Sundar R IYERc789ca22010-07-13 21:48:56 +0530710};
711
Lee Jones3fe52282013-04-02 13:24:12 +0100712static struct regulator_ops ab8500_regulator_anamic_mode_ops = {
713 .enable = ab8500_regulator_enable,
714 .disable = ab8500_regulator_disable,
715 .is_enabled = ab8500_regulator_is_enabled,
716 .set_mode = ab8500_regulator_set_mode,
717 .get_mode = ab8500_regulator_get_mode,
718 .list_voltage = regulator_list_voltage_table,
719};
720
Lee Jones8e6a8d72013-03-28 16:11:11 +0000721/* AB8500 regulator information */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100722static struct ab8500_regulator_info
723 ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
Sundar R IYERc789ca22010-07-13 21:48:56 +0530724 /*
Bengt Jonssone1159e62010-12-10 11:08:44 +0100725 * Variable Voltage Regulators
726 * name, min mV, max mV,
727 * update bank, reg, mask, enable val
Axel Linec1cc4d2012-05-20 10:33:35 +0800728 * volt bank, reg, mask
Sundar R IYERc789ca22010-07-13 21:48:56 +0530729 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100730 [AB8500_LDO_AUX1] = {
731 .desc = {
732 .name = "LDO-AUX1",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000733 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100734 .type = REGULATOR_VOLTAGE,
735 .id = AB8500_LDO_AUX1,
736 .owner = THIS_MODULE,
737 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800738 .volt_table = ldo_vauxn_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800739 .enable_time = 200,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100740 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000741 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100742 .update_bank = 0x04,
743 .update_reg = 0x09,
744 .update_mask = 0x03,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000745 .update_val = 0x01,
746 .update_val_idle = 0x03,
747 .update_val_normal = 0x01,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100748 .voltage_bank = 0x04,
749 .voltage_reg = 0x1f,
750 .voltage_mask = 0x0f,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100751 },
752 [AB8500_LDO_AUX2] = {
753 .desc = {
754 .name = "LDO-AUX2",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000755 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100756 .type = REGULATOR_VOLTAGE,
757 .id = AB8500_LDO_AUX2,
758 .owner = THIS_MODULE,
759 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800760 .volt_table = ldo_vauxn_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800761 .enable_time = 200,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100762 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000763 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100764 .update_bank = 0x04,
765 .update_reg = 0x09,
766 .update_mask = 0x0c,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000767 .update_val = 0x04,
768 .update_val_idle = 0x0c,
769 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100770 .voltage_bank = 0x04,
771 .voltage_reg = 0x20,
772 .voltage_mask = 0x0f,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100773 },
774 [AB8500_LDO_AUX3] = {
775 .desc = {
776 .name = "LDO-AUX3",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000777 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100778 .type = REGULATOR_VOLTAGE,
779 .id = AB8500_LDO_AUX3,
780 .owner = THIS_MODULE,
781 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800782 .volt_table = ldo_vaux3_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800783 .enable_time = 450,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100784 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000785 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100786 .update_bank = 0x04,
787 .update_reg = 0x0a,
788 .update_mask = 0x03,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000789 .update_val = 0x01,
790 .update_val_idle = 0x03,
791 .update_val_normal = 0x01,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100792 .voltage_bank = 0x04,
793 .voltage_reg = 0x21,
794 .voltage_mask = 0x07,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100795 },
796 [AB8500_LDO_INTCORE] = {
797 .desc = {
798 .name = "LDO-INTCORE",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000799 .ops = &ab8500_regulator_volt_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100800 .type = REGULATOR_VOLTAGE,
801 .id = AB8500_LDO_INTCORE,
802 .owner = THIS_MODULE,
803 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Axel Linec1cc4d2012-05-20 10:33:35 +0800804 .volt_table = ldo_vintcore_voltages,
Axel Lin530158b2013-03-27 17:47:22 +0800805 .enable_time = 750,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100806 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000807 .load_lp_uA = 5000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100808 .update_bank = 0x03,
809 .update_reg = 0x80,
810 .update_mask = 0x44,
Lee Jonescc40dc22013-03-21 15:59:41 +0000811 .update_val = 0x44,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000812 .update_val_idle = 0x44,
813 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100814 .voltage_bank = 0x03,
815 .voltage_reg = 0x80,
816 .voltage_mask = 0x38,
Linus Walleija0a70142012-08-20 18:41:35 +0200817 .voltage_shift = 3,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100818 },
Sundar R IYERc789ca22010-07-13 21:48:56 +0530819
820 /*
Bengt Jonssone1159e62010-12-10 11:08:44 +0100821 * Fixed Voltage Regulators
822 * name, fixed mV,
823 * update bank, reg, mask, enable val
Sundar R IYERc789ca22010-07-13 21:48:56 +0530824 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100825 [AB8500_LDO_TVOUT] = {
826 .desc = {
827 .name = "LDO-TVOUT",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000828 .ops = &ab8500_regulator_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100829 .type = REGULATOR_VOLTAGE,
830 .id = AB8500_LDO_TVOUT,
831 .owner = THIS_MODULE,
832 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +0000833 .volt_table = fixed_2000000_voltage,
Lee Jonesed3c1382013-03-28 16:11:12 +0000834 .enable_time = 500,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100835 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000836 .load_lp_uA = 1000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100837 .update_bank = 0x03,
838 .update_reg = 0x80,
839 .update_mask = 0x82,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000840 .update_val = 0x02,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000841 .update_val_idle = 0x82,
842 .update_val_normal = 0x02,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100843 },
844 [AB8500_LDO_AUDIO] = {
845 .desc = {
846 .name = "LDO-AUDIO",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000847 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100848 .type = REGULATOR_VOLTAGE,
849 .id = AB8500_LDO_AUDIO,
850 .owner = THIS_MODULE,
851 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800852 .enable_time = 140,
Lee Jonesb080c782013-03-28 16:11:17 +0000853 .volt_table = fixed_2000000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100854 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100855 .update_bank = 0x03,
856 .update_reg = 0x83,
857 .update_mask = 0x02,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000858 .update_val = 0x02,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100859 },
860 [AB8500_LDO_ANAMIC1] = {
861 .desc = {
862 .name = "LDO-ANAMIC1",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000863 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100864 .type = REGULATOR_VOLTAGE,
865 .id = AB8500_LDO_ANAMIC1,
866 .owner = THIS_MODULE,
867 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800868 .enable_time = 500,
Lee Jonesb080c782013-03-28 16:11:17 +0000869 .volt_table = fixed_2050000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100870 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100871 .update_bank = 0x03,
872 .update_reg = 0x83,
873 .update_mask = 0x08,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000874 .update_val = 0x08,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100875 },
876 [AB8500_LDO_ANAMIC2] = {
877 .desc = {
878 .name = "LDO-ANAMIC2",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000879 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100880 .type = REGULATOR_VOLTAGE,
881 .id = AB8500_LDO_ANAMIC2,
882 .owner = THIS_MODULE,
883 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800884 .enable_time = 500,
Lee Jonesb080c782013-03-28 16:11:17 +0000885 .volt_table = fixed_2050000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100886 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100887 .update_bank = 0x03,
888 .update_reg = 0x83,
889 .update_mask = 0x10,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000890 .update_val = 0x10,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100891 },
892 [AB8500_LDO_DMIC] = {
893 .desc = {
894 .name = "LDO-DMIC",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000895 .ops = &ab8500_regulator_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100896 .type = REGULATOR_VOLTAGE,
897 .id = AB8500_LDO_DMIC,
898 .owner = THIS_MODULE,
899 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800900 .enable_time = 420,
Lee Jonesb080c782013-03-28 16:11:17 +0000901 .volt_table = fixed_1800000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100902 },
Bengt Jonsson6909b452010-12-10 11:08:47 +0100903 .update_bank = 0x03,
904 .update_reg = 0x83,
905 .update_mask = 0x04,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000906 .update_val = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100907 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000908
909 /*
910 * Regulators with fixed voltage and normal/idle modes
911 */
Bengt Jonsson6909b452010-12-10 11:08:47 +0100912 [AB8500_LDO_ANA] = {
913 .desc = {
914 .name = "LDO-ANA",
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000915 .ops = &ab8500_regulator_mode_ops,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100916 .type = REGULATOR_VOLTAGE,
917 .id = AB8500_LDO_ANA,
918 .owner = THIS_MODULE,
919 .n_voltages = 1,
Axel Lin530158b2013-03-27 17:47:22 +0800920 .enable_time = 140,
Lee Jonesb080c782013-03-28 16:11:17 +0000921 .volt_table = fixed_1200000_voltage,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100922 },
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000923 .load_lp_uA = 1000,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100924 .update_bank = 0x04,
925 .update_reg = 0x06,
926 .update_mask = 0x0c,
Emeric Vigierbd28a152013-03-21 15:58:59 +0000927 .update_val = 0x04,
Bengt Jonsson7ce46692013-03-21 15:59:00 +0000928 .update_val_idle = 0x0c,
929 .update_val_normal = 0x04,
Bengt Jonsson6909b452010-12-10 11:08:47 +0100930 },
Lee Jones8e6a8d72013-03-28 16:11:11 +0000931};
Bengt Jonsson6909b452010-12-10 11:08:47 +0100932
Lee Jones547f3842013-03-28 16:11:14 +0000933/* AB8505 regulator information */
934static struct ab8500_regulator_info
935 ab8505_regulator_info[AB8505_NUM_REGULATORS] = {
936 /*
937 * Variable Voltage Regulators
938 * name, min mV, max mV,
939 * update bank, reg, mask, enable val
940 * volt bank, reg, mask, table, table length
941 */
942 [AB8505_LDO_AUX1] = {
943 .desc = {
944 .name = "LDO-AUX1",
945 .ops = &ab8500_regulator_volt_mode_ops,
946 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100947 .id = AB8505_LDO_AUX1,
Lee Jones547f3842013-03-28 16:11:14 +0000948 .owner = THIS_MODULE,
949 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000950 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000951 },
Lee Jones547f3842013-03-28 16:11:14 +0000952 .load_lp_uA = 5000,
953 .update_bank = 0x04,
954 .update_reg = 0x09,
955 .update_mask = 0x03,
956 .update_val = 0x01,
957 .update_val_idle = 0x03,
958 .update_val_normal = 0x01,
959 .voltage_bank = 0x04,
960 .voltage_reg = 0x1f,
961 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +0000962 },
963 [AB8505_LDO_AUX2] = {
964 .desc = {
965 .name = "LDO-AUX2",
966 .ops = &ab8500_regulator_volt_mode_ops,
967 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100968 .id = AB8505_LDO_AUX2,
Lee Jones547f3842013-03-28 16:11:14 +0000969 .owner = THIS_MODULE,
970 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000971 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000972 },
Lee Jones547f3842013-03-28 16:11:14 +0000973 .load_lp_uA = 5000,
974 .update_bank = 0x04,
975 .update_reg = 0x09,
976 .update_mask = 0x0c,
977 .update_val = 0x04,
978 .update_val_idle = 0x0c,
979 .update_val_normal = 0x04,
980 .voltage_bank = 0x04,
981 .voltage_reg = 0x20,
982 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +0000983 },
984 [AB8505_LDO_AUX3] = {
985 .desc = {
986 .name = "LDO-AUX3",
987 .ops = &ab8500_regulator_volt_mode_ops,
988 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +0100989 .id = AB8505_LDO_AUX3,
Lee Jones547f3842013-03-28 16:11:14 +0000990 .owner = THIS_MODULE,
991 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +0000992 .volt_table = ldo_vaux3_voltages,
Lee Jones547f3842013-03-28 16:11:14 +0000993 },
Lee Jones547f3842013-03-28 16:11:14 +0000994 .load_lp_uA = 5000,
995 .update_bank = 0x04,
996 .update_reg = 0x0a,
997 .update_mask = 0x03,
998 .update_val = 0x01,
999 .update_val_idle = 0x03,
1000 .update_val_normal = 0x01,
1001 .voltage_bank = 0x04,
1002 .voltage_reg = 0x21,
1003 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +00001004 },
1005 [AB8505_LDO_AUX4] = {
1006 .desc = {
1007 .name = "LDO-AUX4",
1008 .ops = &ab8500_regulator_volt_mode_ops,
1009 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001010 .id = AB8505_LDO_AUX4,
Lee Jones547f3842013-03-28 16:11:14 +00001011 .owner = THIS_MODULE,
1012 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001013 .volt_table = ldo_vauxn_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001014 },
Lee Jones547f3842013-03-28 16:11:14 +00001015 .load_lp_uA = 5000,
1016 /* values for Vaux4Regu register */
1017 .update_bank = 0x04,
1018 .update_reg = 0x2e,
1019 .update_mask = 0x03,
1020 .update_val = 0x01,
1021 .update_val_idle = 0x03,
1022 .update_val_normal = 0x01,
1023 /* values for Vaux4SEL register */
1024 .voltage_bank = 0x04,
1025 .voltage_reg = 0x2f,
1026 .voltage_mask = 0x0f,
Lee Jones547f3842013-03-28 16:11:14 +00001027 },
1028 [AB8505_LDO_AUX5] = {
1029 .desc = {
1030 .name = "LDO-AUX5",
1031 .ops = &ab8500_regulator_volt_mode_ops,
1032 .type = REGULATOR_VOLTAGE,
1033 .id = AB8505_LDO_AUX5,
1034 .owner = THIS_MODULE,
1035 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001036 .volt_table = ldo_vaux56_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001037 },
Lee Jones547f3842013-03-28 16:11:14 +00001038 .load_lp_uA = 2000,
1039 /* values for CtrlVaux5 register */
1040 .update_bank = 0x01,
1041 .update_reg = 0x55,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001042 .update_mask = 0x18,
1043 .update_val = 0x10,
1044 .update_val_idle = 0x18,
1045 .update_val_normal = 0x10,
Lee Jones547f3842013-03-28 16:11:14 +00001046 .voltage_bank = 0x01,
1047 .voltage_reg = 0x55,
1048 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +00001049 },
1050 [AB8505_LDO_AUX6] = {
1051 .desc = {
1052 .name = "LDO-AUX6",
1053 .ops = &ab8500_regulator_volt_mode_ops,
1054 .type = REGULATOR_VOLTAGE,
1055 .id = AB8505_LDO_AUX6,
1056 .owner = THIS_MODULE,
1057 .n_voltages = ARRAY_SIZE(ldo_vaux56_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001058 .volt_table = ldo_vaux56_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001059 },
Lee Jones547f3842013-03-28 16:11:14 +00001060 .load_lp_uA = 2000,
1061 /* values for CtrlVaux6 register */
1062 .update_bank = 0x01,
1063 .update_reg = 0x56,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001064 .update_mask = 0x18,
1065 .update_val = 0x10,
1066 .update_val_idle = 0x18,
1067 .update_val_normal = 0x10,
Lee Jones547f3842013-03-28 16:11:14 +00001068 .voltage_bank = 0x01,
1069 .voltage_reg = 0x56,
1070 .voltage_mask = 0x07,
Lee Jones547f3842013-03-28 16:11:14 +00001071 },
1072 [AB8505_LDO_INTCORE] = {
1073 .desc = {
1074 .name = "LDO-INTCORE",
1075 .ops = &ab8500_regulator_volt_mode_ops,
1076 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001077 .id = AB8505_LDO_INTCORE,
Lee Jones547f3842013-03-28 16:11:14 +00001078 .owner = THIS_MODULE,
1079 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001080 .volt_table = ldo_vintcore_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001081 },
Lee Jones547f3842013-03-28 16:11:14 +00001082 .load_lp_uA = 5000,
1083 .update_bank = 0x03,
1084 .update_reg = 0x80,
1085 .update_mask = 0x44,
1086 .update_val = 0x04,
1087 .update_val_idle = 0x44,
1088 .update_val_normal = 0x04,
1089 .voltage_bank = 0x03,
1090 .voltage_reg = 0x80,
1091 .voltage_mask = 0x38,
Lee Jones547f3842013-03-28 16:11:14 +00001092 .voltage_shift = 3,
1093 },
1094
1095 /*
1096 * Fixed Voltage Regulators
1097 * name, fixed mV,
1098 * update bank, reg, mask, enable val
1099 */
1100 [AB8505_LDO_ADC] = {
1101 .desc = {
1102 .name = "LDO-ADC",
1103 .ops = &ab8500_regulator_mode_ops,
1104 .type = REGULATOR_VOLTAGE,
1105 .id = AB8505_LDO_ADC,
1106 .owner = THIS_MODULE,
1107 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001108 .volt_table = fixed_2000000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001109 },
1110 .delay = 10000,
Lee Jones547f3842013-03-28 16:11:14 +00001111 .load_lp_uA = 1000,
1112 .update_bank = 0x03,
1113 .update_reg = 0x80,
1114 .update_mask = 0x82,
1115 .update_val = 0x02,
1116 .update_val_idle = 0x82,
1117 .update_val_normal = 0x02,
1118 },
1119 [AB8505_LDO_USB] = {
1120 .desc = {
1121 .name = "LDO-USB",
1122 .ops = &ab8500_regulator_mode_ops,
1123 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001124 .id = AB8505_LDO_USB,
Lee Jones547f3842013-03-28 16:11:14 +00001125 .owner = THIS_MODULE,
1126 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001127 .volt_table = fixed_3300000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001128 },
Lee Jones547f3842013-03-28 16:11:14 +00001129 .update_bank = 0x03,
1130 .update_reg = 0x82,
1131 .update_mask = 0x03,
1132 .update_val = 0x01,
1133 .update_val_idle = 0x03,
1134 .update_val_normal = 0x01,
1135 },
1136 [AB8505_LDO_AUDIO] = {
1137 .desc = {
1138 .name = "LDO-AUDIO",
Lee Jones8a3b1b82013-04-02 13:24:09 +01001139 .ops = &ab8500_regulator_volt_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001140 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001141 .id = AB8505_LDO_AUDIO,
Lee Jones547f3842013-03-28 16:11:14 +00001142 .owner = THIS_MODULE,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001143 .n_voltages = ARRAY_SIZE(ldo_vaudio_voltages),
1144 .volt_table = ldo_vaudio_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001145 },
Lee Jones547f3842013-03-28 16:11:14 +00001146 .update_bank = 0x03,
1147 .update_reg = 0x83,
1148 .update_mask = 0x02,
1149 .update_val = 0x02,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001150 .voltage_bank = 0x01,
1151 .voltage_reg = 0x57,
1152 .voltage_mask = 0x7,
1153 .voltage_shift = 4,
1154 .voltages = ldo_vaudio_voltages,
1155 .voltages_len = ARRAY_SIZE(ldo_vaudio_voltages),
Lee Jones547f3842013-03-28 16:11:14 +00001156 },
1157 [AB8505_LDO_ANAMIC1] = {
1158 .desc = {
1159 .name = "LDO-ANAMIC1",
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_ANAMIC1,
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 Jones4c84b4d2013-04-02 13:24:13 +01001167 .shared_mode = &ldo_anamic1_shared,
Lee Jones547f3842013-03-28 16:11:14 +00001168 .update_bank = 0x03,
1169 .update_reg = 0x83,
1170 .update_mask = 0x08,
1171 .update_val = 0x08,
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_ANAMIC2] = {
1179 .desc = {
1180 .name = "LDO-ANAMIC2",
Lee Jones3fe52282013-04-02 13:24:12 +01001181 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001182 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001183 .id = AB8505_LDO_ANAMIC2,
Lee Jones547f3842013-03-28 16:11:14 +00001184 .owner = THIS_MODULE,
1185 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001186 .volt_table = fixed_2050000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001187 },
Lee Jones3fe52282013-04-02 13:24:12 +01001188 .shared_mode = &ldo_anamic2_shared,
Lee Jones547f3842013-03-28 16:11:14 +00001189 .update_bank = 0x03,
1190 .update_reg = 0x83,
1191 .update_mask = 0x10,
1192 .update_val = 0x10,
Lee Jones3fe52282013-04-02 13:24:12 +01001193 .mode_bank = 0x01,
1194 .mode_reg = 0x54,
1195 .mode_mask = 0x04,
1196 .mode_val_idle = 0x04,
1197 .mode_val_normal = 0x00,
Lee Jones547f3842013-03-28 16:11:14 +00001198 },
1199 [AB8505_LDO_AUX8] = {
1200 .desc = {
1201 .name = "LDO-AUX8",
1202 .ops = &ab8500_regulator_ops,
1203 .type = REGULATOR_VOLTAGE,
1204 .id = AB8505_LDO_AUX8,
1205 .owner = THIS_MODULE,
1206 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001207 .volt_table = fixed_1800000_voltage,
Lee Jones547f3842013-03-28 16:11:14 +00001208 },
Lee Jones547f3842013-03-28 16:11:14 +00001209 .update_bank = 0x03,
1210 .update_reg = 0x83,
1211 .update_mask = 0x04,
1212 .update_val = 0x04,
1213 },
1214 /*
1215 * Regulators with fixed voltage and normal/idle modes
1216 */
1217 [AB8505_LDO_ANA] = {
1218 .desc = {
1219 .name = "LDO-ANA",
Lee Jones8a3b1b82013-04-02 13:24:09 +01001220 .ops = &ab8500_regulator_volt_mode_ops,
Lee Jones547f3842013-03-28 16:11:14 +00001221 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001222 .id = AB8505_LDO_ANA,
Lee Jones547f3842013-03-28 16:11:14 +00001223 .owner = THIS_MODULE,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001224 .n_voltages = ARRAY_SIZE(ldo_vana_voltages),
1225 .volt_table = ldo_vana_voltages,
Lee Jones547f3842013-03-28 16:11:14 +00001226 },
Lee Jones547f3842013-03-28 16:11:14 +00001227 .load_lp_uA = 1000,
1228 .update_bank = 0x04,
1229 .update_reg = 0x06,
1230 .update_mask = 0x0c,
1231 .update_val = 0x04,
1232 .update_val_idle = 0x0c,
1233 .update_val_normal = 0x04,
Lee Jones8a3b1b82013-04-02 13:24:09 +01001234 .voltage_bank = 0x04,
1235 .voltage_reg = 0x29,
1236 .voltage_mask = 0x7,
1237 .voltages = ldo_vana_voltages,
1238 .voltages_len = ARRAY_SIZE(ldo_vana_voltages),
Lee Jones547f3842013-03-28 16:11:14 +00001239 },
1240};
1241
Lee Jones8e6a8d72013-03-28 16:11:11 +00001242/* AB9540 regulator information */
1243static struct ab8500_regulator_info
1244 ab9540_regulator_info[AB9540_NUM_REGULATORS] = {
1245 /*
1246 * Variable Voltage Regulators
1247 * name, min mV, max mV,
1248 * update bank, reg, mask, enable val
1249 * volt bank, reg, mask, table, table length
1250 */
1251 [AB9540_LDO_AUX1] = {
1252 .desc = {
1253 .name = "LDO-AUX1",
1254 .ops = &ab8500_regulator_volt_mode_ops,
1255 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001256 .id = AB9540_LDO_AUX1,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001257 .owner = THIS_MODULE,
1258 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001259 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001260 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001261 .load_lp_uA = 5000,
1262 .update_bank = 0x04,
1263 .update_reg = 0x09,
1264 .update_mask = 0x03,
1265 .update_val = 0x01,
1266 .update_val_idle = 0x03,
1267 .update_val_normal = 0x01,
1268 .voltage_bank = 0x04,
1269 .voltage_reg = 0x1f,
1270 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001271 },
1272 [AB9540_LDO_AUX2] = {
1273 .desc = {
1274 .name = "LDO-AUX2",
1275 .ops = &ab8500_regulator_volt_mode_ops,
1276 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001277 .id = AB9540_LDO_AUX2,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001278 .owner = THIS_MODULE,
1279 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001280 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001281 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001282 .load_lp_uA = 5000,
1283 .update_bank = 0x04,
1284 .update_reg = 0x09,
1285 .update_mask = 0x0c,
1286 .update_val = 0x04,
1287 .update_val_idle = 0x0c,
1288 .update_val_normal = 0x04,
1289 .voltage_bank = 0x04,
1290 .voltage_reg = 0x20,
1291 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001292 },
1293 [AB9540_LDO_AUX3] = {
1294 .desc = {
1295 .name = "LDO-AUX3",
1296 .ops = &ab8500_regulator_volt_mode_ops,
1297 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001298 .id = AB9540_LDO_AUX3,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001299 .owner = THIS_MODULE,
1300 .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001301 .volt_table = ldo_vaux3_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001302 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001303 .load_lp_uA = 5000,
1304 .update_bank = 0x04,
1305 .update_reg = 0x0a,
1306 .update_mask = 0x03,
1307 .update_val = 0x01,
1308 .update_val_idle = 0x03,
1309 .update_val_normal = 0x01,
1310 .voltage_bank = 0x04,
1311 .voltage_reg = 0x21,
1312 .voltage_mask = 0x07,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001313 },
1314 [AB9540_LDO_AUX4] = {
1315 .desc = {
1316 .name = "LDO-AUX4",
1317 .ops = &ab8500_regulator_volt_mode_ops,
1318 .type = REGULATOR_VOLTAGE,
1319 .id = AB9540_LDO_AUX4,
1320 .owner = THIS_MODULE,
1321 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001322 .volt_table = ldo_vauxn_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001323 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001324 .load_lp_uA = 5000,
1325 /* values for Vaux4Regu register */
1326 .update_bank = 0x04,
1327 .update_reg = 0x2e,
1328 .update_mask = 0x03,
1329 .update_val = 0x01,
1330 .update_val_idle = 0x03,
1331 .update_val_normal = 0x01,
1332 /* values for Vaux4SEL register */
1333 .voltage_bank = 0x04,
1334 .voltage_reg = 0x2f,
1335 .voltage_mask = 0x0f,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001336 },
1337 [AB9540_LDO_INTCORE] = {
1338 .desc = {
1339 .name = "LDO-INTCORE",
1340 .ops = &ab8500_regulator_volt_mode_ops,
1341 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001342 .id = AB9540_LDO_INTCORE,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001343 .owner = THIS_MODULE,
1344 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001345 .volt_table = ldo_vintcore_voltages,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001346 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001347 .load_lp_uA = 5000,
1348 .update_bank = 0x03,
1349 .update_reg = 0x80,
1350 .update_mask = 0x44,
1351 .update_val = 0x44,
1352 .update_val_idle = 0x44,
1353 .update_val_normal = 0x04,
1354 .voltage_bank = 0x03,
1355 .voltage_reg = 0x80,
1356 .voltage_mask = 0x38,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001357 .voltage_shift = 3,
1358 },
Bengt Jonsson6909b452010-12-10 11:08:47 +01001359
Lee Jones8e6a8d72013-03-28 16:11:11 +00001360 /*
1361 * Fixed Voltage Regulators
1362 * name, fixed mV,
1363 * update bank, reg, mask, enable val
1364 */
1365 [AB9540_LDO_TVOUT] = {
1366 .desc = {
1367 .name = "LDO-TVOUT",
1368 .ops = &ab8500_regulator_mode_ops,
1369 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001370 .id = AB9540_LDO_TVOUT,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001371 .owner = THIS_MODULE,
1372 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001373 .volt_table = fixed_2000000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001374 },
1375 .delay = 10000,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001376 .load_lp_uA = 1000,
1377 .update_bank = 0x03,
1378 .update_reg = 0x80,
1379 .update_mask = 0x82,
1380 .update_val = 0x02,
1381 .update_val_idle = 0x82,
1382 .update_val_normal = 0x02,
1383 },
1384 [AB9540_LDO_USB] = {
1385 .desc = {
1386 .name = "LDO-USB",
1387 .ops = &ab8500_regulator_ops,
1388 .type = REGULATOR_VOLTAGE,
1389 .id = AB9540_LDO_USB,
1390 .owner = THIS_MODULE,
1391 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001392 .volt_table = fixed_3300000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001393 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001394 .update_bank = 0x03,
1395 .update_reg = 0x82,
1396 .update_mask = 0x03,
1397 .update_val = 0x01,
1398 .update_val_idle = 0x03,
1399 .update_val_normal = 0x01,
1400 },
1401 [AB9540_LDO_AUDIO] = {
1402 .desc = {
1403 .name = "LDO-AUDIO",
1404 .ops = &ab8500_regulator_ops,
1405 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001406 .id = AB9540_LDO_AUDIO,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001407 .owner = THIS_MODULE,
1408 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001409 .volt_table = fixed_2000000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001410 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001411 .update_bank = 0x03,
1412 .update_reg = 0x83,
1413 .update_mask = 0x02,
1414 .update_val = 0x02,
1415 },
1416 [AB9540_LDO_ANAMIC1] = {
1417 .desc = {
1418 .name = "LDO-ANAMIC1",
1419 .ops = &ab8500_regulator_ops,
1420 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001421 .id = AB9540_LDO_ANAMIC1,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001422 .owner = THIS_MODULE,
1423 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001424 .volt_table = fixed_2050000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001425 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001426 .update_bank = 0x03,
1427 .update_reg = 0x83,
1428 .update_mask = 0x08,
1429 .update_val = 0x08,
1430 },
1431 [AB9540_LDO_ANAMIC2] = {
1432 .desc = {
1433 .name = "LDO-ANAMIC2",
1434 .ops = &ab8500_regulator_ops,
1435 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001436 .id = AB9540_LDO_ANAMIC2,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001437 .owner = THIS_MODULE,
1438 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001439 .volt_table = fixed_2050000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001440 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001441 .update_bank = 0x03,
1442 .update_reg = 0x83,
1443 .update_mask = 0x10,
1444 .update_val = 0x10,
1445 },
1446 [AB9540_LDO_DMIC] = {
1447 .desc = {
1448 .name = "LDO-DMIC",
1449 .ops = &ab8500_regulator_ops,
1450 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001451 .id = AB9540_LDO_DMIC,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001452 .owner = THIS_MODULE,
1453 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001454 .volt_table = fixed_1800000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001455 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001456 .update_bank = 0x03,
1457 .update_reg = 0x83,
1458 .update_mask = 0x04,
1459 .update_val = 0x04,
1460 },
1461
1462 /*
1463 * Regulators with fixed voltage and normal/idle modes
1464 */
1465 [AB9540_LDO_ANA] = {
1466 .desc = {
1467 .name = "LDO-ANA",
1468 .ops = &ab8500_regulator_mode_ops,
1469 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001470 .id = AB9540_LDO_ANA,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001471 .owner = THIS_MODULE,
1472 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001473 .volt_table = fixed_1200000_voltage,
Lee Jones8e6a8d72013-03-28 16:11:11 +00001474 },
Lee Jones8e6a8d72013-03-28 16:11:11 +00001475 .load_lp_uA = 1000,
1476 .update_bank = 0x04,
1477 .update_reg = 0x06,
1478 .update_mask = 0x0c,
1479 .update_val = 0x08,
1480 .update_val_idle = 0x0c,
1481 .update_val_normal = 0x08,
1482 },
Sundar R IYERc789ca22010-07-13 21:48:56 +05301483};
1484
Lee Jonesae0a9a32013-03-28 16:11:16 +00001485/* AB8540 regulator information */
1486static struct ab8500_regulator_info
1487 ab8540_regulator_info[AB8540_NUM_REGULATORS] = {
1488 /*
1489 * Variable Voltage Regulators
1490 * name, min mV, max mV,
1491 * update bank, reg, mask, enable val
1492 * volt bank, reg, mask, table, table length
1493 */
1494 [AB8540_LDO_AUX1] = {
1495 .desc = {
1496 .name = "LDO-AUX1",
1497 .ops = &ab8500_regulator_volt_mode_ops,
1498 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001499 .id = AB8540_LDO_AUX1,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001500 .owner = THIS_MODULE,
1501 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001502 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001503 },
1504 .load_lp_uA = 5000,
1505 .update_bank = 0x04,
1506 .update_reg = 0x09,
1507 .update_mask = 0x03,
1508 .update_val = 0x01,
1509 .update_val_idle = 0x03,
1510 .update_val_normal = 0x01,
1511 .voltage_bank = 0x04,
1512 .voltage_reg = 0x1f,
1513 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001514 },
1515 [AB8540_LDO_AUX2] = {
1516 .desc = {
1517 .name = "LDO-AUX2",
1518 .ops = &ab8500_regulator_volt_mode_ops,
1519 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001520 .id = AB8540_LDO_AUX2,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001521 .owner = THIS_MODULE,
1522 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001523 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001524 },
1525 .load_lp_uA = 5000,
1526 .update_bank = 0x04,
1527 .update_reg = 0x09,
1528 .update_mask = 0x0c,
1529 .update_val = 0x04,
1530 .update_val_idle = 0x0c,
1531 .update_val_normal = 0x04,
1532 .voltage_bank = 0x04,
1533 .voltage_reg = 0x20,
1534 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001535 },
1536 [AB8540_LDO_AUX3] = {
1537 .desc = {
1538 .name = "LDO-AUX3",
Lee Jonesd7607ba2013-04-02 13:24:11 +01001539 .ops = &ab8540_aux3_regulator_volt_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001540 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001541 .id = AB8540_LDO_AUX3,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001542 .owner = THIS_MODULE,
1543 .n_voltages = ARRAY_SIZE(ldo_vaux3_ab8540_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001544 .volt_table = ldo_vaux3_ab8540_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001545 },
1546 .load_lp_uA = 5000,
1547 .update_bank = 0x04,
1548 .update_reg = 0x0a,
1549 .update_mask = 0x03,
1550 .update_val = 0x01,
1551 .update_val_idle = 0x03,
1552 .update_val_normal = 0x01,
1553 .voltage_bank = 0x04,
1554 .voltage_reg = 0x21,
1555 .voltage_mask = 0x07,
Lee Jonesd7607ba2013-04-02 13:24:11 +01001556 .expand_register = {
1557 .voltage_limit = 8,
1558 .voltage_bank = 0x04,
1559 .voltage_reg = 0x01,
1560 .voltage_mask = 0x10,
1561 .voltage_shift = 1,
1562 }
Lee Jonesae0a9a32013-03-28 16:11:16 +00001563 },
1564 [AB8540_LDO_AUX4] = {
1565 .desc = {
1566 .name = "LDO-AUX4",
1567 .ops = &ab8500_regulator_volt_mode_ops,
1568 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001569 .id = AB8540_LDO_AUX4,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001570 .owner = THIS_MODULE,
1571 .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001572 .volt_table = ldo_vauxn_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001573 },
1574 .load_lp_uA = 5000,
1575 /* values for Vaux4Regu register */
1576 .update_bank = 0x04,
1577 .update_reg = 0x2e,
1578 .update_mask = 0x03,
1579 .update_val = 0x01,
1580 .update_val_idle = 0x03,
1581 .update_val_normal = 0x01,
1582 /* values for Vaux4SEL register */
1583 .voltage_bank = 0x04,
1584 .voltage_reg = 0x2f,
1585 .voltage_mask = 0x0f,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001586 },
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01001587 [AB8540_LDO_AUX5] = {
1588 .desc = {
1589 .name = "LDO-AUX5",
1590 .ops = &ab8500_regulator_volt_mode_ops,
1591 .type = REGULATOR_VOLTAGE,
1592 .id = AB8540_LDO_AUX5,
1593 .owner = THIS_MODULE,
1594 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1595 },
1596 .load_lp_uA = 20000,
1597 /* values for Vaux5Regu register */
1598 .update_bank = 0x04,
1599 .update_reg = 0x32,
1600 .update_mask = 0x03,
1601 .update_val = 0x01,
1602 .update_val_idle = 0x03,
1603 .update_val_normal = 0x01,
1604 /* values for Vaux5SEL register */
1605 .voltage_bank = 0x04,
1606 .voltage_reg = 0x33,
1607 .voltage_mask = 0x3f,
1608 .voltages = ldo_vaux56_ab8540_voltages,
1609 .voltages_len = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1610 },
1611 [AB8540_LDO_AUX6] = {
1612 .desc = {
1613 .name = "LDO-AUX6",
1614 .ops = &ab8500_regulator_volt_mode_ops,
1615 .type = REGULATOR_VOLTAGE,
1616 .id = AB8540_LDO_AUX6,
1617 .owner = THIS_MODULE,
1618 .n_voltages = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1619 },
1620 .load_lp_uA = 20000,
1621 /* values for Vaux6Regu register */
1622 .update_bank = 0x04,
1623 .update_reg = 0x35,
1624 .update_mask = 0x03,
1625 .update_val = 0x01,
1626 .update_val_idle = 0x03,
1627 .update_val_normal = 0x01,
1628 /* values for Vaux6SEL register */
1629 .voltage_bank = 0x04,
1630 .voltage_reg = 0x36,
1631 .voltage_mask = 0x3f,
1632 .voltages = ldo_vaux56_ab8540_voltages,
1633 .voltages_len = ARRAY_SIZE(ldo_vaux56_ab8540_voltages),
1634 },
Lee Jonesae0a9a32013-03-28 16:11:16 +00001635 [AB8540_LDO_INTCORE] = {
1636 .desc = {
1637 .name = "LDO-INTCORE",
1638 .ops = &ab8500_regulator_volt_mode_ops,
1639 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001640 .id = AB8540_LDO_INTCORE,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001641 .owner = THIS_MODULE,
1642 .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages),
Lee Jones62ab4112013-03-28 16:11:18 +00001643 .volt_table = ldo_vintcore_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001644 },
1645 .load_lp_uA = 5000,
1646 .update_bank = 0x03,
1647 .update_reg = 0x80,
1648 .update_mask = 0x44,
1649 .update_val = 0x44,
1650 .update_val_idle = 0x44,
1651 .update_val_normal = 0x04,
1652 .voltage_bank = 0x03,
1653 .voltage_reg = 0x80,
1654 .voltage_mask = 0x38,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001655 .voltage_shift = 3,
1656 },
1657
1658 /*
1659 * Fixed Voltage Regulators
1660 * name, fixed mV,
1661 * update bank, reg, mask, enable val
1662 */
1663 [AB8540_LDO_TVOUT] = {
1664 .desc = {
1665 .name = "LDO-TVOUT",
1666 .ops = &ab8500_regulator_mode_ops,
1667 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001668 .id = AB8540_LDO_TVOUT,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001669 .owner = THIS_MODULE,
1670 .n_voltages = 1,
1671 },
1672 .delay = 10000,
1673 .load_lp_uA = 1000,
1674 .update_bank = 0x03,
1675 .update_reg = 0x80,
1676 .update_mask = 0x82,
1677 .update_val = 0x02,
1678 .update_val_idle = 0x82,
1679 .update_val_normal = 0x02,
1680 },
1681 [AB8540_LDO_AUDIO] = {
1682 .desc = {
1683 .name = "LDO-AUDIO",
1684 .ops = &ab8500_regulator_ops,
1685 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001686 .id = AB8540_LDO_AUDIO,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001687 .owner = THIS_MODULE,
1688 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001689 .volt_table = fixed_2000000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001690 },
1691 .update_bank = 0x03,
1692 .update_reg = 0x83,
1693 .update_mask = 0x02,
1694 .update_val = 0x02,
1695 },
1696 [AB8540_LDO_ANAMIC1] = {
1697 .desc = {
1698 .name = "LDO-ANAMIC1",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001699 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001700 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001701 .id = AB8540_LDO_ANAMIC1,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001702 .owner = THIS_MODULE,
1703 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001704 .volt_table = fixed_2050000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001705 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001706 .shared_mode = &ab8540_ldo_anamic1_shared,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001707 .update_bank = 0x03,
1708 .update_reg = 0x83,
1709 .update_mask = 0x08,
1710 .update_val = 0x08,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001711 .mode_bank = 0x03,
1712 .mode_reg = 0x83,
1713 .mode_mask = 0x20,
1714 .mode_val_idle = 0x20,
1715 .mode_val_normal = 0x00,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001716 },
1717 [AB8540_LDO_ANAMIC2] = {
1718 .desc = {
1719 .name = "LDO-ANAMIC2",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001720 .ops = &ab8500_regulator_anamic_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001721 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001722 .id = AB8540_LDO_ANAMIC2,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001723 .owner = THIS_MODULE,
1724 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001725 .volt_table = fixed_2050000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001726 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001727 .shared_mode = &ab8540_ldo_anamic2_shared,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001728 .update_bank = 0x03,
1729 .update_reg = 0x83,
1730 .update_mask = 0x10,
1731 .update_val = 0x10,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001732 .mode_bank = 0x03,
1733 .mode_reg = 0x83,
1734 .mode_mask = 0x20,
1735 .mode_val_idle = 0x20,
1736 .mode_val_normal = 0x00,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001737 },
1738 [AB8540_LDO_DMIC] = {
1739 .desc = {
1740 .name = "LDO-DMIC",
Lee Jones4c84b4d2013-04-02 13:24:13 +01001741 .ops = &ab8500_regulator_volt_mode_ops,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001742 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001743 .id = AB8540_LDO_DMIC,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001744 .owner = THIS_MODULE,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001745 .n_voltages = ARRAY_SIZE(ldo_vdmic_voltages),
Lee Jonesae0a9a32013-03-28 16:11:16 +00001746 },
Lee Jones4c84b4d2013-04-02 13:24:13 +01001747 .load_lp_uA = 1000,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001748 .update_bank = 0x03,
1749 .update_reg = 0x83,
1750 .update_mask = 0x04,
1751 .update_val = 0x04,
Lee Jones4c84b4d2013-04-02 13:24:13 +01001752 .voltage_bank = 0x03,
1753 .voltage_reg = 0x83,
1754 .voltage_mask = 0xc0,
1755 .voltages = ldo_vdmic_voltages,
1756 .voltages_len = ARRAY_SIZE(ldo_vdmic_voltages),
Lee Jonesae0a9a32013-03-28 16:11:16 +00001757 },
1758
1759 /*
1760 * Regulators with fixed voltage and normal/idle modes
1761 */
1762 [AB8540_LDO_ANA] = {
1763 .desc = {
1764 .name = "LDO-ANA",
1765 .ops = &ab8500_regulator_mode_ops,
1766 .type = REGULATOR_VOLTAGE,
Lee Jones0b946412013-04-02 13:24:07 +01001767 .id = AB8540_LDO_ANA,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001768 .owner = THIS_MODULE,
1769 .n_voltages = 1,
Lee Jonesb080c782013-03-28 16:11:17 +00001770 .volt_table = fixed_1200000_voltage,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001771 },
1772 .load_lp_uA = 1000,
1773 .update_bank = 0x04,
1774 .update_reg = 0x06,
1775 .update_mask = 0x0c,
1776 .update_val = 0x04,
1777 .update_val_idle = 0x0c,
1778 .update_val_normal = 0x04,
1779 },
1780 [AB8540_LDO_SDIO] = {
1781 .desc = {
1782 .name = "LDO-SDIO",
1783 .ops = &ab8500_regulator_volt_mode_ops,
1784 .type = REGULATOR_VOLTAGE,
1785 .id = AB8540_LDO_SDIO,
1786 .owner = THIS_MODULE,
Lee Jones62ab4112013-03-28 16:11:18 +00001787 .n_voltages = ARRAY_SIZE(ldo_sdio_voltages),
1788 .volt_table = ldo_sdio_voltages,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001789 },
Lee Jonesae0a9a32013-03-28 16:11:16 +00001790 .load_lp_uA = 5000,
1791 .update_bank = 0x03,
1792 .update_reg = 0x88,
1793 .update_mask = 0x30,
1794 .update_val = 0x10,
1795 .update_val_idle = 0x30,
1796 .update_val_normal = 0x10,
1797 .voltage_bank = 0x03,
1798 .voltage_reg = 0x88,
1799 .voltage_mask = 0x07,
Lee Jonesae0a9a32013-03-28 16:11:16 +00001800 },
1801};
1802
Lee Jones3fe52282013-04-02 13:24:12 +01001803static struct ab8500_shared_mode ldo_anamic1_shared = {
1804 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC2],
1805};
1806
1807static struct ab8500_shared_mode ldo_anamic2_shared = {
1808 .shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC1],
1809};
1810
Lee Jones4c84b4d2013-04-02 13:24:13 +01001811static struct ab8500_shared_mode ab8540_ldo_anamic1_shared = {
1812 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC2],
1813};
1814
1815static struct ab8500_shared_mode ab8540_ldo_anamic2_shared = {
1816 .shared_regulator = &ab8540_regulator_info[AB8540_LDO_ANAMIC1],
1817};
1818
Bengt Jonsson79568b942011-03-11 11:54:46 +01001819struct ab8500_reg_init {
1820 u8 bank;
1821 u8 addr;
1822 u8 mask;
1823};
1824
1825#define REG_INIT(_id, _bank, _addr, _mask) \
1826 [_id] = { \
1827 .bank = _bank, \
1828 .addr = _addr, \
1829 .mask = _mask, \
1830 }
1831
Lee Jones8e6a8d72013-03-28 16:11:11 +00001832/* AB8500 register init */
Bengt Jonsson79568b942011-03-11 11:54:46 +01001833static struct ab8500_reg_init ab8500_reg_init[] = {
1834 /*
Lee Jones33bc8f42013-03-21 15:59:02 +00001835 * 0x30, VanaRequestCtrl
Bengt Jonsson79568b942011-03-11 11:54:46 +01001836 * 0xc0, VextSupply1RequestCtrl
1837 */
Lee Jones43a59112013-03-21 15:59:15 +00001838 REG_INIT(AB8500_REGUREQUESTCTRL2, 0x03, 0x04, 0xf0),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001839 /*
1840 * 0x03, VextSupply2RequestCtrl
1841 * 0x0c, VextSupply3RequestCtrl
1842 * 0x30, Vaux1RequestCtrl
1843 * 0xc0, Vaux2RequestCtrl
1844 */
1845 REG_INIT(AB8500_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
1846 /*
1847 * 0x03, Vaux3RequestCtrl
1848 * 0x04, SwHPReq
1849 */
1850 REG_INIT(AB8500_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
1851 /*
1852 * 0x08, VanaSysClkReq1HPValid
1853 * 0x20, Vaux1SysClkReq1HPValid
1854 * 0x40, Vaux2SysClkReq1HPValid
1855 * 0x80, Vaux3SysClkReq1HPValid
1856 */
Lee Jones43a59112013-03-21 15:59:15 +00001857 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001858 /*
1859 * 0x10, VextSupply1SysClkReq1HPValid
1860 * 0x20, VextSupply2SysClkReq1HPValid
1861 * 0x40, VextSupply3SysClkReq1HPValid
1862 */
Lee Jones43a59112013-03-21 15:59:15 +00001863 REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x70),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001864 /*
1865 * 0x08, VanaHwHPReq1Valid
1866 * 0x20, Vaux1HwHPReq1Valid
1867 * 0x40, Vaux2HwHPReq1Valid
1868 * 0x80, Vaux3HwHPReq1Valid
1869 */
Lee Jones43a59112013-03-21 15:59:15 +00001870 REG_INIT(AB8500_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001871 /*
1872 * 0x01, VextSupply1HwHPReq1Valid
1873 * 0x02, VextSupply2HwHPReq1Valid
1874 * 0x04, VextSupply3HwHPReq1Valid
1875 */
Lee Jones43a59112013-03-21 15:59:15 +00001876 REG_INIT(AB8500_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001877 /*
1878 * 0x08, VanaHwHPReq2Valid
1879 * 0x20, Vaux1HwHPReq2Valid
1880 * 0x40, Vaux2HwHPReq2Valid
1881 * 0x80, Vaux3HwHPReq2Valid
1882 */
Lee Jones43a59112013-03-21 15:59:15 +00001883 REG_INIT(AB8500_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xe8),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001884 /*
1885 * 0x01, VextSupply1HwHPReq2Valid
1886 * 0x02, VextSupply2HwHPReq2Valid
1887 * 0x04, VextSupply3HwHPReq2Valid
1888 */
Lee Jones43a59112013-03-21 15:59:15 +00001889 REG_INIT(AB8500_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001890 /*
1891 * 0x20, VanaSwHPReqValid
1892 * 0x80, Vaux1SwHPReqValid
1893 */
Lee Jones43a59112013-03-21 15:59:15 +00001894 REG_INIT(AB8500_REGUSWHPREQVALID1, 0x03, 0x0d, 0xa0),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001895 /*
1896 * 0x01, Vaux2SwHPReqValid
1897 * 0x02, Vaux3SwHPReqValid
1898 * 0x04, VextSupply1SwHPReqValid
1899 * 0x08, VextSupply2SwHPReqValid
1900 * 0x10, VextSupply3SwHPReqValid
1901 */
Lee Jones43a59112013-03-21 15:59:15 +00001902 REG_INIT(AB8500_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001903 /*
1904 * 0x02, SysClkReq2Valid1
Lee Jones43a59112013-03-21 15:59:15 +00001905 * 0x04, SysClkReq3Valid1
1906 * 0x08, SysClkReq4Valid1
1907 * 0x10, SysClkReq5Valid1
1908 * 0x20, SysClkReq6Valid1
1909 * 0x40, SysClkReq7Valid1
Bengt Jonsson79568b942011-03-11 11:54:46 +01001910 * 0x80, SysClkReq8Valid1
1911 */
1912 REG_INIT(AB8500_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
1913 /*
1914 * 0x02, SysClkReq2Valid2
Lee Jones43a59112013-03-21 15:59:15 +00001915 * 0x04, SysClkReq3Valid2
1916 * 0x08, SysClkReq4Valid2
1917 * 0x10, SysClkReq5Valid2
1918 * 0x20, SysClkReq6Valid2
1919 * 0x40, SysClkReq7Valid2
Bengt Jonsson79568b942011-03-11 11:54:46 +01001920 * 0x80, SysClkReq8Valid2
1921 */
1922 REG_INIT(AB8500_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
1923 /*
1924 * 0x02, VTVoutEna
1925 * 0x04, Vintcore12Ena
1926 * 0x38, Vintcore12Sel
1927 * 0x40, Vintcore12LP
1928 * 0x80, VTVoutLP
1929 */
1930 REG_INIT(AB8500_REGUMISC1, 0x03, 0x80, 0xfe),
1931 /*
1932 * 0x02, VaudioEna
1933 * 0x04, VdmicEna
1934 * 0x08, Vamic1Ena
1935 * 0x10, Vamic2Ena
1936 */
1937 REG_INIT(AB8500_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
1938 /*
1939 * 0x01, Vamic1_dzout
1940 * 0x02, Vamic2_dzout
1941 */
1942 REG_INIT(AB8500_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
1943 /*
Lee Jones43a59112013-03-21 15:59:15 +00001944 * 0x03, VpllRegu (NOTE! PRCMU register bits)
Lee Jones33bc8f42013-03-21 15:59:02 +00001945 * 0x0c, VanaRegu
Bengt Jonsson79568b942011-03-11 11:54:46 +01001946 */
1947 REG_INIT(AB8500_VPLLVANAREGU, 0x04, 0x06, 0x0f),
1948 /*
1949 * 0x01, VrefDDREna
1950 * 0x02, VrefDDRSleepMode
1951 */
1952 REG_INIT(AB8500_VREFDDR, 0x04, 0x07, 0x03),
1953 /*
1954 * 0x03, VextSupply1Regu
1955 * 0x0c, VextSupply2Regu
1956 * 0x30, VextSupply3Regu
1957 * 0x40, ExtSupply2Bypass
1958 * 0x80, ExtSupply3Bypass
1959 */
1960 REG_INIT(AB8500_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
1961 /*
1962 * 0x03, Vaux1Regu
1963 * 0x0c, Vaux2Regu
1964 */
1965 REG_INIT(AB8500_VAUX12REGU, 0x04, 0x09, 0x0f),
1966 /*
1967 * 0x03, Vaux3Regu
1968 */
Lee Jones43a59112013-03-21 15:59:15 +00001969 REG_INIT(AB8500_VRF1VAUX3REGU, 0x04, 0x0a, 0x03),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001970 /*
1971 * 0x0f, Vaux1Sel
1972 */
1973 REG_INIT(AB8500_VAUX1SEL, 0x04, 0x1f, 0x0f),
1974 /*
1975 * 0x0f, Vaux2Sel
1976 */
1977 REG_INIT(AB8500_VAUX2SEL, 0x04, 0x20, 0x0f),
1978 /*
1979 * 0x07, Vaux3Sel
1980 */
Lee Jones43a59112013-03-21 15:59:15 +00001981 REG_INIT(AB8500_VRF1VAUX3SEL, 0x04, 0x21, 0x07),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001982 /*
1983 * 0x01, VextSupply12LP
1984 */
1985 REG_INIT(AB8500_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
1986 /*
1987 * 0x04, Vaux1Disch
1988 * 0x08, Vaux2Disch
1989 * 0x10, Vaux3Disch
1990 * 0x20, Vintcore12Disch
1991 * 0x40, VTVoutDisch
1992 * 0x80, VaudioDisch
1993 */
Lee Jones43a59112013-03-21 15:59:15 +00001994 REG_INIT(AB8500_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
Bengt Jonsson79568b942011-03-11 11:54:46 +01001995 /*
1996 * 0x02, VanaDisch
1997 * 0x04, VdmicPullDownEna
1998 * 0x10, VdmicDisch
1999 */
Lee Jones43a59112013-03-21 15:59:15 +00002000 REG_INIT(AB8500_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
Bengt Jonsson79568b942011-03-11 11:54:46 +01002001};
2002
Lee Jones547f3842013-03-28 16:11:14 +00002003/* AB8505 register init */
2004static struct ab8500_reg_init ab8505_reg_init[] = {
2005 /*
2006 * 0x03, VarmRequestCtrl
2007 * 0x0c, VsmpsCRequestCtrl
2008 * 0x30, VsmpsARequestCtrl
2009 * 0xc0, VsmpsBRequestCtrl
2010 */
2011 REG_INIT(AB8505_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2012 /*
2013 * 0x03, VsafeRequestCtrl
2014 * 0x0c, VpllRequestCtrl
2015 * 0x30, VanaRequestCtrl
2016 */
2017 REG_INIT(AB8505_REGUREQUESTCTRL2, 0x03, 0x04, 0x3f),
2018 /*
2019 * 0x30, Vaux1RequestCtrl
2020 * 0xc0, Vaux2RequestCtrl
2021 */
2022 REG_INIT(AB8505_REGUREQUESTCTRL3, 0x03, 0x05, 0xf0),
2023 /*
2024 * 0x03, Vaux3RequestCtrl
2025 * 0x04, SwHPReq
2026 */
2027 REG_INIT(AB8505_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2028 /*
2029 * 0x01, VsmpsASysClkReq1HPValid
2030 * 0x02, VsmpsBSysClkReq1HPValid
2031 * 0x04, VsafeSysClkReq1HPValid
2032 * 0x08, VanaSysClkReq1HPValid
2033 * 0x10, VpllSysClkReq1HPValid
2034 * 0x20, Vaux1SysClkReq1HPValid
2035 * 0x40, Vaux2SysClkReq1HPValid
2036 * 0x80, Vaux3SysClkReq1HPValid
2037 */
2038 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2039 /*
2040 * 0x01, VsmpsCSysClkReq1HPValid
2041 * 0x02, VarmSysClkReq1HPValid
2042 * 0x04, VbbSysClkReq1HPValid
2043 * 0x08, VsmpsMSysClkReq1HPValid
2044 */
2045 REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x0f),
2046 /*
2047 * 0x01, VsmpsAHwHPReq1Valid
2048 * 0x02, VsmpsBHwHPReq1Valid
2049 * 0x04, VsafeHwHPReq1Valid
2050 * 0x08, VanaHwHPReq1Valid
2051 * 0x10, VpllHwHPReq1Valid
2052 * 0x20, Vaux1HwHPReq1Valid
2053 * 0x40, Vaux2HwHPReq1Valid
2054 * 0x80, Vaux3HwHPReq1Valid
2055 */
2056 REG_INIT(AB8505_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2057 /*
2058 * 0x08, VsmpsMHwHPReq1Valid
2059 */
2060 REG_INIT(AB8505_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x08),
2061 /*
2062 * 0x01, VsmpsAHwHPReq2Valid
2063 * 0x02, VsmpsBHwHPReq2Valid
2064 * 0x04, VsafeHwHPReq2Valid
2065 * 0x08, VanaHwHPReq2Valid
2066 * 0x10, VpllHwHPReq2Valid
2067 * 0x20, Vaux1HwHPReq2Valid
2068 * 0x40, Vaux2HwHPReq2Valid
2069 * 0x80, Vaux3HwHPReq2Valid
2070 */
2071 REG_INIT(AB8505_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2072 /*
2073 * 0x08, VsmpsMHwHPReq2Valid
2074 */
2075 REG_INIT(AB8505_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x08),
2076 /*
2077 * 0x01, VsmpsCSwHPReqValid
2078 * 0x02, VarmSwHPReqValid
2079 * 0x04, VsmpsASwHPReqValid
2080 * 0x08, VsmpsBSwHPReqValid
2081 * 0x10, VsafeSwHPReqValid
2082 * 0x20, VanaSwHPReqValid
2083 * 0x40, VpllSwHPReqValid
2084 * 0x80, Vaux1SwHPReqValid
2085 */
2086 REG_INIT(AB8505_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2087 /*
2088 * 0x01, Vaux2SwHPReqValid
2089 * 0x02, Vaux3SwHPReqValid
2090 * 0x20, VsmpsMSwHPReqValid
2091 */
2092 REG_INIT(AB8505_REGUSWHPREQVALID2, 0x03, 0x0e, 0x23),
2093 /*
2094 * 0x02, SysClkReq2Valid1
2095 * 0x04, SysClkReq3Valid1
2096 * 0x08, SysClkReq4Valid1
2097 */
2098 REG_INIT(AB8505_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0x0e),
2099 /*
2100 * 0x02, SysClkReq2Valid2
2101 * 0x04, SysClkReq3Valid2
2102 * 0x08, SysClkReq4Valid2
2103 */
2104 REG_INIT(AB8505_REGUSYSCLKREQVALID2, 0x03, 0x10, 0x0e),
2105 /*
2106 * 0x01, Vaux4SwHPReqValid
2107 * 0x02, Vaux4HwHPReq2Valid
2108 * 0x04, Vaux4HwHPReq1Valid
2109 * 0x08, Vaux4SysClkReq1HPValid
2110 */
2111 REG_INIT(AB8505_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2112 /*
2113 * 0x02, VadcEna
2114 * 0x04, VintCore12Ena
2115 * 0x38, VintCore12Sel
2116 * 0x40, VintCore12LP
2117 * 0x80, VadcLP
2118 */
2119 REG_INIT(AB8505_REGUMISC1, 0x03, 0x80, 0xfe),
2120 /*
2121 * 0x02, VaudioEna
2122 * 0x04, VdmicEna
2123 * 0x08, Vamic1Ena
2124 * 0x10, Vamic2Ena
2125 */
2126 REG_INIT(AB8505_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2127 /*
2128 * 0x01, Vamic1_dzout
2129 * 0x02, Vamic2_dzout
2130 */
2131 REG_INIT(AB8505_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2132 /*
2133 * 0x03, VsmpsARegu
2134 * 0x0c, VsmpsASelCtrl
2135 * 0x10, VsmpsAAutoMode
2136 * 0x20, VsmpsAPWMMode
2137 */
2138 REG_INIT(AB8505_VSMPSAREGU, 0x04, 0x03, 0x3f),
2139 /*
2140 * 0x03, VsmpsBRegu
2141 * 0x0c, VsmpsBSelCtrl
2142 * 0x10, VsmpsBAutoMode
2143 * 0x20, VsmpsBPWMMode
2144 */
2145 REG_INIT(AB8505_VSMPSBREGU, 0x04, 0x04, 0x3f),
2146 /*
2147 * 0x03, VsafeRegu
2148 * 0x0c, VsafeSelCtrl
2149 * 0x10, VsafeAutoMode
2150 * 0x20, VsafePWMMode
2151 */
2152 REG_INIT(AB8505_VSAFEREGU, 0x04, 0x05, 0x3f),
2153 /*
2154 * 0x03, VpllRegu (NOTE! PRCMU register bits)
2155 * 0x0c, VanaRegu
2156 */
2157 REG_INIT(AB8505_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2158 /*
2159 * 0x03, VextSupply1Regu
2160 * 0x0c, VextSupply2Regu
2161 * 0x30, VextSupply3Regu
2162 * 0x40, ExtSupply2Bypass
2163 * 0x80, ExtSupply3Bypass
2164 */
2165 REG_INIT(AB8505_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2166 /*
2167 * 0x03, Vaux1Regu
2168 * 0x0c, Vaux2Regu
2169 */
2170 REG_INIT(AB8505_VAUX12REGU, 0x04, 0x09, 0x0f),
2171 /*
2172 * 0x0f, Vaux3Regu
2173 */
2174 REG_INIT(AB8505_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2175 /*
2176 * 0x3f, VsmpsASel1
2177 */
2178 REG_INIT(AB8505_VSMPSASEL1, 0x04, 0x13, 0x3f),
2179 /*
2180 * 0x3f, VsmpsASel2
2181 */
2182 REG_INIT(AB8505_VSMPSASEL2, 0x04, 0x14, 0x3f),
2183 /*
2184 * 0x3f, VsmpsASel3
2185 */
2186 REG_INIT(AB8505_VSMPSASEL3, 0x04, 0x15, 0x3f),
2187 /*
2188 * 0x3f, VsmpsBSel1
2189 */
2190 REG_INIT(AB8505_VSMPSBSEL1, 0x04, 0x17, 0x3f),
2191 /*
2192 * 0x3f, VsmpsBSel2
2193 */
2194 REG_INIT(AB8505_VSMPSBSEL2, 0x04, 0x18, 0x3f),
2195 /*
2196 * 0x3f, VsmpsBSel3
2197 */
2198 REG_INIT(AB8505_VSMPSBSEL3, 0x04, 0x19, 0x3f),
2199 /*
2200 * 0x7f, VsafeSel1
2201 */
2202 REG_INIT(AB8505_VSAFESEL1, 0x04, 0x1b, 0x7f),
2203 /*
2204 * 0x3f, VsafeSel2
2205 */
2206 REG_INIT(AB8505_VSAFESEL2, 0x04, 0x1c, 0x7f),
2207 /*
2208 * 0x3f, VsafeSel3
2209 */
2210 REG_INIT(AB8505_VSAFESEL3, 0x04, 0x1d, 0x7f),
2211 /*
2212 * 0x0f, Vaux1Sel
2213 */
2214 REG_INIT(AB8505_VAUX1SEL, 0x04, 0x1f, 0x0f),
2215 /*
2216 * 0x0f, Vaux2Sel
2217 */
2218 REG_INIT(AB8505_VAUX2SEL, 0x04, 0x20, 0x0f),
2219 /*
2220 * 0x07, Vaux3Sel
2221 * 0x30, VRF1Sel
2222 */
2223 REG_INIT(AB8505_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2224 /*
2225 * 0x03, Vaux4RequestCtrl
2226 */
2227 REG_INIT(AB8505_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2228 /*
2229 * 0x03, Vaux4Regu
2230 */
2231 REG_INIT(AB8505_VAUX4REGU, 0x04, 0x2e, 0x03),
2232 /*
2233 * 0x0f, Vaux4Sel
2234 */
2235 REG_INIT(AB8505_VAUX4SEL, 0x04, 0x2f, 0x0f),
2236 /*
2237 * 0x04, Vaux1Disch
2238 * 0x08, Vaux2Disch
2239 * 0x10, Vaux3Disch
2240 * 0x20, Vintcore12Disch
2241 * 0x40, VTVoutDisch
2242 * 0x80, VaudioDisch
2243 */
2244 REG_INIT(AB8505_REGUCTRLDISCH, 0x04, 0x43, 0xfc),
2245 /*
2246 * 0x02, VanaDisch
2247 * 0x04, VdmicPullDownEna
2248 * 0x10, VdmicDisch
2249 */
2250 REG_INIT(AB8505_REGUCTRLDISCH2, 0x04, 0x44, 0x16),
2251 /*
2252 * 0x01, Vaux4Disch
2253 */
2254 REG_INIT(AB8505_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2255 /*
2256 * 0x07, Vaux5Sel
2257 * 0x08, Vaux5LP
2258 * 0x10, Vaux5Ena
2259 * 0x20, Vaux5Disch
2260 * 0x40, Vaux5DisSfst
2261 * 0x80, Vaux5DisPulld
2262 */
2263 REG_INIT(AB8505_CTRLVAUX5, 0x01, 0x55, 0xff),
2264 /*
2265 * 0x07, Vaux6Sel
2266 * 0x08, Vaux6LP
2267 * 0x10, Vaux6Ena
2268 * 0x80, Vaux6DisPulld
2269 */
2270 REG_INIT(AB8505_CTRLVAUX6, 0x01, 0x56, 0x9f),
2271};
2272
Lee Jones8e6a8d72013-03-28 16:11:11 +00002273/* AB9540 register init */
2274static struct ab8500_reg_init ab9540_reg_init[] = {
2275 /*
2276 * 0x03, VarmRequestCtrl
2277 * 0x0c, VapeRequestCtrl
2278 * 0x30, Vsmps1RequestCtrl
2279 * 0xc0, Vsmps2RequestCtrl
2280 */
2281 REG_INIT(AB9540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2282 /*
2283 * 0x03, Vsmps3RequestCtrl
2284 * 0x0c, VpllRequestCtrl
2285 * 0x30, VanaRequestCtrl
2286 * 0xc0, VextSupply1RequestCtrl
2287 */
2288 REG_INIT(AB9540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2289 /*
2290 * 0x03, VextSupply2RequestCtrl
2291 * 0x0c, VextSupply3RequestCtrl
2292 * 0x30, Vaux1RequestCtrl
2293 * 0xc0, Vaux2RequestCtrl
2294 */
2295 REG_INIT(AB9540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2296 /*
2297 * 0x03, Vaux3RequestCtrl
2298 * 0x04, SwHPReq
2299 */
2300 REG_INIT(AB9540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2301 /*
2302 * 0x01, Vsmps1SysClkReq1HPValid
2303 * 0x02, Vsmps2SysClkReq1HPValid
2304 * 0x04, Vsmps3SysClkReq1HPValid
2305 * 0x08, VanaSysClkReq1HPValid
2306 * 0x10, VpllSysClkReq1HPValid
2307 * 0x20, Vaux1SysClkReq1HPValid
2308 * 0x40, Vaux2SysClkReq1HPValid
2309 * 0x80, Vaux3SysClkReq1HPValid
2310 */
2311 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2312 /*
2313 * 0x01, VapeSysClkReq1HPValid
2314 * 0x02, VarmSysClkReq1HPValid
2315 * 0x04, VbbSysClkReq1HPValid
2316 * 0x08, VmodSysClkReq1HPValid
2317 * 0x10, VextSupply1SysClkReq1HPValid
2318 * 0x20, VextSupply2SysClkReq1HPValid
2319 * 0x40, VextSupply3SysClkReq1HPValid
2320 */
2321 REG_INIT(AB9540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x7f),
2322 /*
2323 * 0x01, Vsmps1HwHPReq1Valid
2324 * 0x02, Vsmps2HwHPReq1Valid
2325 * 0x04, Vsmps3HwHPReq1Valid
2326 * 0x08, VanaHwHPReq1Valid
2327 * 0x10, VpllHwHPReq1Valid
2328 * 0x20, Vaux1HwHPReq1Valid
2329 * 0x40, Vaux2HwHPReq1Valid
2330 * 0x80, Vaux3HwHPReq1Valid
2331 */
2332 REG_INIT(AB9540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2333 /*
2334 * 0x01, VextSupply1HwHPReq1Valid
2335 * 0x02, VextSupply2HwHPReq1Valid
2336 * 0x04, VextSupply3HwHPReq1Valid
2337 * 0x08, VmodHwHPReq1Valid
2338 */
2339 REG_INIT(AB9540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x0f),
2340 /*
2341 * 0x01, Vsmps1HwHPReq2Valid
2342 * 0x02, Vsmps2HwHPReq2Valid
2343 * 0x03, Vsmps3HwHPReq2Valid
2344 * 0x08, VanaHwHPReq2Valid
2345 * 0x10, VpllHwHPReq2Valid
2346 * 0x20, Vaux1HwHPReq2Valid
2347 * 0x40, Vaux2HwHPReq2Valid
2348 * 0x80, Vaux3HwHPReq2Valid
2349 */
2350 REG_INIT(AB9540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2351 /*
2352 * 0x01, VextSupply1HwHPReq2Valid
2353 * 0x02, VextSupply2HwHPReq2Valid
2354 * 0x04, VextSupply3HwHPReq2Valid
2355 * 0x08, VmodHwHPReq2Valid
2356 */
2357 REG_INIT(AB9540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x0f),
2358 /*
2359 * 0x01, VapeSwHPReqValid
2360 * 0x02, VarmSwHPReqValid
2361 * 0x04, Vsmps1SwHPReqValid
2362 * 0x08, Vsmps2SwHPReqValid
2363 * 0x10, Vsmps3SwHPReqValid
2364 * 0x20, VanaSwHPReqValid
2365 * 0x40, VpllSwHPReqValid
2366 * 0x80, Vaux1SwHPReqValid
2367 */
2368 REG_INIT(AB9540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2369 /*
2370 * 0x01, Vaux2SwHPReqValid
2371 * 0x02, Vaux3SwHPReqValid
2372 * 0x04, VextSupply1SwHPReqValid
2373 * 0x08, VextSupply2SwHPReqValid
2374 * 0x10, VextSupply3SwHPReqValid
2375 * 0x20, VmodSwHPReqValid
2376 */
2377 REG_INIT(AB9540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x3f),
2378 /*
2379 * 0x02, SysClkReq2Valid1
2380 * ...
2381 * 0x80, SysClkReq8Valid1
2382 */
2383 REG_INIT(AB9540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xfe),
2384 /*
2385 * 0x02, SysClkReq2Valid2
2386 * ...
2387 * 0x80, SysClkReq8Valid2
2388 */
2389 REG_INIT(AB9540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xfe),
2390 /*
2391 * 0x01, Vaux4SwHPReqValid
2392 * 0x02, Vaux4HwHPReq2Valid
2393 * 0x04, Vaux4HwHPReq1Valid
2394 * 0x08, Vaux4SysClkReq1HPValid
2395 */
2396 REG_INIT(AB9540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2397 /*
2398 * 0x02, VTVoutEna
2399 * 0x04, Vintcore12Ena
2400 * 0x38, Vintcore12Sel
2401 * 0x40, Vintcore12LP
2402 * 0x80, VTVoutLP
2403 */
2404 REG_INIT(AB9540_REGUMISC1, 0x03, 0x80, 0xfe),
2405 /*
2406 * 0x02, VaudioEna
2407 * 0x04, VdmicEna
2408 * 0x08, Vamic1Ena
2409 * 0x10, Vamic2Ena
2410 */
2411 REG_INIT(AB9540_VAUDIOSUPPLY, 0x03, 0x83, 0x1e),
2412 /*
2413 * 0x01, Vamic1_dzout
2414 * 0x02, Vamic2_dzout
2415 */
2416 REG_INIT(AB9540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2417 /*
2418 * 0x03, Vsmps1Regu
2419 * 0x0c, Vsmps1SelCtrl
2420 * 0x10, Vsmps1AutoMode
2421 * 0x20, Vsmps1PWMMode
2422 */
2423 REG_INIT(AB9540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2424 /*
2425 * 0x03, Vsmps2Regu
2426 * 0x0c, Vsmps2SelCtrl
2427 * 0x10, Vsmps2AutoMode
2428 * 0x20, Vsmps2PWMMode
2429 */
2430 REG_INIT(AB9540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2431 /*
2432 * 0x03, Vsmps3Regu
2433 * 0x0c, Vsmps3SelCtrl
2434 * NOTE! PRCMU register
2435 */
2436 REG_INIT(AB9540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2437 /*
2438 * 0x03, VpllRegu
2439 * 0x0c, VanaRegu
2440 */
2441 REG_INIT(AB9540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2442 /*
2443 * 0x03, VextSupply1Regu
2444 * 0x0c, VextSupply2Regu
2445 * 0x30, VextSupply3Regu
2446 * 0x40, ExtSupply2Bypass
2447 * 0x80, ExtSupply3Bypass
2448 */
2449 REG_INIT(AB9540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2450 /*
2451 * 0x03, Vaux1Regu
2452 * 0x0c, Vaux2Regu
2453 */
2454 REG_INIT(AB9540_VAUX12REGU, 0x04, 0x09, 0x0f),
2455 /*
2456 * 0x0c, Vrf1Regu
2457 * 0x03, Vaux3Regu
2458 */
2459 REG_INIT(AB9540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2460 /*
2461 * 0x3f, Vsmps1Sel1
2462 */
2463 REG_INIT(AB9540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2464 /*
2465 * 0x3f, Vsmps1Sel2
2466 */
2467 REG_INIT(AB9540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2468 /*
2469 * 0x3f, Vsmps1Sel3
2470 */
2471 REG_INIT(AB9540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2472 /*
2473 * 0x3f, Vsmps2Sel1
2474 */
2475 REG_INIT(AB9540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2476 /*
2477 * 0x3f, Vsmps2Sel2
2478 */
2479 REG_INIT(AB9540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2480 /*
2481 * 0x3f, Vsmps2Sel3
2482 */
2483 REG_INIT(AB9540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2484 /*
2485 * 0x7f, Vsmps3Sel1
2486 * NOTE! PRCMU register
2487 */
2488 REG_INIT(AB9540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2489 /*
2490 * 0x7f, Vsmps3Sel2
2491 * NOTE! PRCMU register
2492 */
2493 REG_INIT(AB9540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2494 /*
2495 * 0x0f, Vaux1Sel
2496 */
2497 REG_INIT(AB9540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2498 /*
2499 * 0x0f, Vaux2Sel
2500 */
2501 REG_INIT(AB9540_VAUX2SEL, 0x04, 0x20, 0x0f),
2502 /*
2503 * 0x07, Vaux3Sel
2504 * 0x30, Vrf1Sel
2505 */
2506 REG_INIT(AB9540_VRF1VAUX3SEL, 0x04, 0x21, 0x37),
2507 /*
2508 * 0x01, VextSupply12LP
2509 */
2510 REG_INIT(AB9540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2511 /*
2512 * 0x03, Vaux4RequestCtrl
2513 */
2514 REG_INIT(AB9540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2515 /*
2516 * 0x03, Vaux4Regu
2517 */
2518 REG_INIT(AB9540_VAUX4REGU, 0x04, 0x2e, 0x03),
2519 /*
2520 * 0x08, Vaux4Sel
2521 */
2522 REG_INIT(AB9540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2523 /*
2524 * 0x01, VpllDisch
2525 * 0x02, Vrf1Disch
2526 * 0x04, Vaux1Disch
2527 * 0x08, Vaux2Disch
2528 * 0x10, Vaux3Disch
2529 * 0x20, Vintcore12Disch
2530 * 0x40, VTVoutDisch
2531 * 0x80, VaudioDisch
2532 */
2533 REG_INIT(AB9540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2534 /*
2535 * 0x01, VsimDisch
2536 * 0x02, VanaDisch
2537 * 0x04, VdmicPullDownEna
2538 * 0x08, VpllPullDownEna
2539 * 0x10, VdmicDisch
2540 */
2541 REG_INIT(AB9540_REGUCTRLDISCH2, 0x04, 0x44, 0x1f),
2542 /*
2543 * 0x01, Vaux4Disch
2544 */
2545 REG_INIT(AB9540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2546};
2547
Lee Jonesae0a9a32013-03-28 16:11:16 +00002548/* AB8540 register init */
2549static struct ab8500_reg_init ab8540_reg_init[] = {
2550 /*
2551 * 0x01, VSimSycClkReq1Valid
2552 * 0x02, VSimSycClkReq2Valid
2553 * 0x04, VSimSycClkReq3Valid
2554 * 0x08, VSimSycClkReq4Valid
2555 * 0x10, VSimSycClkReq5Valid
2556 * 0x20, VSimSycClkReq6Valid
2557 * 0x40, VSimSycClkReq7Valid
2558 * 0x80, VSimSycClkReq8Valid
2559 */
2560 REG_INIT(AB8540_VSIMSYSCLKCTRL, 0x02, 0x33, 0xff),
2561 /*
2562 * 0x03, VarmRequestCtrl
2563 * 0x0c, VapeRequestCtrl
2564 * 0x30, Vsmps1RequestCtrl
2565 * 0xc0, Vsmps2RequestCtrl
2566 */
2567 REG_INIT(AB8540_REGUREQUESTCTRL1, 0x03, 0x03, 0xff),
2568 /*
2569 * 0x03, Vsmps3RequestCtrl
2570 * 0x0c, VpllRequestCtrl
2571 * 0x30, VanaRequestCtrl
2572 * 0xc0, VextSupply1RequestCtrl
2573 */
2574 REG_INIT(AB8540_REGUREQUESTCTRL2, 0x03, 0x04, 0xff),
2575 /*
2576 * 0x03, VextSupply2RequestCtrl
2577 * 0x0c, VextSupply3RequestCtrl
2578 * 0x30, Vaux1RequestCtrl
2579 * 0xc0, Vaux2RequestCtrl
2580 */
2581 REG_INIT(AB8540_REGUREQUESTCTRL3, 0x03, 0x05, 0xff),
2582 /*
2583 * 0x03, Vaux3RequestCtrl
2584 * 0x04, SwHPReq
2585 */
2586 REG_INIT(AB8540_REGUREQUESTCTRL4, 0x03, 0x06, 0x07),
2587 /*
2588 * 0x01, Vsmps1SysClkReq1HPValid
2589 * 0x02, Vsmps2SysClkReq1HPValid
2590 * 0x04, Vsmps3SysClkReq1HPValid
2591 * 0x08, VanaSysClkReq1HPValid
2592 * 0x10, VpllSysClkReq1HPValid
2593 * 0x20, Vaux1SysClkReq1HPValid
2594 * 0x40, Vaux2SysClkReq1HPValid
2595 * 0x80, Vaux3SysClkReq1HPValid
2596 */
2597 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID1, 0x03, 0x07, 0xff),
2598 /*
2599 * 0x01, VapeSysClkReq1HPValid
2600 * 0x02, VarmSysClkReq1HPValid
2601 * 0x04, VbbSysClkReq1HPValid
2602 * 0x10, VextSupply1SysClkReq1HPValid
2603 * 0x20, VextSupply2SysClkReq1HPValid
2604 * 0x40, VextSupply3SysClkReq1HPValid
2605 */
2606 REG_INIT(AB8540_REGUSYSCLKREQ1HPVALID2, 0x03, 0x08, 0x77),
2607 /*
2608 * 0x01, Vsmps1HwHPReq1Valid
2609 * 0x02, Vsmps2HwHPReq1Valid
2610 * 0x04, Vsmps3HwHPReq1Valid
2611 * 0x08, VanaHwHPReq1Valid
2612 * 0x10, VpllHwHPReq1Valid
2613 * 0x20, Vaux1HwHPReq1Valid
2614 * 0x40, Vaux2HwHPReq1Valid
2615 * 0x80, Vaux3HwHPReq1Valid
2616 */
2617 REG_INIT(AB8540_REGUHWHPREQ1VALID1, 0x03, 0x09, 0xff),
2618 /*
2619 * 0x01, VextSupply1HwHPReq1Valid
2620 * 0x02, VextSupply2HwHPReq1Valid
2621 * 0x04, VextSupply3HwHPReq1Valid
2622 */
2623 REG_INIT(AB8540_REGUHWHPREQ1VALID2, 0x03, 0x0a, 0x07),
2624 /*
2625 * 0x01, Vsmps1HwHPReq2Valid
2626 * 0x02, Vsmps2HwHPReq2Valid
2627 * 0x03, Vsmps3HwHPReq2Valid
2628 * 0x08, VanaHwHPReq2Valid
2629 * 0x10, VpllHwHPReq2Valid
2630 * 0x20, Vaux1HwHPReq2Valid
2631 * 0x40, Vaux2HwHPReq2Valid
2632 * 0x80, Vaux3HwHPReq2Valid
2633 */
2634 REG_INIT(AB8540_REGUHWHPREQ2VALID1, 0x03, 0x0b, 0xff),
2635 /*
2636 * 0x01, VextSupply1HwHPReq2Valid
2637 * 0x02, VextSupply2HwHPReq2Valid
2638 * 0x04, VextSupply3HwHPReq2Valid
2639 */
2640 REG_INIT(AB8540_REGUHWHPREQ2VALID2, 0x03, 0x0c, 0x07),
2641 /*
2642 * 0x01, VapeSwHPReqValid
2643 * 0x02, VarmSwHPReqValid
2644 * 0x04, Vsmps1SwHPReqValid
2645 * 0x08, Vsmps2SwHPReqValid
2646 * 0x10, Vsmps3SwHPReqValid
2647 * 0x20, VanaSwHPReqValid
2648 * 0x40, VpllSwHPReqValid
2649 * 0x80, Vaux1SwHPReqValid
2650 */
2651 REG_INIT(AB8540_REGUSWHPREQVALID1, 0x03, 0x0d, 0xff),
2652 /*
2653 * 0x01, Vaux2SwHPReqValid
2654 * 0x02, Vaux3SwHPReqValid
2655 * 0x04, VextSupply1SwHPReqValid
2656 * 0x08, VextSupply2SwHPReqValid
2657 * 0x10, VextSupply3SwHPReqValid
2658 */
2659 REG_INIT(AB8540_REGUSWHPREQVALID2, 0x03, 0x0e, 0x1f),
2660 /*
2661 * 0x02, SysClkReq2Valid1
2662 * ...
2663 * 0x80, SysClkReq8Valid1
2664 */
2665 REG_INIT(AB8540_REGUSYSCLKREQVALID1, 0x03, 0x0f, 0xff),
2666 /*
2667 * 0x02, SysClkReq2Valid2
2668 * ...
2669 * 0x80, SysClkReq8Valid2
2670 */
2671 REG_INIT(AB8540_REGUSYSCLKREQVALID2, 0x03, 0x10, 0xff),
2672 /*
2673 * 0x01, Vaux4SwHPReqValid
2674 * 0x02, Vaux4HwHPReq2Valid
2675 * 0x04, Vaux4HwHPReq1Valid
2676 * 0x08, Vaux4SysClkReq1HPValid
2677 */
2678 REG_INIT(AB8540_REGUVAUX4REQVALID, 0x03, 0x11, 0x0f),
2679 /*
2680 * 0x01, Vaux5SwHPReqValid
2681 * 0x02, Vaux5HwHPReq2Valid
2682 * 0x04, Vaux5HwHPReq1Valid
2683 * 0x08, Vaux5SysClkReq1HPValid
2684 */
2685 REG_INIT(AB8540_REGUVAUX5REQVALID, 0x03, 0x12, 0x0f),
2686 /*
2687 * 0x01, Vaux6SwHPReqValid
2688 * 0x02, Vaux6HwHPReq2Valid
2689 * 0x04, Vaux6HwHPReq1Valid
2690 * 0x08, Vaux6SysClkReq1HPValid
2691 */
2692 REG_INIT(AB8540_REGUVAUX6REQVALID, 0x03, 0x13, 0x0f),
2693 /*
2694 * 0x01, VclkbSwHPReqValid
2695 * 0x02, VclkbHwHPReq2Valid
2696 * 0x04, VclkbHwHPReq1Valid
2697 * 0x08, VclkbSysClkReq1HPValid
2698 */
2699 REG_INIT(AB8540_REGUVCLKBREQVALID, 0x03, 0x14, 0x0f),
2700 /*
2701 * 0x01, Vrf1SwHPReqValid
2702 * 0x02, Vrf1HwHPReq2Valid
2703 * 0x04, Vrf1HwHPReq1Valid
2704 * 0x08, Vrf1SysClkReq1HPValid
2705 */
2706 REG_INIT(AB8540_REGUVRF1REQVALID, 0x03, 0x15, 0x0f),
2707 /*
2708 * 0x02, VTVoutEna
2709 * 0x04, Vintcore12Ena
2710 * 0x38, Vintcore12Sel
2711 * 0x40, Vintcore12LP
2712 * 0x80, VTVoutLP
2713 */
2714 REG_INIT(AB8540_REGUMISC1, 0x03, 0x80, 0xfe),
2715 /*
2716 * 0x02, VaudioEna
2717 * 0x04, VdmicEna
2718 * 0x08, Vamic1Ena
2719 * 0x10, Vamic2Ena
2720 * 0x20, Vamic12LP
2721 * 0xC0, VdmicSel
2722 */
2723 REG_INIT(AB8540_VAUDIOSUPPLY, 0x03, 0x83, 0xfe),
2724 /*
2725 * 0x01, Vamic1_dzout
2726 * 0x02, Vamic2_dzout
2727 */
2728 REG_INIT(AB8540_REGUCTRL1VAMIC, 0x03, 0x84, 0x03),
2729 /*
2730 * 0x07, VHSICSel
2731 * 0x08, VHSICOffState
2732 * 0x10, VHSIEna
2733 * 0x20, VHSICLP
2734 */
2735 REG_INIT(AB8540_VHSIC, 0x03, 0x87, 0x3f),
2736 /*
2737 * 0x07, VSDIOSel
2738 * 0x08, VSDIOOffState
2739 * 0x10, VSDIOEna
2740 * 0x20, VSDIOLP
2741 */
2742 REG_INIT(AB8540_VSDIO, 0x03, 0x88, 0x3f),
2743 /*
2744 * 0x03, Vsmps1Regu
2745 * 0x0c, Vsmps1SelCtrl
2746 * 0x10, Vsmps1AutoMode
2747 * 0x20, Vsmps1PWMMode
2748 */
2749 REG_INIT(AB8540_VSMPS1REGU, 0x04, 0x03, 0x3f),
2750 /*
2751 * 0x03, Vsmps2Regu
2752 * 0x0c, Vsmps2SelCtrl
2753 * 0x10, Vsmps2AutoMode
2754 * 0x20, Vsmps2PWMMode
2755 */
2756 REG_INIT(AB8540_VSMPS2REGU, 0x04, 0x04, 0x3f),
2757 /*
2758 * 0x03, Vsmps3Regu
2759 * 0x0c, Vsmps3SelCtrl
2760 * 0x10, Vsmps3AutoMode
2761 * 0x20, Vsmps3PWMMode
2762 * NOTE! PRCMU register
2763 */
2764 REG_INIT(AB8540_VSMPS3REGU, 0x04, 0x05, 0x0f),
2765 /*
2766 * 0x03, VpllRegu
2767 * 0x0c, VanaRegu
2768 */
2769 REG_INIT(AB8540_VPLLVANAREGU, 0x04, 0x06, 0x0f),
2770 /*
2771 * 0x03, VextSupply1Regu
2772 * 0x0c, VextSupply2Regu
2773 * 0x30, VextSupply3Regu
2774 * 0x40, ExtSupply2Bypass
2775 * 0x80, ExtSupply3Bypass
2776 */
2777 REG_INIT(AB8540_EXTSUPPLYREGU, 0x04, 0x08, 0xff),
2778 /*
2779 * 0x03, Vaux1Regu
2780 * 0x0c, Vaux2Regu
2781 */
2782 REG_INIT(AB8540_VAUX12REGU, 0x04, 0x09, 0x0f),
2783 /*
2784 * 0x0c, VRF1Regu
2785 * 0x03, Vaux3Regu
2786 */
2787 REG_INIT(AB8540_VRF1VAUX3REGU, 0x04, 0x0a, 0x0f),
2788 /*
2789 * 0x3f, Vsmps1Sel1
2790 */
2791 REG_INIT(AB8540_VSMPS1SEL1, 0x04, 0x13, 0x3f),
2792 /*
2793 * 0x3f, Vsmps1Sel2
2794 */
2795 REG_INIT(AB8540_VSMPS1SEL2, 0x04, 0x14, 0x3f),
2796 /*
2797 * 0x3f, Vsmps1Sel3
2798 */
2799 REG_INIT(AB8540_VSMPS1SEL3, 0x04, 0x15, 0x3f),
2800 /*
2801 * 0x3f, Vsmps2Sel1
2802 */
2803 REG_INIT(AB8540_VSMPS2SEL1, 0x04, 0x17, 0x3f),
2804 /*
2805 * 0x3f, Vsmps2Sel2
2806 */
2807 REG_INIT(AB8540_VSMPS2SEL2, 0x04, 0x18, 0x3f),
2808 /*
2809 * 0x3f, Vsmps2Sel3
2810 */
2811 REG_INIT(AB8540_VSMPS2SEL3, 0x04, 0x19, 0x3f),
2812 /*
2813 * 0x7f, Vsmps3Sel1
2814 * NOTE! PRCMU register
2815 */
2816 REG_INIT(AB8540_VSMPS3SEL1, 0x04, 0x1b, 0x7f),
2817 /*
2818 * 0x7f, Vsmps3Sel2
2819 * NOTE! PRCMU register
2820 */
2821 REG_INIT(AB8540_VSMPS3SEL2, 0x04, 0x1c, 0x7f),
2822 /*
2823 * 0x0f, Vaux1Sel
2824 */
2825 REG_INIT(AB8540_VAUX1SEL, 0x04, 0x1f, 0x0f),
2826 /*
2827 * 0x0f, Vaux2Sel
2828 */
2829 REG_INIT(AB8540_VAUX2SEL, 0x04, 0x20, 0x0f),
2830 /*
2831 * 0x07, Vaux3Sel
2832 * 0x70, Vrf1Sel
2833 */
2834 REG_INIT(AB8540_VRF1VAUX3SEL, 0x04, 0x21, 0x77),
2835 /*
2836 * 0x01, VextSupply12LP
2837 */
2838 REG_INIT(AB8540_REGUCTRL2SPARE, 0x04, 0x22, 0x01),
2839 /*
2840 * 0x07, Vanasel
2841 * 0x30, Vpllsel
2842 */
2843 REG_INIT(AB8540_VANAVPLLSEL, 0x04, 0x29, 0x37),
2844 /*
2845 * 0x03, Vaux4RequestCtrl
2846 */
2847 REG_INIT(AB8540_VAUX4REQCTRL, 0x04, 0x2d, 0x03),
2848 /*
2849 * 0x03, Vaux4Regu
2850 */
2851 REG_INIT(AB8540_VAUX4REGU, 0x04, 0x2e, 0x03),
2852 /*
2853 * 0x0f, Vaux4Sel
2854 */
2855 REG_INIT(AB8540_VAUX4SEL, 0x04, 0x2f, 0x0f),
2856 /*
2857 * 0x03, Vaux5RequestCtrl
2858 */
2859 REG_INIT(AB8540_VAUX5REQCTRL, 0x04, 0x31, 0x03),
2860 /*
2861 * 0x03, Vaux5Regu
2862 */
2863 REG_INIT(AB8540_VAUX5REGU, 0x04, 0x32, 0x03),
2864 /*
2865 * 0x3f, Vaux5Sel
2866 */
2867 REG_INIT(AB8540_VAUX5SEL, 0x04, 0x33, 0x3f),
2868 /*
2869 * 0x03, Vaux6RequestCtrl
2870 */
2871 REG_INIT(AB8540_VAUX6REQCTRL, 0x04, 0x34, 0x03),
2872 /*
2873 * 0x03, Vaux6Regu
2874 */
2875 REG_INIT(AB8540_VAUX6REGU, 0x04, 0x35, 0x03),
2876 /*
2877 * 0x3f, Vaux6Sel
2878 */
2879 REG_INIT(AB8540_VAUX6SEL, 0x04, 0x36, 0x3f),
2880 /*
2881 * 0x03, VCLKBRequestCtrl
2882 */
2883 REG_INIT(AB8540_VCLKBREQCTRL, 0x04, 0x37, 0x03),
2884 /*
2885 * 0x03, VCLKBRegu
2886 */
2887 REG_INIT(AB8540_VCLKBREGU, 0x04, 0x38, 0x03),
2888 /*
2889 * 0x07, VCLKBSel
2890 */
2891 REG_INIT(AB8540_VCLKBSEL, 0x04, 0x39, 0x07),
2892 /*
2893 * 0x03, Vrf1RequestCtrl
2894 */
2895 REG_INIT(AB8540_VRF1REQCTRL, 0x04, 0x3a, 0x03),
2896 /*
2897 * 0x01, VpllDisch
2898 * 0x02, Vrf1Disch
2899 * 0x04, Vaux1Disch
2900 * 0x08, Vaux2Disch
2901 * 0x10, Vaux3Disch
2902 * 0x20, Vintcore12Disch
2903 * 0x40, VTVoutDisch
2904 * 0x80, VaudioDisch
2905 */
2906 REG_INIT(AB8540_REGUCTRLDISCH, 0x04, 0x43, 0xff),
2907 /*
2908 * 0x02, VanaDisch
2909 * 0x04, VdmicPullDownEna
2910 * 0x08, VpllPullDownEna
2911 * 0x10, VdmicDisch
2912 */
2913 REG_INIT(AB8540_REGUCTRLDISCH2, 0x04, 0x44, 0x1e),
2914 /*
2915 * 0x01, Vaux4Disch
2916 */
2917 REG_INIT(AB8540_REGUCTRLDISCH3, 0x04, 0x48, 0x01),
2918 /*
2919 * 0x01, Vaux5Disch
2920 * 0x02, Vaux6Disch
2921 * 0x04, VCLKBDisch
2922 */
2923 REG_INIT(AB8540_REGUCTRLDISCH4, 0x04, 0x49, 0x07),
2924};
2925
Lee Jones33aeb492013-04-02 13:24:14 +01002926static struct {
2927 struct ab8500_regulator_info *info;
2928 int info_size;
2929 struct ab8500_reg_init *init;
2930 int init_size;
2931 struct of_regulator_match *match;
2932 int match_size;
2933} abx500_regulator;
2934
Lee Jones3c1b8432013-03-21 15:59:01 +00002935static int ab8500_regulator_init_registers(struct platform_device *pdev,
2936 int id, int mask, int value)
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002937{
Lee Jones33aeb492013-04-02 13:24:14 +01002938 struct ab8500_reg_init *reg_init = abx500_regulator.init;
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002939 int err;
2940
Lee Jones3c1b8432013-03-21 15:59:01 +00002941 BUG_ON(value & ~mask);
Lee Jonesb54969a2013-03-28 16:11:10 +00002942 BUG_ON(mask & ~reg_init[id].mask);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002943
Lee Jones3c1b8432013-03-21 15:59:01 +00002944 /* initialize register */
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002945 err = abx500_mask_and_set_register_interruptible(
2946 &pdev->dev,
Lee Jonesb54969a2013-03-28 16:11:10 +00002947 reg_init[id].bank,
2948 reg_init[id].addr,
Lee Jones3c1b8432013-03-21 15:59:01 +00002949 mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002950 if (err < 0) {
2951 dev_err(&pdev->dev,
2952 "Failed to initialize 0x%02x, 0x%02x.\n",
Lee Jonesb54969a2013-03-28 16:11:10 +00002953 reg_init[id].bank,
2954 reg_init[id].addr);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002955 return err;
2956 }
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002957 dev_vdbg(&pdev->dev,
Lee Jones3c1b8432013-03-21 15:59:01 +00002958 " init: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
Lee Jonesb54969a2013-03-28 16:11:10 +00002959 reg_init[id].bank,
2960 reg_init[id].addr,
Lee Jones3c1b8432013-03-21 15:59:01 +00002961 mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002962
2963 return 0;
2964}
2965
Bill Pembertona5023572012-11-19 13:22:22 -05002966static int ab8500_regulator_register(struct platform_device *pdev,
Lee Jonesb54969a2013-03-28 16:11:10 +00002967 struct regulator_init_data *init_data,
Lee Jonesb54969a2013-03-28 16:11:10 +00002968 int id, struct device_node *np)
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002969{
Lee Jones8e6a8d72013-03-28 16:11:11 +00002970 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002971 struct ab8500_regulator_info *info = NULL;
2972 struct regulator_config config = { };
2973 int err;
2974
2975 /* assign per-regulator data */
Lee Jones33aeb492013-04-02 13:24:14 +01002976 info = &abx500_regulator.info[id];
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002977 info->dev = &pdev->dev;
2978
2979 config.dev = &pdev->dev;
2980 config.init_data = init_data;
2981 config.driver_data = info;
2982 config.of_node = np;
2983
2984 /* fix for hardware before ab8500v2.0 */
Lee Jones8e6a8d72013-03-28 16:11:11 +00002985 if (is_ab8500_1p1_or_earlier(ab8500)) {
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002986 if (info->desc.id == AB8500_LDO_AUX3) {
2987 info->desc.n_voltages =
2988 ARRAY_SIZE(ldo_vauxn_voltages);
Axel Linec1cc4d2012-05-20 10:33:35 +08002989 info->desc.volt_table = ldo_vauxn_voltages;
Lee Jonesa7ac1d92012-05-17 14:45:14 +01002990 info->voltage_mask = 0xf;
2991 }
2992 }
2993
2994 /* register regulator with framework */
2995 info->regulator = regulator_register(&info->desc, &config);
2996 if (IS_ERR(info->regulator)) {
2997 err = PTR_ERR(info->regulator);
2998 dev_err(&pdev->dev, "failed to register regulator %s\n",
2999 info->desc.name);
3000 /* when we fail, un-register all earlier regulators */
3001 while (--id >= 0) {
Lee Jones33aeb492013-04-02 13:24:14 +01003002 info = &abx500_regulator.info[id];
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003003 regulator_unregister(info->regulator);
3004 }
3005 return err;
3006 }
3007
3008 return 0;
3009}
3010
Lee Jonesb54969a2013-03-28 16:11:10 +00003011static struct of_regulator_match ab8500_regulator_match[] = {
Lee Jones7e715b92012-05-30 12:47:26 +08003012 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8500_LDO_AUX1, },
3013 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8500_LDO_AUX2, },
3014 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8500_LDO_AUX3, },
3015 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, },
3016 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8500_LDO_TVOUT, },
Lee Jones7e715b92012-05-30 12:47:26 +08003017 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8500_LDO_AUDIO, },
3018 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, },
3019 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, },
3020 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8500_LDO_DMIC, },
3021 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8500_LDO_ANA, },
Lee Jones3a8334b2012-05-17 14:45:16 +01003022};
3023
Lee Jones547f3842013-03-28 16:11:14 +00003024static struct of_regulator_match ab8505_regulator_match[] = {
3025 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8505_LDO_AUX1, },
3026 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8505_LDO_AUX2, },
3027 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8505_LDO_AUX3, },
3028 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8505_LDO_AUX4, },
3029 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8505_LDO_AUX5, },
3030 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8505_LDO_AUX6, },
3031 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8505_LDO_INTCORE, },
3032 { .name = "ab8500_ldo_adc", .driver_data = (void *) AB8505_LDO_ADC, },
3033 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8505_LDO_AUDIO, },
3034 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8505_LDO_ANAMIC1, },
3035 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8505_LDO_ANAMIC2, },
3036 { .name = "ab8500_ldo_aux8", .driver_data = (void *) AB8505_LDO_AUX8, },
3037 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8505_LDO_ANA, },
3038};
3039
Lee Jonesae0a9a32013-03-28 16:11:16 +00003040static struct of_regulator_match ab8540_regulator_match[] = {
3041 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB8540_LDO_AUX1, },
3042 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB8540_LDO_AUX2, },
3043 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB8540_LDO_AUX3, },
3044 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB8540_LDO_AUX4, },
Zhenhua HUANG684d5ce2013-04-02 13:24:15 +01003045 { .name = "ab8500_ldo_aux5", .driver_data = (void *) AB8540_LDO_AUX5, },
3046 { .name = "ab8500_ldo_aux6", .driver_data = (void *) AB8540_LDO_AUX6, },
Lee Jonesae0a9a32013-03-28 16:11:16 +00003047 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB8540_LDO_INTCORE, },
3048 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB8540_LDO_TVOUT, },
3049 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB8540_LDO_AUDIO, },
3050 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB8540_LDO_ANAMIC1, },
3051 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB8540_LDO_ANAMIC2, },
3052 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB8540_LDO_DMIC, },
3053 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB8540_LDO_ANA, },
3054 { .name = "ab8500_ldo_sdio", .driver_data = (void *) AB8540_LDO_SDIO, },
3055};
3056
Lee Jones8e6a8d72013-03-28 16:11:11 +00003057static struct of_regulator_match ab9540_regulator_match[] = {
3058 { .name = "ab8500_ldo_aux1", .driver_data = (void *) AB9540_LDO_AUX1, },
3059 { .name = "ab8500_ldo_aux2", .driver_data = (void *) AB9540_LDO_AUX2, },
3060 { .name = "ab8500_ldo_aux3", .driver_data = (void *) AB9540_LDO_AUX3, },
3061 { .name = "ab8500_ldo_aux4", .driver_data = (void *) AB9540_LDO_AUX4, },
3062 { .name = "ab8500_ldo_intcore", .driver_data = (void *) AB9540_LDO_INTCORE, },
3063 { .name = "ab8500_ldo_tvout", .driver_data = (void *) AB9540_LDO_TVOUT, },
3064 { .name = "ab8500_ldo_audio", .driver_data = (void *) AB9540_LDO_AUDIO, },
3065 { .name = "ab8500_ldo_anamic1", .driver_data = (void *) AB9540_LDO_ANAMIC1, },
3066 { .name = "ab8500_ldo_amamic2", .driver_data = (void *) AB9540_LDO_ANAMIC2, },
3067 { .name = "ab8500_ldo_dmic", .driver_data = (void *) AB9540_LDO_DMIC, },
3068 { .name = "ab8500_ldo_ana", .driver_data = (void *) AB9540_LDO_ANA, },
3069};
3070
Lee Jones33aeb492013-04-02 13:24:14 +01003071static void abx500_get_regulator_info(struct ab8500 *ab8500)
3072{
3073 if (is_ab9540(ab8500)) {
3074 abx500_regulator.info = ab9540_regulator_info;
3075 abx500_regulator.info_size = ARRAY_SIZE(ab9540_regulator_info);
3076 abx500_regulator.init = ab9540_reg_init;
3077 abx500_regulator.init_size = AB9540_NUM_REGULATOR_REGISTERS;
3078 abx500_regulator.match = ab9540_regulator_match;
3079 abx500_regulator.match_size = ARRAY_SIZE(ab9540_regulator_match);
3080 } else if (is_ab8505(ab8500)) {
3081 abx500_regulator.info = ab8505_regulator_info;
3082 abx500_regulator.info_size = ARRAY_SIZE(ab8505_regulator_info);
3083 abx500_regulator.init = ab8505_reg_init;
3084 abx500_regulator.init_size = AB8505_NUM_REGULATOR_REGISTERS;
3085 abx500_regulator.match = ab8505_regulator_match;
3086 abx500_regulator.match_size = ARRAY_SIZE(ab8505_regulator_match);
3087 } else if (is_ab8540(ab8500)) {
3088 abx500_regulator.info = ab8540_regulator_info;
3089 abx500_regulator.info_size = ARRAY_SIZE(ab8540_regulator_info);
3090 abx500_regulator.init = ab8540_reg_init;
3091 abx500_regulator.init_size = AB8540_NUM_REGULATOR_REGISTERS;
3092 abx500_regulator.match = ab8540_regulator_match;
3093 abx500_regulator.match_size = ARRAY_SIZE(ab8540_regulator_match);
3094 } else {
3095 abx500_regulator.info = ab8500_regulator_info;
3096 abx500_regulator.info_size = ARRAY_SIZE(ab8500_regulator_info);
3097 abx500_regulator.init = ab8500_reg_init;
3098 abx500_regulator.init_size = AB8500_NUM_REGULATOR_REGISTERS;
3099 abx500_regulator.match = ab8500_regulator_match;
3100 abx500_regulator.match_size = ARRAY_SIZE(ab8500_regulator_match);
3101 }
3102}
3103
Bill Pembertona5023572012-11-19 13:22:22 -05003104static int
Lee Jonesb54969a2013-03-28 16:11:10 +00003105ab8500_regulator_of_probe(struct platform_device *pdev,
Lee Jonesb54969a2013-03-28 16:11:10 +00003106 struct device_node *np)
Lee Jones3a8334b2012-05-17 14:45:16 +01003107{
Lee Jones33aeb492013-04-02 13:24:14 +01003108 struct of_regulator_match *match = abx500_regulator.match;
Lee Jones3a8334b2012-05-17 14:45:16 +01003109 int err, i;
3110
Lee Jones33aeb492013-04-02 13:24:14 +01003111 for (i = 0; i < abx500_regulator.info_size; i++) {
Lee Jones3a8334b2012-05-17 14:45:16 +01003112 err = ab8500_regulator_register(
Lee Jones33aeb492013-04-02 13:24:14 +01003113 pdev, match[i].init_data, i, match[i].of_node);
Lee Jones3a8334b2012-05-17 14:45:16 +01003114 if (err)
3115 return err;
3116 }
3117
3118 return 0;
3119}
3120
Bill Pembertona5023572012-11-19 13:22:22 -05003121static int ab8500_regulator_probe(struct platform_device *pdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303122{
3123 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Lee Jones3a8334b2012-05-17 14:45:16 +01003124 struct device_node *np = pdev->dev.of_node;
Bengt Jonsson732805a2013-03-21 15:59:03 +00003125 struct ab8500_platform_data *ppdata;
3126 struct ab8500_regulator_platform_data *pdata;
Sundar R IYERc789ca22010-07-13 21:48:56 +05303127 int i, err;
Lee Jonesb54969a2013-03-28 16:11:10 +00003128
Lee Jones33aeb492013-04-02 13:24:14 +01003129 if (!ab8500) {
3130 dev_err(&pdev->dev, "null mfd parent\n");
3131 return -EINVAL;
Lee Jones8e6a8d72013-03-28 16:11:11 +00003132 }
Sundar R IYERc789ca22010-07-13 21:48:56 +05303133
Lee Jones33aeb492013-04-02 13:24:14 +01003134 abx500_get_regulator_info(ab8500);
3135
Lee Jones3a8334b2012-05-17 14:45:16 +01003136 if (np) {
Lee Jones33aeb492013-04-02 13:24:14 +01003137 err = of_regulator_match(&pdev->dev, np,
3138 abx500_regulator.match,
3139 abx500_regulator.match_size);
Lee Jones3a8334b2012-05-17 14:45:16 +01003140 if (err < 0) {
3141 dev_err(&pdev->dev,
3142 "Error parsing regulator init data: %d\n", err);
3143 return err;
3144 }
3145
Lee Jones33aeb492013-04-02 13:24:14 +01003146 err = ab8500_regulator_of_probe(pdev, np);
Lee Jones3a8334b2012-05-17 14:45:16 +01003147 return err;
3148 }
3149
Bengt Jonsson732805a2013-03-21 15:59:03 +00003150 ppdata = dev_get_platdata(ab8500->dev);
3151 if (!ppdata) {
3152 dev_err(&pdev->dev, "null parent pdata\n");
3153 return -EINVAL;
3154 }
3155
3156 pdata = ppdata->regulator;
Bengt Jonssonfc24b422010-12-10 11:08:45 +01003157 if (!pdata) {
3158 dev_err(&pdev->dev, "null pdata\n");
3159 return -EINVAL;
3160 }
Sundar R IYERc789ca22010-07-13 21:48:56 +05303161
Bengt Jonssoncb189b02010-12-10 11:08:40 +01003162 /* make sure the platform data has the correct size */
Lee Jones33aeb492013-04-02 13:24:14 +01003163 if (pdata->num_regulator != abx500_regulator.info_size) {
Bengt Jonsson79568b942011-03-11 11:54:46 +01003164 dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
Bengt Jonssoncb189b02010-12-10 11:08:40 +01003165 return -EINVAL;
3166 }
3167
Lee Jonesda0b0c42013-03-28 16:11:09 +00003168 /* initialize debug (initial state is recorded with this call) */
3169 err = ab8500_regulator_debug_init(pdev);
3170 if (err)
3171 return err;
3172
Bengt Jonsson79568b942011-03-11 11:54:46 +01003173 /* initialize registers */
Bengt Jonsson732805a2013-03-21 15:59:03 +00003174 for (i = 0; i < pdata->num_reg_init; i++) {
Lee Jones3c1b8432013-03-21 15:59:01 +00003175 int id, mask, value;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003176
Bengt Jonsson732805a2013-03-21 15:59:03 +00003177 id = pdata->reg_init[i].id;
3178 mask = pdata->reg_init[i].mask;
3179 value = pdata->reg_init[i].value;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003180
3181 /* check for configuration errors */
Lee Jones33aeb492013-04-02 13:24:14 +01003182 BUG_ON(id >= abx500_regulator.init_size);
Bengt Jonsson79568b942011-03-11 11:54:46 +01003183
Lee Jones33aeb492013-04-02 13:24:14 +01003184 err = ab8500_regulator_init_registers(pdev, id, mask, value);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003185 if (err < 0)
Bengt Jonsson79568b942011-03-11 11:54:46 +01003186 return err;
Bengt Jonsson79568b942011-03-11 11:54:46 +01003187 }
3188
Rabin Vincentf7eae372013-04-02 13:24:08 +01003189 if (!is_ab8505(ab8500)) {
3190 /* register external regulators (before Vaux1, 2 and 3) */
3191 err = ab8500_ext_regulator_init(pdev);
3192 if (err)
3193 return err;
3194 }
Lee Jonesd1a82002013-03-28 16:11:01 +00003195
Sundar R IYERc789ca22010-07-13 21:48:56 +05303196 /* register all regulators */
Lee Jones33aeb492013-04-02 13:24:14 +01003197 for (i = 0; i < abx500_regulator.info_size; i++) {
Lee Jonesb54969a2013-03-28 16:11:10 +00003198 err = ab8500_regulator_register(pdev, &pdata->regulator[i],
Lee Jones33aeb492013-04-02 13:24:14 +01003199 i, NULL);
Lee Jonesa7ac1d92012-05-17 14:45:14 +01003200 if (err < 0)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303201 return err;
Sundar R IYERc789ca22010-07-13 21:48:56 +05303202 }
3203
3204 return 0;
3205}
3206
Bill Pemberton8dc995f2012-11-19 13:26:10 -05003207static int ab8500_regulator_remove(struct platform_device *pdev)
Sundar R IYERc789ca22010-07-13 21:48:56 +05303208{
Lee Jonesd1a82002013-03-28 16:11:01 +00003209 int i, err;
Lee Jones8e6a8d72013-03-28 16:11:11 +00003210 struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
Sundar R IYERc789ca22010-07-13 21:48:56 +05303211
Lee Jones33aeb492013-04-02 13:24:14 +01003212 for (i = 0; i < abx500_regulator.info_size; i++) {
Sundar R IYERc789ca22010-07-13 21:48:56 +05303213 struct ab8500_regulator_info *info = NULL;
Lee Jones33aeb492013-04-02 13:24:14 +01003214 info = &abx500_regulator.info[i];
Bengt Jonsson09aefa12010-12-10 11:08:46 +01003215
3216 dev_vdbg(rdev_get_dev(info->regulator),
3217 "%s-remove\n", info->desc.name);
3218
Sundar R IYERc789ca22010-07-13 21:48:56 +05303219 regulator_unregister(info->regulator);
3220 }
3221
Rabin Vincentf7eae372013-04-02 13:24:08 +01003222 if (!is_ab8505(ab8500)) {
3223 /* remove external regulators (after Vaux1, 2 and 3) */
3224 err = ab8500_ext_regulator_exit(pdev);
3225 if (err)
3226 return err;
3227 }
Lee Jonesd1a82002013-03-28 16:11:01 +00003228
Lee Jonesda0b0c42013-03-28 16:11:09 +00003229 /* remove regulator debug */
3230 err = ab8500_regulator_debug_exit(pdev);
3231 if (err)
3232 return err;
3233
Sundar R IYERc789ca22010-07-13 21:48:56 +05303234 return 0;
3235}
3236
3237static struct platform_driver ab8500_regulator_driver = {
3238 .probe = ab8500_regulator_probe,
Bill Pemberton5eb9f2b2012-11-19 13:20:42 -05003239 .remove = ab8500_regulator_remove,
Sundar R IYERc789ca22010-07-13 21:48:56 +05303240 .driver = {
3241 .name = "ab8500-regulator",
3242 .owner = THIS_MODULE,
Sundar R IYERc789ca22010-07-13 21:48:56 +05303243 },
3244};
3245
3246static int __init ab8500_regulator_init(void)
3247{
3248 int ret;
3249
3250 ret = platform_driver_register(&ab8500_regulator_driver);
3251 if (ret != 0)
3252 pr_err("Failed to register ab8500 regulator: %d\n", ret);
3253
3254 return ret;
3255}
3256subsys_initcall(ab8500_regulator_init);
3257
3258static void __exit ab8500_regulator_exit(void)
3259{
3260 platform_driver_unregister(&ab8500_regulator_driver);
3261}
3262module_exit(ab8500_regulator_exit);
3263
3264MODULE_LICENSE("GPL v2");
3265MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
Bengt Jonsson732805a2013-03-21 15:59:03 +00003266MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
Lee Jones547f3842013-03-28 16:11:14 +00003267MODULE_AUTHOR("Daniel Willerud <daniel.willerud@stericsson.com>");
Sundar R IYERc789ca22010-07-13 21:48:56 +05303268MODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
3269MODULE_ALIAS("platform:ab8500-regulator");