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// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * tps6507x-regulator.c
4 *
5 * Regulator driver for TPS65073 PMIC
6 *
7 * Copyright (C) 2009 Texas Instrument Incorporated - https://www.ti.com/
8 */
9
10#include <linux/kernel.h>
11#include <linux/module.h>
12#include <linux/init.h>
13#include <linux/err.h>
14#include <linux/platform_device.h>
15#include <linux/regulator/driver.h>
16#include <linux/regulator/machine.h>
17#include <linux/regulator/tps6507x.h>
18#include <linux/of.h>
19#include <linux/slab.h>
20#include <linux/mfd/tps6507x.h>
21#include <linux/regulator/of_regulator.h>
22
23/* DCDC's */
24#define TPS6507X_DCDC_1 0
25#define TPS6507X_DCDC_2 1
26#define TPS6507X_DCDC_3 2
27/* LDOs */
28#define TPS6507X_LDO_1 3
29#define TPS6507X_LDO_2 4
30
31#define TPS6507X_MAX_REG_ID TPS6507X_LDO_2
32
33/* Number of step-down converters available */
34#define TPS6507X_NUM_DCDC 3
35/* Number of LDO voltage regulators available */
36#define TPS6507X_NUM_LDO 2
37/* Number of total regulators available */
38#define TPS6507X_NUM_REGULATOR (TPS6507X_NUM_DCDC + TPS6507X_NUM_LDO)
39
40/* Supported voltage values for regulators (in microVolts) */
41static const unsigned int VDCDCx_VSEL_table[] = {
42 725000, 750000, 775000, 800000,
43 825000, 850000, 875000, 900000,
44 925000, 950000, 975000, 1000000,
45 1025000, 1050000, 1075000, 1100000,
46 1125000, 1150000, 1175000, 1200000,
47 1225000, 1250000, 1275000, 1300000,
48 1325000, 1350000, 1375000, 1400000,
49 1425000, 1450000, 1475000, 1500000,
50 1550000, 1600000, 1650000, 1700000,
51 1750000, 1800000, 1850000, 1900000,
52 1950000, 2000000, 2050000, 2100000,
53 2150000, 2200000, 2250000, 2300000,
54 2350000, 2400000, 2450000, 2500000,
55 2550000, 2600000, 2650000, 2700000,
56 2750000, 2800000, 2850000, 2900000,
57 3000000, 3100000, 3200000, 3300000,
58};
59
60static const unsigned int LDO1_VSEL_table[] = {
61 1000000, 1100000, 1200000, 1250000,
62 1300000, 1350000, 1400000, 1500000,
63 1600000, 1800000, 2500000, 2750000,
64 2800000, 3000000, 3100000, 3300000,
65};
66
67/* The voltage mapping table for LDO2 is the same as VDCDCx */
68#define LDO2_VSEL_table VDCDCx_VSEL_table
69
70struct tps_info {
71 const char *name;
72 u8 table_len;
73 const unsigned int *table;
74
75 /* Does DCDC high or the low register defines output voltage? */
76 bool defdcdc_default;
77};
78
79static struct tps_info tps6507x_pmic_regs[] = {
80 {
81 .name = "VDCDC1",
82 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
83 .table = VDCDCx_VSEL_table,
84 },
85 {
86 .name = "VDCDC2",
87 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
88 .table = VDCDCx_VSEL_table,
89 },
90 {
91 .name = "VDCDC3",
92 .table_len = ARRAY_SIZE(VDCDCx_VSEL_table),
93 .table = VDCDCx_VSEL_table,
94 },
95 {
96 .name = "LDO1",
97 .table_len = ARRAY_SIZE(LDO1_VSEL_table),
98 .table = LDO1_VSEL_table,
99 },
100 {
101 .name = "LDO2",
102 .table_len = ARRAY_SIZE(LDO2_VSEL_table),
103 .table = LDO2_VSEL_table,
104 },
105};
106
107struct tps6507x_pmic {
108 struct regulator_desc desc[TPS6507X_NUM_REGULATOR];
109 struct tps6507x_dev *mfd;
110 struct tps_info *info[TPS6507X_NUM_REGULATOR];
111 struct mutex io_lock;
112};
113static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg)
114{
115 u8 val;
116 int err;
117
118 err = tps->mfd->read_dev(tps->mfd, reg, 1, &val);
119
120 if (err)
121 return err;
122
123 return val;
124}
125
126static inline int tps6507x_pmic_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
127{
128 return tps->mfd->write_dev(tps->mfd, reg, 1, &val);
129}
130
131static int tps6507x_pmic_set_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
132{
133 int err, data;
134
135 mutex_lock(&tps->io_lock);
136
137 data = tps6507x_pmic_read(tps, reg);
138 if (data < 0) {
139 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
140 err = data;
141 goto out;
142 }
143
144 data |= mask;
145 err = tps6507x_pmic_write(tps, reg, data);
146 if (err)
147 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
148
149out:
150 mutex_unlock(&tps->io_lock);
151 return err;
152}
153
154static int tps6507x_pmic_clear_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
155{
156 int err, data;
157
158 mutex_lock(&tps->io_lock);
159
160 data = tps6507x_pmic_read(tps, reg);
161 if (data < 0) {
162 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
163 err = data;
164 goto out;
165 }
166
167 data &= ~mask;
168 err = tps6507x_pmic_write(tps, reg, data);
169 if (err)
170 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
171
172out:
173 mutex_unlock(&tps->io_lock);
174 return err;
175}
176
177static int tps6507x_pmic_reg_read(struct tps6507x_pmic *tps, u8 reg)
178{
179 int data;
180
181 mutex_lock(&tps->io_lock);
182
183 data = tps6507x_pmic_read(tps, reg);
184 if (data < 0)
185 dev_err(tps->mfd->dev, "Read from reg 0x%x failed\n", reg);
186
187 mutex_unlock(&tps->io_lock);
188 return data;
189}
190
191static int tps6507x_pmic_reg_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
192{
193 int err;
194
195 mutex_lock(&tps->io_lock);
196
197 err = tps6507x_pmic_write(tps, reg, val);
198 if (err < 0)
199 dev_err(tps->mfd->dev, "Write for reg 0x%x failed\n", reg);
200
201 mutex_unlock(&tps->io_lock);
202 return err;
203}
204
205static int tps6507x_pmic_is_enabled(struct regulator_dev *dev)
206{
207 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
208 int data, rid = rdev_get_id(dev);
209 u8 shift;
210
211 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
212 return -EINVAL;
213
214 shift = TPS6507X_MAX_REG_ID - rid;
215 data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
216
217 if (data < 0)
218 return data;
219 else
220 return (data & 1<<shift) ? 1 : 0;
221}
222
223static int tps6507x_pmic_enable(struct regulator_dev *dev)
224{
225 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
226 int rid = rdev_get_id(dev);
227 u8 shift;
228
229 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
230 return -EINVAL;
231
232 shift = TPS6507X_MAX_REG_ID - rid;
233 return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
234}
235
236static int tps6507x_pmic_disable(struct regulator_dev *dev)
237{
238 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
239 int rid = rdev_get_id(dev);
240 u8 shift;
241
242 if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
243 return -EINVAL;
244
245 shift = TPS6507X_MAX_REG_ID - rid;
246 return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
247 1 << shift);
248}
249
250static int tps6507x_pmic_get_voltage_sel(struct regulator_dev *dev)
251{
252 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
253 int data, rid = rdev_get_id(dev);
254 u8 reg, mask;
255
256 switch (rid) {
257 case TPS6507X_DCDC_1:
258 reg = TPS6507X_REG_DEFDCDC1;
259 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
260 break;
261 case TPS6507X_DCDC_2:
262 if (tps->info[rid]->defdcdc_default)
263 reg = TPS6507X_REG_DEFDCDC2_HIGH;
264 else
265 reg = TPS6507X_REG_DEFDCDC2_LOW;
266 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
267 break;
268 case TPS6507X_DCDC_3:
269 if (tps->info[rid]->defdcdc_default)
270 reg = TPS6507X_REG_DEFDCDC3_HIGH;
271 else
272 reg = TPS6507X_REG_DEFDCDC3_LOW;
273 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
274 break;
275 case TPS6507X_LDO_1:
276 reg = TPS6507X_REG_LDO_CTRL1;
277 mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
278 break;
279 case TPS6507X_LDO_2:
280 reg = TPS6507X_REG_DEFLDO2;
281 mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
282 break;
283 default:
284 return -EINVAL;
285 }
286
287 data = tps6507x_pmic_reg_read(tps, reg);
288 if (data < 0)
289 return data;
290
291 data &= mask;
292 return data;
293}
294
295static int tps6507x_pmic_set_voltage_sel(struct regulator_dev *dev,
296 unsigned selector)
297{
298 struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
299 int data, rid = rdev_get_id(dev);
300 u8 reg, mask;
301
302 switch (rid) {
303 case TPS6507X_DCDC_1:
304 reg = TPS6507X_REG_DEFDCDC1;
305 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
306 break;
307 case TPS6507X_DCDC_2:
308 if (tps->info[rid]->defdcdc_default)
309 reg = TPS6507X_REG_DEFDCDC2_HIGH;
310 else
311 reg = TPS6507X_REG_DEFDCDC2_LOW;
312 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
313 break;
314 case TPS6507X_DCDC_3:
315 if (tps->info[rid]->defdcdc_default)
316 reg = TPS6507X_REG_DEFDCDC3_HIGH;
317 else
318 reg = TPS6507X_REG_DEFDCDC3_LOW;
319 mask = TPS6507X_DEFDCDCX_DCDC_MASK;
320 break;
321 case TPS6507X_LDO_1:
322 reg = TPS6507X_REG_LDO_CTRL1;
323 mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
324 break;
325 case TPS6507X_LDO_2:
326 reg = TPS6507X_REG_DEFLDO2;
327 mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
328 break;
329 default:
330 return -EINVAL;
331 }
332
333 data = tps6507x_pmic_reg_read(tps, reg);
334 if (data < 0)
335 return data;
336
337 data &= ~mask;
338 data |= selector;
339
340 return tps6507x_pmic_reg_write(tps, reg, data);
341}
342
343static const struct regulator_ops tps6507x_pmic_ops = {
344 .is_enabled = tps6507x_pmic_is_enabled,
345 .enable = tps6507x_pmic_enable,
346 .disable = tps6507x_pmic_disable,
347 .get_voltage_sel = tps6507x_pmic_get_voltage_sel,
348 .set_voltage_sel = tps6507x_pmic_set_voltage_sel,
349 .list_voltage = regulator_list_voltage_table,
350 .map_voltage = regulator_map_voltage_ascend,
351};
352
353static int tps6507x_pmic_of_parse_cb(struct device_node *np,
354 const struct regulator_desc *desc,
355 struct regulator_config *config)
356{
357 struct tps6507x_pmic *tps = config->driver_data;
358 struct tps_info *info = tps->info[desc->id];
359 u32 prop;
360 int ret;
361
362 ret = of_property_read_u32(np, "ti,defdcdc_default", &prop);
363 if (!ret)
364 info->defdcdc_default = prop;
365
366 return 0;
367}
368
369static int tps6507x_pmic_probe(struct platform_device *pdev)
370{
371 struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent);
372 struct tps_info *info = &tps6507x_pmic_regs[0];
373 struct regulator_config config = { };
374 struct regulator_init_data *init_data = NULL;
375 struct regulator_dev *rdev;
376 struct tps6507x_pmic *tps;
377 struct tps6507x_board *tps_board;
378 int i;
379
380 /**
381 * tps_board points to pmic related constants
382 * coming from the board-evm file.
383 */
384
385 tps_board = dev_get_platdata(tps6507x_dev->dev);
386 if (tps_board)
387 init_data = tps_board->tps6507x_pmic_init_data;
388
389 tps = devm_kzalloc(&pdev->dev, sizeof(*tps), GFP_KERNEL);
390 if (!tps)
391 return -ENOMEM;
392
393 mutex_init(&tps->io_lock);
394
395 /* common for all regulators */
396 tps->mfd = tps6507x_dev;
397
398 for (i = 0; i < TPS6507X_NUM_REGULATOR; i++, info++) {
399 /* Register the regulators */
400 tps->info[i] = info;
401 if (init_data && init_data[i].driver_data) {
402 struct tps6507x_reg_platform_data *data =
403 init_data[i].driver_data;
404 info->defdcdc_default = data->defdcdc_default;
405 }
406
407 tps->desc[i].name = info->name;
408 tps->desc[i].of_match = of_match_ptr(info->name);
409 tps->desc[i].regulators_node = of_match_ptr("regulators");
410 tps->desc[i].of_parse_cb = tps6507x_pmic_of_parse_cb;
411 tps->desc[i].id = i;
412 tps->desc[i].n_voltages = info->table_len;
413 tps->desc[i].volt_table = info->table;
414 tps->desc[i].ops = &tps6507x_pmic_ops;
415 tps->desc[i].type = REGULATOR_VOLTAGE;
416 tps->desc[i].owner = THIS_MODULE;
417
418 config.dev = tps6507x_dev->dev;
419 config.init_data = init_data;
420 config.driver_data = tps;
421
422 rdev = devm_regulator_register(&pdev->dev, &tps->desc[i],
423 &config);
424 if (IS_ERR(rdev)) {
425 dev_err(tps6507x_dev->dev,
426 "failed to register %s regulator\n",
427 pdev->name);
428 return PTR_ERR(rdev);
429 }
430 }
431
432 tps6507x_dev->pmic = tps;
433 platform_set_drvdata(pdev, tps6507x_dev);
434
435 return 0;
436}
437
438static struct platform_driver tps6507x_pmic_driver = {
439 .driver = {
440 .name = "tps6507x-pmic",
441 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
442 },
443 .probe = tps6507x_pmic_probe,
444};
445
446static int __init tps6507x_pmic_init(void)
447{
448 return platform_driver_register(&tps6507x_pmic_driver);
449}
450subsys_initcall(tps6507x_pmic_init);
451
452static void __exit tps6507x_pmic_cleanup(void)
453{
454 platform_driver_unregister(&tps6507x_pmic_driver);
455}
456module_exit(tps6507x_pmic_cleanup);
457
458MODULE_AUTHOR("Texas Instruments");
459MODULE_DESCRIPTION("TPS6507x voltage regulator driver");
460MODULE_LICENSE("GPL v2");
461MODULE_ALIAS("platform:tps6507x-pmic");