1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
5 * Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
7 * This file is based on drivers/regulator/ab8500.c
9 * AB8500 external regulators
11 * ab8500-ext supports the following regulators:
14 #include <linux/init.h>
15 #include <linux/kernel.h>
16 #include <linux/err.h>
17 #include <linux/module.h>
19 #include <linux/platform_device.h>
20 #include <linux/regulator/driver.h>
21 #include <linux/regulator/machine.h>
22 #include <linux/regulator/of_regulator.h>
23 #include <linux/mfd/abx500.h>
24 #include <linux/mfd/abx500/ab8500.h>
25 #include <linux/regulator/ab8500.h>
27 static struct regulator_consumer_supply ab8500_vaux1_consumers
[] = {
28 /* Main display, u8500 R3 uib */
29 REGULATOR_SUPPLY("vddi", "mcde_disp_sony_acx424akp.0"),
30 /* Main display, u8500 uib and ST uib */
31 REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.0"),
32 /* Secondary display, ST uib */
33 REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.1"),
34 /* SFH7741 proximity sensor */
35 REGULATOR_SUPPLY("vcc", "gpio-keys.0"),
36 /* BH1780GLS ambient light sensor */
37 REGULATOR_SUPPLY("vcc", "2-0029"),
38 /* lsm303dlh accelerometer */
39 REGULATOR_SUPPLY("vdd", "2-0018"),
40 /* lsm303dlhc accelerometer */
41 REGULATOR_SUPPLY("vdd", "2-0019"),
42 /* lsm303dlh magnetometer */
43 REGULATOR_SUPPLY("vdd", "2-001e"),
44 /* Rohm BU21013 Touchscreen devices */
45 REGULATOR_SUPPLY("avdd", "3-005c"),
46 REGULATOR_SUPPLY("avdd", "3-005d"),
47 /* Synaptics RMI4 Touchscreen device */
48 REGULATOR_SUPPLY("vdd", "3-004b"),
49 /* L3G4200D Gyroscope device */
50 REGULATOR_SUPPLY("vdd", "2-0068"),
51 /* Ambient light sensor device */
52 REGULATOR_SUPPLY("vdd", "3-0029"),
53 /* Pressure sensor device */
54 REGULATOR_SUPPLY("vdd", "2-005c"),
55 /* Cypress TrueTouch Touchscreen device */
56 REGULATOR_SUPPLY("vcpin", "spi8.0"),
58 REGULATOR_SUPPLY("vaux12v5", "mmio_camera"),
61 static struct regulator_consumer_supply ab8500_vaux2_consumers
[] = {
62 /* On-board eMMC power */
63 REGULATOR_SUPPLY("vmmc", "sdi4"),
64 /* AB8500 audio codec */
65 REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"),
66 /* AB8500 accessory detect 1 */
67 REGULATOR_SUPPLY("vcc-N2158", "ab8500-acc-det.0"),
68 /* AB8500 Tv-out device */
69 REGULATOR_SUPPLY("vcc-N2158", "mcde_tv_ab8500.4"),
70 /* AV8100 HDMI device */
71 REGULATOR_SUPPLY("vcc-N2158", "av8100_hdmi.3"),
74 static struct regulator_consumer_supply ab8500_vaux3_consumers
[] = {
75 REGULATOR_SUPPLY("v-SD-STM", "stm"),
76 /* External MMC slot power */
77 REGULATOR_SUPPLY("vmmc", "sdi0"),
80 static struct regulator_consumer_supply ab8500_vtvout_consumers
[] = {
81 /* TV-out DENC supply */
82 REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"),
83 /* Internal general-purpose ADC */
84 REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"),
86 REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"),
87 /* AB8500 Tv-out device */
88 REGULATOR_SUPPLY("vtvout", "mcde_tv_ab8500.4"),
91 static struct regulator_consumer_supply ab8500_vaud_consumers
[] = {
92 /* AB8500 audio-codec main supply */
93 REGULATOR_SUPPLY("vaud", "ab8500-codec.0"),
96 static struct regulator_consumer_supply ab8500_vamic1_consumers
[] = {
97 /* AB8500 audio-codec Mic1 supply */
98 REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"),
101 static struct regulator_consumer_supply ab8500_vamic2_consumers
[] = {
102 /* AB8500 audio-codec Mic2 supply */
103 REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"),
106 static struct regulator_consumer_supply ab8500_vdmic_consumers
[] = {
107 /* AB8500 audio-codec DMic supply */
108 REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"),
111 static struct regulator_consumer_supply ab8500_vintcore_consumers
[] = {
112 /* SoC core supply, no device */
113 REGULATOR_SUPPLY("v-intcore", NULL
),
114 /* USB Transceiver */
115 REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"),
116 /* Handled by abx500 clk driver */
117 REGULATOR_SUPPLY("v-intcore", "abx500-clk.0"),
120 static struct regulator_consumer_supply ab8500_vana_consumers
[] = {
122 REGULATOR_SUPPLY("vdddsi1v2", "mcde"),
123 REGULATOR_SUPPLY("vdddsi1v2", "b2r2_core"),
124 REGULATOR_SUPPLY("vdddsi1v2", "b2r2_1_core"),
125 REGULATOR_SUPPLY("vdddsi1v2", "dsilink.0"),
126 REGULATOR_SUPPLY("vdddsi1v2", "dsilink.1"),
127 REGULATOR_SUPPLY("vdddsi1v2", "dsilink.2"),
129 REGULATOR_SUPPLY("vddcsi1v2", "mmio_camera"),
132 /* ab8500 regulator register initialization */
133 static struct ab8500_regulator_reg_init ab8500_reg_init
[] = {
135 * VanaRequestCtrl = HP/LP depending on VxRequest
136 * VextSupply1RequestCtrl = HP/LP depending on VxRequest
138 INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2
, 0xf0, 0x00),
140 * VextSupply2RequestCtrl = HP/LP depending on VxRequest
141 * VextSupply3RequestCtrl = HP/LP depending on VxRequest
142 * Vaux1RequestCtrl = HP/LP depending on VxRequest
143 * Vaux2RequestCtrl = HP/LP depending on VxRequest
145 INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3
, 0xff, 0x00),
147 * Vaux3RequestCtrl = HP/LP depending on VxRequest
148 * SwHPReq = Control through SWValid disabled
150 INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4
, 0x07, 0x00),
152 * VanaSysClkReq1HPValid = disabled
153 * Vaux1SysClkReq1HPValid = disabled
154 * Vaux2SysClkReq1HPValid = disabled
155 * Vaux3SysClkReq1HPValid = disabled
157 INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1
, 0xe8, 0x00),
159 * VextSupply1SysClkReq1HPValid = disabled
160 * VextSupply2SysClkReq1HPValid = disabled
161 * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled
163 INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2
, 0x70, 0x40),
165 * VanaHwHPReq1Valid = disabled
166 * Vaux1HwHPreq1Valid = disabled
167 * Vaux2HwHPReq1Valid = disabled
168 * Vaux3HwHPReqValid = disabled
170 INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1
, 0xe8, 0x00),
172 * VextSupply1HwHPReq1Valid = disabled
173 * VextSupply2HwHPReq1Valid = disabled
174 * VextSupply3HwHPReq1Valid = disabled
176 INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2
, 0x07, 0x00),
178 * VanaHwHPReq2Valid = disabled
179 * Vaux1HwHPReq2Valid = disabled
180 * Vaux2HwHPReq2Valid = disabled
181 * Vaux3HwHPReq2Valid = disabled
183 INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1
, 0xe8, 0x00),
185 * VextSupply1HwHPReq2Valid = disabled
186 * VextSupply2HwHPReq2Valid = disabled
187 * VextSupply3HwHPReq2Valid = HWReq2 controlled
189 INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2
, 0x07, 0x04),
191 * VanaSwHPReqValid = disabled
192 * Vaux1SwHPReqValid = disabled
194 INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1
, 0xa0, 0x00),
196 * Vaux2SwHPReqValid = disabled
197 * Vaux3SwHPReqValid = disabled
198 * VextSupply1SwHPReqValid = disabled
199 * VextSupply2SwHPReqValid = disabled
200 * VextSupply3SwHPReqValid = disabled
202 INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2
, 0x1f, 0x00),
204 * SysClkReq2Valid1 = SysClkReq2 controlled
205 * SysClkReq3Valid1 = disabled
206 * SysClkReq4Valid1 = SysClkReq4 controlled
207 * SysClkReq5Valid1 = disabled
208 * SysClkReq6Valid1 = SysClkReq6 controlled
209 * SysClkReq7Valid1 = disabled
210 * SysClkReq8Valid1 = disabled
212 INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1
, 0xfe, 0x2a),
214 * SysClkReq2Valid2 = disabled
215 * SysClkReq3Valid2 = disabled
216 * SysClkReq4Valid2 = disabled
217 * SysClkReq5Valid2 = disabled
218 * SysClkReq6Valid2 = SysClkReq6 controlled
219 * SysClkReq7Valid2 = disabled
220 * SysClkReq8Valid2 = disabled
222 INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2
, 0xfe, 0x20),
224 * VTVoutEna = disabled
225 * Vintcore12Ena = disabled
226 * Vintcore12Sel = 1.25 V
227 * Vintcore12LP = inactive (HP)
228 * VTVoutLP = inactive (HP)
230 INIT_REGULATOR_REGISTER(AB8500_REGUMISC1
, 0xfe, 0x10),
232 * VaudioEna = disabled
233 * VdmicEna = disabled
234 * Vamic1Ena = disabled
235 * Vamic2Ena = disabled
237 INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY
, 0x1e, 0x00),
239 * Vamic1_dzout = high-Z when Vamic1 is disabled
240 * Vamic2_dzout = high-Z when Vamic2 is disabled
242 INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC
, 0x03, 0x00),
244 * VPll = Hw controlled (NOTE! PRCMU bits)
245 * VanaRegu = force off
247 INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU
, 0x0f, 0x02),
249 * VrefDDREna = disabled
250 * VrefDDRSleepMode = inactive (no pulldown)
252 INIT_REGULATOR_REGISTER(AB8500_VREFDDR
, 0x03, 0x00),
254 * VextSupply1Regu = force LP
255 * VextSupply2Regu = force OFF
256 * VextSupply3Regu = force HP (-> STBB2=LP and TPS=LP)
257 * ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0
258 * ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0
260 INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU
, 0xff, 0x13),
262 * Vaux1Regu = force HP
263 * Vaux2Regu = force off
265 INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU
, 0x0f, 0x01),
267 * Vaux3Regu = force off
269 INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU
, 0x03, 0x00),
273 INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL
, 0x0f, 0x0C),
277 INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL
, 0x0f, 0x0d),
281 INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL
, 0x07, 0x07),
283 * VextSupply12LP = disabled (no LP)
285 INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE
, 0x01, 0x00),
287 * Vaux1Disch = short discharge time
288 * Vaux2Disch = short discharge time
289 * Vaux3Disch = short discharge time
290 * Vintcore12Disch = short discharge time
291 * VTVoutDisch = short discharge time
292 * VaudioDisch = short discharge time
294 INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH
, 0xfc, 0x00),
296 * VanaDisch = short discharge time
297 * VdmicPullDownEna = pulldown disabled when Vdmic is disabled
298 * VdmicDisch = short discharge time
300 INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2
, 0x16, 0x00),
303 /* AB8500 regulators */
304 static struct regulator_init_data ab8500_regulators
[AB8500_NUM_REGULATORS
] = {
305 /* supplies to the display/camera */
306 [AB8500_LDO_AUX1
] = {
307 .supply_regulator
= "ab8500-ext-supply3",
312 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
313 REGULATOR_CHANGE_STATUS
,
314 .boot_on
= 1, /* display is on at boot */
316 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vaux1_consumers
),
317 .consumer_supplies
= ab8500_vaux1_consumers
,
319 /* supplies to the on-board eMMC */
320 [AB8500_LDO_AUX2
] = {
321 .supply_regulator
= "ab8500-ext-supply3",
326 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
327 REGULATOR_CHANGE_STATUS
|
328 REGULATOR_CHANGE_MODE
,
329 .valid_modes_mask
= REGULATOR_MODE_NORMAL
|
332 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vaux2_consumers
),
333 .consumer_supplies
= ab8500_vaux2_consumers
,
335 /* supply for VAUX3, supplies to SDcard slots */
336 [AB8500_LDO_AUX3
] = {
337 .supply_regulator
= "ab8500-ext-supply3",
342 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
343 REGULATOR_CHANGE_STATUS
|
344 REGULATOR_CHANGE_MODE
,
345 .valid_modes_mask
= REGULATOR_MODE_NORMAL
|
348 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vaux3_consumers
),
349 .consumer_supplies
= ab8500_vaux3_consumers
,
351 /* supply for tvout, gpadc, TVOUT LDO */
352 [AB8500_LDO_TVOUT
] = {
355 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
357 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vtvout_consumers
),
358 .consumer_supplies
= ab8500_vtvout_consumers
,
360 /* supply for ab8500-vaudio, VAUDIO LDO */
361 [AB8500_LDO_AUDIO
] = {
364 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
366 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vaud_consumers
),
367 .consumer_supplies
= ab8500_vaud_consumers
,
369 /* supply for v-anamic1 VAMic1-LDO */
370 [AB8500_LDO_ANAMIC1
] = {
373 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
375 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vamic1_consumers
),
376 .consumer_supplies
= ab8500_vamic1_consumers
,
378 /* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
379 [AB8500_LDO_ANAMIC2
] = {
382 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
384 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vamic2_consumers
),
385 .consumer_supplies
= ab8500_vamic2_consumers
,
387 /* supply for v-dmic, VDMIC LDO */
388 [AB8500_LDO_DMIC
] = {
391 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
393 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vdmic_consumers
),
394 .consumer_supplies
= ab8500_vdmic_consumers
,
396 /* supply for v-intcore12, VINTCORE12 LDO */
397 [AB8500_LDO_INTCORE
] = {
403 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
404 REGULATOR_CHANGE_STATUS
|
405 REGULATOR_CHANGE_MODE
|
406 REGULATOR_CHANGE_DRMS
,
407 .valid_modes_mask
= REGULATOR_MODE_NORMAL
|
410 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vintcore_consumers
),
411 .consumer_supplies
= ab8500_vintcore_consumers
,
413 /* supply for U8500 CSI-DSI, VANA LDO */
417 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
419 .num_consumer_supplies
= ARRAY_SIZE(ab8500_vana_consumers
),
420 .consumer_supplies
= ab8500_vana_consumers
,
424 /* supply for VextSupply3 */
425 static struct regulator_consumer_supply ab8500_ext_supply3_consumers
[] = {
426 /* SIM supply for 3 V SIM cards */
427 REGULATOR_SUPPLY("vinvsim", "sim-detect.0"),
431 * AB8500 external regulators
433 static struct regulator_init_data ab8500_ext_regulators
[] = {
434 /* fixed Vbat supplies VSMPS1_EXT_1V8 */
435 [AB8500_EXT_SUPPLY1
] = {
437 .name
= "ab8500-ext-supply1",
440 .initial_mode
= REGULATOR_MODE_IDLE
,
445 /* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */
446 [AB8500_EXT_SUPPLY2
] = {
448 .name
= "ab8500-ext-supply2",
453 /* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */
454 [AB8500_EXT_SUPPLY3
] = {
456 .name
= "ab8500-ext-supply3",
459 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
462 .num_consumer_supplies
=
463 ARRAY_SIZE(ab8500_ext_supply3_consumers
),
464 .consumer_supplies
= ab8500_ext_supply3_consumers
,
468 static struct ab8500_regulator_platform_data ab8500_regulator_plat_data
= {
469 .reg_init
= ab8500_reg_init
,
470 .num_reg_init
= ARRAY_SIZE(ab8500_reg_init
),
471 .regulator
= ab8500_regulators
,
472 .num_regulator
= ARRAY_SIZE(ab8500_regulators
),
473 .ext_regulator
= ab8500_ext_regulators
,
474 .num_ext_regulator
= ARRAY_SIZE(ab8500_ext_regulators
),
478 * struct ab8500_ext_regulator_info - ab8500 regulator information
479 * @dev: device pointer
480 * @desc: regulator description
481 * @cfg: regulator configuration (extension of regulator FW configuration)
482 * @update_bank: bank to control on/off
483 * @update_reg: register to control on/off
484 * @update_mask: mask to enable/disable and set mode of regulator
485 * @update_val: bits holding the regulator current mode
486 * @update_val_hp: bits to set EN pin active (LPn pin deactive)
487 * normally this means high power mode
488 * @update_val_lp: bits to set EN pin active and LPn pin active
489 * normally this means low power mode
490 * @update_val_hw: bits to set regulator pins in HW control
491 * SysClkReq pins and logic will choose mode
493 struct ab8500_ext_regulator_info
{
495 struct regulator_desc desc
;
496 struct ab8500_ext_regulator_cfg
*cfg
;
506 static int ab8500_ext_regulator_enable(struct regulator_dev
*rdev
)
509 struct ab8500_ext_regulator_info
*info
= rdev_get_drvdata(rdev
);
513 dev_err(rdev_get_dev(rdev
), "regulator info null pointer\n");
518 * To satisfy both HW high power request and SW request, the regulator
519 * must be on in high power.
521 if (info
->cfg
&& info
->cfg
->hwreq
)
522 regval
= info
->update_val_hp
;
524 regval
= info
->update_val
;
526 ret
= abx500_mask_and_set_register_interruptible(info
->dev
,
527 info
->update_bank
, info
->update_reg
,
528 info
->update_mask
, regval
);
530 dev_err(rdev_get_dev(rdev
),
531 "couldn't set enable bits for regulator\n");
535 dev_dbg(rdev_get_dev(rdev
),
536 "%s-enable (bank, reg, mask, value): 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
537 info
->desc
.name
, info
->update_bank
, info
->update_reg
,
538 info
->update_mask
, regval
);
543 static int ab8500_ext_regulator_disable(struct regulator_dev
*rdev
)
546 struct ab8500_ext_regulator_info
*info
= rdev_get_drvdata(rdev
);
550 dev_err(rdev_get_dev(rdev
), "regulator info null pointer\n");
555 * Set the regulator in HW request mode if configured
557 if (info
->cfg
&& info
->cfg
->hwreq
)
558 regval
= info
->update_val_hw
;
562 ret
= abx500_mask_and_set_register_interruptible(info
->dev
,
563 info
->update_bank
, info
->update_reg
,
564 info
->update_mask
, regval
);
566 dev_err(rdev_get_dev(rdev
),
567 "couldn't set disable bits for regulator\n");
571 dev_dbg(rdev_get_dev(rdev
), "%s-disable (bank, reg, mask, value):"
572 " 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
573 info
->desc
.name
, info
->update_bank
, info
->update_reg
,
574 info
->update_mask
, regval
);
579 static int ab8500_ext_regulator_is_enabled(struct regulator_dev
*rdev
)
582 struct ab8500_ext_regulator_info
*info
= rdev_get_drvdata(rdev
);
586 dev_err(rdev_get_dev(rdev
), "regulator info null pointer\n");
590 ret
= abx500_get_register_interruptible(info
->dev
,
591 info
->update_bank
, info
->update_reg
, ®val
);
593 dev_err(rdev_get_dev(rdev
),
594 "couldn't read 0x%x register\n", info
->update_reg
);
598 dev_dbg(rdev_get_dev(rdev
), "%s-is_enabled (bank, reg, mask, value):"
599 " 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
600 info
->desc
.name
, info
->update_bank
, info
->update_reg
,
601 info
->update_mask
, regval
);
603 if (((regval
& info
->update_mask
) == info
->update_val_lp
) ||
604 ((regval
& info
->update_mask
) == info
->update_val_hp
))
610 static int ab8500_ext_regulator_set_mode(struct regulator_dev
*rdev
,
614 struct ab8500_ext_regulator_info
*info
= rdev_get_drvdata(rdev
);
618 dev_err(rdev_get_dev(rdev
), "regulator info null pointer\n");
623 case REGULATOR_MODE_NORMAL
:
624 regval
= info
->update_val_hp
;
626 case REGULATOR_MODE_IDLE
:
627 regval
= info
->update_val_lp
;
634 /* If regulator is enabled and info->cfg->hwreq is set, the regulator
635 must be on in high power, so we don't need to write the register with
638 if (ab8500_ext_regulator_is_enabled(rdev
) &&
639 !(info
->cfg
&& info
->cfg
->hwreq
)) {
640 ret
= abx500_mask_and_set_register_interruptible(info
->dev
,
641 info
->update_bank
, info
->update_reg
,
642 info
->update_mask
, regval
);
644 dev_err(rdev_get_dev(rdev
),
645 "Could not set regulator mode.\n");
649 dev_dbg(rdev_get_dev(rdev
),
650 "%s-set_mode (bank, reg, mask, value): "
651 "0x%x, 0x%x, 0x%x, 0x%x\n",
652 info
->desc
.name
, info
->update_bank
, info
->update_reg
,
653 info
->update_mask
, regval
);
656 info
->update_val
= regval
;
661 static unsigned int ab8500_ext_regulator_get_mode(struct regulator_dev
*rdev
)
663 struct ab8500_ext_regulator_info
*info
= rdev_get_drvdata(rdev
);
667 dev_err(rdev_get_dev(rdev
), "regulator info null pointer\n");
671 if (info
->update_val
== info
->update_val_hp
)
672 ret
= REGULATOR_MODE_NORMAL
;
673 else if (info
->update_val
== info
->update_val_lp
)
674 ret
= REGULATOR_MODE_IDLE
;
681 static int ab8500_ext_set_voltage(struct regulator_dev
*rdev
, int min_uV
,
682 int max_uV
, unsigned *selector
)
684 struct regulation_constraints
*regu_constraints
= rdev
->constraints
;
686 if (!regu_constraints
) {
687 dev_err(rdev_get_dev(rdev
), "No regulator constraints\n");
691 if (regu_constraints
->min_uV
== min_uV
&&
692 regu_constraints
->max_uV
== max_uV
)
695 dev_err(rdev_get_dev(rdev
),
696 "Requested min %duV max %duV != constrained min %duV max %duV\n",
698 regu_constraints
->min_uV
, regu_constraints
->max_uV
);
703 static int ab8500_ext_list_voltage(struct regulator_dev
*rdev
,
706 struct regulation_constraints
*regu_constraints
= rdev
->constraints
;
708 if (regu_constraints
== NULL
) {
709 dev_err(rdev_get_dev(rdev
), "regulator constraints null pointer\n");
712 /* return the uV for the fixed regulators */
713 if (regu_constraints
->min_uV
&& regu_constraints
->max_uV
) {
714 if (regu_constraints
->min_uV
== regu_constraints
->max_uV
)
715 return regu_constraints
->min_uV
;
720 static const struct regulator_ops ab8500_ext_regulator_ops
= {
721 .enable
= ab8500_ext_regulator_enable
,
722 .disable
= ab8500_ext_regulator_disable
,
723 .is_enabled
= ab8500_ext_regulator_is_enabled
,
724 .set_mode
= ab8500_ext_regulator_set_mode
,
725 .get_mode
= ab8500_ext_regulator_get_mode
,
726 .set_voltage
= ab8500_ext_set_voltage
,
727 .list_voltage
= ab8500_ext_list_voltage
,
730 static struct ab8500_ext_regulator_info
731 ab8500_ext_regulator_info
[AB8500_NUM_EXT_REGULATORS
] = {
732 [AB8500_EXT_SUPPLY1
] = {
734 .name
= "VEXTSUPPLY1",
735 .of_match
= of_match_ptr("ab8500_ext1"),
736 .ops
= &ab8500_ext_regulator_ops
,
737 .type
= REGULATOR_VOLTAGE
,
738 .id
= AB8500_EXT_SUPPLY1
,
739 .owner
= THIS_MODULE
,
746 .update_val_hp
= 0x01,
747 .update_val_lp
= 0x03,
748 .update_val_hw
= 0x02,
750 [AB8500_EXT_SUPPLY2
] = {
752 .name
= "VEXTSUPPLY2",
753 .of_match
= of_match_ptr("ab8500_ext2"),
754 .ops
= &ab8500_ext_regulator_ops
,
755 .type
= REGULATOR_VOLTAGE
,
756 .id
= AB8500_EXT_SUPPLY2
,
757 .owner
= THIS_MODULE
,
764 .update_val_hp
= 0x04,
765 .update_val_lp
= 0x0c,
766 .update_val_hw
= 0x08,
768 [AB8500_EXT_SUPPLY3
] = {
770 .name
= "VEXTSUPPLY3",
771 .of_match
= of_match_ptr("ab8500_ext3"),
772 .ops
= &ab8500_ext_regulator_ops
,
773 .type
= REGULATOR_VOLTAGE
,
774 .id
= AB8500_EXT_SUPPLY3
,
775 .owner
= THIS_MODULE
,
782 .update_val_hp
= 0x10,
783 .update_val_lp
= 0x30,
784 .update_val_hw
= 0x20,
788 static int ab8500_ext_regulator_probe(struct platform_device
*pdev
)
790 struct ab8500
*ab8500
= dev_get_drvdata(pdev
->dev
.parent
);
791 struct ab8500_regulator_platform_data
*pdata
= &ab8500_regulator_plat_data
;
792 struct regulator_config config
= { };
793 struct regulator_dev
*rdev
;
797 dev_err(&pdev
->dev
, "null mfd parent\n");
801 /* make sure the platform data has the correct size */
802 if (pdata
->num_ext_regulator
!= ARRAY_SIZE(ab8500_ext_regulator_info
)) {
803 dev_err(&pdev
->dev
, "Configuration error: size mismatch.\n");
807 /* check for AB8500 2.x */
808 if (is_ab8500_2p0_or_earlier(ab8500
)) {
809 struct ab8500_ext_regulator_info
*info
;
811 /* VextSupply3LPn is inverted on AB8500 2.x */
812 info
= &ab8500_ext_regulator_info
[AB8500_EXT_SUPPLY3
];
813 info
->update_val
= 0x30;
814 info
->update_val_hp
= 0x30;
815 info
->update_val_lp
= 0x10;
818 /* register all regulators */
819 for (i
= 0; i
< ARRAY_SIZE(ab8500_ext_regulator_info
); i
++) {
820 struct ab8500_ext_regulator_info
*info
= NULL
;
822 /* assign per-regulator data */
823 info
= &ab8500_ext_regulator_info
[i
];
824 info
->dev
= &pdev
->dev
;
825 info
->cfg
= (struct ab8500_ext_regulator_cfg
*)
826 pdata
->ext_regulator
[i
].driver_data
;
828 config
.dev
= &pdev
->dev
;
829 config
.driver_data
= info
;
830 config
.init_data
= &pdata
->ext_regulator
[i
];
832 /* register regulator with framework */
833 rdev
= devm_regulator_register(&pdev
->dev
, &info
->desc
,
836 dev_err(&pdev
->dev
, "failed to register regulator %s\n",
838 return PTR_ERR(rdev
);
841 dev_dbg(&pdev
->dev
, "%s-probed\n", info
->desc
.name
);
847 static struct platform_driver ab8500_ext_regulator_driver
= {
848 .probe
= ab8500_ext_regulator_probe
,
850 .name
= "ab8500-ext-regulator",
854 static int __init
ab8500_ext_regulator_init(void)
858 ret
= platform_driver_register(&ab8500_ext_regulator_driver
);
860 pr_err("Failed to register ab8500 ext regulator: %d\n", ret
);
864 subsys_initcall(ab8500_ext_regulator_init
);
866 static void __exit
ab8500_ext_regulator_exit(void)
868 platform_driver_unregister(&ab8500_ext_regulator_driver
);
870 module_exit(ab8500_ext_regulator_exit
);
872 MODULE_LICENSE("GPL v2");
873 MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
874 MODULE_DESCRIPTION("AB8500 external regulator driver");
875 MODULE_ALIAS("platform:ab8500-ext-regulator");