Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Copyright (C) ST-Ericsson SA 2010
  3 *
  4 * License Terms: GNU General Public License v2
  5 *
  6 * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
  7 *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
  8 *
  9 * AB8500 peripheral regulators
 10 *
 11 * AB8500 supports the following regulators:
 12 *   VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
 13 */
 14#include <linux/init.h>
 15#include <linux/kernel.h>
 
 16#include <linux/err.h>
 17#include <linux/platform_device.h>
 18#include <linux/mfd/ab8500.h>
 19#include <linux/mfd/abx500.h>
 
 
 
 20#include <linux/regulator/driver.h>
 21#include <linux/regulator/machine.h>
 22#include <linux/regulator/ab8500.h>
 
 23
 24/**
 25 * struct ab8500_regulator_info - ab8500 regulator information
 26 * @dev: device pointer
 27 * @desc: regulator description
 28 * @regulator_dev: regulator device
 29 * @max_uV: maximum voltage (for variable voltage supplies)
 30 * @min_uV: minimum voltage (for variable voltage supplies)
 31 * @fixed_uV: typical voltage (for fixed voltage supplies)
 32 * @update_bank: bank to control on/off
 33 * @update_reg: register to control on/off
 34 * @update_mask: mask to enable/disable regulator
 35 * @update_val_enable: bits to enable the regulator in normal (high power) mode
 36 * @voltage_bank: bank to control regulator voltage
 37 * @voltage_reg: register to control regulator voltage
 38 * @voltage_mask: mask to control regulator voltage
 39 * @voltages: supported voltage table
 40 * @voltages_len: number of supported voltages for the regulator
 41 * @delay: startup/set voltage delay in us
 42 */
 43struct ab8500_regulator_info {
 44	struct device		*dev;
 45	struct regulator_desc	desc;
 46	struct regulator_dev	*regulator;
 47	int max_uV;
 48	int min_uV;
 49	int fixed_uV;
 50	u8 update_bank;
 51	u8 update_reg;
 52	u8 update_mask;
 53	u8 update_val_enable;
 54	u8 voltage_bank;
 55	u8 voltage_reg;
 56	u8 voltage_mask;
 57	int const *voltages;
 58	int voltages_len;
 59	unsigned int delay;
 60};
 61
 62/* voltage tables for the vauxn/vintcore supplies */
 63static const int ldo_vauxn_voltages[] = {
 64	1100000,
 65	1200000,
 66	1300000,
 67	1400000,
 68	1500000,
 69	1800000,
 70	1850000,
 71	1900000,
 72	2500000,
 73	2650000,
 74	2700000,
 75	2750000,
 76	2800000,
 77	2900000,
 78	3000000,
 79	3300000,
 80};
 81
 82static const int ldo_vaux3_voltages[] = {
 83	1200000,
 84	1500000,
 85	1800000,
 86	2100000,
 87	2500000,
 88	2750000,
 89	2790000,
 90	2910000,
 91};
 92
 93static const int ldo_vintcore_voltages[] = {
 94	1200000,
 95	1225000,
 96	1250000,
 97	1275000,
 98	1300000,
 99	1325000,
100	1350000,
101};
102
103static int ab8500_regulator_enable(struct regulator_dev *rdev)
104{
105	int ret;
106	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
107
108	if (info == NULL) {
109		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
110		return -EINVAL;
111	}
112
113	ret = abx500_mask_and_set_register_interruptible(info->dev,
114		info->update_bank, info->update_reg,
115		info->update_mask, info->update_val_enable);
116	if (ret < 0)
117		dev_err(rdev_get_dev(rdev),
118			"couldn't set enable bits for regulator\n");
119
120	dev_vdbg(rdev_get_dev(rdev),
121		"%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
122		info->desc.name, info->update_bank, info->update_reg,
123		info->update_mask, info->update_val_enable);
124
125	return ret;
126}
127
128static int ab8500_regulator_disable(struct regulator_dev *rdev)
129{
130	int ret;
131	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
132
133	if (info == NULL) {
134		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
135		return -EINVAL;
136	}
137
138	ret = abx500_mask_and_set_register_interruptible(info->dev,
139		info->update_bank, info->update_reg,
140		info->update_mask, 0x0);
141	if (ret < 0)
142		dev_err(rdev_get_dev(rdev),
143			"couldn't set disable bits for regulator\n");
144
145	dev_vdbg(rdev_get_dev(rdev),
146		"%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
147		info->desc.name, info->update_bank, info->update_reg,
148		info->update_mask, 0x0);
149
150	return ret;
151}
152
153static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
154{
155	int ret;
156	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
157	u8 regval;
158
159	if (info == NULL) {
160		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
161		return -EINVAL;
162	}
163
164	ret = abx500_get_register_interruptible(info->dev,
165		info->update_bank, info->update_reg, &regval);
166	if (ret < 0) {
167		dev_err(rdev_get_dev(rdev),
168			"couldn't read 0x%x register\n", info->update_reg);
169		return ret;
170	}
171
172	dev_vdbg(rdev_get_dev(rdev),
173		"%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
174		" 0x%x\n",
175		info->desc.name, info->update_bank, info->update_reg,
176		info->update_mask, regval);
177
178	if (regval & info->update_mask)
179		return true;
180	else
181		return false;
182}
183
184static int ab8500_list_voltage(struct regulator_dev *rdev, unsigned selector)
185{
186	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
187
188	if (info == NULL) {
189		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
190		return -EINVAL;
191	}
192
193	/* return the uV for the fixed regulators */
194	if (info->fixed_uV)
195		return info->fixed_uV;
196
197	if (selector >= info->voltages_len)
198		return -EINVAL;
199
200	return info->voltages[selector];
201}
202
203static int ab8500_regulator_get_voltage(struct regulator_dev *rdev)
204{
205	int ret, val;
206	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
207	u8 regval;
208
209	if (info == NULL) {
210		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
211		return -EINVAL;
212	}
213
214	ret = abx500_get_register_interruptible(info->dev,
215			info->voltage_bank, info->voltage_reg, &regval);
216	if (ret < 0) {
217		dev_err(rdev_get_dev(rdev),
218			"couldn't read voltage reg for regulator\n");
219		return ret;
220	}
221
222	dev_vdbg(rdev_get_dev(rdev),
223		"%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
224		" 0x%x\n",
225		info->desc.name, info->voltage_bank, info->voltage_reg,
226		info->voltage_mask, regval);
227
228	/* vintcore has a different layout */
229	val = regval & info->voltage_mask;
230	if (info->desc.id == AB8500_LDO_INTCORE)
231		ret = info->voltages[val >> 0x3];
232	else
233		ret = info->voltages[val];
234
235	return ret;
236}
237
238static int ab8500_get_best_voltage_index(struct regulator_dev *rdev,
239		int min_uV, int max_uV)
240{
241	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
242	int i;
243
244	/* check the supported voltage */
245	for (i = 0; i < info->voltages_len; i++) {
246		if ((info->voltages[i] >= min_uV) &&
247		    (info->voltages[i] <= max_uV))
248			return i;
249	}
250
251	return -EINVAL;
252}
253
254static int ab8500_regulator_set_voltage(struct regulator_dev *rdev,
255					int min_uV, int max_uV,
256					unsigned *selector)
257{
258	int ret;
259	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
260	u8 regval;
261
262	if (info == NULL) {
263		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
264		return -EINVAL;
265	}
266
267	/* get the appropriate voltages within the range */
268	ret = ab8500_get_best_voltage_index(rdev, min_uV, max_uV);
269	if (ret < 0) {
270		dev_err(rdev_get_dev(rdev),
271				"couldn't get best voltage for regulator\n");
272		return ret;
273	}
274
275	*selector = ret;
276
277	/* set the registers for the request */
278	regval = (u8)ret;
279	ret = abx500_mask_and_set_register_interruptible(info->dev,
280			info->voltage_bank, info->voltage_reg,
281			info->voltage_mask, regval);
282	if (ret < 0)
283		dev_err(rdev_get_dev(rdev),
284		"couldn't set voltage reg for regulator\n");
285
286	dev_vdbg(rdev_get_dev(rdev),
287		"%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
288		" 0x%x\n",
289		info->desc.name, info->voltage_bank, info->voltage_reg,
290		info->voltage_mask, regval);
291
292	return ret;
293}
294
295static int ab8500_regulator_enable_time(struct regulator_dev *rdev)
296{
297	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
298
299	return info->delay;
300}
301
302static int ab8500_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
303					     unsigned int old_sel,
304					     unsigned int new_sel)
305{
306	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
307	int ret;
308
309	/* If the regulator isn't on, it won't take time here */
310	ret = ab8500_regulator_is_enabled(rdev);
311	if (ret < 0)
312		return ret;
313	if (!ret)
314		return 0;
315	return info->delay;
316}
317
318static struct regulator_ops ab8500_regulator_ops = {
319	.enable		= ab8500_regulator_enable,
320	.disable	= ab8500_regulator_disable,
321	.is_enabled	= ab8500_regulator_is_enabled,
322	.get_voltage	= ab8500_regulator_get_voltage,
323	.set_voltage	= ab8500_regulator_set_voltage,
324	.list_voltage	= ab8500_list_voltage,
325	.enable_time	= ab8500_regulator_enable_time,
326	.set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
327};
328
329static int ab8500_fixed_get_voltage(struct regulator_dev *rdev)
330{
331	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
338	return info->fixed_uV;
339}
340
341static struct regulator_ops ab8500_regulator_fixed_ops = {
342	.enable		= ab8500_regulator_enable,
343	.disable	= ab8500_regulator_disable,
344	.is_enabled	= ab8500_regulator_is_enabled,
345	.get_voltage	= ab8500_fixed_get_voltage,
346	.list_voltage	= ab8500_list_voltage,
347	.enable_time	= ab8500_regulator_enable_time,
348	.set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
349};
350
351static struct ab8500_regulator_info
352		ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
353	/*
354	 * Variable Voltage Regulators
355	 *   name, min mV, max mV,
356	 *   update bank, reg, mask, enable val
357	 *   volt bank, reg, mask, table, table length
358	 */
359	[AB8500_LDO_AUX1] = {
360		.desc = {
361			.name		= "LDO-AUX1",
362			.ops		= &ab8500_regulator_ops,
363			.type		= REGULATOR_VOLTAGE,
364			.id		= AB8500_LDO_AUX1,
365			.owner		= THIS_MODULE,
366			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
367		},
368		.min_uV			= 1100000,
369		.max_uV			= 3300000,
370		.update_bank		= 0x04,
371		.update_reg		= 0x09,
372		.update_mask		= 0x03,
373		.update_val_enable	= 0x01,
374		.voltage_bank		= 0x04,
375		.voltage_reg		= 0x1f,
376		.voltage_mask		= 0x0f,
377		.voltages		= ldo_vauxn_voltages,
378		.voltages_len		= ARRAY_SIZE(ldo_vauxn_voltages),
379	},
380	[AB8500_LDO_AUX2] = {
381		.desc = {
382			.name		= "LDO-AUX2",
383			.ops		= &ab8500_regulator_ops,
384			.type		= REGULATOR_VOLTAGE,
385			.id		= AB8500_LDO_AUX2,
386			.owner		= THIS_MODULE,
387			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
388		},
389		.min_uV			= 1100000,
390		.max_uV			= 3300000,
391		.update_bank		= 0x04,
392		.update_reg		= 0x09,
393		.update_mask		= 0x0c,
394		.update_val_enable	= 0x04,
395		.voltage_bank		= 0x04,
396		.voltage_reg		= 0x20,
397		.voltage_mask		= 0x0f,
398		.voltages		= ldo_vauxn_voltages,
399		.voltages_len		= ARRAY_SIZE(ldo_vauxn_voltages),
400	},
401	[AB8500_LDO_AUX3] = {
402		.desc = {
403			.name		= "LDO-AUX3",
404			.ops		= &ab8500_regulator_ops,
405			.type		= REGULATOR_VOLTAGE,
406			.id		= AB8500_LDO_AUX3,
407			.owner		= THIS_MODULE,
408			.n_voltages	= ARRAY_SIZE(ldo_vaux3_voltages),
409		},
410		.min_uV			= 1100000,
411		.max_uV			= 3300000,
412		.update_bank		= 0x04,
413		.update_reg		= 0x0a,
414		.update_mask		= 0x03,
415		.update_val_enable	= 0x01,
416		.voltage_bank		= 0x04,
417		.voltage_reg		= 0x21,
418		.voltage_mask		= 0x07,
419		.voltages		= ldo_vaux3_voltages,
420		.voltages_len		= ARRAY_SIZE(ldo_vaux3_voltages),
421	},
422	[AB8500_LDO_INTCORE] = {
423		.desc = {
424			.name		= "LDO-INTCORE",
425			.ops		= &ab8500_regulator_ops,
426			.type		= REGULATOR_VOLTAGE,
427			.id		= AB8500_LDO_INTCORE,
428			.owner		= THIS_MODULE,
429			.n_voltages	= ARRAY_SIZE(ldo_vintcore_voltages),
430		},
431		.min_uV			= 1100000,
432		.max_uV			= 3300000,
433		.update_bank		= 0x03,
434		.update_reg		= 0x80,
435		.update_mask		= 0x44,
436		.update_val_enable	= 0x04,
437		.voltage_bank		= 0x03,
438		.voltage_reg		= 0x80,
439		.voltage_mask		= 0x38,
440		.voltages		= ldo_vintcore_voltages,
441		.voltages_len		= ARRAY_SIZE(ldo_vintcore_voltages),
442	},
443
444	/*
445	 * Fixed Voltage Regulators
446	 *   name, fixed mV,
447	 *   update bank, reg, mask, enable val
448	 */
449	[AB8500_LDO_TVOUT] = {
450		.desc = {
451			.name		= "LDO-TVOUT",
452			.ops		= &ab8500_regulator_fixed_ops,
453			.type		= REGULATOR_VOLTAGE,
454			.id		= AB8500_LDO_TVOUT,
455			.owner		= THIS_MODULE,
456			.n_voltages	= 1,
457		},
458		.delay			= 10000,
459		.fixed_uV		= 2000000,
460		.update_bank		= 0x03,
461		.update_reg		= 0x80,
462		.update_mask		= 0x82,
463		.update_val_enable	= 0x02,
464	},
465	[AB8500_LDO_USB] = {
466		.desc = {
467			.name           = "LDO-USB",
468			.ops            = &ab8500_regulator_fixed_ops,
469			.type           = REGULATOR_VOLTAGE,
470			.id             = AB8500_LDO_USB,
471			.owner          = THIS_MODULE,
472			.n_voltages     = 1,
473		},
474		.fixed_uV               = 3300000,
475		.update_bank            = 0x03,
476		.update_reg             = 0x82,
477		.update_mask            = 0x03,
478		.update_val_enable      = 0x01,
479	},
480	[AB8500_LDO_AUDIO] = {
481		.desc = {
482			.name		= "LDO-AUDIO",
483			.ops		= &ab8500_regulator_fixed_ops,
484			.type		= REGULATOR_VOLTAGE,
485			.id		= AB8500_LDO_AUDIO,
486			.owner		= THIS_MODULE,
487			.n_voltages	= 1,
488		},
489		.fixed_uV		= 2000000,
490		.update_bank		= 0x03,
491		.update_reg		= 0x83,
492		.update_mask		= 0x02,
493		.update_val_enable	= 0x02,
494	},
495	[AB8500_LDO_ANAMIC1] = {
496		.desc = {
497			.name		= "LDO-ANAMIC1",
498			.ops		= &ab8500_regulator_fixed_ops,
499			.type		= REGULATOR_VOLTAGE,
500			.id		= AB8500_LDO_ANAMIC1,
501			.owner		= THIS_MODULE,
502			.n_voltages	= 1,
503		},
504		.fixed_uV		= 2050000,
505		.update_bank		= 0x03,
506		.update_reg		= 0x83,
507		.update_mask		= 0x08,
508		.update_val_enable	= 0x08,
509	},
510	[AB8500_LDO_ANAMIC2] = {
511		.desc = {
512			.name		= "LDO-ANAMIC2",
513			.ops		= &ab8500_regulator_fixed_ops,
514			.type		= REGULATOR_VOLTAGE,
515			.id		= AB8500_LDO_ANAMIC2,
516			.owner		= THIS_MODULE,
517			.n_voltages	= 1,
518		},
519		.fixed_uV		= 2050000,
520		.update_bank		= 0x03,
521		.update_reg		= 0x83,
522		.update_mask		= 0x10,
523		.update_val_enable	= 0x10,
524	},
525	[AB8500_LDO_DMIC] = {
526		.desc = {
527			.name		= "LDO-DMIC",
528			.ops		= &ab8500_regulator_fixed_ops,
529			.type		= REGULATOR_VOLTAGE,
530			.id		= AB8500_LDO_DMIC,
531			.owner		= THIS_MODULE,
532			.n_voltages	= 1,
533		},
534		.fixed_uV		= 1800000,
535		.update_bank		= 0x03,
536		.update_reg		= 0x83,
537		.update_mask		= 0x04,
538		.update_val_enable	= 0x04,
539	},
540	[AB8500_LDO_ANA] = {
541		.desc = {
542			.name		= "LDO-ANA",
543			.ops		= &ab8500_regulator_fixed_ops,
544			.type		= REGULATOR_VOLTAGE,
545			.id		= AB8500_LDO_ANA,
546			.owner		= THIS_MODULE,
547			.n_voltages	= 1,
548		},
549		.fixed_uV		= 1200000,
550		.update_bank		= 0x04,
551		.update_reg		= 0x06,
552		.update_mask		= 0x0c,
553		.update_val_enable	= 0x04,
554	},
555
556
557};
558
559struct ab8500_reg_init {
560	u8 bank;
561	u8 addr;
562	u8 mask;
563};
564
565#define REG_INIT(_id, _bank, _addr, _mask)	\
566	[_id] = {				\
567		.bank = _bank,			\
568		.addr = _addr,			\
569		.mask = _mask,			\
570	}
571
572static struct ab8500_reg_init ab8500_reg_init[] = {
573	/*
574	 * 0x30, VanaRequestCtrl
575	 * 0x0C, VpllRequestCtrl
576	 * 0xc0, VextSupply1RequestCtrl
577	 */
578	REG_INIT(AB8500_REGUREQUESTCTRL2,	0x03, 0x04, 0xfc),
579	/*
580	 * 0x03, VextSupply2RequestCtrl
581	 * 0x0c, VextSupply3RequestCtrl
582	 * 0x30, Vaux1RequestCtrl
583	 * 0xc0, Vaux2RequestCtrl
584	 */
585	REG_INIT(AB8500_REGUREQUESTCTRL3,	0x03, 0x05, 0xff),
586	/*
587	 * 0x03, Vaux3RequestCtrl
588	 * 0x04, SwHPReq
589	 */
590	REG_INIT(AB8500_REGUREQUESTCTRL4,	0x03, 0x06, 0x07),
591	/*
592	 * 0x08, VanaSysClkReq1HPValid
593	 * 0x20, Vaux1SysClkReq1HPValid
594	 * 0x40, Vaux2SysClkReq1HPValid
595	 * 0x80, Vaux3SysClkReq1HPValid
596	 */
597	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1,	0x03, 0x07, 0xe8),
598	/*
599	 * 0x10, VextSupply1SysClkReq1HPValid
600	 * 0x20, VextSupply2SysClkReq1HPValid
601	 * 0x40, VextSupply3SysClkReq1HPValid
602	 */
603	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2,	0x03, 0x08, 0x70),
604	/*
605	 * 0x08, VanaHwHPReq1Valid
606	 * 0x20, Vaux1HwHPReq1Valid
607	 * 0x40, Vaux2HwHPReq1Valid
608	 * 0x80, Vaux3HwHPReq1Valid
609	 */
610	REG_INIT(AB8500_REGUHWHPREQ1VALID1,	0x03, 0x09, 0xe8),
611	/*
612	 * 0x01, VextSupply1HwHPReq1Valid
613	 * 0x02, VextSupply2HwHPReq1Valid
614	 * 0x04, VextSupply3HwHPReq1Valid
615	 */
616	REG_INIT(AB8500_REGUHWHPREQ1VALID2,	0x03, 0x0a, 0x07),
617	/*
618	 * 0x08, VanaHwHPReq2Valid
619	 * 0x20, Vaux1HwHPReq2Valid
620	 * 0x40, Vaux2HwHPReq2Valid
621	 * 0x80, Vaux3HwHPReq2Valid
622	 */
623	REG_INIT(AB8500_REGUHWHPREQ2VALID1,	0x03, 0x0b, 0xe8),
624	/*
625	 * 0x01, VextSupply1HwHPReq2Valid
626	 * 0x02, VextSupply2HwHPReq2Valid
627	 * 0x04, VextSupply3HwHPReq2Valid
628	 */
629	REG_INIT(AB8500_REGUHWHPREQ2VALID2,	0x03, 0x0c, 0x07),
630	/*
631	 * 0x20, VanaSwHPReqValid
632	 * 0x80, Vaux1SwHPReqValid
633	 */
634	REG_INIT(AB8500_REGUSWHPREQVALID1,	0x03, 0x0d, 0xa0),
635	/*
636	 * 0x01, Vaux2SwHPReqValid
637	 * 0x02, Vaux3SwHPReqValid
638	 * 0x04, VextSupply1SwHPReqValid
639	 * 0x08, VextSupply2SwHPReqValid
640	 * 0x10, VextSupply3SwHPReqValid
641	 */
642	REG_INIT(AB8500_REGUSWHPREQVALID2,	0x03, 0x0e, 0x1f),
643	/*
644	 * 0x02, SysClkReq2Valid1
645	 * ...
646	 * 0x80, SysClkReq8Valid1
647	 */
648	REG_INIT(AB8500_REGUSYSCLKREQVALID1,	0x03, 0x0f, 0xfe),
649	/*
650	 * 0x02, SysClkReq2Valid2
651	 * ...
652	 * 0x80, SysClkReq8Valid2
653	 */
654	REG_INIT(AB8500_REGUSYSCLKREQVALID2,	0x03, 0x10, 0xfe),
655	/*
656	 * 0x02, VTVoutEna
657	 * 0x04, Vintcore12Ena
658	 * 0x38, Vintcore12Sel
659	 * 0x40, Vintcore12LP
660	 * 0x80, VTVoutLP
661	 */
662	REG_INIT(AB8500_REGUMISC1,		0x03, 0x80, 0xfe),
663	/*
664	 * 0x02, VaudioEna
665	 * 0x04, VdmicEna
666	 * 0x08, Vamic1Ena
667	 * 0x10, Vamic2Ena
668	 */
669	REG_INIT(AB8500_VAUDIOSUPPLY,		0x03, 0x83, 0x1e),
670	/*
671	 * 0x01, Vamic1_dzout
672	 * 0x02, Vamic2_dzout
673	 */
674	REG_INIT(AB8500_REGUCTRL1VAMIC,		0x03, 0x84, 0x03),
675	/*
676	 * 0x0c, VanaRegu
677	 * 0x03, VpllRegu
678	 */
679	REG_INIT(AB8500_VPLLVANAREGU,		0x04, 0x06, 0x0f),
680	/*
681	 * 0x01, VrefDDREna
682	 * 0x02, VrefDDRSleepMode
683	 */
684	REG_INIT(AB8500_VREFDDR,		0x04, 0x07, 0x03),
685	/*
686	 * 0x03, VextSupply1Regu
687	 * 0x0c, VextSupply2Regu
688	 * 0x30, VextSupply3Regu
689	 * 0x40, ExtSupply2Bypass
690	 * 0x80, ExtSupply3Bypass
691	 */
692	REG_INIT(AB8500_EXTSUPPLYREGU,		0x04, 0x08, 0xff),
693	/*
694	 * 0x03, Vaux1Regu
695	 * 0x0c, Vaux2Regu
696	 */
697	REG_INIT(AB8500_VAUX12REGU,		0x04, 0x09, 0x0f),
698	/*
699	 * 0x03, Vaux3Regu
700	 */
701	REG_INIT(AB8500_VRF1VAUX3REGU,		0x04, 0x0a, 0x03),
702	/*
703	 * 0x3f, Vsmps1Sel1
704	 */
705	REG_INIT(AB8500_VSMPS1SEL1,		0x04, 0x13, 0x3f),
706	/*
707	 * 0x0f, Vaux1Sel
708	 */
709	REG_INIT(AB8500_VAUX1SEL,		0x04, 0x1f, 0x0f),
710	/*
711	 * 0x0f, Vaux2Sel
712	 */
713	REG_INIT(AB8500_VAUX2SEL,		0x04, 0x20, 0x0f),
714	/*
715	 * 0x07, Vaux3Sel
716	 */
717	REG_INIT(AB8500_VRF1VAUX3SEL,		0x04, 0x21, 0x07),
718	/*
719	 * 0x01, VextSupply12LP
720	 */
721	REG_INIT(AB8500_REGUCTRL2SPARE,		0x04, 0x22, 0x01),
722	/*
723	 * 0x04, Vaux1Disch
724	 * 0x08, Vaux2Disch
725	 * 0x10, Vaux3Disch
726	 * 0x20, Vintcore12Disch
727	 * 0x40, VTVoutDisch
728	 * 0x80, VaudioDisch
729	 */
730	REG_INIT(AB8500_REGUCTRLDISCH,		0x04, 0x43, 0xfc),
731	/*
732	 * 0x02, VanaDisch
733	 * 0x04, VdmicPullDownEna
734	 * 0x10, VdmicDisch
735	 */
736	REG_INIT(AB8500_REGUCTRLDISCH2,		0x04, 0x44, 0x16),
737};
738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
739static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
740{
741	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
742	struct ab8500_platform_data *pdata;
 
743	int i, err;
744
 
 
 
 
 
 
 
 
 
 
 
 
 
 
745	if (!ab8500) {
746		dev_err(&pdev->dev, "null mfd parent\n");
747		return -EINVAL;
748	}
749	pdata = dev_get_platdata(ab8500->dev);
750	if (!pdata) {
751		dev_err(&pdev->dev, "null pdata\n");
752		return -EINVAL;
753	}
754
755	/* make sure the platform data has the correct size */
756	if (pdata->num_regulator != ARRAY_SIZE(ab8500_regulator_info)) {
757		dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
758		return -EINVAL;
759	}
760
761	/* initialize registers */
762	for (i = 0; i < pdata->num_regulator_reg_init; i++) {
763		int id;
764		u8 value;
765
766		id = pdata->regulator_reg_init[i].id;
767		value = pdata->regulator_reg_init[i].value;
768
769		/* check for configuration errors */
770		if (id >= AB8500_NUM_REGULATOR_REGISTERS) {
771			dev_err(&pdev->dev,
772				"Configuration error: id outside range.\n");
773			return -EINVAL;
774		}
775		if (value & ~ab8500_reg_init[id].mask) {
776			dev_err(&pdev->dev,
777				"Configuration error: value outside mask.\n");
778			return -EINVAL;
779		}
780
781		/* initialize register */
782		err = abx500_mask_and_set_register_interruptible(&pdev->dev,
783			ab8500_reg_init[id].bank,
784			ab8500_reg_init[id].addr,
785			ab8500_reg_init[id].mask,
786			value);
787		if (err < 0) {
788			dev_err(&pdev->dev,
789				"Failed to initialize 0x%02x, 0x%02x.\n",
790				ab8500_reg_init[id].bank,
791				ab8500_reg_init[id].addr);
792			return err;
793		}
794		dev_vdbg(&pdev->dev,
795			"  init: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
796			ab8500_reg_init[id].bank,
797			ab8500_reg_init[id].addr,
798			ab8500_reg_init[id].mask,
799			value);
800	}
801
802	/* register all regulators */
803	for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
804		struct ab8500_regulator_info *info = NULL;
805
806		/* assign per-regulator data */
807		info = &ab8500_regulator_info[i];
808		info->dev = &pdev->dev;
809
810		/* fix for hardware before ab8500v2.0 */
811		if (abx500_get_chip_id(info->dev) < 0x20) {
812			if (info->desc.id == AB8500_LDO_AUX3) {
813				info->desc.n_voltages =
814					ARRAY_SIZE(ldo_vauxn_voltages);
815				info->voltages = ldo_vauxn_voltages;
816				info->voltages_len =
817					ARRAY_SIZE(ldo_vauxn_voltages);
818				info->voltage_mask = 0xf;
819			}
820		}
821
822		/* register regulator with framework */
823		info->regulator = regulator_register(&info->desc, &pdev->dev,
824				&pdata->regulator[i], info);
825		if (IS_ERR(info->regulator)) {
826			err = PTR_ERR(info->regulator);
827			dev_err(&pdev->dev, "failed to register regulator %s\n",
828					info->desc.name);
829			/* when we fail, un-register all earlier regulators */
830			while (--i >= 0) {
831				info = &ab8500_regulator_info[i];
832				regulator_unregister(info->regulator);
833			}
834			return err;
835		}
836
837		dev_vdbg(rdev_get_dev(info->regulator),
838			"%s-probed\n", info->desc.name);
839	}
840
841	return 0;
842}
843
844static __devexit int ab8500_regulator_remove(struct platform_device *pdev)
845{
846	int i;
847
848	for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
849		struct ab8500_regulator_info *info = NULL;
850		info = &ab8500_regulator_info[i];
851
852		dev_vdbg(rdev_get_dev(info->regulator),
853			"%s-remove\n", info->desc.name);
854
855		regulator_unregister(info->regulator);
856	}
857
858	return 0;
859}
860
 
 
 
 
 
