Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Regulator driver for TI TPS6586x
  3 *
  4 * Copyright (C) 2010 Compulab Ltd.
  5 * Author: Mike Rapoport <mike@compulab.co.il>
  6 *
  7 * Based on da903x
  8 * Copyright (C) 2006-2008 Marvell International Ltd.
  9 * Copyright (C) 2008 Compulab Ltd.
 10 *
 11 * This program is free software; you can redistribute it and/or modify
 12 * it under the terms of the GNU General Public License version 2 as
 13 * published by the Free Software Foundation.
 14 */
 15
 16#include <linux/kernel.h>
 
 17#include <linux/init.h>
 18#include <linux/err.h>
 19#include <linux/slab.h>
 20#include <linux/platform_device.h>
 21#include <linux/regulator/driver.h>
 22#include <linux/regulator/machine.h>
 23#include <linux/mfd/tps6586x.h>
 24
 25/* supply control and voltage setting  */
 26#define TPS6586X_SUPPLYENA	0x10
 27#define TPS6586X_SUPPLYENB	0x11
 28#define TPS6586X_SUPPLYENC	0x12
 29#define TPS6586X_SUPPLYEND	0x13
 30#define TPS6586X_SUPPLYENE	0x14
 31#define TPS6586X_VCC1		0x20
 32#define TPS6586X_VCC2		0x21
 33#define TPS6586X_SM1V1		0x23
 34#define TPS6586X_SM1V2		0x24
 35#define TPS6586X_SM1SL		0x25
 36#define TPS6586X_SM0V1		0x26
 37#define TPS6586X_SM0V2		0x27
 38#define TPS6586X_SM0SL		0x28
 39#define TPS6586X_LDO2AV1	0x29
 40#define TPS6586X_LDO2AV2	0x2A
 41#define TPS6586X_LDO2BV1	0x2F
 42#define TPS6586X_LDO2BV2	0x30
 43#define TPS6586X_LDO4V1		0x32
 44#define TPS6586X_LDO4V2		0x33
 45
 46/* converter settings  */
 47#define TPS6586X_SUPPLYV1	0x41
 48#define TPS6586X_SUPPLYV2	0x42
 49#define TPS6586X_SUPPLYV3	0x43
 50#define TPS6586X_SUPPLYV4	0x44
 51#define TPS6586X_SUPPLYV5	0x45
 52#define TPS6586X_SUPPLYV6	0x46
 53#define TPS6586X_SMODE1		0x47
 54#define TPS6586X_SMODE2		0x48
 55
 56struct tps6586x_regulator {
 57	struct regulator_desc desc;
 58
 59	int volt_reg;
 60	int volt_shift;
 61	int volt_nbits;
 62	int enable_bit[2];
 63	int enable_reg[2];
 64
 65	int *voltages;
 66
 67	/* for DVM regulators */
 68	int go_reg;
 69	int go_bit;
 70};
 71
 72static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
 73{
 74	return rdev_get_dev(rdev)->parent->parent;
 75}
 76
 77static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,
 78				     unsigned selector)
 79{
 80	struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
 
 
 
 
 
 81
 82	return info->voltages[selector] * 1000;
 83}
 84
 85
 86static int __tps6586x_ldo_set_voltage(struct device *parent,
 87				      struct tps6586x_regulator *ri,
 88				      int min_uV, int max_uV,
 89				      unsigned *selector)
 90{
 91	int val, uV;
 
 
 92	uint8_t mask;
 93
 94	for (val = 0; val < ri->desc.n_voltages; val++) {
 95		uV = ri->voltages[val] * 1000;
 96
 97		/* LDO0 has minimal voltage 1.2 rather than 1.25 */
 98		if (ri->desc.id == TPS6586X_ID_LDO_0 && val == 0)
 99			uV -= 50 * 1000;
100
101		/* use the first in-range value */
102		if (min_uV <= uV && uV <= max_uV) {
103
104			*selector = val;
105
106			val <<= ri->volt_shift;
107			mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
 
108
109			return tps6586x_update(parent, ri->volt_reg, val, mask);
110		}
 
 
 
 
 
 
111	}
112
113	return -EINVAL;
114}
115
116static int tps6586x_ldo_set_voltage(struct regulator_dev *rdev,
117				    int min_uV, int max_uV, unsigned *selector)
118{
119	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
120	struct device *parent = to_tps6586x_dev(rdev);
121
122	return __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
123					  selector);
124}
125
126static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev)
127{
128	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
129	struct device *parent = to_tps6586x_dev(rdev);
130	uint8_t val, mask;
131	int ret;
132
133	ret = tps6586x_read(parent, ri->volt_reg, &val);
134	if (ret)
135		return ret;
136
137	mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
138	val = (val & mask) >> ri->volt_shift;
139
140	if (val >= ri->desc.n_voltages)
141		BUG();
142
143	return ri->voltages[val] * 1000;
144}
145
146static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
147				    int min_uV, int max_uV, unsigned *selector)
148{
149	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
150	struct device *parent = to_tps6586x_dev(rdev);
151	int ret;
152
153	ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
154					 selector);
155	if (ret)
156		return ret;
157
158	return tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
159}
160
161static int tps6586x_regulator_enable(struct regulator_dev *rdev)
162{
163	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
164	struct device *parent = to_tps6586x_dev(rdev);
165
166	return tps6586x_set_bits(parent, ri->enable_reg[0],
167				 1 << ri->enable_bit[0]);
168}
169
170static int tps6586x_regulator_disable(struct regulator_dev *rdev)
171{
172	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
173	struct device *parent = to_tps6586x_dev(rdev);
174
175	return tps6586x_clr_bits(parent, ri->enable_reg[0],
176				 1 << ri->enable_bit[0]);
177}
178
179static int tps6586x_regulator_is_enabled(struct regulator_dev *rdev)
180{
181	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
182	struct device *parent = to_tps6586x_dev(rdev);
183	uint8_t reg_val;
184	int ret;
185
186	ret = tps6586x_read(parent, ri->enable_reg[0], &reg_val);
187	if (ret)
188		return ret;
189
190	return !!(reg_val & (1 << ri->enable_bit[0]));
191}
192
193static struct regulator_ops tps6586x_regulator_ldo_ops = {
194	.list_voltage = tps6586x_ldo_list_voltage,
195	.get_voltage = tps6586x_ldo_get_voltage,
196	.set_voltage = tps6586x_ldo_set_voltage,
197
198	.is_enabled = tps6586x_regulator_is_enabled,
199	.enable = tps6586x_regulator_enable,
200	.disable = tps6586x_regulator_disable,
201};
202
203static struct regulator_ops tps6586x_regulator_dvm_ops = {
204	.list_voltage = tps6586x_ldo_list_voltage,
205	.get_voltage = tps6586x_ldo_get_voltage,
206	.set_voltage = tps6586x_dvm_set_voltage,
207
208	.is_enabled = tps6586x_regulator_is_enabled,
209	.enable = tps6586x_regulator_enable,
210	.disable = tps6586x_regulator_disable,
211};
212
213static int tps6586x_ldo_voltages[] = {
214	1250, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
215};
216
217static int tps6586x_ldo4_voltages[] = {
218	1700, 1725, 1750, 1775, 1800, 1825, 1850, 1875,
219	1900, 1925, 1950, 1975, 2000, 2025, 2050, 2075,
220	2100, 2125, 2150, 2175, 2200, 2225, 2250, 2275,
221	2300, 2325, 2350, 2375, 2400, 2425, 2450, 2475,
222};
223
224static int tps6586x_sm2_voltages[] = {
225	3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350,
226	3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750,
227	3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150,
228	4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550,
229};
230
231static int tps6586x_dvm_voltages[] = {
232	 725,  750,  775,  800,  825,  850,  875,  900,
233	 925,  950,  975, 1000, 1025, 1050, 1075, 1100,
234	1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300,
235	1325, 1350, 1375, 1400, 1425, 1450, 1475, 1500,
236};
237
238#define TPS6586X_REGULATOR(_id, vdata, _ops, vreg, shift, nbits,	\
239			   ereg0, ebit0, ereg1, ebit1)			\
240	.desc	= {							\
241		.name	= "REG-" #_id,					\
242		.ops	= &tps6586x_regulator_##_ops,			\
243		.type	= REGULATOR_VOLTAGE,				\
244		.id	= TPS6586X_ID_##_id,				\
245		.n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages),	\
246		.owner	= THIS_MODULE,					\
247	},								\
248	.volt_reg	= TPS6586X_##vreg,				\
249	.volt_shift	= (shift),					\
250	.volt_nbits	= (nbits),					\
251	.enable_reg[0]	= TPS6586X_SUPPLY##ereg0,			\
252	.enable_bit[0]	= (ebit0),					\
253	.enable_reg[1]	= TPS6586X_SUPPLY##ereg1,			\
254	.enable_bit[1]	= (ebit1),					\
255	.voltages	= tps6586x_##vdata##_voltages,
256
257#define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
258	.go_reg = TPS6586X_##goreg,					\
259	.go_bit = (gobit),
260
261#define TPS6586X_LDO(_id, vdata, vreg, shift, nbits,			\
262		     ereg0, ebit0, ereg1, ebit1)			\
263{									\
264	TPS6586X_REGULATOR(_id, vdata, ldo_ops, vreg, shift, nbits,	\
265			   ereg0, ebit0, ereg1, ebit1)			\
266}
267
268#define TPS6586X_DVM(_id, vdata, vreg, shift, nbits,			\
269		     ereg0, ebit0, ereg1, ebit1, goreg, gobit)		\
270{									\
271	TPS6586X_REGULATOR(_id, vdata, dvm_ops, vreg, shift, nbits,	\
272			   ereg0, ebit0, ereg1, ebit1)			\
273	TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
274}
275
276static struct tps6586x_regulator tps6586x_regulator[] = {
277	TPS6586X_LDO(LDO_0, ldo, SUPPLYV1, 5, 3, ENC, 0, END, 0),
278	TPS6586X_LDO(LDO_3, ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2),
279	TPS6586X_LDO(LDO_5, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
280	TPS6586X_LDO(LDO_6, ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4),
281	TPS6586X_LDO(LDO_7, ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5),
282	TPS6586X_LDO(LDO_8, ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6),
283	TPS6586X_LDO(LDO_9, ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
284	TPS6586X_LDO(LDO_RTC, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
285	TPS6586X_LDO(LDO_1, dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
286	TPS6586X_LDO(SM_2, sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
287
288	TPS6586X_DVM(LDO_2, dvm, LDO2BV1, 0, 5, ENA, 3, ENB, 3, VCC2, 6),
289	TPS6586X_DVM(LDO_4, ldo4, LDO4V1, 0, 5, ENC, 3, END, 3, VCC1, 6),
290	TPS6586X_DVM(SM_0, dvm, SM0V1, 0, 5, ENA, 1, ENB, 1, VCC1, 2),
291	TPS6586X_DVM(SM_1, dvm, SM1V1, 0, 5, ENA, 0, ENB, 0, VCC1, 0),
292};
293
294/*
295 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
296 * regulator state. Clearing one of this bits allows switching
297 * regulator on and of with single register write.
298 */
299static inline int tps6586x_regulator_preinit(struct device *parent,
300					     struct tps6586x_regulator *ri)
301{
302	uint8_t val1, val2;
303	int ret;
304
305	if (ri->enable_reg[0] == ri->enable_reg[1] &&
306	    ri->enable_bit[0] == ri->enable_bit[1])
307			return 0;
308
309	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
310	if (ret)
311		return ret;
312
313	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
314	if (ret)
315		return ret;
316
317	if (!(val2 & (1 << ri->enable_bit[1])))
318		return 0;
319
320	/*
321	 * The regulator is on, but it's enabled with the bit we don't
322	 * want to use, so we switch the enable bits
323	 */
324	if (!(val1 & (1 << ri->enable_bit[0]))) {
325		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
326					1 << ri->enable_bit[0]);
327		if (ret)
328			return ret;
329	}
330
331	return tps6586x_clr_bits(parent, ri->enable_reg[1],
332				 1 << ri->enable_bit[1]);
333}
334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
335static inline struct tps6586x_regulator *find_regulator_info(int id)
336{
337	struct tps6586x_regulator *ri;
338	int i;
339
340	for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
341		ri = &tps6586x_regulator[i];
342		if (ri->desc.id == id)
343			return ri;
344	}
345	return NULL;
346}
347
348static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
349{
350	struct tps6586x_regulator *ri = NULL;
 
351	struct regulator_dev *rdev;
352	int id = pdev->id;
353	int err;
354
355	dev_dbg(&pdev->dev, "Probing reulator %d\n", id);
356
357	ri = find_regulator_info(id);
358	if (ri == NULL) {
359		dev_err(&pdev->dev, "invalid regulator ID specified\n");
360		return -EINVAL;
361	}
362
363	err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
364	if (err)
365		return err;
366
367	rdev = regulator_register(&ri->desc, &pdev->dev,
368				  pdev->dev.platform_data, ri);
 
 
 
 
369	if (IS_ERR(rdev)) {
370		dev_err(&pdev->dev, "failed to register regulator %s\n",
371				ri->desc.name);
372		return PTR_ERR(rdev);
373	}
374
375	platform_set_drvdata(pdev, rdev);
376
377	return 0;
378}
379
380static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)
381{
382	struct regulator_dev *rdev = platform_get_drvdata(pdev);
383
384	regulator_unregister(rdev);
385	return 0;
386}
387
388static struct platform_driver tps6586x_regulator_driver = {
389	.driver	= {
390		.name	= "tps6586x-regulator",
391		.owner	= THIS_MODULE,
392	},
393	.probe		= tps6586x_regulator_probe,
394	.remove		= __devexit_p(tps6586x_regulator_remove),
395};
396
397static int __init tps6586x_regulator_init(void)
398{
399	return platform_driver_register(&tps6586x_regulator_driver);
400}
401subsys_initcall(tps6586x_regulator_init);
402
403static void __exit tps6586x_regulator_exit(void)
404{
405	platform_driver_unregister(&tps6586x_regulator_driver);
406}
407module_exit(tps6586x_regulator_exit);
408
409MODULE_LICENSE("GPL");
410MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
411MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
412MODULE_ALIAS("platform:tps6586x-regulator");
v3.5.6
  1/*
  2 * Regulator driver for TI TPS6586x
  3 *
  4 * Copyright (C) 2010 Compulab Ltd.
  5 * Author: Mike Rapoport <mike@compulab.co.il>
  6 *
  7 * Based on da903x
  8 * Copyright (C) 2006-2008 Marvell International Ltd.
  9 * Copyright (C) 2008 Compulab Ltd.
 10 *
 11 * This program is free software; you can redistribute it and/or modify
 12 * it under the terms of the GNU General Public License version 2 as
 13 * published by the Free Software Foundation.
 14 */
 15
 16#include <linux/kernel.h>
 17#include <linux/module.h>
 18#include <linux/init.h>
 19#include <linux/err.h>
 20#include <linux/slab.h>
 21#include <linux/platform_device.h>
 22#include <linux/regulator/driver.h>
 23#include <linux/regulator/machine.h>
 24#include <linux/mfd/tps6586x.h>
 25
 26/* supply control and voltage setting  */
 27#define TPS6586X_SUPPLYENA	0x10
 28#define TPS6586X_SUPPLYENB	0x11
 29#define TPS6586X_SUPPLYENC	0x12
 30#define TPS6586X_SUPPLYEND	0x13
 31#define TPS6586X_SUPPLYENE	0x14
 32#define TPS6586X_VCC1		0x20
 33#define TPS6586X_VCC2		0x21
 34#define TPS6586X_SM1V1		0x23
 35#define TPS6586X_SM1V2		0x24
 36#define TPS6586X_SM1SL		0x25
 37#define TPS6586X_SM0V1		0x26
 38#define TPS6586X_SM0V2		0x27
 39#define TPS6586X_SM0SL		0x28
 40#define TPS6586X_LDO2AV1	0x29
 41#define TPS6586X_LDO2AV2	0x2A
 42#define TPS6586X_LDO2BV1	0x2F
 43#define TPS6586X_LDO2BV2	0x30
 44#define TPS6586X_LDO4V1		0x32
 45#define TPS6586X_LDO4V2		0x33
 46
 47/* converter settings  */
 48#define TPS6586X_SUPPLYV1	0x41
 49#define TPS6586X_SUPPLYV2	0x42
 50#define TPS6586X_SUPPLYV3	0x43
 51#define TPS6586X_SUPPLYV4	0x44
 52#define TPS6586X_SUPPLYV5	0x45
 53#define TPS6586X_SUPPLYV6	0x46
 54#define TPS6586X_SMODE1		0x47
 55#define TPS6586X_SMODE2		0x48
 56
 57struct tps6586x_regulator {
 58	struct regulator_desc desc;
 59
 60	int volt_reg;
 61	int volt_shift;
 62	int volt_nbits;
 63	int enable_bit[2];
 64	int enable_reg[2];
 65
 66	int *voltages;
 67
 68	/* for DVM regulators */
 69	int go_reg;
 70	int go_bit;
 71};
 72
 73static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
 74{
 75	return rdev_get_dev(rdev)->parent->parent;
 76}
 77
 78static int tps6586x_list_voltage(struct regulator_dev *rdev, unsigned selector)
 
 79{
 80	struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
 81	int rid = rdev_get_id(rdev);
 82
 83	/* LDO0 has minimal voltage 1.2V rather than 1.25V */
 84	if ((rid == TPS6586X_ID_LDO_0) && (selector == 0))
 85		return (info->voltages[0] - 50) * 1000;
 86
 87	return info->voltages[selector] * 1000;
 88}
 89
 90
 91static int tps6586x_set_voltage_sel(struct regulator_dev *rdev,
 92				    unsigned selector)
 
 
 93{
 94	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
 95	struct device *parent = to_tps6586x_dev(rdev);
 96	int ret, val, rid = rdev_get_id(rdev);
 97	uint8_t mask;
 98
 99	val = selector << ri->volt_shift;
100	mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
 
 
 
 
 
 
 
 
 
101
102	ret = tps6586x_update(parent, ri->volt_reg, val, mask);
103	if (ret)
104		return ret;
105
106	/* Update go bit for DVM regulators */
107	switch (rid) {
108	case TPS6586X_ID_LDO_2:
109	case TPS6586X_ID_LDO_4:
110	case TPS6586X_ID_SM_0:
111	case TPS6586X_ID_SM_1:
112		ret = tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
113		break;
114	}
115	return ret;
 
 
 
 
 
 
 
 
 
 
 
116}
117
118static int tps6586x_get_voltage_sel(struct regulator_dev *rdev)
119{
120	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
121	struct device *parent = to_tps6586x_dev(rdev);
122	uint8_t val, mask;
123	int ret;
124
125	ret = tps6586x_read(parent, ri->volt_reg, &val);
126	if (ret)
127		return ret;
128
129	mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
130	val = (val & mask) >> ri->volt_shift;
131
132	if (val >= ri->desc.n_voltages)
133		BUG();
134
135	return val;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136}
137
138static int tps6586x_regulator_enable(struct regulator_dev *rdev)
139{
140	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
141	struct device *parent = to_tps6586x_dev(rdev);
142
143	return tps6586x_set_bits(parent, ri->enable_reg[0],
144				 1 << ri->enable_bit[0]);
145}
146
147static int tps6586x_regulator_disable(struct regulator_dev *rdev)
148{
149	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
150	struct device *parent = to_tps6586x_dev(rdev);
151
152	return tps6586x_clr_bits(parent, ri->enable_reg[0],
153				 1 << ri->enable_bit[0]);
154}
155
156static int tps6586x_regulator_is_enabled(struct regulator_dev *rdev)
157{
158	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
159	struct device *parent = to_tps6586x_dev(rdev);
160	uint8_t reg_val;
161	int ret;
162
163	ret = tps6586x_read(parent, ri->enable_reg[0], &reg_val);
164	if (ret)
165		return ret;
166
167	return !!(reg_val & (1 << ri->enable_bit[0]));
168}
169
170static struct regulator_ops tps6586x_regulator_ops = {
171	.list_voltage = tps6586x_list_voltage,
172	.get_voltage_sel = tps6586x_get_voltage_sel,
173	.set_voltage_sel = tps6586x_set_voltage_sel,
 
 
 
 
 
 
 
 
 
 
174
175	.is_enabled = tps6586x_regulator_is_enabled,
176	.enable = tps6586x_regulator_enable,
177	.disable = tps6586x_regulator_disable,
178};
179
180static int tps6586x_ldo_voltages[] = {
181	1250, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
182};
183
184static int tps6586x_ldo4_voltages[] = {
185	1700, 1725, 1750, 1775, 1800, 1825, 1850, 1875,
186	1900, 1925, 1950, 1975, 2000, 2025, 2050, 2075,
187	2100, 2125, 2150, 2175, 2200, 2225, 2250, 2275,
188	2300, 2325, 2350, 2375, 2400, 2425, 2450, 2475,
189};
190
191static int tps6586x_sm2_voltages[] = {
192	3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350,
193	3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750,
194	3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150,
195	4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550,
196};
197
198static int tps6586x_dvm_voltages[] = {
199	 725,  750,  775,  800,  825,  850,  875,  900,
200	 925,  950,  975, 1000, 1025, 1050, 1075, 1100,
201	1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300,
202	1325, 1350, 1375, 1400, 1425, 1450, 1475, 1500,
203};
204
205#define TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,		\
206			   ereg0, ebit0, ereg1, ebit1)			\
207	.desc	= {							\
208		.name	= "REG-" #_id,					\
209		.ops	= &tps6586x_regulator_ops,			\
210		.type	= REGULATOR_VOLTAGE,				\
211		.id	= TPS6586X_ID_##_id,				\
212		.n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages),	\
213		.owner	= THIS_MODULE,					\
214	},								\
215	.volt_reg	= TPS6586X_##vreg,				\
216	.volt_shift	= (shift),					\
217	.volt_nbits	= (nbits),					\
218	.enable_reg[0]	= TPS6586X_SUPPLY##ereg0,			\
219	.enable_bit[0]	= (ebit0),					\
220	.enable_reg[1]	= TPS6586X_SUPPLY##ereg1,			\
221	.enable_bit[1]	= (ebit1),					\
222	.voltages	= tps6586x_##vdata##_voltages,
223
224#define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
225	.go_reg = TPS6586X_##goreg,					\
226	.go_bit = (gobit),
227
228#define TPS6586X_LDO(_id, vdata, vreg, shift, nbits,			\
229		     ereg0, ebit0, ereg1, ebit1)			\
230{									\
231	TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,		\
232			   ereg0, ebit0, ereg1, ebit1)			\
233}
234
235#define TPS6586X_DVM(_id, vdata, vreg, shift, nbits,			\
236		     ereg0, ebit0, ereg1, ebit1, goreg, gobit)		\
237{									\
238	TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,		\
239			   ereg0, ebit0, ereg1, ebit1)			\
240	TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
241}
242
243static struct tps6586x_regulator tps6586x_regulator[] = {
244	TPS6586X_LDO(LDO_0, ldo, SUPPLYV1, 5, 3, ENC, 0, END, 0),
245	TPS6586X_LDO(LDO_3, ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2),
246	TPS6586X_LDO(LDO_5, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
247	TPS6586X_LDO(LDO_6, ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4),
248	TPS6586X_LDO(LDO_7, ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5),
249	TPS6586X_LDO(LDO_8, ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6),
250	TPS6586X_LDO(LDO_9, ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
251	TPS6586X_LDO(LDO_RTC, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
252	TPS6586X_LDO(LDO_1, dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
253	TPS6586X_LDO(SM_2, sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
254
255	TPS6586X_DVM(LDO_2, dvm, LDO2BV1, 0, 5, ENA, 3, ENB, 3, VCC2, 6),
256	TPS6586X_DVM(LDO_4, ldo4, LDO4V1, 0, 5, ENC, 3, END, 3, VCC1, 6),
257	TPS6586X_DVM(SM_0, dvm, SM0V1, 0, 5, ENA, 1, ENB, 1, VCC1, 2),
258	TPS6586X_DVM(SM_1, dvm, SM1V1, 0, 5, ENA, 0, ENB, 0, VCC1, 0),
259};
260
261/*
262 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
263 * regulator state. Clearing one of this bits allows switching
264 * regulator on and of with single register write.
265 */
266static inline int tps6586x_regulator_preinit(struct device *parent,
267					     struct tps6586x_regulator *ri)
268{
269	uint8_t val1, val2;
270	int ret;
271
272	if (ri->enable_reg[0] == ri->enable_reg[1] &&
273	    ri->enable_bit[0] == ri->enable_bit[1])
274			return 0;
275
276	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
277	if (ret)
278		return ret;
279
280	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
281	if (ret)
282		return ret;
283
284	if (!(val2 & (1 << ri->enable_bit[1])))
285		return 0;
286
287	/*
288	 * The regulator is on, but it's enabled with the bit we don't
289	 * want to use, so we switch the enable bits
290	 */
291	if (!(val1 & (1 << ri->enable_bit[0]))) {
292		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
293					1 << ri->enable_bit[0]);
294		if (ret)
295			return ret;
296	}
297
298	return tps6586x_clr_bits(parent, ri->enable_reg[1],
299				 1 << ri->enable_bit[1]);
300}
301
302static int tps6586x_regulator_set_slew_rate(struct platform_device *pdev)
303{
304	struct device *parent = pdev->dev.parent;
305	struct regulator_init_data *p = pdev->dev.platform_data;
306	struct tps6586x_settings *setting = p->driver_data;
307	uint8_t reg;
308
309	if (setting == NULL)
310		return 0;
311
312	if (!(setting->slew_rate & TPS6586X_SLEW_RATE_SET))
313		return 0;
314
315	/* only SM0 and SM1 can have the slew rate settings */
316	switch (pdev->id) {
317	case TPS6586X_ID_SM_0:
318		reg = TPS6586X_SM0SL;
319		break;
320	case TPS6586X_ID_SM_1:
321		reg = TPS6586X_SM1SL;
322		break;
323	default:
324		dev_warn(&pdev->dev, "Only SM0/SM1 can set slew rate\n");
325		return -EINVAL;
326	}
327
328	return tps6586x_write(parent, reg,
329			setting->slew_rate & TPS6586X_SLEW_RATE_MASK);
330}
331
332static inline struct tps6586x_regulator *find_regulator_info(int id)
333{
334	struct tps6586x_regulator *ri;
335	int i;
336
337	for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
338		ri = &tps6586x_regulator[i];
339		if (ri->desc.id == id)
340			return ri;
341	}
342	return NULL;
343}
344
345static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
346{
347	struct tps6586x_regulator *ri = NULL;
348	struct regulator_config config = { };
349	struct regulator_dev *rdev;
350	int id = pdev->id;
351	int err;
352
353	dev_dbg(&pdev->dev, "Probing regulator %d\n", id);
354
355	ri = find_regulator_info(id);
356	if (ri == NULL) {
357		dev_err(&pdev->dev, "invalid regulator ID specified\n");
358		return -EINVAL;
359	}
360
361	err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
362	if (err)
363		return err;
364
365	config.dev = &pdev->dev;
366	config.of_node = pdev->dev.of_node;
367	config.init_data = pdev->dev.platform_data;
368	config.driver_data = ri;
369
370	rdev = regulator_register(&ri->desc, &config);
371	if (IS_ERR(rdev)) {
372		dev_err(&pdev->dev, "failed to register regulator %s\n",
373				ri->desc.name);
374		return PTR_ERR(rdev);
375	}
376
377	platform_set_drvdata(pdev, rdev);
378
379	return tps6586x_regulator_set_slew_rate(pdev);
380}
381
382static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)
383{
384	struct regulator_dev *rdev = platform_get_drvdata(pdev);
385
386	regulator_unregister(rdev);
387	return 0;
388}
389
390static struct platform_driver tps6586x_regulator_driver = {
391	.driver	= {
392		.name	= "tps6586x-regulator",
393		.owner	= THIS_MODULE,
394	},
395	.probe		= tps6586x_regulator_probe,
396	.remove		= __devexit_p(tps6586x_regulator_remove),
397};
398
399static int __init tps6586x_regulator_init(void)
400{
401	return platform_driver_register(&tps6586x_regulator_driver);
402}
403subsys_initcall(tps6586x_regulator_init);
404
405static void __exit tps6586x_regulator_exit(void)
406{
407	platform_driver_unregister(&tps6586x_regulator_driver);
408}
409module_exit(tps6586x_regulator_exit);
410
411MODULE_LICENSE("GPL");
412MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
413MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
414MODULE_ALIAS("platform:tps6586x-regulator");