Loading...
1/*
2 * tps6507x-regulator.c
3 *
4 * Regulator driver for TPS65073 PMIC
5 *
6 * Copyright (C) 2009 Texas Instrument Incorporated - http://www.ti.com/
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation version 2.
11 *
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
13 * whether express or implied; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 */
17
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/init.h>
21#include <linux/err.h>
22#include <linux/platform_device.h>
23#include <linux/regulator/driver.h>
24#include <linux/regulator/machine.h>
25#include <linux/regulator/tps6507x.h>
26#include <linux/delay.h>
27#include <linux/slab.h>
28#include <linux/mfd/tps6507x.h>
29
30/* DCDC's */
31#define TPS6507X_DCDC_1 0
32#define TPS6507X_DCDC_2 1
33#define TPS6507X_DCDC_3 2
34/* LDOs */
35#define TPS6507X_LDO_1 3
36#define TPS6507X_LDO_2 4
37
38#define TPS6507X_MAX_REG_ID TPS6507X_LDO_2
39
40/* Number of step-down converters available */
41#define TPS6507X_NUM_DCDC 3
42/* Number of LDO voltage regulators available */
43#define TPS6507X_NUM_LDO 2
44/* Number of total regulators available */
45#define TPS6507X_NUM_REGULATOR (TPS6507X_NUM_DCDC + TPS6507X_NUM_LDO)
46
47/* Supported voltage values for regulators (in milliVolts) */
48static const u16 VDCDCx_VSEL_table[] = {
49 725, 750, 775, 800,
50 825, 850, 875, 900,
51 925, 950, 975, 1000,
52 1025, 1050, 1075, 1100,
53 1125, 1150, 1175, 1200,
54 1225, 1250, 1275, 1300,
55 1325, 1350, 1375, 1400,
56 1425, 1450, 1475, 1500,
57 1550, 1600, 1650, 1700,
58 1750, 1800, 1850, 1900,
59 1950, 2000, 2050, 2100,
60 2150, 2200, 2250, 2300,
61 2350, 2400, 2450, 2500,
62 2550, 2600, 2650, 2700,
63 2750, 2800, 2850, 2900,
64 3000, 3100, 3200, 3300,
65};
66
67static const u16 LDO1_VSEL_table[] = {
68 1000, 1100, 1200, 1250,
69 1300, 1350, 1400, 1500,
70 1600, 1800, 2500, 2750,
71 2800, 3000, 3100, 3300,
72};
73
74static const u16 LDO2_VSEL_table[] = {
75 725, 750, 775, 800,
76 825, 850, 875, 900,
77 925, 950, 975, 1000,
78 1025, 1050, 1075, 1100,
79 1125, 1150, 1175, 1200,
80 1225, 1250, 1275, 1300,
81 1325, 1350, 1375, 1400,
82 1425, 1450, 1475, 1500,
83 1550, 1600, 1650, 1700,
84 1750, 1800, 1850, 1900,
85 1950, 2000, 2050, 2100,
86 2150, 2200, 2250, 2300,
87 2350, 2400, 2450, 2500,
88 2550, 2600, 2650, 2700,
89 2750, 2800, 2850, 2900,
90 3000, 3100, 3200, 3300,
91};
92
93static unsigned int num_voltages[] = {ARRAY_SIZE(VDCDCx_VSEL_table),
94 ARRAY_SIZE(VDCDCx_VSEL_table),
95 ARRAY_SIZE(VDCDCx_VSEL_table),
96 ARRAY_SIZE(LDO1_VSEL_table),
97 ARRAY_SIZE(LDO2_VSEL_table)};
98
99struct tps_info {
100 const char *name;
101 unsigned min_uV;
102 unsigned max_uV;
103 u8 table_len;
104 const u16 *table;
105
106 /* Does DCDC high or the low register defines output voltage? */
107 bool defdcdc_default;
108};
109
110static struct tps_info tps6507x_pmic_regs[] = {
111 {
112 .name = "VDCDC1",
113 .min_uV = 725000,
114 .max_uV = 3300000,
115 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
116 .table = VDCDCx_VSEL_table,
117 },
118 {
119 .name = "VDCDC2",
120 .min_uV = 725000,
121 .max_uV = 3300000,
122 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
123 .table = VDCDCx_VSEL_table,
124 },
125 {
126 .name = "VDCDC3",
127 .min_uV = 725000,
128 .max_uV = 3300000,
129 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
130 .table = VDCDCx_VSEL_table,
131 },
132 {
133 .name = "LDO1",
134 .min_uV = 1000000,
135 .max_uV = 3300000,
136 .table_len = ARRAY_SIZE(LDO1_VSEL_table),
137 .table = LDO1_VSEL_table,
138 },
139 {
140 .name = "LDO2",
141 .min_uV = 725000,
142 .max_uV = 3300000,
143 .table_len = ARRAY_SIZE(LDO2_VSEL_table),
144 .table = LDO2_VSEL_table,
145 },
146};
147
148struct tps6507x_pmic {
149 struct regulator_desc desc[TPS6507X_NUM_REGULATOR];
150 struct tps6507x_dev *mfd;
151 struct regulator_dev *rdev[TPS6507X_NUM_REGULATOR];
152 struct tps_info *info[TPS6507X_NUM_REGULATOR];
153 struct mutex io_lock;
154};
155static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg)
156{
157 u8 val;
158 int err;
159
160 err = tps->mfd->read_dev(tps->mfd, reg, 1, &val);
161
162 if (err)
163 return err;
164
165 return val;
166}
167
168static inline int tps6507x_pmic_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
169{
170 return tps->mfd->write_dev(tps->mfd, reg, 1, &val);
171}
172
173static int tps6507x_pmic_set_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
174{
175 int err, data;
176
177 mutex_lock(&tps->io_lock);
178
179 data = tps6507x_pmic_read(tps, reg);
180 if (data < 0) {
181 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
182 err = data;
183 goto out;
184 }
185
186 data |= mask;
187 err = tps6507x_pmic_write(tps, reg, data);
188 if (err)
189 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
190
191out:
192 mutex_unlock(&tps->io_lock);
193 return err;
194}
195
196static int tps6507x_pmic_clear_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
197{
198 int err, data;
199
200 mutex_lock(&tps->io_lock);
201
202 data = tps6507x_pmic_read(tps, reg);
203 if (data < 0) {
204 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
205 err = data;
206 goto out;
207 }
208
209 data &= ~mask;
210 err = tps6507x_pmic_write(tps, reg, data);
211 if (err)
212 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
213
214out:
215 mutex_unlock(&tps->io_lock);
216 return err;
217}
218
219static int tps6507x_pmic_reg_read(struct tps6507x_pmic *tps, u8 reg)
220{
221 int data;
222
223 mutex_lock(&tps->io_lock);
224
225 data = tps6507x_pmic_read(tps, reg);
226 if (data < 0)
227 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
228
229 mutex_unlock(&tps->io_lock);
230 return data;
231}
232
233static int tps6507x_pmic_reg_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
234{
235 int err;
236
237 mutex_lock(&tps->io_lock);
238
239 err = tps6507x_pmic_write(tps, reg, val);
240 if (err < 0)
241 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
242
243 mutex_unlock(&tps->io_lock);
244 return err;
245}
246
247static int tps6507x_pmic_dcdc_is_enabled(struct regulator_dev *dev)
248{
249 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
250 int data, dcdc = rdev_get_id(dev);
251 u8 shift;
252
253 if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
254 return -EINVAL;
255
256 shift = TPS6507X_MAX_REG_ID - dcdc;
257 data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
258
259 if (data < 0)
260 return data;
261 else
262 return (data & 1<<shift) ? 1 : 0;
263}
264
265static int tps6507x_pmic_ldo_is_enabled(struct regulator_dev *dev)
266{
267 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
268 int data, ldo = rdev_get_id(dev);
269 u8 shift;
270
271 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
272 return -EINVAL;
273
274 shift = TPS6507X_MAX_REG_ID - ldo;
275 data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
276
277 if (data < 0)
278 return data;
279 else
280 return (data & 1<<shift) ? 1 : 0;
281}
282
283static int tps6507x_pmic_dcdc_enable(struct regulator_dev *dev)
284{
285 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
286 int dcdc = rdev_get_id(dev);
287 u8 shift;
288
289 if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
290 return -EINVAL;
291
292 shift = TPS6507X_MAX_REG_ID - dcdc;
293 return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
294}
295
296static int tps6507x_pmic_dcdc_disable(struct regulator_dev *dev)
297{
298 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
299 int dcdc = rdev_get_id(dev);
300 u8 shift;
301
302 if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
303 return -EINVAL;
304
305 shift = TPS6507X_MAX_REG_ID - dcdc;
306 return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
307 1 << shift);
308}
309
310static int tps6507x_pmic_ldo_enable(struct regulator_dev *dev)
311{
312 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
313 int ldo = rdev_get_id(dev);
314 u8 shift;
315
316 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
317 return -EINVAL;
318
319 shift = TPS6507X_MAX_REG_ID - ldo;
320 return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
321}
322
323static int tps6507x_pmic_ldo_disable(struct regulator_dev *dev)
324{
325 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
326 int ldo = rdev_get_id(dev);
327 u8 shift;
328
329 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
330 return -EINVAL;
331
332 shift = TPS6507X_MAX_REG_ID - ldo;
333 return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
334 1 << shift);
335}
336
337static int tps6507x_pmic_dcdc_get_voltage(struct regulator_dev *dev)
338{
339 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
340 int data, dcdc = rdev_get_id(dev);
341 u8 reg;
342
343 switch (dcdc) {
344 case TPS6507X_DCDC_1:
345 reg = TPS6507X_REG_DEFDCDC1;
346 break;
347 case TPS6507X_DCDC_2:
348 if (tps->info[dcdc]->defdcdc_default)
349 reg = TPS6507X_REG_DEFDCDC2_HIGH;
350 else
351 reg = TPS6507X_REG_DEFDCDC2_LOW;
352 break;
353 case TPS6507X_DCDC_3:
354 if (tps->info[dcdc]->defdcdc_default)
355 reg = TPS6507X_REG_DEFDCDC3_HIGH;
356 else
357 reg = TPS6507X_REG_DEFDCDC3_LOW;
358 break;
359 default:
360 return -EINVAL;
361 }
362
363 data = tps6507x_pmic_reg_read(tps, reg);
364 if (data < 0)
365 return data;
366
367 data &= TPS6507X_DEFDCDCX_DCDC_MASK;
368 return tps->info[dcdc]->table[data] * 1000;
369}
370
371static int tps6507x_pmic_dcdc_set_voltage(struct regulator_dev *dev,
372 int min_uV, int max_uV,
373 unsigned *selector)
374{
375 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
376 int data, vsel, dcdc = rdev_get_id(dev);
377 u8 reg;
378
379 switch (dcdc) {
380 case TPS6507X_DCDC_1:
381 reg = TPS6507X_REG_DEFDCDC1;
382 break;
383 case TPS6507X_DCDC_2:
384 if (tps->info[dcdc]->defdcdc_default)
385 reg = TPS6507X_REG_DEFDCDC2_HIGH;
386 else
387 reg = TPS6507X_REG_DEFDCDC2_LOW;
388 break;
389 case TPS6507X_DCDC_3:
390 if (tps->info[dcdc]->defdcdc_default)
391 reg = TPS6507X_REG_DEFDCDC3_HIGH;
392 else
393 reg = TPS6507X_REG_DEFDCDC3_LOW;
394 break;
395 default:
396 return -EINVAL;
397 }
398
399 if (min_uV < tps->info[dcdc]->min_uV
400 || min_uV > tps->info[dcdc]->max_uV)
401 return -EINVAL;
402 if (max_uV < tps->info[dcdc]->min_uV
403 || max_uV > tps->info[dcdc]->max_uV)
404 return -EINVAL;
405
406 for (vsel = 0; vsel < tps->info[dcdc]->table_len; vsel++) {
407 int mV = tps->info[dcdc]->table[vsel];
408 int uV = mV * 1000;
409
410 /* Break at the first in-range value */
411 if (min_uV <= uV && uV <= max_uV)
412 break;
413 }
414
415 /* write to the register in case we found a match */
416 if (vsel == tps->info[dcdc]->table_len)
417 return -EINVAL;
418
419 *selector = vsel;
420
421 data = tps6507x_pmic_reg_read(tps, reg);
422 if (data < 0)
423 return data;
424
425 data &= ~TPS6507X_DEFDCDCX_DCDC_MASK;
426 data |= vsel;
427
428 return tps6507x_pmic_reg_write(tps, reg, data);
429}
430
431static int tps6507x_pmic_ldo_get_voltage(struct regulator_dev *dev)
432{
433 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
434 int data, ldo = rdev_get_id(dev);
435 u8 reg, mask;
436
437 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
438 return -EINVAL;
439 else {
440 reg = (ldo == TPS6507X_LDO_1 ?
441 TPS6507X_REG_LDO_CTRL1 : TPS6507X_REG_DEFLDO2);
442 mask = (ldo == TPS6507X_LDO_1 ?
443 TPS6507X_REG_LDO_CTRL1_LDO1_MASK :
444 TPS6507X_REG_DEFLDO2_LDO2_MASK);
445 }
446
447 data = tps6507x_pmic_reg_read(tps, reg);
448 if (data < 0)
449 return data;
450
451 data &= mask;
452 return tps->info[ldo]->table[data] * 1000;
453}
454
455static int tps6507x_pmic_ldo_set_voltage(struct regulator_dev *dev,
456 int min_uV, int max_uV,
457 unsigned *selector)
458{
459 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
460 int data, vsel, ldo = rdev_get_id(dev);
461 u8 reg, mask;
462
463 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
464 return -EINVAL;
465 else {
466 reg = (ldo == TPS6507X_LDO_1 ?
467 TPS6507X_REG_LDO_CTRL1 : TPS6507X_REG_DEFLDO2);
468 mask = (ldo == TPS6507X_LDO_1 ?
469 TPS6507X_REG_LDO_CTRL1_LDO1_MASK :
470 TPS6507X_REG_DEFLDO2_LDO2_MASK);
471 }
472
473 if (min_uV < tps->info[ldo]->min_uV || min_uV > tps->info[ldo]->max_uV)
474 return -EINVAL;
475 if (max_uV < tps->info[ldo]->min_uV || max_uV > tps->info[ldo]->max_uV)
476 return -EINVAL;
477
478 for (vsel = 0; vsel < tps->info[ldo]->table_len; vsel++) {
479 int mV = tps->info[ldo]->table[vsel];
480 int uV = mV * 1000;
481
482 /* Break at the first in-range value */
483 if (min_uV <= uV && uV <= max_uV)
484 break;
485 }
486
487 if (vsel == tps->info[ldo]->table_len)
488 return -EINVAL;
489
490 *selector = vsel;
491
492 data = tps6507x_pmic_reg_read(tps, reg);
493 if (data < 0)
494 return data;
495
496 data &= ~mask;
497 data |= vsel;
498
499 return tps6507x_pmic_reg_write(tps, reg, data);
500}
501
502static int tps6507x_pmic_dcdc_list_voltage(struct regulator_dev *dev,
503 unsigned selector)
504{
505 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
506 int dcdc = rdev_get_id(dev);
507
508 if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
509 return -EINVAL;
510
511 if (selector >= tps->info[dcdc]->table_len)
512 return -EINVAL;
513 else
514 return tps->info[dcdc]->table[selector] * 1000;
515}
516
517static int tps6507x_pmic_ldo_list_voltage(struct regulator_dev *dev,
518 unsigned selector)
519{
520 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
521 int ldo = rdev_get_id(dev);
522
523 if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
524 return -EINVAL;
525
526 if (selector >= tps->info[ldo]->table_len)
527 return -EINVAL;
528 else
529 return tps->info[ldo]->table[selector] * 1000;
530}
531
532/* Operations permitted on VDCDCx */
533static struct regulator_ops tps6507x_pmic_dcdc_ops = {
534 .is_enabled = tps6507x_pmic_dcdc_is_enabled,
535 .enable = tps6507x_pmic_dcdc_enable,
536 .disable = tps6507x_pmic_dcdc_disable,
537 .get_voltage = tps6507x_pmic_dcdc_get_voltage,
538 .set_voltage = tps6507x_pmic_dcdc_set_voltage,
539 .list_voltage = tps6507x_pmic_dcdc_list_voltage,
540};
541
542/* Operations permitted on LDOx */
543static struct regulator_ops tps6507x_pmic_ldo_ops = {
544 .is_enabled = tps6507x_pmic_ldo_is_enabled,
545 .enable = tps6507x_pmic_ldo_enable,
546 .disable = tps6507x_pmic_ldo_disable,
547 .get_voltage = tps6507x_pmic_ldo_get_voltage,
548 .set_voltage = tps6507x_pmic_ldo_set_voltage,
549 .list_voltage = tps6507x_pmic_ldo_list_voltage,
550};
551
552static __devinit
553int tps6507x_pmic_probe(struct platform_device *pdev)
554{
555 struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent);
556 struct tps_info *info = &tps6507x_pmic_regs[0];
557 struct regulator_init_data *init_data;
558 struct regulator_dev *rdev;
559 struct tps6507x_pmic *tps;
560 struct tps6507x_board *tps_board;
561 int i;
562 int error;
563
564 /**
565 * tps_board points to pmic related constants
566 * coming from the board-evm file.
567 */
568
569 tps_board = dev_get_platdata(tps6507x_dev->dev);
570 if (!tps_board)
571 return -EINVAL;
572
573 /**
574 * init_data points to array of regulator_init structures
575 * coming from the board-evm file.
576 */
577 init_data = tps_board->tps6507x_pmic_init_data;
578 if (!init_data)
579 return -EINVAL;
580
581 tps = kzalloc(sizeof(*tps), GFP_KERNEL);
582 if (!tps)
583 return -ENOMEM;
584
585 mutex_init(&tps->io_lock);
586
587 /* common for all regulators */
588 tps->mfd = tps6507x_dev;
589
590 for (i = 0; i < TPS6507X_NUM_REGULATOR; i++, info++, init_data++) {
591 /* Register the regulators */
592 tps->info[i] = info;
593 if (init_data->driver_data) {
594 struct tps6507x_reg_platform_data *data =
595 init_data->driver_data;
596 tps->info[i]->defdcdc_default = data->defdcdc_default;
597 }
598
599 tps->desc[i].name = info->name;
600 tps->desc[i].id = i;
601 tps->desc[i].n_voltages = num_voltages[i];
602 tps->desc[i].ops = (i > TPS6507X_DCDC_3 ?
603 &tps6507x_pmic_ldo_ops : &tps6507x_pmic_dcdc_ops);
604 tps->desc[i].type = REGULATOR_VOLTAGE;
605 tps->desc[i].owner = THIS_MODULE;
606
607 rdev = regulator_register(&tps->desc[i],
608 tps6507x_dev->dev, init_data, tps);
609 if (IS_ERR(rdev)) {
610 dev_err(tps6507x_dev->dev,
611 "failed to register %s regulator\n",
612 pdev->name);
613 error = PTR_ERR(rdev);
614 goto fail;
615 }
616
617 /* Save regulator for cleanup */
618 tps->rdev[i] = rdev;
619 }
620
621 tps6507x_dev->pmic = tps;
622 platform_set_drvdata(pdev, tps6507x_dev);
623
624 return 0;
625
626fail:
627 while (--i >= 0)
628 regulator_unregister(tps->rdev[i]);
629
630 kfree(tps);
631 return error;
632}
633
634static int __devexit tps6507x_pmic_remove(struct platform_device *pdev)
635{
636 struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev);
637 struct tps6507x_pmic *tps = tps6507x_dev->pmic;
638 int i;
639
640 for (i = 0; i < TPS6507X_NUM_REGULATOR; i++)
641 regulator_unregister(tps->rdev[i]);
642
643 kfree(tps);
644
645 return 0;
646}
647
648static struct platform_driver tps6507x_pmic_driver = {
649 .driver = {
650 .name = "tps6507x-pmic",
651 .owner = THIS_MODULE,
652 },
653 .probe = tps6507x_pmic_probe,
654 .remove = __devexit_p(tps6507x_pmic_remove),
655};
656
657/**
658 * tps6507x_pmic_init
659 *
660 * Module init function
661 */
662static int __init tps6507x_pmic_init(void)
663{
664 return platform_driver_register(&tps6507x_pmic_driver);
665}
666subsys_initcall(tps6507x_pmic_init);
667
668/**
669 * tps6507x_pmic_cleanup
670 *
671 * Module exit function
672 */
673static void __exit tps6507x_pmic_cleanup(void)
674{
675 platform_driver_unregister(&tps6507x_pmic_driver);
676}
677module_exit(tps6507x_pmic_cleanup);
678
679MODULE_AUTHOR("Texas Instruments");
680MODULE_DESCRIPTION("TPS6507x voltage regulator driver");
681MODULE_LICENSE("GPL v2");
682MODULE_ALIAS("platform:tps6507x-pmic");
1/*
2 * tps6507x-regulator.c
3 *
4 * Regulator driver for TPS65073 PMIC
5 *
6 * Copyright (C) 2009 Texas Instrument Incorporated - http://www.ti.com/
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation version 2.
11 *
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
13 * whether express or implied; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 */
17
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/init.h>
21#include <linux/err.h>
22#include <linux/platform_device.h>
23#include <linux/regulator/driver.h>
24#include <linux/regulator/machine.h>
25#include <linux/regulator/tps6507x.h>
26#include <linux/of.h>
27#include <linux/slab.h>
28#include <linux/mfd/tps6507x.h>
29#include <linux/regulator/of_regulator.h>
30
31/* DCDC's */
32#define TPS6507X_DCDC_1 0
33#define TPS6507X_DCDC_2 1
34#define TPS6507X_DCDC_3 2
35/* LDOs */
36#define TPS6507X_LDO_1 3
37#define TPS6507X_LDO_2 4
38
39#define TPS6507X_MAX_REG_ID TPS6507X_LDO_2
40
41/* Number of step-down converters available */
42#define TPS6507X_NUM_DCDC 3
43/* Number of LDO voltage regulators available */
44#define TPS6507X_NUM_LDO 2
45/* Number of total regulators available */
46#define TPS6507X_NUM_REGULATOR (TPS6507X_NUM_DCDC + TPS6507X_NUM_LDO)
47
48/* Supported voltage values for regulators (in microVolts) */
49static const unsigned int VDCDCx_VSEL_table[] = {
50 725000, 750000, 775000, 800000,
51 825000, 850000, 875000, 900000,
52 925000, 950000, 975000, 1000000,
53 1025000, 1050000, 1075000, 1100000,
54 1125000, 1150000, 1175000, 1200000,
55 1225000, 1250000, 1275000, 1300000,
56 1325000, 1350000, 1375000, 1400000,
57 1425000, 1450000, 1475000, 1500000,
58 1550000, 1600000, 1650000, 1700000,
59 1750000, 1800000, 1850000, 1900000,
60 1950000, 2000000, 2050000, 2100000,
61 2150000, 2200000, 2250000, 2300000,
62 2350000, 2400000, 2450000, 2500000,
63 2550000, 2600000, 2650000, 2700000,
64 2750000, 2800000, 2850000, 2900000,
65 3000000, 3100000, 3200000, 3300000,
66};
67
68static const unsigned int LDO1_VSEL_table[] = {
69 1000000, 1100000, 1200000, 1250000,
70 1300000, 1350000, 1400000, 1500000,
71 1600000, 1800000, 2500000, 2750000,
72 2800000, 3000000, 3100000, 3300000,
73};
74
75/* The voltage mapping table for LDO2 is the same as VDCDCx */
76#define LDO2_VSEL_table VDCDCx_VSEL_table
77
78struct tps_info {
79 const char *name;
80 u8 table_len;
81 const unsigned int *table;
82
83 /* Does DCDC high or the low register defines output voltage? */
84 bool defdcdc_default;
85};
86
87static struct tps_info tps6507x_pmic_regs[] = {
88 {
89 .name = "VDCDC1",
90 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
91 .table = VDCDCx_VSEL_table,
92 },
93 {
94 .name = "VDCDC2",
95 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
96 .table = VDCDCx_VSEL_table,
97 },
98 {
99 .name = "VDCDC3",
100 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
101 .table = VDCDCx_VSEL_table,
102 },
103 {
104 .name = "LDO1",
105 .table_len = ARRAY_SIZE(LDO1_VSEL_table),
106 .table = LDO1_VSEL_table,
107 },
108 {
109 .name = "LDO2",
110 .table_len = ARRAY_SIZE(LDO2_VSEL_table),
111 .table = LDO2_VSEL_table,
112 },
113};
114
115struct tps6507x_pmic {
116 struct regulator_desc desc[TPS6507X_NUM_REGULATOR];
117 struct tps6507x_dev *mfd;
118 struct regulator_dev *rdev[TPS6507X_NUM_REGULATOR];
119 struct tps_info *info[TPS6507X_NUM_REGULATOR];
120 struct mutex io_lock;
121};
122static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg)
123{
124 u8 val;
125 int err;
126
127 err = tps->mfd->read_dev(tps->mfd, reg, 1, &val);
128
129 if (err)
130 return err;
131
132 return val;
133}
134
135static inline int tps6507x_pmic_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
136{
137 return tps->mfd->write_dev(tps->mfd, reg, 1, &val);
138}
139
140static int tps6507x_pmic_set_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
141{
142 int err, data;
143
144 mutex_lock(&tps->io_lock);
145
146 data = tps6507x_pmic_read(tps, reg);
147 if (data < 0) {
148 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
149 err = data;
150 goto out;
151 }
152
153 data |= mask;
154 err = tps6507x_pmic_write(tps, reg, data);
155 if (err)
156 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
157
158out:
159 mutex_unlock(&tps->io_lock);
160 return err;
161}
162
163static int tps6507x_pmic_clear_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
164{
165 int err, data;
166
167 mutex_lock(&tps->io_lock);
168
169 data = tps6507x_pmic_read(tps, reg);
170 if (data < 0) {
171 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
172 err = data;
173 goto out;
174 }
175
176 data &= ~mask;
177 err = tps6507x_pmic_write(tps, reg, data);
178 if (err)
179 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
180
181out:
182 mutex_unlock(&tps->io_lock);
183 return err;
184}
185
186static int tps6507x_pmic_reg_read(struct tps6507x_pmic *tps, u8 reg)
187{
188 int data;
189
190 mutex_lock(&tps->io_lock);
191
192 data = tps6507x_pmic_read(tps, reg);
193 if (data < 0)
194 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
195
196 mutex_unlock(&tps->io_lock);
197 return data;
198}
199
200static int tps6507x_pmic_reg_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
201{
202 int err;
203
204 mutex_lock(&tps->io_lock);
205
206 err = tps6507x_pmic_write(tps, reg, val);
207 if (err < 0)
208 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
209
210 mutex_unlock(&tps->io_lock);
211 return err;
212}
213
214static int tps6507x_pmic_is_enabled(struct regulator_dev *dev)
215{
216 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
217 int data, rid = rdev_get_id(dev);
218 u8 shift;
219
220 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
221 return -EINVAL;
222
223 shift = TPS6507X_MAX_REG_ID - rid;
224 data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
225
226 if (data < 0)
227 return data;
228 else
229 return (data & 1<<shift) ? 1 : 0;
230}
231
232static int tps6507x_pmic_enable(struct regulator_dev *dev)
233{
234 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
235 int rid = rdev_get_id(dev);
236 u8 shift;
237
238 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
239 return -EINVAL;
240
241 shift = TPS6507X_MAX_REG_ID - rid;
242 return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
243}
244
245static int tps6507x_pmic_disable(struct regulator_dev *dev)
246{
247 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
248 int rid = rdev_get_id(dev);
249 u8 shift;
250
251 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
252 return -EINVAL;
253
254 shift = TPS6507X_MAX_REG_ID - rid;
255 return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
256 1 << shift);
257}
258
259static int tps6507x_pmic_get_voltage_sel(struct regulator_dev *dev)
260{
261 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
262 int data, rid = rdev_get_id(dev);
263 u8 reg, mask;
264
265 switch (rid) {
266 case TPS6507X_DCDC_1:
267 reg = TPS6507X_REG_DEFDCDC1;
268 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
269 break;
270 case TPS6507X_DCDC_2:
271 if (tps->info[rid]->defdcdc_default)
272 reg = TPS6507X_REG_DEFDCDC2_HIGH;
273 else
274 reg = TPS6507X_REG_DEFDCDC2_LOW;
275 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
276 break;
277 case TPS6507X_DCDC_3:
278 if (tps->info[rid]->defdcdc_default)
279 reg = TPS6507X_REG_DEFDCDC3_HIGH;
280 else
281 reg = TPS6507X_REG_DEFDCDC3_LOW;
282 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
283 break;
284 case TPS6507X_LDO_1:
285 reg = TPS6507X_REG_LDO_CTRL1;
286 mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
287 break;
288 case TPS6507X_LDO_2:
289 reg = TPS6507X_REG_DEFLDO2;
290 mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
291 break;
292 default:
293 return -EINVAL;
294 }
295
296 data = tps6507x_pmic_reg_read(tps, reg);
297 if (data < 0)
298 return data;
299
300 data &= mask;
301 return data;
302}
303
304static int tps6507x_pmic_set_voltage_sel(struct regulator_dev *dev,
305 unsigned selector)
306{
307 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
308 int data, rid = rdev_get_id(dev);
309 u8 reg, mask;
310
311 switch (rid) {
312 case TPS6507X_DCDC_1:
313 reg = TPS6507X_REG_DEFDCDC1;
314 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
315 break;
316 case TPS6507X_DCDC_2:
317 if (tps->info[rid]->defdcdc_default)
318 reg = TPS6507X_REG_DEFDCDC2_HIGH;
319 else
320 reg = TPS6507X_REG_DEFDCDC2_LOW;
321 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
322 break;
323 case TPS6507X_DCDC_3:
324 if (tps->info[rid]->defdcdc_default)
325 reg = TPS6507X_REG_DEFDCDC3_HIGH;
326 else
327 reg = TPS6507X_REG_DEFDCDC3_LOW;
328 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
329 break;
330 case TPS6507X_LDO_1:
331 reg = TPS6507X_REG_LDO_CTRL1;
332 mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
333 break;
334 case TPS6507X_LDO_2:
335 reg = TPS6507X_REG_DEFLDO2;
336 mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
337 break;
338 default:
339 return -EINVAL;
340 }
341
342 data = tps6507x_pmic_reg_read(tps, reg);
343 if (data < 0)
344 return data;
345
346 data &= ~mask;
347 data |= selector;
348
349 return tps6507x_pmic_reg_write(tps, reg, data);
350}
351
352static struct regulator_ops tps6507x_pmic_ops = {
353 .is_enabled = tps6507x_pmic_is_enabled,
354 .enable = tps6507x_pmic_enable,
355 .disable = tps6507x_pmic_disable,
356 .get_voltage_sel = tps6507x_pmic_get_voltage_sel,
357 .set_voltage_sel = tps6507x_pmic_set_voltage_sel,
358 .list_voltage = regulator_list_voltage_table,
359 .map_voltage = regulator_map_voltage_ascend,
360};
361
362static struct of_regulator_match tps6507x_matches[] = {
363 { .name = "VDCDC1"},
364 { .name = "VDCDC2"},
365 { .name = "VDCDC3"},
366 { .name = "LDO1"},
367 { .name = "LDO2"},
368};
369
370static struct tps6507x_board *tps6507x_parse_dt_reg_data(
371 struct platform_device *pdev,
372 struct of_regulator_match **tps6507x_reg_matches)
373{
374 struct tps6507x_board *tps_board;
375 struct device_node *np = pdev->dev.parent->of_node;
376 struct device_node *regulators;
377 struct of_regulator_match *matches;
378 struct regulator_init_data *reg_data;
379 int idx = 0, count, ret;
380
381 tps_board = devm_kzalloc(&pdev->dev, sizeof(*tps_board),
382 GFP_KERNEL);
383 if (!tps_board)
384 return NULL;
385
386 regulators = of_get_child_by_name(np, "regulators");
387 if (!regulators) {
388 dev_err(&pdev->dev, "regulator node not found\n");
389 return NULL;
390 }
391
392 count = ARRAY_SIZE(tps6507x_matches);
393 matches = tps6507x_matches;
394
395 ret = of_regulator_match(&pdev->dev, regulators, matches, count);
396 of_node_put(regulators);
397 if (ret < 0) {
398 dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
399 ret);
400 return NULL;
401 }
402
403 *tps6507x_reg_matches = matches;
404
405 reg_data = devm_kzalloc(&pdev->dev, (sizeof(struct regulator_init_data)
406 * TPS6507X_NUM_REGULATOR), GFP_KERNEL);
407 if (!reg_data)
408 return NULL;
409
410 tps_board->tps6507x_pmic_init_data = reg_data;
411
412 for (idx = 0; idx < count; idx++) {
413 if (!matches[idx].init_data || !matches[idx].of_node)
414 continue;
415
416 memcpy(®_data[idx], matches[idx].init_data,
417 sizeof(struct regulator_init_data));
418
419 }
420
421 return tps_board;
422}
423
424static int tps6507x_pmic_probe(struct platform_device *pdev)
425{
426 struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent);
427 struct tps_info *info = &tps6507x_pmic_regs[0];
428 struct regulator_config config = { };
429 struct regulator_init_data *init_data;
430 struct regulator_dev *rdev;
431 struct tps6507x_pmic *tps;
432 struct tps6507x_board *tps_board;
433 struct of_regulator_match *tps6507x_reg_matches = NULL;
434 int i;
435 int error;
436 unsigned int prop;
437
438 /**
439 * tps_board points to pmic related constants
440 * coming from the board-evm file.
441 */
442
443 tps_board = dev_get_platdata(tps6507x_dev->dev);
444 if (IS_ENABLED(CONFIG_OF) && !tps_board &&
445 tps6507x_dev->dev->of_node)
446 tps_board = tps6507x_parse_dt_reg_data(pdev,
447 &tps6507x_reg_matches);
448 if (!tps_board)
449 return -EINVAL;
450
451 /**
452 * init_data points to array of regulator_init structures
453 * coming from the board-evm file.
454 */
455 init_data = tps_board->tps6507x_pmic_init_data;
456 if (!init_data)
457 return -EINVAL;
458
459 tps = devm_kzalloc(&pdev->dev, sizeof(*tps), GFP_KERNEL);
460 if (!tps)
461 return -ENOMEM;
462
463 mutex_init(&tps->io_lock);
464
465 /* common for all regulators */
466 tps->mfd = tps6507x_dev;
467
468 for (i = 0; i < TPS6507X_NUM_REGULATOR; i++, info++, init_data++) {
469 /* Register the regulators */
470 tps->info[i] = info;
471 if (init_data->driver_data) {
472 struct tps6507x_reg_platform_data *data =
473 init_data->driver_data;
474 tps->info[i]->defdcdc_default = data->defdcdc_default;
475 }
476
477 tps->desc[i].name = info->name;
478 tps->desc[i].id = i;
479 tps->desc[i].n_voltages = info->table_len;
480 tps->desc[i].volt_table = info->table;
481 tps->desc[i].ops = &tps6507x_pmic_ops;
482 tps->desc[i].type = REGULATOR_VOLTAGE;
483 tps->desc[i].owner = THIS_MODULE;
484
485 config.dev = tps6507x_dev->dev;
486 config.init_data = init_data;
487 config.driver_data = tps;
488
489 if (tps6507x_reg_matches) {
490 error = of_property_read_u32(
491 tps6507x_reg_matches[i].of_node,
492 "ti,defdcdc_default", &prop);
493
494 if (!error)
495 tps->info[i]->defdcdc_default = prop;
496
497 config.of_node = tps6507x_reg_matches[i].of_node;
498 }
499
500 rdev = devm_regulator_register(&pdev->dev, &tps->desc[i],
501 &config);
502 if (IS_ERR(rdev)) {
503 dev_err(tps6507x_dev->dev,
504 "failed to register %s regulator\n",
505 pdev->name);
506 return PTR_ERR(rdev);
507 }
508
509 /* Save regulator for cleanup */
510 tps->rdev[i] = rdev;
511 }
512
513 tps6507x_dev->pmic = tps;
514 platform_set_drvdata(pdev, tps6507x_dev);
515
516 return 0;
517}
518
519static struct platform_driver tps6507x_pmic_driver = {
520 .driver = {
521 .name = "tps6507x-pmic",
522 },
523 .probe = tps6507x_pmic_probe,
524};
525
526static int __init tps6507x_pmic_init(void)
527{
528 return platform_driver_register(&tps6507x_pmic_driver);
529}
530subsys_initcall(tps6507x_pmic_init);
531
532static void __exit tps6507x_pmic_cleanup(void)
533{
534 platform_driver_unregister(&tps6507x_pmic_driver);
535}
536module_exit(tps6507x_pmic_cleanup);
537
538MODULE_AUTHOR("Texas Instruments");
539MODULE_DESCRIPTION("TPS6507x voltage regulator driver");
540MODULE_LICENSE("GPL v2");
541MODULE_ALIAS("platform:tps6507x-pmic");