861static struct platform_driver ab8500_regulator_driver = {
862	.probe = ab8500_regulator_probe,
863	.remove = __devexit_p(ab8500_regulator_remove),
864	.driver         = {
865		.name   = "ab8500-regulator",
866		.owner  = THIS_MODULE,
 
867	},
868};
869
870static int __init ab8500_regulator_init(void)
871{
872	int ret;
873
874	ret = platform_driver_register(&ab8500_regulator_driver);
875	if (ret != 0)
876		pr_err("Failed to register ab8500 regulator: %d\n", ret);
877
878	return ret;
879}
880subsys_initcall(ab8500_regulator_init);
881
882static void __exit ab8500_regulator_exit(void)
883{
884	platform_driver_unregister(&ab8500_regulator_driver);
885}
886module_exit(ab8500_regulator_exit);
887
888MODULE_LICENSE("GPL v2");
889MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
890MODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
891MODULE_ALIAS("platform:ab8500-regulator");
v3.5.6
  1/*
  2 * Copyright (C) ST-Ericsson SA 2010
  3 *
  4 * License Terms: GNU General Public License v2
  5 *
  6 * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
  7 *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
  8 *
  9 * AB8500 peripheral regulators
 10 *
 11 * AB8500 supports the following regulators:
 12 *   VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
 13 */
 14#include <linux/init.h>
 15#include <linux/kernel.h>
 16#include <linux/module.h>
 17#include <linux/err.h>
 18#include <linux/platform_device.h>
 
 19#include <linux/mfd/abx500.h>
 20#include <linux/mfd/abx500/ab8500.h>
 21#include <linux/of.h>
 22#include <linux/regulator/of_regulator.h>
 23#include <linux/regulator/driver.h>
 24#include <linux/regulator/machine.h>
 25#include <linux/regulator/ab8500.h>
 26#include <linux/slab.h>
 27
 28/**
 29 * struct ab8500_regulator_info - ab8500 regulator information
 30 * @dev: device pointer
 31 * @desc: regulator description
 32 * @regulator_dev: regulator device
 33 * @max_uV: maximum voltage (for variable voltage supplies)
 34 * @min_uV: minimum voltage (for variable voltage supplies)
 35 * @fixed_uV: typical voltage (for fixed voltage supplies)
 36 * @update_bank: bank to control on/off
 37 * @update_reg: register to control on/off
 38 * @update_mask: mask to enable/disable regulator
 39 * @update_val_enable: bits to enable the regulator in normal (high power) mode
 40 * @voltage_bank: bank to control regulator voltage
 41 * @voltage_reg: register to control regulator voltage
 42 * @voltage_mask: mask to control regulator voltage
 43 * @voltages: supported voltage table
 44 * @voltages_len: number of supported voltages for the regulator
 45 * @delay: startup/set voltage delay in us
 46 */
 47struct ab8500_regulator_info {
 48	struct device		*dev;
 49	struct regulator_desc	desc;
 50	struct regulator_dev	*regulator;
 51	int max_uV;
 52	int min_uV;
 53	int fixed_uV;
 54	u8 update_bank;
 55	u8 update_reg;
 56	u8 update_mask;
 57	u8 update_val_enable;
 58	u8 voltage_bank;
 59	u8 voltage_reg;
 60	u8 voltage_mask;
 61	int const *voltages;
 62	int voltages_len;
 63	unsigned int delay;
 64};
 65
 66/* voltage tables for the vauxn/vintcore supplies */
 67static const int ldo_vauxn_voltages[] = {
 68	1100000,
 69	1200000,
 70	1300000,
 71	1400000,
 72	1500000,
 73	1800000,
 74	1850000,
 75	1900000,
 76	2500000,
 77	2650000,
 78	2700000,
 79	2750000,
 80	2800000,
 81	2900000,
 82	3000000,
 83	3300000,
 84};
 85
 86static const int ldo_vaux3_voltages[] = {
 87	1200000,
 88	1500000,
 89	1800000,
 90	2100000,
 91	2500000,
 92	2750000,
 93	2790000,
 94	2910000,
 95};
 96
 97static const int ldo_vintcore_voltages[] = {
 98	1200000,
 99	1225000,
100	1250000,
101	1275000,
102	1300000,
103	1325000,
104	1350000,
105};
106
107static int ab8500_regulator_enable(struct regulator_dev *rdev)
108{
109	int ret;
110	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
111
112	if (info == NULL) {
113		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
114		return -EINVAL;
115	}
116
117	ret = abx500_mask_and_set_register_interruptible(info->dev,
118		info->update_bank, info->update_reg,
119		info->update_mask, info->update_val_enable);
120	if (ret < 0)
121		dev_err(rdev_get_dev(rdev),
122			"couldn't set enable bits for regulator\n");
123
124	dev_vdbg(rdev_get_dev(rdev),
125		"%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
126		info->desc.name, info->update_bank, info->update_reg,
127		info->update_mask, info->update_val_enable);
128
129	return ret;
130}
131
132static int ab8500_regulator_disable(struct regulator_dev *rdev)
133{
134	int ret;
135	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
136
137	if (info == NULL) {
138		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
139		return -EINVAL;
140	}
141
142	ret = abx500_mask_and_set_register_interruptible(info->dev,
143		info->update_bank, info->update_reg,
144		info->update_mask, 0x0);
145	if (ret < 0)
146		dev_err(rdev_get_dev(rdev),
147			"couldn't set disable bits for regulator\n");
148
149	dev_vdbg(rdev_get_dev(rdev),
150		"%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
151		info->desc.name, info->update_bank, info->update_reg,
152		info->update_mask, 0x0);
153
154	return ret;
155}
156
157static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
158{
159	int ret;
160	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
161	u8 regval;
162
163	if (info == NULL) {
164		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
165		return -EINVAL;
166	}
167
168	ret = abx500_get_register_interruptible(info->dev,
169		info->update_bank, info->update_reg, &regval);
170	if (ret < 0) {
171		dev_err(rdev_get_dev(rdev),
172			"couldn't read 0x%x register\n", info->update_reg);
173		return ret;
174	}
175
176	dev_vdbg(rdev_get_dev(rdev),
177		"%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
178		" 0x%x\n",
179		info->desc.name, info->update_bank, info->update_reg,
180		info->update_mask, regval);
181
182	if (regval & info->update_mask)
183		return true;
184	else
185		return false;
186}
187
188static int ab8500_list_voltage(struct regulator_dev *rdev, unsigned selector)
189{
190	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
191
192	if (info == NULL) {
193		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
194		return -EINVAL;
195	}
196
197	/* return the uV for the fixed regulators */
198	if (info->fixed_uV)
199		return info->fixed_uV;
200
201	if (selector >= info->voltages_len)
202		return -EINVAL;
203
204	return info->voltages[selector];
205}
206
207static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
208{
209	int ret, val;
210	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
211	u8 regval;
212
213	if (info == NULL) {
214		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
215		return -EINVAL;
216	}
217
218	ret = abx500_get_register_interruptible(info->dev,
219			info->voltage_bank, info->voltage_reg, &regval);
220	if (ret < 0) {
221		dev_err(rdev_get_dev(rdev),
222			"couldn't read voltage reg for regulator\n");
223		return ret;
224	}
225
226	dev_vdbg(rdev_get_dev(rdev),
227		"%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
228		" 0x%x\n",
229		info->desc.name, info->voltage_bank, info->voltage_reg,
230		info->voltage_mask, regval);
231
232	/* vintcore has a different layout */
233	val = regval & info->voltage_mask;
234	if (info->desc.id == AB8500_LDO_INTCORE)
235		return val >> 0x3;
236	else
237		return val;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238}
239
240static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
241					    unsigned selector)
 
