Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (C) ST-Ericsson SA 2010
  4 *
  5 * Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
  6 *
  7 * This file is based on drivers/regulator/ab8500.c
  8 *
  9 * AB8500 external regulators
 10 *
 11 * ab8500-ext supports the following regulators:
 12 * - VextSupply3
 13 */
 14#include <linux/init.h>
 15#include <linux/kernel.h>
 16#include <linux/err.h>
 17#include <linux/module.h>
 18#include <linux/of.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>
 26
 27static 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"),
 57	/* Camera device */
 58	REGULATOR_SUPPLY("vaux12v5", "mmio_camera"),
 59};
 60
 61static 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"),
 72};
 73
 74static struct regulator_consumer_supply ab8500_vaux3_consumers[] = {
 75	REGULATOR_SUPPLY("v-SD-STM", "stm"),
 76	/* External MMC slot power */
 77	REGULATOR_SUPPLY("vmmc", "sdi0"),
 78};
 79
 80static 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"),
 85	/* ADC for charger */
 86	REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"),
 87	/* AB8500 Tv-out device */
 88	REGULATOR_SUPPLY("vtvout", "mcde_tv_ab8500.4"),
 89};
 90
 91static struct regulator_consumer_supply ab8500_vaud_consumers[] = {
 92	/* AB8500 audio-codec main supply */
 93	REGULATOR_SUPPLY("vaud", "ab8500-codec.0"),
 94};
 95
 96static struct regulator_consumer_supply ab8500_vamic1_consumers[] = {
 97	/* AB8500 audio-codec Mic1 supply */
 98	REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"),
 99};
