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 
57 struct tps6586x_regulator {
58 	struct regulator_desc desc;
59 
60 	int enable_bit[2];
61 	int enable_reg[2];
62 
63 	/* for DVM regulators */
64 	int go_reg;
65 	int go_bit;
66 };
67 
68 static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
69 {
70 	return rdev_get_dev(rdev)->parent;
71 }
72 
73 static int tps6586x_set_voltage_sel(struct regulator_dev *rdev,
74 				    unsigned selector)
75 {
76 	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
77 	struct device *parent = to_tps6586x_dev(rdev);
78 	int ret, val, rid = rdev_get_id(rdev);
79 	uint8_t mask;
80 
81 	val = selector << (ffs(rdev->desc->vsel_mask) - 1);
82 	mask = rdev->desc->vsel_mask;
83 
84 	ret = tps6586x_update(parent, rdev->desc->vsel_reg, val, mask);
85 	if (ret)
86 		return ret;
87 
88 	/* Update go bit for DVM regulators */
89 	switch (rid) {
90 	case TPS6586X_ID_LDO_2:
91 	case TPS6586X_ID_LDO_4:
92 	case TPS6586X_ID_SM_0:
93 	case TPS6586X_ID_SM_1:
94 		ret = tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
95 		break;
96 	}
97 	return ret;
98 }
99 
100 static struct regulator_ops tps6586x_regulator_ops = {
101 	.list_voltage = regulator_list_voltage_table,
102 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
103 	.set_voltage_sel = tps6586x_set_voltage_sel,
104 
105 	.is_enabled = regulator_is_enabled_regmap,
106 	.enable = regulator_enable_regmap,
107 	.disable = regulator_disable_regmap,
108 };
109 
110 static struct regulator_ops tps6586x_sys_regulator_ops = {
111 };
112 
113 static const unsigned int tps6586x_ldo0_voltages[] = {
114 	1200000, 1500000, 1800000, 2500000, 2700000, 2850000, 3100000, 3300000,
115 };
116 
117 static const unsigned int tps6586x_ldo4_voltages[] = {
118 	1700000, 1725000, 1750000, 1775000, 1800000, 1825000, 1850000, 1875000,
119 	1900000, 1925000, 1950000, 1975000, 2000000, 2025000, 2050000, 2075000,
120 	2100000, 2125000, 2150000, 2175000, 2200000, 2225000, 2250000, 2275000,
121 	2300000, 2325000, 2350000, 2375000, 2400000, 2425000, 2450000, 2475000,
122 };
123 
124 static const unsigned int tps6586x_ldo_voltages[] = {
125 	1250000, 1500000, 1800000, 2500000, 2700000, 2850000, 3100000, 3300000,
126 };
127 
128 static const unsigned int tps6586x_sm2_voltages[] = {
129 	3000000, 3050000, 3100000, 3150000, 3200000, 3250000, 3300000, 3350000,
130 	3400000, 3450000, 3500000, 3550000, 3600000, 3650000, 3700000, 3750000,
131 	3800000, 3850000, 3900000, 3950000, 4000000, 4050000, 4100000, 4150000,
132 	4200000, 4250000, 4300000, 4350000, 4400000, 4450000, 4500000, 4550000,
133 };
134 
135 static const unsigned int tps6586x_dvm_voltages[] = {
136 	 725000,  750000,  775000,  800000,  825000,  850000,  875000,  900000,
137 	 925000,  950000,  975000, 1000000, 1025000, 1050000, 1075000, 1100000,
138 	1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000,
139 	1325000, 1350000, 1375000, 1400000, 1425000, 1450000, 1475000, 1500000,
140 };
141 
142 #define TPS6586X_REGULATOR(_id, _pin_name, vdata, vreg, shift, nbits,	\
143 			   ereg0, ebit0, ereg1, ebit1)			\
144 	.desc	= {							\
145 		.supply_name = _pin_name,				\
146 		.name	= "REG-" #_id,					\
147 		.ops	= &tps6586x_regulator_ops,			\
148 		.type	= REGULATOR_VOLTAGE,				\
149 		.id	= TPS6586X_ID_##_id,				\
150 		.n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages),	\
151 		.volt_table = tps6586x_##vdata##_voltages,		\
152 		.owner	= THIS_MODULE,					\
153 		.enable_reg = TPS6586X_SUPPLY##ereg0,			\
154 		.enable_mask = 1 << (ebit0),				\
155 		.vsel_reg = TPS6586X_##vreg,				\
156 		.vsel_mask = ((1 << (nbits)) - 1) << (shift),		\
157 	},								\
158 	.enable_reg[0]	= TPS6586X_SUPPLY##ereg0,			\
159 	.enable_bit[0]	= (ebit0),					\
160 	.enable_reg[1]	= TPS6586X_SUPPLY##ereg1,			\
161 	.enable_bit[1]	= (ebit1),
162 
163 #define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
164 	.go_reg = TPS6586X_##goreg,					\
165 	.go_bit = (gobit),
166 
167 #define TPS6586X_LDO(_id, _pname, vdata, vreg, shift, nbits,		\
168 		     ereg0, ebit0, ereg1, ebit1)			\
169 {									\
170 	TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits,	\
171 			   ereg0, ebit0, ereg1, ebit1)			\
172 }
173 
174 #define TPS6586X_DVM(_id, _pname, vdata, vreg, shift, nbits,		\
175 		     ereg0, ebit0, ereg1, ebit1, goreg, gobit)		\
176 {									\
177 	TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits,	\
178 			   ereg0, ebit0, ereg1, ebit1)			\
179 	TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)			\
180 }
181 
182 #define TPS6586X_SYS_REGULATOR()					\
183 {									\
184 	.desc	= {							\
185 		.supply_name = "sys",					\
186 		.name	= "REG-SYS",					\
187 		.ops	= &tps6586x_sys_regulator_ops,			\
188 		.type	= REGULATOR_VOLTAGE,				\
189 		.id	= TPS6586X_ID_SYS,				\
190 		.owner	= THIS_MODULE,					\
191 	},								\
192 }
193 
194 static struct tps6586x_regulator tps6586x_regulator[] = {
195 	TPS6586X_SYS_REGULATOR(),
196 	TPS6586X_LDO(LDO_0, "vinldo01", ldo0, SUPPLYV1, 5, 3, ENC, 0, END, 0),
197 	TPS6586X_LDO(LDO_3, "vinldo23", ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2),
198 	TPS6586X_LDO(LDO_5, "REG-SYS", ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
199 	TPS6586X_LDO(LDO_6, "vinldo678", ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4),
200 	TPS6586X_LDO(LDO_7, "vinldo678", ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5),
201 	TPS6586X_LDO(LDO_8, "vinldo678", ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6),
202 	TPS6586X_LDO(LDO_9, "vinldo9", ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
203 	TPS6586X_LDO(LDO_RTC, "REG-SYS", ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
204 	TPS6586X_LDO(LDO_1, "vinldo01", dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
205 	TPS6586X_LDO(SM_2, "vin-sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
206 
207 	TPS6586X_DVM(LDO_2, "vinldo23", dvm, LDO2BV1, 0, 5, ENA, 3,
208 					ENB, 3, VCC2, 6),
209 	TPS6586X_DVM(LDO_4, "vinldo4", ldo4, LDO4V1, 0, 5, ENC, 3,
210 					END, 3, VCC1, 6),
211 	TPS6586X_DVM(SM_0, "vin-sm0", dvm, SM0V1, 0, 5, ENA, 1,
212 					ENB, 1, VCC1, 2),
213 	TPS6586X_DVM(SM_1, "vin-sm1", dvm, SM1V1, 0, 5, ENA, 0,
214 					ENB, 0, VCC1, 0),
215 };
216 
217 /*
218  * TPS6586X has 2 enable bits that are OR'ed to determine the actual
219  * regulator state. Clearing one of this bits allows switching
220  * regulator on and of with single register write.
221  */
222 static inline int tps6586x_regulator_preinit(struct device *parent,
223 					     struct tps6586x_regulator *ri)
224 {
225 	uint8_t val1, val2;
226 	int ret;
227 
228 	if (ri->enable_reg[0] == ri->enable_reg[1] &&
229 	    ri->enable_bit[0] == ri->enable_bit[1])
230 			return 0;
231 
232 	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
233 	if (ret)
234 		return ret;
235 
236 	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
237 	if (ret)
238 		return ret;
239 
240 	if (!(val2 & (1 << ri->enable_bit[1])))
241 		return 0;
242 
243 	/*
244 	 * The regulator is on, but it's enabled with the bit we don't
245 	 * want to use, so we switch the enable bits
246 	 */
247 	if (!(val1 & (1 << ri->enable_bit[0]))) {
248 		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
249 					1 << ri->enable_bit[0]);
250 		if (ret)
251 			return ret;
252 	}
253 
254 	return tps6586x_clr_bits(parent, ri->enable_reg[1],
255 				 1 << ri->enable_bit[1]);
256 }
257 
258 static int tps6586x_regulator_set_slew_rate(struct platform_device *pdev)
259 {
260 	struct device *parent = pdev->dev.parent;
261 	struct regulator_init_data *p = pdev->dev.platform_data;
262 	struct tps6586x_settings *setting = p->driver_data;
263 	uint8_t reg;
264 
265 	if (setting == NULL)
266 		return 0;
267 
268 	if (!(setting->slew_rate & TPS6586X_SLEW_RATE_SET))
269 		return 0;
270 
271 	/* only SM0 and SM1 can have the slew rate settings */
272 	switch (pdev->id) {
273 	case TPS6586X_ID_SM_0:
274 		reg = TPS6586X_SM0SL;
275 		break;
276 	case TPS6586X_ID_SM_1:
277 		reg = TPS6586X_SM1SL;
278 		break;
279 	default:
280 		dev_warn(&pdev->dev, "Only SM0/SM1 can set slew rate\n");
281 		return -EINVAL;
282 	}
283 
284 	return tps6586x_write(parent, reg,
285 			setting->slew_rate & TPS6586X_SLEW_RATE_MASK);
286 }
287 
288 static inline struct tps6586x_regulator *find_regulator_info(int id)
289 {
290 	struct tps6586x_regulator *ri;
291 	int i;
292 
293 	for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
294 		ri = &tps6586x_regulator[i];
295 		if (ri->desc.id == id)
296 			return ri;
297 	}
298 	return NULL;
299 }
300 
301 static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
302 {
303 	struct tps6586x_regulator *ri = NULL;
304 	struct regulator_config config = { };
305 	struct regulator_dev *rdev;
306 	int id = pdev->id;
307 	int err;
308 
309 	dev_dbg(&pdev->dev, "Probing regulator %d\n", id);
310 
311 	ri = find_regulator_info(id);
312 	if (ri == NULL) {
313 		dev_err(&pdev->dev, "invalid regulator ID specified\n");
314 		return -EINVAL;
315 	}
316 
317 	err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
318 	if (err)
319 		return err;
320 
321 	config.dev = pdev->dev.parent;
322 	config.of_node = pdev->dev.of_node;
323 	config.init_data = pdev->dev.platform_data;
324 	config.driver_data = ri;
325 
326 	rdev = regulator_register(&ri->desc, &config);
327 	if (IS_ERR(rdev)) {
328 		dev_err(&pdev->dev, "failed to register regulator %s\n",
329 				ri->desc.name);
330 		return PTR_ERR(rdev);
331 	}
332 
333 	platform_set_drvdata(pdev, rdev);
334 
335 	return tps6586x_regulator_set_slew_rate(pdev);
336 }
337 
338 static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)
339 {
340 	struct regulator_dev *rdev = platform_get_drvdata(pdev);
341 
342 	regulator_unregister(rdev);
343 	return 0;
344 }
345 
346 static struct platform_driver tps6586x_regulator_driver = {
347 	.driver	= {
348 		.name	= "tps6586x-regulator",
349 		.owner	= THIS_MODULE,
350 	},
351 	.probe		= tps6586x_regulator_probe,
352 	.remove		= __devexit_p(tps6586x_regulator_remove),
353 };
354 
355 static int __init tps6586x_regulator_init(void)
356 {
357 	return platform_driver_register(&tps6586x_regulator_driver);
358 }
359 subsys_initcall(tps6586x_regulator_init);
360 
361 static void __exit tps6586x_regulator_exit(void)
362 {
363 	platform_driver_unregister(&tps6586x_regulator_driver);
364 }
365 module_exit(tps6586x_regulator_exit);
366 
367 MODULE_LICENSE("GPL");
368 MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
369 MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
370 MODULE_ALIAS("platform:tps6586x-regulator");
371