242{
243	int ret;
244	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
245	u8 regval;
246
247	if (info == NULL) {
248		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
249		return -EINVAL;
250	}
251
 
 
 
 
 
 
 
 
 
 
252	/* set the registers for the request */
253	regval = (u8)selector;
254	ret = abx500_mask_and_set_register_interruptible(info->dev,
255			info->voltage_bank, info->voltage_reg,
256			info->voltage_mask, regval);
257	if (ret < 0)
258		dev_err(rdev_get_dev(rdev),
259		"couldn't set voltage reg for regulator\n");
260
261	dev_vdbg(rdev_get_dev(rdev),
262		"%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
263		" 0x%x\n",
264		info->desc.name, info->voltage_bank, info->voltage_reg,
265		info->voltage_mask, regval);
266
267	return ret;
268}
269
270static int ab8500_regulator_enable_time(struct regulator_dev *rdev)
271{
272	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
273
274	return info->delay;
275}
276
277static int ab8500_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
278					     unsigned int old_sel,
279					     unsigned int new_sel)
280{
281	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
282	int ret;
283
284	/* If the regulator isn't on, it won't take time here */
285	ret = ab8500_regulator_is_enabled(rdev);
286	if (ret < 0)
287		return ret;
288	if (!ret)
289		return 0;
290	return info->delay;
291}
292
293static struct regulator_ops ab8500_regulator_ops = {
294	.enable		= ab8500_regulator_enable,
295	.disable	= ab8500_regulator_disable,
296	.is_enabled	= ab8500_regulator_is_enabled,
297	.get_voltage_sel = ab8500_regulator_get_voltage_sel,
298	.set_voltage_sel = ab8500_regulator_set_voltage_sel,
299	.list_voltage	= ab8500_list_voltage,
300	.enable_time	= ab8500_regulator_enable_time,
301	.set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
302};
303
304static int ab8500_fixed_get_voltage(struct regulator_dev *rdev)
305{
306	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
307
308	if (info == NULL) {
309		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
310		return -EINVAL;
311	}
312
313	return info->fixed_uV;
314}
315
316static struct regulator_ops ab8500_regulator_fixed_ops = {
317	.enable		= ab8500_regulator_enable,
318	.disable	= ab8500_regulator_disable,
319	.is_enabled	= ab8500_regulator_is_enabled,
320	.get_voltage	= ab8500_fixed_get_voltage,
321	.list_voltage	= ab8500_list_voltage,
322	.enable_time	= ab8500_regulator_enable_time,
323	.set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
324};
325
326static struct ab8500_regulator_info
327		ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
328	/*
329	 * Variable Voltage Regulators
330	 *   name, min mV, max mV,
331	 *   update bank, reg, mask, enable val
332	 *   volt bank, reg, mask, table, table length
333	 */
334	[AB8500_LDO_AUX1] = {
335		.desc = {
336			.name		= "LDO-AUX1",
337			.ops		= &ab8500_regulator_ops,
338			.type		= REGULATOR_VOLTAGE,
339			.id		= AB8500_LDO_AUX1,
340			.owner		= THIS_MODULE,
341			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
342		},
343		.min_uV			= 1100000,
344		.max_uV			= 3300000,
345		.update_bank		= 0x04,
346		.update_reg		= 0x09,
347		.update_mask		= 0x03,
348		.update_val_enable	= 0x01,
349		.voltage_bank		= 0x04,
350		.voltage_reg		= 0x1f,
351		.voltage_mask		= 0x0f,
352		.voltages		= ldo_vauxn_voltages,
353		.voltages_len		= ARRAY_SIZE(ldo_vauxn_voltages),
354	},
355	[AB8500_LDO_AUX2] = {
356		.desc = {
357			.name		= "LDO-AUX2",
358			.ops		= &ab8500_regulator_ops,
359			.type		= REGULATOR_VOLTAGE,
360			.id		= AB8500_LDO_AUX2,
361			.owner		= THIS_MODULE,
362			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
363		},
364		.min_uV			= 1100000,
365		.max_uV			= 3300000,
366		.update_bank		= 0x04,
367		.update_reg		= 0x09,
368		.update_mask		= 0x0c,
369		.update_val_enable	= 0x04,
370		.voltage_bank		= 0x04,
371		.voltage_reg		= 0x20,
372		.voltage_mask		= 0x0f,
373		.voltages		= ldo_vauxn_voltages,
374		.voltages_len		= ARRAY_SIZE(ldo_vauxn_voltages),
375	},
376	[AB8500_LDO_AUX3] = {
377		.desc = {
378			.name		= "LDO-AUX3",
379			.ops		= &ab8500_regulator_ops,
380			.type		= REGULATOR_VOLTAGE,
381			.id		= AB8500_LDO_AUX3,
382			.owner		= THIS_MODULE,
383			.n_voltages	= ARRAY_SIZE(ldo_vaux3_voltages),
384		},
385		.min_uV			= 1100000,
386		.max_uV			= 3300000,
387		.update_bank		= 0x04,
388		.update_reg		= 0x0a,
389		.update_mask		= 0x03,
390		.update_val_enable	= 0x01,
391		.voltage_bank		= 0x04,
392		.voltage_reg		= 0x21,
393		.voltage_mask		= 0x07,
394		.voltages		= ldo_vaux3_voltages,
395		.voltages_len		= ARRAY_SIZE(ldo_vaux3_voltages),
396	},
397	[AB8500_LDO_INTCORE] = {
398		.desc = {
399			.name		= "LDO-INTCORE",
400			.ops		= &ab8500_regulator_ops,
401			.type		= REGULATOR_VOLTAGE,
402			.id		= AB8500_LDO_INTCORE,
403			.owner		= THIS_MODULE,
404			.n_voltages	= ARRAY_SIZE(ldo_vintcore_voltages),
405		},
406		.min_uV			= 1100000,
407		.max_uV			= 3300000,
408		.update_bank		= 0x03,
409		.update_reg		= 0x80,
410		.update_mask		= 0x44,
411		.update_val_enable	= 0x04,
412		.voltage_bank		= 0x03,
413		.voltage_reg		= 0x80,
414		.voltage_mask		= 0x38,
415		.voltages		= ldo_vintcore_voltages,
416		.voltages_len		= ARRAY_SIZE(ldo_vintcore_voltages),
417	},
418
419	/*
420	 * Fixed Voltage Regulators
421	 *   name, fixed mV,
422	 *   update bank, reg, mask, enable val
423	 */
424	[AB8500_LDO_TVOUT] = {
425		.desc = {
426			.name		= "LDO-TVOUT",
427			.ops		= &ab8500_regulator_fixed_ops,
428			.type		= REGULATOR_VOLTAGE,
429			.id		= AB8500_LDO_TVOUT,
430			.owner		= THIS_MODULE,
431			.n_voltages	= 1,
432		},
433		.delay			= 10000,
434		.fixed_uV		= 2000000,
435		.update_bank		= 0x03,
436		.update_reg		= 0x80,
437		.update_mask		= 0x82,
438		.update_val_enable	= 0x02,
439	},
440	[AB8500_LDO_USB] = {
441		.desc = {
442			.name           = "LDO-USB",
443			.ops            = &ab8500_regulator_fixed_ops,
444			.type           = REGULATOR_VOLTAGE,
445			.id             = AB8500_LDO_USB,
446			.owner          = THIS_MODULE,
447			.n_voltages     = 1,
448		},
449		.fixed_uV               = 3300000,
450		.update_bank            = 0x03,
451		.update_reg             = 0x82,
452		.update_mask            = 0x03,
453		.update_val_enable      = 0x01,
454	},
455	[AB8500_LDO_AUDIO] = {
456		.desc = {
457			.name		= "LDO-AUDIO",
458			.ops		= &ab8500_regulator_fixed_ops,
459			.type		= REGULATOR_VOLTAGE,
460			.id		= AB8500_LDO_AUDIO,
461			.owner		= THIS_MODULE,
462			.n_voltages	= 1,
463		},
464		.fixed_uV		= 2000000,
465		.update_bank		= 0x03,
466		.update_reg		= 0x83,
467		.update_mask		= 0x02,
468		.update_val_enable	= 0x02,
469	},
470	[AB8500_LDO_ANAMIC1] = {
471		.desc = {
472			.name		= "LDO-ANAMIC1",
473			.ops		= &ab8500_regulator_fixed_ops,
474			.type		= REGULATOR_VOLTAGE,
475			.id		= AB8500_LDO_ANAMIC1,
476			.owner		= THIS_MODULE,
477			.n_voltages	= 1,
478		},
479		.fixed_uV		= 2050000,
480		.update_bank		= 0x03,
481		.update_reg		= 0x83,
482		.update_mask		= 0x08,
483		.update_val_enable	= 0x08,
484	},
485	[AB8500_LDO_ANAMIC2] = {
486		.desc = {
487			.name		= "LDO-ANAMIC2",
488			.ops		= &ab8500_regulator_fixed_ops,
489			.type		= REGULATOR_VOLTAGE,
490			.id		= AB8500_LDO_ANAMIC2,
491			.owner		= THIS_MODULE,
492			.n_voltages	= 1,
493		},
494		.fixed_uV		= 2050000,
495		.update_bank		= 0x03,
496		.update_reg		= 0x83,
497		.update_mask		= 0x10,
498		.update_val_enable	= 0x10,
499	},
500	[AB8500_LDO_DMIC] = {
501		.desc = {
502			.name		= "LDO-DMIC",
503			.ops		= &ab8500_regulator_fixed_ops,
504			.type		= REGULATOR_VOLTAGE,
505			.id		= AB8500_LDO_DMIC,
506			.owner		= THIS_MODULE,
507			.n_voltages	= 1,
508		},
509		.fixed_uV		= 1800000,
510		.update_bank		= 0x03,
511		.update_reg		= 0x83,
512		.update_mask		= 0x04,
513		.update_val_enable	= 0x04,
514	},
515	[AB8500_LDO_ANA] = {
516		.desc = {
517			.name		= "LDO-ANA",
518			.ops		= &ab8500_regulator_fixed_ops,
519			.type		= REGULATOR_VOLTAGE,
520			.id		= AB8500_LDO_ANA,
521			.owner		= THIS_MODULE,
522			.n_voltages	= 1,
523		},
524		.fixed_uV		= 1200000,
525		.update_bank		= 0x04,
526		.update_reg		= 0x06,
527		.update_mask		= 0x0c,
528		.update_val_enable	= 0x04,
529	},
530
531
532};
533
534struct ab8500_reg_init {
535	u8 bank;
536	u8 addr;
537	u8 mask;
538};
539
540#define REG_INIT(_id, _bank, _addr, _mask)	\
541	[_id] = {				\
542		.bank = _bank,			\
543		.addr = _addr,			\
544		.mask = _mask,			\
545	}
546
547static struct ab8500_reg_init ab8500_reg_init[] = {
548	/*
549	 * 0x30, VanaRequestCtrl
550	 * 0x0C, VpllRequestCtrl
551	 * 0xc0, VextSupply1RequestCtrl
552	 */
553	REG_INIT(AB8500_REGUREQUESTCTRL2,	0x03, 0x04, 0xfc),
554	/*
555	 * 0x03, VextSupply2RequestCtrl
556	 * 0x0c, VextSupply3RequestCtrl
557	 * 0x30, Vaux1RequestCtrl
558	 * 0xc0, Vaux2RequestCtrl
559	 */
560	REG_INIT(AB8500_REGUREQUESTCTRL3,	0x03, 0x05, 0xff),
561	/*
562	 * 0x03, Vaux3RequestCtrl
563	 * 0x04, SwHPReq
564	 */
565	REG_INIT(AB8500_REGUREQUESTCTRL4,	0x03, 0x06, 0x07),
566	/*
567	 * 0x08, VanaSysClkReq1HPValid
568	 * 0x20, Vaux1SysClkReq1HPValid
569	 * 0x40, Vaux2SysClkReq1HPValid
570	 * 0x80, Vaux3SysClkReq1HPValid
571	 */
572	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1,	0x03, 0x07, 0xe8),
573	/*
574	 * 0x10, VextSupply1SysClkReq1HPValid
575	 * 0x20, VextSupply2SysClkReq1HPValid
576	 * 0x40, VextSupply3SysClkReq1HPValid
577	 */
578	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2,	0x03, 0x08, 0x70),
579	/*
580	 * 0x08, VanaHwHPReq1Valid
581	 * 0x20, Vaux1HwHPReq1Valid
582	 * 0x40, Vaux2HwHPReq1Valid
583	 * 0x80, Vaux3HwHPReq1Valid
584	 */
585	REG_INIT(AB8500_REGUHWHPREQ1VALID1,	0x03, 0x09, 0xe8),
586	/*
587	 * 0x01, VextSupply1HwHPReq1Valid
588	 * 0x02, VextSupply2HwHPReq1Valid
589	 * 0x04, VextSupply3HwHPReq1Valid
590	 */
591	REG_INIT(AB8500_REGUHWHPREQ1VALID2,	0x03, 0x0a, 0x07),
592	/*
593	 * 0x08, VanaHwHPReq2Valid
594	 * 0x20, Vaux1HwHPReq2Valid
595	 * 0x40, Vaux2HwHPReq2Valid
596	 * 0x80, Vaux3HwHPReq2Valid
597	 */
598	REG_INIT(AB8500_REGUHWHPREQ2VALID1,	0x03, 0x0b, 0xe8),
599	/*
600	 * 0x01, VextSupply1HwHPReq2Valid
601	 * 0x02, VextSupply2HwHPReq2Valid
602	 * 0x04, VextSupply3HwHPReq2Valid
603	 */
604	REG_INIT(AB8500_REGUHWHPREQ2VALID2,	0x03, 0x0c, 0x07),
605	/*
606	 * 0x20, VanaSwHPReqValid
607	 * 0x80, Vaux1SwHPReqValid
608	 */
609	REG_INIT(AB8500_REGUSWHPREQVALID1,	0x03, 0x0d, 0xa0),
610	/*
611	 * 0x01, Vaux2SwHPReqValid
612	 * 0x02, Vaux3SwHPReqValid
613	 * 0x04, VextSupply1SwHPReqValid
614	 * 0x08, VextSupply2SwHPReqValid
615	 * 0x10, VextSupply3SwHPReqValid
616	 */
617	REG_INIT(AB8500_REGUSWHPREQVALID2,	0x03, 0x0e, 0x1f),
618	/*
619	 * 0x02, SysClkReq2Valid1
620	 * ...
621	 * 0x80, SysClkReq8Valid1
622	 */
623	REG_INIT(AB8500_REGUSYSCLKREQVALID1,	0x03, 0x0f, 0xfe),
624	/*
625	 * 0x02, SysClkReq2Valid2
626	 * ...
627	 * 0x80, SysClkReq8Valid2
628	 */
629	REG_INIT(AB8500_REGUSYSCLKREQVALID2,	0x03, 0x10, 0xfe),
630	/*
631	 * 0x02, VTVoutEna
632	 * 0x04, Vintcore12Ena
633	 * 0x38, Vintcore12Sel
634	 * 0x40, Vintcore12LP
635	 * 0x80, VTVoutLP
636	 */
637	REG_INIT(AB8500_REGUMISC1,		0x03, 0x80, 0xfe),
638	/*
639	 * 0x02, VaudioEna
640	 * 0x04, VdmicEna
641	 * 0x08, Vamic1Ena
642	 * 0x10, Vamic2Ena
643	 */
644	REG_INIT(AB8500_VAUDIOSUPPLY,		0x03, 0x83, 0x1e),
645	/*
646	 * 0x01, Vamic1_dzout
647	 * 0x02, Vamic2_dzout
648	 */
649	REG_INIT(AB8500_REGUCTRL1VAMIC,		0x03, 0x84, 0x03),
650	/*
651	 * 0x0c, VanaRegu
652	 * 0x03, VpllRegu
653	 */
654	REG_INIT(AB8500_VPLLVANAREGU,		0x04, 0x06, 0x0f),
655	/*
656	 * 0x01, VrefDDREna
657	 * 0x02, VrefDDRSleepMode
658	 */
659	REG_INIT(AB8500_VREFDDR,		0x04, 0x07, 0x03),
660	/*
661	 * 0x03, VextSupply1Regu
662	 * 0x0c, VextSupply2Regu
663	 * 0x30, VextSupply3Regu
664	 * 0x40, ExtSupply2Bypass
665	 * 0x80, ExtSupply3Bypass
666	 */
667	REG_INIT(AB8500_EXTSUPPLYREGU,		0x04, 0x08, 0xff),
668	/*
669	 * 0x03, Vaux1Regu
670	 * 0x0c, Vaux2Regu
671	 */
672	REG_INIT(AB8500_VAUX12REGU,		0x04, 0x09, 0x0f),
673	/*
674	 * 0x03, Vaux3Regu
675	 */
676	REG_INIT(AB8500_VRF1VAUX3REGU,		0x04, 0x0a, 0x03),
677	/*
678	 * 0x3f, Vsmps1Sel1
679	 */
680	REG_INIT(AB8500_VSMPS1SEL1,		0x04, 0x13, 0x3f),
681	/*
682	 * 0x0f, Vaux1Sel
683	 */
684	REG_INIT(AB8500_VAUX1SEL,		0x04, 0x1f, 0x0f),
685	/*
686	 * 0x0f, Vaux2Sel
687	 */
688	REG_INIT(AB8500_VAUX2SEL,		0x04, 0x20, 0x0f),
689	/*
690	 * 0x07, Vaux3Sel
691	 */
692	REG_INIT(AB8500_VRF1VAUX3SEL,		0x04, 0x21, 0x07),
693	/*
694	 * 0x01, VextSupply12LP
695	 */
696	REG_INIT(AB8500_REGUCTRL2SPARE,		0x04, 0x22, 0x01),
697	/*
698	 * 0x04, Vaux1Disch
699	 * 0x08, Vaux2Disch
700	 * 0x10, Vaux3Disch
701	 * 0x20, Vintcore12Disch
702	 * 0x40, VTVoutDisch
703	 * 0x80, VaudioDisch
704	 */
705	REG_INIT(AB8500_REGUCTRLDISCH,		0x04, 0x43, 0xfc),
706	/*
707	 * 0x02, VanaDisch
708	 * 0x04, VdmicPullDownEna
709	 * 0x10, VdmicDisch
710	 */
711	REG_INIT(AB8500_REGUCTRLDISCH2,		0x04, 0x44, 0x16),
712};
713
714static __devinit int
715ab8500_regulator_init_registers(struct platform_device *pdev, int id, int value)
716{
717	int err;
718
719	if (value & ~ab8500_reg_init[id].mask) {
720		dev_err(&pdev->dev,
721			"Configuration error: value outside mask.\n");
722		return -EINVAL;
723	}
724
725	err = abx500_mask_and_set_register_interruptible(
726		&pdev->dev,
727		ab8500_reg_init[id].bank,
728		ab8500_reg_init[id].addr,
729		ab8500_reg_init[id].mask,
730		value);
731	if (err < 0) {
732		dev_err(&pdev->dev,
733			"Failed to initialize 0x%02x, 0x%02x.\n",
734			ab8500_reg_init[id].bank,
735			ab8500_reg_init[id].addr);
736		return err;
737	}
738
739	dev_vdbg(&pdev->dev,
740		"init: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
741		ab8500_reg_init[id].bank,
742		ab8500_reg_init[id].addr,
743		ab8500_reg_init[id].mask,
744		value);
745
746	return 0;
747}
748
749static __devinit int ab8500_regulator_register(struct platform_device *pdev,
750					struct regulator_init_data *init_data,
751					int id,
752					struct device_node *np)
753{
754	struct ab8500_regulator_info *info = NULL;
755	struct regulator_config config = { };
756	int err;
757
758	/* assign per-regulator data */
759	info = &ab8500_regulator_info[id];
760	info->dev = &pdev->dev;
761
762	config.dev = &pdev->dev;
763	config.init_data = init_data;
764	config.driver_data = info;
765	config.of_node = np;
766
767	/* fix for hardware before ab8500v2.0 */
768	if (abx500_get_chip_id(info->dev) < 0x20) {
769		if (info->desc.id == AB8500_LDO_AUX3) {
770			info->desc.n_voltages =
771				ARRAY_SIZE(ldo_vauxn_voltages);
772			info->voltages = ldo_vauxn_voltages;
773			info->voltages_len =
774				ARRAY_SIZE(ldo_vauxn_voltages);
775			info->voltage_mask = 0xf;
776		}
777	}
778
779	/* register regulator with framework */
780	info->regulator = regulator_register(&info->desc, &config);
781	if (IS_ERR(info->regulator)) {
782		err = PTR_ERR(info->regulator);
783		dev_err(&pdev->dev, "failed to register regulator %s\n",
784			info->desc.name);
785		/* when we fail, un-register all earlier regulators */
786		while (--id >= 0) {
787			info = &ab8500_regulator_info[id];
788			regulator_unregister(info->regulator);
789		}
790		return err;
791	}
792
793	return 0;
794}
795
796static struct of_regulator_match ab8500_regulator_matches[] = {
797	{ .name	= "ab8500_ldo_aux1",    .driver_data = (void *) AB8500_LDO_AUX1, },
798	{ .name	= "ab8500_ldo_aux2",    .driver_data = (void *) AB8500_LDO_AUX2, },
799	{ .name	= "ab8500_ldo_aux3",    .driver_data = (void *) AB8500_LDO_AUX3, },
800	{ .name	= "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, },
801	{ .name	= "ab8500_ldo_tvout",   .driver_data = (void *) AB8500_LDO_TVOUT, },
802	{ .name = "ab8500_ldo_usb",     .driver_data = (void *) AB8500_LDO_USB, },
803	{ .name = "ab8500_ldo_audio",   .driver_data = (void *) AB8500_LDO_AUDIO, },
804	{ .name	= "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, },
805	{ .name	= "ab8500_ldo_amamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, },
806	{ .name	= "ab8500_ldo_dmic",    .driver_data = (void *) AB8500_LDO_DMIC, },
807	{ .name	= "ab8500_ldo_ana",     .driver_data = (void *) AB8500_LDO_ANA, },
808};
809
810static __devinit int
811ab8500_regulator_of_probe(struct platform_device *pdev, struct device_node *np)
812{
813	int err, i;
814
815	for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
816		err = ab8500_regulator_register(
817			pdev, ab8500_regulator_matches[i].init_data,
818			i, ab8500_regulator_matches[i].of_node);
819		if (err)
820			return err;
821	}
822
823	return 0;
824}
825
826static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
827{
828	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
829	struct ab8500_platform_data *pdata;
830	struct device_node *np = pdev->dev.of_node;
831	int i, err;
832
833	if (np) {
834		err = of_regulator_match(&pdev->dev, np,
835					ab8500_regulator_matches,
836					ARRAY_SIZE(ab8500_regulator_matches));
837		if (err < 0) {
838			dev_err(&pdev->dev,
839				"Error parsing regulator init data: %d\n", err);
840			return err;
841		}
842
843		err = ab8500_regulator_of_probe(pdev, np);
844		return err;
845	}
846
847	if (!ab8500) {
848		dev_err(&pdev->dev, "null mfd parent\n");
849		return -EINVAL;
850	}
851	pdata = dev_get_platdata(ab8500->dev);
852	if (!pdata) {
853		dev_err(&pdev->dev, "null pdata\n");
854		return -EINVAL;
855	}
856
857	/* make sure the platform data has the correct size */
858	if (pdata->num_regulator != ARRAY_SIZE(ab8500_regulator_info)) {
859		dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
860		return -EINVAL;
861	}
862
863	/* initialize registers */
864	for (i = 0; i < pdata->num_regulator_reg_init; i++) {
865		int id, value;
 
866
867		id = pdata->regulator_reg_init[i].id;
868		value = pdata->regulator_reg_init[i].value;
869
870		/* check for configuration errors */
871		if (id >= AB8500_NUM_REGULATOR_REGISTERS) {
872			dev_err(&pdev->dev,
873				"Configuration error: id outside range.\n");
874			return -EINVAL;
875		}
 
 
 
 
 
876
877		err = ab8500_regulator_init_registers(pdev, id, value);
878		if (err < 0)
 
 
 
 
 
 
 
 
 
879			return err;
 
 
 
 
 
 
 
880	}
881
882	/* register all regulators */
883	for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
884		err = ab8500_regulator_register(pdev, &pdata->regulator[i], i, NULL);
885		if (err < 0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
886			return err;
 
 
 
 
887	}
888
889	return 0;
890}
891
892static __devexit int ab8500_regulator_remove(struct platform_device *pdev)
893{
894	int i;
895
896	for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
897		struct ab8500_regulator_info *info = NULL;
898		info = &ab8500_regulator_info[i];
899
900		dev_vdbg(rdev_get_dev(info->regulator),
901			"%s-remove\n", info->desc.name);
902
903		regulator_unregister(info->regulator);
904	}
905
906	return 0;
907}
908
909static const struct of_device_id ab8500_regulator_match[] = {
910        { .compatible = "stericsson,ab8500-regulator", },
911        {}
912};
913
914static struct platform_driver ab8500_regulator_driver = {
915	.probe = ab8500_regulator_probe,
916	.remove = __devexit_p(ab8500_regulator_remove),
917	.driver         = {
918		.name   = "ab8500-regulator",
919		.owner  = THIS_MODULE,
920		.of_match_table = ab8500_regulator_match,
921	},
922};
923
924static int __init ab8500_regulator_init(void)
925{
926	int ret;
927
928	ret = platform_driver_register(&ab8500_regulator_driver);
929	if (ret != 0)
930		pr_err("Failed to register ab8500 regulator: %d\n", ret);
931
932	return ret;
933}
934subsys_initcall(ab8500_regulator_init);
935
936static void __exit ab8500_regulator_exit(void)
937{
938	platform_driver_unregister(&ab8500_regulator_driver);
939}
940module_exit(ab8500_regulator_exit);
941
942MODULE_LICENSE("GPL v2");
943MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
944MODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
945MODULE_ALIAS("platform:ab8500-regulator");