100
101static struct regulator_consumer_supply ab8500_vamic2_consumers[] = {
102	/* AB8500 audio-codec Mic2 supply */
103	REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"),
104};
105
106static struct regulator_consumer_supply ab8500_vdmic_consumers[] = {
107	/* AB8500 audio-codec DMic supply */
108	REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"),
109};
110
111static 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"),
118};
119
120static struct regulator_consumer_supply ab8500_vana_consumers[] = {
121	/* DB8500 DSI */
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"),
128	/* DB8500 CSI */
129	REGULATOR_SUPPLY("vddcsi1v2", "mmio_camera"),
130};
131
132/* ab8500 regulator register initialization */
133static struct ab8500_regulator_reg_init ab8500_reg_init[] = {
134	/*
135	 * VanaRequestCtrl          = HP/LP depending on VxRequest
136	 * VextSupply1RequestCtrl   = HP/LP depending on VxRequest
137	 */
138	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2,       0xf0, 0x00),
139	/*
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
144	 */
145	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3,       0xff, 0x00),
146	/*
147	 * Vaux3RequestCtrl         = HP/LP depending on VxRequest
148	 * SwHPReq                  = Control through SWValid disabled
149	 */
150	INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4,       0x07, 0x00),
151	/*
152	 * VanaSysClkReq1HPValid    = disabled
153	 * Vaux1SysClkReq1HPValid   = disabled
154	 * Vaux2SysClkReq1HPValid   = disabled
155	 * Vaux3SysClkReq1HPValid   = disabled
156	 */
157	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00),
158	/*
159	 * VextSupply1SysClkReq1HPValid = disabled
160	 * VextSupply2SysClkReq1HPValid = disabled
161	 * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled
162	 */
163	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x70, 0x40),
164	/*
165	 * VanaHwHPReq1Valid        = disabled
166	 * Vaux1HwHPreq1Valid       = disabled
167	 * Vaux2HwHPReq1Valid       = disabled
168	 * Vaux3HwHPReqValid        = disabled
169	 */
170	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1,     0xe8, 0x00),
171	/*
172	 * VextSupply1HwHPReq1Valid = disabled
173	 * VextSupply2HwHPReq1Valid = disabled
174	 * VextSupply3HwHPReq1Valid = disabled
175	 */
176	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2,     0x07, 0x00),
177	/*
178	 * VanaHwHPReq2Valid        = disabled
179	 * Vaux1HwHPReq2Valid       = disabled
180	 * Vaux2HwHPReq2Valid       = disabled
181	 * Vaux3HwHPReq2Valid       = disabled
182	 */
183	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1,     0xe8, 0x00),
184	/*
185	 * VextSupply1HwHPReq2Valid = disabled
186	 * VextSupply2HwHPReq2Valid = disabled
187	 * VextSupply3HwHPReq2Valid = HWReq2 controlled
188	 */
189	INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2,     0x07, 0x04),
190	/*
191	 * VanaSwHPReqValid         = disabled
192	 * Vaux1SwHPReqValid        = disabled
193	 */
194	INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1,      0xa0, 0x00),
195	/*
196	 * Vaux2SwHPReqValid        = disabled
197	 * Vaux3SwHPReqValid        = disabled
198	 * VextSupply1SwHPReqValid  = disabled
199	 * VextSupply2SwHPReqValid  = disabled
200	 * VextSupply3SwHPReqValid  = disabled
201	 */
202	INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2,      0x1f, 0x00),
203	/*
204	 * SysClkReq2Valid1         = SysClkReq2 controlled
205	 * SysClkReq3Valid1         = disabled
206	 * SysClkReq4Valid1         = SysClkReq4 controlled
207	 * SysClkReq5Valid1         = disabled
208	 * SysClkReq6Valid1         = SysClkReq6 controlled
209	 * SysClkReq7Valid1         = disabled
210	 * SysClkReq8Valid1         = disabled
211	 */
212	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1,    0xfe, 0x2a),
213	/*
214	 * SysClkReq2Valid2         = disabled
215	 * SysClkReq3Valid2         = disabled
216	 * SysClkReq4Valid2         = disabled
217	 * SysClkReq5Valid2         = disabled
218	 * SysClkReq6Valid2         = SysClkReq6 controlled
219	 * SysClkReq7Valid2         = disabled
220	 * SysClkReq8Valid2         = disabled
221	 */
222	INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2,    0xfe, 0x20),
223	/*
224	 * VTVoutEna                = disabled
225	 * Vintcore12Ena            = disabled
226	 * Vintcore12Sel            = 1.25 V
227	 * Vintcore12LP             = inactive (HP)
228	 * VTVoutLP                 = inactive (HP)
229	 */
230	INIT_REGULATOR_REGISTER(AB8500_REGUMISC1,              0xfe, 0x10),
231	/*
232	 * VaudioEna                = disabled
233	 * VdmicEna                 = disabled
234	 * Vamic1Ena                = disabled
235	 * Vamic2Ena                = disabled
236	 */
237	INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY,           0x1e, 0x00),
238	/*
239	 * Vamic1_dzout             = high-Z when Vamic1 is disabled
240	 * Vamic2_dzout             = high-Z when Vamic2 is disabled
241	 */
242	INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC,         0x03, 0x00),
243	/*
244	 * VPll                     = Hw controlled (NOTE! PRCMU bits)
245	 * VanaRegu                 = force off
246	 */
247	INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU,           0x0f, 0x02),
248	/*
249	 * VrefDDREna               = disabled
250	 * VrefDDRSleepMode         = inactive (no pulldown)
251	 */
252	INIT_REGULATOR_REGISTER(AB8500_VREFDDR,                0x03, 0x00),
253	/*
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
259	 */
260	INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU,          0xff, 0x13),
261	/*
262	 * Vaux1Regu                = force HP
263	 * Vaux2Regu                = force off
264	 */
265	INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU,             0x0f, 0x01),
266	/*
267	 * Vaux3Regu                = force off
268	 */
269	INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU,          0x03, 0x00),
270	/*
271	 * Vaux1Sel                 = 2.8 V
272	 */
273	INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL,               0x0f, 0x0C),
274	/*
275	 * Vaux2Sel                 = 2.9 V
276	 */
277	INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL,               0x0f, 0x0d),
278	/*
279	 * Vaux3Sel                 = 2.91 V
280	 */
281	INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL,           0x07, 0x07),
282	/*
283	 * VextSupply12LP           = disabled (no LP)
284	 */
285	INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE,         0x01, 0x00),
286	/*
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
293	 */
294	INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH,          0xfc, 0x00),
295	/*
296	 * VanaDisch                = short discharge time
297	 * VdmicPullDownEna         = pulldown disabled when Vdmic is disabled
298	 * VdmicDisch               = short discharge time
299	 */
300	INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2,         0x16, 0x00),
301};
302
303/* AB8500 regulators */
304static 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",
308		.constraints = {
309			.name = "V-DISPLAY",
310			.min_uV = 2800000,
311			.max_uV = 3300000,
312			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
313					  REGULATOR_CHANGE_STATUS,
314			.boot_on = 1, /* display is on at boot */
315		},
316		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
317		.consumer_supplies = ab8500_vaux1_consumers,
318	},
319	/* supplies to the on-board eMMC */
320	[AB8500_LDO_AUX2] = {
321		.supply_regulator = "ab8500-ext-supply3",
322		.constraints = {
323			.name = "V-eMMC1",
324			.min_uV = 1100000,
325			.max_uV = 3300000,
326			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
327					  REGULATOR_CHANGE_STATUS |
328					  REGULATOR_CHANGE_MODE,
329			.valid_modes_mask = REGULATOR_MODE_NORMAL |
330					    REGULATOR_MODE_IDLE,
331		},
332		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers),
333		.consumer_supplies = ab8500_vaux2_consumers,
334	},
335	/* supply for VAUX3, supplies to SDcard slots */
336	[AB8500_LDO_AUX3] = {
337		.supply_regulator = "ab8500-ext-supply3",
338		.constraints = {
339			.name = "V-MMC-SD",
340			.min_uV = 1100000,
341			.max_uV = 3300000,
342			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
343					  REGULATOR_CHANGE_STATUS |
344					  REGULATOR_CHANGE_MODE,
345			.valid_modes_mask = REGULATOR_MODE_NORMAL |
346					    REGULATOR_MODE_IDLE,
347		},
348		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers),
349		.consumer_supplies = ab8500_vaux3_consumers,
350	},
351	/* supply for tvout, gpadc, TVOUT LDO */
352	[AB8500_LDO_TVOUT] = {
353		.constraints = {
354			.name = "V-TVOUT",
355			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
356		},
357		.num_consumer_supplies = ARRAY_SIZE(ab8500_vtvout_consumers),
358		.consumer_supplies = ab8500_vtvout_consumers,
359	},
360	/* supply for ab8500-vaudio, VAUDIO LDO */
361	[AB8500_LDO_AUDIO] = {
362		.constraints = {
363			.name = "V-AUD",
364			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
365		},
366		.num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers),
367		.consumer_supplies = ab8500_vaud_consumers,
368	},
369	/* supply for v-anamic1 VAMic1-LDO */
370	[AB8500_LDO_ANAMIC1] = {
371		.constraints = {
372			.name = "V-AMIC1",
373			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
374		},
375		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers),
376		.consumer_supplies = ab8500_vamic1_consumers,
377	},
378	/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
379	[AB8500_LDO_ANAMIC2] = {
380		.constraints = {
381			.name = "V-AMIC2",
382			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
383		},
384		.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers),
385		.consumer_supplies = ab8500_vamic2_consumers,
386	},
387	/* supply for v-dmic, VDMIC LDO */
388	[AB8500_LDO_DMIC] = {
389		.constraints = {
390			.name = "V-DMIC",
391			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
392		},
393		.num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers),
394		.consumer_supplies = ab8500_vdmic_consumers,
395	},
396	/* supply for v-intcore12, VINTCORE12 LDO */
397	[AB8500_LDO_INTCORE] = {
398		.constraints = {
399			.name = "V-INTCORE",
400			.min_uV = 1250000,
401			.max_uV = 1350000,
402			.input_uV = 1800000,
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 |
408					    REGULATOR_MODE_IDLE,
409		},
410		.num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers),
411		.consumer_supplies = ab8500_vintcore_consumers,
412	},
413	/* supply for U8500 CSI-DSI, VANA LDO */
414	[AB8500_LDO_ANA] = {
415		.constraints = {
416			.name = "V-CSI-DSI",
417			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
418		},
419		.num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers),
420		.consumer_supplies = ab8500_vana_consumers,
421	},
422};
423
424/* supply for VextSupply3 */
425static struct regulator_consumer_supply ab8500_ext_supply3_consumers[] = {
426	/* SIM supply for 3 V SIM cards */
427	REGULATOR_SUPPLY("vinvsim", "sim-detect.0"),
428};
429
430/*
431 * AB8500 external regulators
432 */
433static struct regulator_init_data ab8500_ext_regulators[] = {
434	/* fixed Vbat supplies VSMPS1_EXT_1V8 */
435	[AB8500_EXT_SUPPLY1] = {
436		.constraints = {
437			.name = "ab8500-ext-supply1",
438			.min_uV = 1800000,
439			.max_uV = 1800000,
440			.initial_mode = REGULATOR_MODE_IDLE,
441			.boot_on = 1,
442			.always_on = 1,
443		},
444	},
445	/* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */
446	[AB8500_EXT_SUPPLY2] = {
447		.constraints = {
448			.name = "ab8500-ext-supply2",
449			.min_uV = 1360000,
450			.max_uV = 1360000,
451		},
452	},
453	/* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */
454	[AB8500_EXT_SUPPLY3] = {
455		.constraints = {
456			.name = "ab8500-ext-supply3",
457			.min_uV = 3400000,
458			.max_uV = 3400000,
459			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
460			.boot_on = 1,
461		},
462		.num_consumer_supplies =
463			ARRAY_SIZE(ab8500_ext_supply3_consumers),
464		.consumer_supplies = ab8500_ext_supply3_consumers,
465	},
466};
467
468static 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),
475};
476
477/**
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
492 */
493struct ab8500_ext_regulator_info {
494	struct device *dev;
495	struct regulator_desc desc;
496	struct ab8500_ext_regulator_cfg *cfg;
497	u8 update_bank;
498	u8 update_reg;
499	u8 update_mask;
500	u8 update_val;
501	u8 update_val_hp;
502	u8 update_val_lp;
503	u8 update_val_hw;
504};
505
506static int ab8500_ext_regulator_enable(struct regulator_dev *rdev)
507{
508	int ret;
509	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
510	u8 regval;
511
512	if (info == NULL) {
513		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
514		return -EINVAL;
515	}
516
517	/*
518	 * To satisfy both HW high power request and SW request, the regulator
519	 * must be on in high power.
520	 */
521	if (info->cfg && info->cfg->hwreq)
522		regval = info->update_val_hp;
523	else
524		regval = info->update_val;
525
526	ret = abx500_mask_and_set_register_interruptible(info->dev,
527		info->update_bank, info->update_reg,
528		info->update_mask, regval);
529	if (ret < 0) {
530		dev_err(rdev_get_dev(rdev),
531			"couldn't set enable bits for regulator\n");
532		return ret;
533	}
534
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);
539
540	return 0;
541}
542
543static int ab8500_ext_regulator_disable(struct regulator_dev *rdev)
544{
545	int ret;
546	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
547	u8 regval;
548
549	if (info == NULL) {
550		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
551		return -EINVAL;
552	}
553
554	/*
555	 * Set the regulator in HW request mode if configured
556	 */
557	if (info->cfg && info->cfg->hwreq)
558		regval = info->update_val_hw;
559	else
560		regval = 0;
561
562	ret = abx500_mask_and_set_register_interruptible(info->dev,
563		info->update_bank, info->update_reg,
564		info->update_mask, regval);
565	if (ret < 0) {
566		dev_err(rdev_get_dev(rdev),
567			"couldn't set disable bits for regulator\n");
568		return ret;
569	}
570
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);
575
576	return 0;
577}
578
579static int ab8500_ext_regulator_is_enabled(struct regulator_dev *rdev)
580{
581	int ret;
582	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
583	u8 regval;
584
585	if (info == NULL) {
586		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
587		return -EINVAL;
588	}
589
590	ret = abx500_get_register_interruptible(info->dev,
591		info->update_bank, info->update_reg, &regval);
592	if (ret < 0) {
593		dev_err(rdev_get_dev(rdev),
594			"couldn't read 0x%x register\n", info->update_reg);
595		return ret;
596	}
597
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);
602
603	if (((regval & info->update_mask) == info->update_val_lp) ||
604	    ((regval & info->update_mask) == info->update_val_hp))
605		return 1;
606	else
607		return 0;
608}
609
610static int ab8500_ext_regulator_set_mode(struct regulator_dev *rdev,
611					 unsigned int mode)
612{
613	int ret = 0;
614	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
615	u8 regval;
616
617	if (info == NULL) {
618		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
619		return -EINVAL;
620	}
621
622	switch (mode) {
623	case REGULATOR_MODE_NORMAL:
624		regval = info->update_val_hp;
625		break;
626	case REGULATOR_MODE_IDLE:
627		regval = info->update_val_lp;
628		break;
629
630	default:
631		return -EINVAL;
632	}
633
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
636	   the same value.
637	 */
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);
643		if (ret < 0) {
644			dev_err(rdev_get_dev(rdev),
645				"Could not set regulator mode.\n");
646			return ret;
647		}
648
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);
654	}
655
656	info->update_val = regval;
657
658	return 0;
659}
660
661static unsigned int ab8500_ext_regulator_get_mode(struct regulator_dev *rdev)
662{
663	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
664	int ret;
665
666	if (info == NULL) {
667		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
668		return -EINVAL;
669	}
670
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;
675	else
676		ret = -EINVAL;
677
678	return ret;
679}
680
681static int ab8500_ext_set_voltage(struct regulator_dev *rdev, int min_uV,
682				  int max_uV, unsigned *selector)
683{
684	struct regulation_constraints *regu_constraints = rdev->constraints;
685
686	if (!regu_constraints) {
687		dev_err(rdev_get_dev(rdev), "No regulator constraints\n");
688		return -EINVAL;
689	}
690
691	if (regu_constraints->min_uV == min_uV &&
692	    regu_constraints->max_uV == max_uV)
693		return 0;
694
695	dev_err(rdev_get_dev(rdev),
696		"Requested min %duV max %duV != constrained min %duV max %duV\n",
697		min_uV, max_uV,
698		regu_constraints->min_uV, regu_constraints->max_uV);
699
700	return -EINVAL;
701}
702
703static int ab8500_ext_list_voltage(struct regulator_dev *rdev,
704				   unsigned selector)
705{
706	struct regulation_constraints *regu_constraints = rdev->constraints;
707
708	if (regu_constraints == NULL) {
709		dev_err(rdev_get_dev(rdev), "regulator constraints null pointer\n");
710		return -EINVAL;
711	}
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;
716	}
717	return -EINVAL;
718}
719
720static 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,
728};
729
730static struct ab8500_ext_regulator_info
731		ab8500_ext_regulator_info[AB8500_NUM_EXT_REGULATORS] = {
732	[AB8500_EXT_SUPPLY1] = {
733		.desc = {
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,
740			.n_voltages	= 1,
741		},
742		.update_bank		= 0x04,
743		.update_reg		= 0x08,
744		.update_mask		= 0x03,
745		.update_val		= 0x01,
746		.update_val_hp		= 0x01,
747		.update_val_lp		= 0x03,
748		.update_val_hw		= 0x02,
749	},
750	[AB8500_EXT_SUPPLY2] = {
751		.desc = {
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,
758			.n_voltages	= 1,
759		},
760		.update_bank		= 0x04,
761		.update_reg		= 0x08,
762		.update_mask		= 0x0c,
763		.update_val		= 0x04,
764		.update_val_hp		= 0x04,
765		.update_val_lp		= 0x0c,
766		.update_val_hw		= 0x08,
767	},
768	[AB8500_EXT_SUPPLY3] = {
769		.desc = {
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,
776			.n_voltages	= 1,
777		},
778		.update_bank		= 0x04,
779		.update_reg		= 0x08,
780		.update_mask		= 0x30,
781		.update_val		= 0x10,
782		.update_val_hp		= 0x10,
783		.update_val_lp		= 0x30,
784		.update_val_hw		= 0x20,
785	},
786};
787
788static int ab8500_ext_regulator_probe(struct platform_device *pdev)
789{
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;
794	int i;
795
796	if (!ab8500) {
797		dev_err(&pdev->dev, "null mfd parent\n");
798		return -EINVAL;
799	}
800
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");
804		return -EINVAL;
805	}
806
807	/* check for AB8500 2.x */
808	if (is_ab8500_2p0_or_earlier(ab8500)) {
809		struct ab8500_ext_regulator_info *info;
810
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;
816	}
817
818	/* register all regulators */
819	for (i = 0; i < ARRAY_SIZE(ab8500_ext_regulator_info); i++) {
820		struct ab8500_ext_regulator_info *info = NULL;
821
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;
827
828		config.dev = &pdev->dev;
829		config.driver_data = info;
830		config.init_data = &pdata->ext_regulator[i];
831
832		/* register regulator with framework */
833		rdev = devm_regulator_register(&pdev->dev, &info->desc,
834					       &config);
835		if (IS_ERR(rdev)) {
836			dev_err(&pdev->dev, "failed to register regulator %s\n",
837					info->desc.name);
838			return PTR_ERR(rdev);
839		}
840
841		dev_dbg(&pdev->dev, "%s-probed\n", info->desc.name);
842	}
843
844	return 0;
845}
846
847static struct platform_driver ab8500_ext_regulator_driver = {
848	.probe = ab8500_ext_regulator_probe,
849	.driver         = {
850		.name   = "ab8500-ext-regulator",
 
851	},
852};
853
854static int __init ab8500_ext_regulator_init(void)
855{
856	int ret;
857
858	ret = platform_driver_register(&ab8500_ext_regulator_driver);
859	if (ret)
860		pr_err("Failed to register ab8500 ext regulator: %d\n", ret);
861
862	return ret;
863}
864subsys_initcall(ab8500_ext_regulator_init);
865
866static void __exit ab8500_ext_regulator_exit(void)
867{
868	platform_driver_unregister(&ab8500_ext_regulator_driver);
869}
870module_exit(ab8500_ext_regulator_exit);
871
872MODULE_LICENSE("GPL v2");
873MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
874MODULE_DESCRIPTION("AB8500 external regulator driver");
875MODULE_ALIAS("platform:ab8500-ext-regulator");
v6.8
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (C) ST-Ericsson SA 2010
  4 *
  5 * Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
  6 *
  7 * This file is based on drivers/regulator/ab8500.c
  8 *
  9 * AB8500 external regulators
 10 *
 11 * ab8500-ext supports the following regulators:
 12 * - VextSupply3
 13 */
 14#include <linux/init.h>
 15#include <linux/kernel.h>
 16#include <linux/err.h>
 17#include <linux/module.h>
 18#include <linux/of.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
 26/* AB8500 external regulators */
 27enum ab8500_ext_regulator_id {
 28	AB8500_EXT_SUPPLY1,
 29	AB8500_EXT_SUPPLY2,
 30	AB8500_EXT_SUPPLY3,
 31	AB8500_NUM_EXT_REGULATORS,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 32};
 33
 34struct ab8500_ext_regulator_cfg {
 35	bool hwreq; /* requires hw mode or high power mode */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 36};
 37
 38/* supply for VextSupply3 */
 39static struct regulator_consumer_supply ab8500_ext_supply3_consumers[] = {
 40	/* SIM supply for 3 V SIM cards */
 41	REGULATOR_SUPPLY("vinvsim", "sim-detect.0"),
 42};
 43
 44/*
 45 * AB8500 external regulators
 46 */
 47static struct regulator_init_data ab8500_ext_regulators[] = {
 48	/* fixed Vbat supplies VSMPS1_EXT_1V8 */
 49	[AB8500_EXT_SUPPLY1] = {
 50		.constraints = {
 51			.name = "ab8500-ext-supply1",
 52			.min_uV = 1800000,
 53			.max_uV = 1800000,
 54			.initial_mode = REGULATOR_MODE_IDLE,
 55			.boot_on = 1,
 56			.always_on = 1,
 57		},
 58	},
 59	/* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */
 60	[AB8500_EXT_SUPPLY2] = {
 61		.constraints = {
 62			.name = "ab8500-ext-supply2",
 63			.min_uV = 1360000,
 64			.max_uV = 1360000,
 65		},
 66	},
 67	/* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */
 68	[AB8500_EXT_SUPPLY3] = {
 69		.constraints = {
 70			.name = "ab8500-ext-supply3",
 71			.min_uV = 3400000,
 72			.max_uV = 3400000,
 73			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
 74			.boot_on = 1,
 75		},
 76		.num_consumer_supplies =
 77			ARRAY_SIZE(ab8500_ext_supply3_consumers),
 78		.consumer_supplies = ab8500_ext_supply3_consumers,
 79	},
 80};
 81
 
 
 
 
 
 
 
 
 
 82/**
 83 * struct ab8500_ext_regulator_info - ab8500 regulator information
 84 * @dev: device pointer
 85 * @desc: regulator description
 86 * @cfg: regulator configuration (extension of regulator FW configuration)
 87 * @update_bank: bank to control on/off
 88 * @update_reg: register to control on/off
 89 * @update_mask: mask to enable/disable and set mode of regulator
 90 * @update_val: bits holding the regulator current mode
 91 * @update_val_hp: bits to set EN pin active (LPn pin deactive)
 92 *                 normally this means high power mode
 93 * @update_val_lp: bits to set EN pin active and LPn pin active
 94 *                 normally this means low power mode
 95 * @update_val_hw: bits to set regulator pins in HW control
 96 *                 SysClkReq pins and logic will choose mode
 97 */
 98struct ab8500_ext_regulator_info {
 99	struct device *dev;
100	struct regulator_desc desc;
101	struct ab8500_ext_regulator_cfg *cfg;
102	u8 update_bank;
103	u8 update_reg;
104	u8 update_mask;
105	u8 update_val;
106	u8 update_val_hp;
107	u8 update_val_lp;
108	u8 update_val_hw;
109};
110
111static int ab8500_ext_regulator_enable(struct regulator_dev *rdev)
112{
113	int ret;
114	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
115	u8 regval;
116
117	if (info == NULL) {
118		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
119		return -EINVAL;
120	}
121
122	/*
123	 * To satisfy both HW high power request and SW request, the regulator
124	 * must be on in high power.
125	 */
126	if (info->cfg && info->cfg->hwreq)
127		regval = info->update_val_hp;
128	else
129		regval = info->update_val;
130
131	ret = abx500_mask_and_set_register_interruptible(info->dev,
132		info->update_bank, info->update_reg,
133		info->update_mask, regval);
134	if (ret < 0) {
135		dev_err(rdev_get_dev(rdev),
136			"couldn't set enable bits for regulator\n");
137		return ret;
138	}
139
140	dev_dbg(rdev_get_dev(rdev),
141		"%s-enable (bank, reg, mask, value): 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
142		info->desc.name, info->update_bank, info->update_reg,
143		info->update_mask, regval);
144
145	return 0;
146}
147
148static int ab8500_ext_regulator_disable(struct regulator_dev *rdev)
149{
150	int ret;
151	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
152	u8 regval;
153
154	if (info == NULL) {
155		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
156		return -EINVAL;
157	}
158
159	/*
160	 * Set the regulator in HW request mode if configured
161	 */
162	if (info->cfg && info->cfg->hwreq)
163		regval = info->update_val_hw;
164	else
165		regval = 0;
166
167	ret = abx500_mask_and_set_register_interruptible(info->dev,
168		info->update_bank, info->update_reg,
169		info->update_mask, regval);
170	if (ret < 0) {
171		dev_err(rdev_get_dev(rdev),
172			"couldn't set disable bits for regulator\n");
173		return ret;
174	}
175
176	dev_dbg(rdev_get_dev(rdev), "%s-disable (bank, reg, mask, value):"
177		" 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
178		info->desc.name, info->update_bank, info->update_reg,
179		info->update_mask, regval);
180
181	return 0;
182}
183
184static int ab8500_ext_regulator_is_enabled(struct regulator_dev *rdev)
185{
186	int ret;
187	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
188	u8 regval;
189
190	if (info == NULL) {
191		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
192		return -EINVAL;
193	}
194
195	ret = abx500_get_register_interruptible(info->dev,
196		info->update_bank, info->update_reg, &regval);
197	if (ret < 0) {
198		dev_err(rdev_get_dev(rdev),
199			"couldn't read 0x%x register\n", info->update_reg);
200		return ret;
201	}
202
203	dev_dbg(rdev_get_dev(rdev), "%s-is_enabled (bank, reg, mask, value):"
204		" 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
205		info->desc.name, info->update_bank, info->update_reg,
206		info->update_mask, regval);
207
208	if (((regval & info->update_mask) == info->update_val_lp) ||
209	    ((regval & info->update_mask) == info->update_val_hp))
210		return 1;
211	else
212		return 0;
213}
214
215static int ab8500_ext_regulator_set_mode(struct regulator_dev *rdev,
216					 unsigned int mode)
217{
218	int ret = 0;
219	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
220	u8 regval;
221
222	if (info == NULL) {
223		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
224		return -EINVAL;
225	}
226
227	switch (mode) {
228	case REGULATOR_MODE_NORMAL:
229		regval = info->update_val_hp;
230		break;
231	case REGULATOR_MODE_IDLE:
232		regval = info->update_val_lp;
233		break;
234
235	default:
236		return -EINVAL;
237	}
238
239	/* If regulator is enabled and info->cfg->hwreq is set, the regulator
240	   must be on in high power, so we don't need to write the register with
241	   the same value.
242	 */
243	if (ab8500_ext_regulator_is_enabled(rdev) &&
244	    !(info->cfg && info->cfg->hwreq)) {
245		ret = abx500_mask_and_set_register_interruptible(info->dev,
246					info->update_bank, info->update_reg,
247					info->update_mask, regval);
248		if (ret < 0) {
249			dev_err(rdev_get_dev(rdev),
250				"Could not set regulator mode.\n");
251			return ret;
252		}
253
254		dev_dbg(rdev_get_dev(rdev),
255			"%s-set_mode (bank, reg, mask, value): "
256			"0x%x, 0x%x, 0x%x, 0x%x\n",
257			info->desc.name, info->update_bank, info->update_reg,
258			info->update_mask, regval);
259	}
260
261	info->update_val = regval;
262
263	return 0;
264}
265
266static unsigned int ab8500_ext_regulator_get_mode(struct regulator_dev *rdev)
267{
268	struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
269	int ret;
270
271	if (info == NULL) {
272		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
273		return -EINVAL;
274	}
275
276	if (info->update_val == info->update_val_hp)
277		ret = REGULATOR_MODE_NORMAL;
278	else if (info->update_val == info->update_val_lp)
279		ret = REGULATOR_MODE_IDLE;
280	else
281		ret = -EINVAL;
282
283	return ret;
284}
285
286static int ab8500_ext_set_voltage(struct regulator_dev *rdev, int min_uV,
287				  int max_uV, unsigned *selector)
288{
289	struct regulation_constraints *regu_constraints = rdev->constraints;
290
291	if (!regu_constraints) {
292		dev_err(rdev_get_dev(rdev), "No regulator constraints\n");
293		return -EINVAL;
294	}
295
296	if (regu_constraints->min_uV == min_uV &&
297	    regu_constraints->max_uV == max_uV)
298		return 0;
299
300	dev_err(rdev_get_dev(rdev),
301		"Requested min %duV max %duV != constrained min %duV max %duV\n",
302		min_uV, max_uV,
303		regu_constraints->min_uV, regu_constraints->max_uV);
304
305	return -EINVAL;
306}
307
308static int ab8500_ext_list_voltage(struct regulator_dev *rdev,
309				   unsigned selector)
310{
311	struct regulation_constraints *regu_constraints = rdev->constraints;
312
313	if (regu_constraints == NULL) {
314		dev_err(rdev_get_dev(rdev), "regulator constraints null pointer\n");
315		return -EINVAL;
316	}
317	/* return the uV for the fixed regulators */
318	if (regu_constraints->min_uV && regu_constraints->max_uV) {
319		if (regu_constraints->min_uV == regu_constraints->max_uV)
320			return regu_constraints->min_uV;
321	}
322	return -EINVAL;
323}
324
325static const struct regulator_ops ab8500_ext_regulator_ops = {
326	.enable			= ab8500_ext_regulator_enable,
327	.disable		= ab8500_ext_regulator_disable,
328	.is_enabled		= ab8500_ext_regulator_is_enabled,
329	.set_mode		= ab8500_ext_regulator_set_mode,
330	.get_mode		= ab8500_ext_regulator_get_mode,
331	.set_voltage		= ab8500_ext_set_voltage,
332	.list_voltage		= ab8500_ext_list_voltage,
333};
334
335static struct ab8500_ext_regulator_info
336		ab8500_ext_regulator_info[AB8500_NUM_EXT_REGULATORS] = {
337	[AB8500_EXT_SUPPLY1] = {
338		.desc = {
339			.name		= "VEXTSUPPLY1",
340			.of_match	= of_match_ptr("ab8500_ext1"),
341			.ops		= &ab8500_ext_regulator_ops,
342			.type		= REGULATOR_VOLTAGE,
343			.id		= AB8500_EXT_SUPPLY1,
344			.owner		= THIS_MODULE,
345			.n_voltages	= 1,
346		},
347		.update_bank		= 0x04,
348		.update_reg		= 0x08,
349		.update_mask		= 0x03,
350		.update_val		= 0x01,
351		.update_val_hp		= 0x01,
352		.update_val_lp		= 0x03,
353		.update_val_hw		= 0x02,
354	},
355	[AB8500_EXT_SUPPLY2] = {
356		.desc = {
357			.name		= "VEXTSUPPLY2",
358			.of_match	= of_match_ptr("ab8500_ext2"),
359			.ops		= &ab8500_ext_regulator_ops,
360			.type		= REGULATOR_VOLTAGE,
361			.id		= AB8500_EXT_SUPPLY2,
362			.owner		= THIS_MODULE,
363			.n_voltages	= 1,
364		},
365		.update_bank		= 0x04,
366		.update_reg		= 0x08,
367		.update_mask		= 0x0c,
368		.update_val		= 0x04,
369		.update_val_hp		= 0x04,
370		.update_val_lp		= 0x0c,
371		.update_val_hw		= 0x08,
372	},
373	[AB8500_EXT_SUPPLY3] = {
374		.desc = {
375			.name		= "VEXTSUPPLY3",
376			.of_match	= of_match_ptr("ab8500_ext3"),
377			.ops		= &ab8500_ext_regulator_ops,
378			.type		= REGULATOR_VOLTAGE,
379			.id		= AB8500_EXT_SUPPLY3,
380			.owner		= THIS_MODULE,
381			.n_voltages	= 1,
382		},
383		.update_bank		= 0x04,
384		.update_reg		= 0x08,
385		.update_mask		= 0x30,
386		.update_val		= 0x10,
387		.update_val_hp		= 0x10,
388		.update_val_lp		= 0x30,
389		.update_val_hw		= 0x20,
390	},
391};
392
393static int ab8500_ext_regulator_probe(struct platform_device *pdev)
394{
395	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
 
396	struct regulator_config config = { };
397	struct regulator_dev *rdev;
398	int i;
399
400	if (!ab8500) {
401		dev_err(&pdev->dev, "null mfd parent\n");
402		return -EINVAL;
403	}
404
 
 
 
 
 
 
405	/* check for AB8500 2.x */
406	if (is_ab8500_2p0_or_earlier(ab8500)) {
407		struct ab8500_ext_regulator_info *info;
408
409		/* VextSupply3LPn is inverted on AB8500 2.x */
410		info = &ab8500_ext_regulator_info[AB8500_EXT_SUPPLY3];
411		info->update_val = 0x30;
412		info->update_val_hp = 0x30;
413		info->update_val_lp = 0x10;
414	}
415
416	/* register all regulators */
417	for (i = 0; i < ARRAY_SIZE(ab8500_ext_regulator_info); i++) {
418		struct ab8500_ext_regulator_info *info = NULL;
419
420		/* assign per-regulator data */
421		info = &ab8500_ext_regulator_info[i];
422		info->dev = &pdev->dev;
423		info->cfg = (struct ab8500_ext_regulator_cfg *)
424			ab8500_ext_regulators[i].driver_data;
425
426		config.dev = &pdev->dev;
427		config.driver_data = info;
428		config.init_data = &ab8500_ext_regulators[i];
429
430		/* register regulator with framework */
431		rdev = devm_regulator_register(&pdev->dev, &info->desc,
432					       &config);
433		if (IS_ERR(rdev)) {
434			dev_err(&pdev->dev, "failed to register regulator %s\n",
435					info->desc.name);
436			return PTR_ERR(rdev);
437		}
438
439		dev_dbg(&pdev->dev, "%s-probed\n", info->desc.name);
440	}
441
442	return 0;
443}
444
445static struct platform_driver ab8500_ext_regulator_driver = {
446	.probe = ab8500_ext_regulator_probe,
447	.driver         = {
448		.name   = "ab8500-ext-regulator",
449		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
450	},
451};
452
453static int __init ab8500_ext_regulator_init(void)
454{
455	int ret;
456
457	ret = platform_driver_register(&ab8500_ext_regulator_driver);
458	if (ret)
459		pr_err("Failed to register ab8500 ext regulator: %d\n", ret);
460
461	return ret;
462}
463subsys_initcall(ab8500_ext_regulator_init);
464
465static void __exit ab8500_ext_regulator_exit(void)
466{
467	platform_driver_unregister(&ab8500_ext_regulator_driver);
468}
469module_exit(ab8500_ext_regulator_exit);
470
471MODULE_LICENSE("GPL v2");
472MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
473MODULE_DESCRIPTION("AB8500 external regulator driver");
474MODULE_ALIAS("platform:ab8500-ext-regulator");