2 * Regulator driver for TPS6524x PMIC
4 * Copyright (C) 2010 Texas Instruments
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation version 2.
10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
11 * whether express or implied; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/err.h>
19 #include <linux/errno.h>
20 #include <linux/slab.h>
21 #include <linux/spi/spi.h>
22 #include <linux/regulator/driver.h>
23 #include <linux/regulator/machine.h>
25 #define REG_LDO_SET 0x0
26 #define LDO_ILIM_MASK 1 /* 0 = 400-800, 1 = 900-1500 */
27 #define LDO_VSEL_MASK 0x0f
28 #define LDO2_ILIM_SHIFT 12
29 #define LDO2_VSEL_SHIFT 4
30 #define LDO1_ILIM_SHIFT 8
31 #define LDO1_VSEL_SHIFT 0
33 #define REG_BLOCK_EN 0x1
35 #define BLOCK_LDO1_SHIFT 0
36 #define BLOCK_LDO2_SHIFT 1
37 #define BLOCK_LCD_SHIFT 2
38 #define BLOCK_USB_SHIFT 3
40 #define REG_DCDC_SET 0x2
41 #define DCDC_VDCDC_MASK 0x1f
42 #define DCDC_VDCDC1_SHIFT 0
43 #define DCDC_VDCDC2_SHIFT 5
44 #define DCDC_VDCDC3_SHIFT 10
46 #define REG_DCDC_EN 0x3
47 #define DCDCDCDC_EN_MASK 0x1
48 #define DCDCDCDC1_EN_SHIFT 0
49 #define DCDCDCDC1_PG_MSK BIT(1)
50 #define DCDCDCDC2_EN_SHIFT 2
51 #define DCDCDCDC2_PG_MSK BIT(3)
52 #define DCDCDCDC3_EN_SHIFT 4
53 #define DCDCDCDC3_PG_MSK BIT(5)
56 #define USB_ILIM_SHIFT 0
57 #define USB_ILIM_MASK 0x3
58 #define USB_TSD_SHIFT 2
59 #define USB_TSD_MASK 0x3
60 #define USB_TWARN_SHIFT 4
61 #define USB_TWARN_MASK 0x3
62 #define USB_IWARN_SD BIT(6)
63 #define USB_FAST_LOOP BIT(7)
66 #define ALARM_LDO1 BIT(0)
67 #define ALARM_DCDC1 BIT(1)
68 #define ALARM_DCDC2 BIT(2)
69 #define ALARM_DCDC3 BIT(3)
70 #define ALARM_LDO2 BIT(4)
71 #define ALARM_USB_WARN BIT(5)
72 #define ALARM_USB_ALARM BIT(6)
73 #define ALARM_LCD BIT(9)
74 #define ALARM_TEMP_WARM BIT(10)
75 #define ALARM_TEMP_HOT BIT(11)
76 #define ALARM_NRST BIT(14)
77 #define ALARM_POWERUP BIT(15)
79 #define REG_INT_ENABLE 0x6
80 #define INT_LDO1 BIT(0)
81 #define INT_DCDC1 BIT(1)
82 #define INT_DCDC2 BIT(2)
83 #define INT_DCDC3 BIT(3)
84 #define INT_LDO2 BIT(4)
85 #define INT_USB_WARN BIT(5)
86 #define INT_USB_ALARM BIT(6)
87 #define INT_LCD BIT(9)
88 #define INT_TEMP_WARM BIT(10)
89 #define INT_TEMP_HOT BIT(11)
90 #define INT_GLOBAL_EN BIT(15)
92 #define REG_INT_STATUS 0x7
93 #define STATUS_LDO1 BIT(0)
94 #define STATUS_DCDC1 BIT(1)
95 #define STATUS_DCDC2 BIT(2)
96 #define STATUS_DCDC3 BIT(3)
97 #define STATUS_LDO2 BIT(4)
98 #define STATUS_USB_WARN BIT(5)
99 #define STATUS_USB_ALARM BIT(6)
100 #define STATUS_LCD BIT(9)
101 #define STATUS_TEMP_WARM BIT(10)
102 #define STATUS_TEMP_HOT BIT(11)
104 #define REG_SOFTWARE_RESET 0xb
105 #define REG_WRITE_ENABLE 0xd
106 #define REG_REV_ID 0xf
111 #define N_REGULATORS (N_DCDC + N_LDO + N_SWITCH)
113 #define FIXED_ILIMSEL BIT(0)
114 #define FIXED_VOLTAGE BIT(1)
116 #define CMD_READ(reg) ((reg) << 6)
117 #define CMD_WRITE(reg) (BIT(5) | (reg) << 6)
118 #define STAT_CLK BIT(3)
119 #define STAT_WRITE BIT(2)
120 #define STAT_INVALID BIT(1)
121 #define STAT_WP BIT(0)
138 struct field enable
, voltage
, ilimsel
;
143 struct spi_device
*spi
;
145 struct regulator_desc desc
[N_REGULATORS
];
146 struct regulator_dev
*rdev
[N_REGULATORS
];
149 static int __read_reg(struct tps6524x
*hw
, int reg
)
152 u16 cmd
= CMD_READ(reg
), in
;
154 struct spi_message m
;
155 struct spi_transfer t
[3];
157 spi_message_init(&m
);
158 memset(t
, 0, sizeof(t
));
162 t
[0].bits_per_word
= 12;
163 spi_message_add_tail(&t
[0], &m
);
167 t
[1].bits_per_word
= 16;
168 spi_message_add_tail(&t
[1], &m
);
170 t
[2].rx_buf
= &status
;
172 t
[2].bits_per_word
= 4;
173 spi_message_add_tail(&t
[2], &m
);
175 error
= spi_sync(hw
->spi
, &m
);
179 dev_dbg(hw
->dev
, "read reg %d, data %x, status %x\n",
182 if (!(status
& STAT_CLK
) || (status
& STAT_WRITE
))
185 if (status
& STAT_INVALID
)
191 static int read_reg(struct tps6524x
*hw
, int reg
)
195 mutex_lock(&hw
->lock
);
196 ret
= __read_reg(hw
, reg
);
197 mutex_unlock(&hw
->lock
);
202 static int __write_reg(struct tps6524x
*hw
, int reg
, int val
)
205 u16 cmd
= CMD_WRITE(reg
), out
= val
;
207 struct spi_message m
;
208 struct spi_transfer t
[3];
210 spi_message_init(&m
);
211 memset(t
, 0, sizeof(t
));
215 t
[0].bits_per_word
= 12;
216 spi_message_add_tail(&t
[0], &m
);
220 t
[1].bits_per_word
= 16;
221 spi_message_add_tail(&t
[1], &m
);
223 t
[2].rx_buf
= &status
;
225 t
[2].bits_per_word
= 4;
226 spi_message_add_tail(&t
[2], &m
);
228 error
= spi_sync(hw
->spi
, &m
);
232 dev_dbg(hw
->dev
, "wrote reg %d, data %x, status %x\n",
235 if (!(status
& STAT_CLK
) || !(status
& STAT_WRITE
))
238 if (status
& (STAT_INVALID
| STAT_WP
))
244 static int __rmw_reg(struct tps6524x
*hw
, int reg
, int mask
, int val
)
248 ret
= __read_reg(hw
, reg
);
255 ret
= __write_reg(hw
, reg
, ret
);
257 return (ret
< 0) ? ret
: 0;
260 static int rmw_protect(struct tps6524x
*hw
, int reg
, int mask
, int val
)
264 mutex_lock(&hw
->lock
);
266 ret
= __write_reg(hw
, REG_WRITE_ENABLE
, 1);
268 dev_err(hw
->dev
, "failed to set write enable\n");
272 ret
= __rmw_reg(hw
, reg
, mask
, val
);
274 dev_err(hw
->dev
, "failed to rmw register %d\n", reg
);
276 ret
= __write_reg(hw
, REG_WRITE_ENABLE
, 0);
278 dev_err(hw
->dev
, "failed to clear write enable\n");
283 mutex_unlock(&hw
->lock
);
288 static int read_field(struct tps6524x
*hw
, const struct field
*field
)
292 tmp
= read_reg(hw
, field
->reg
);
296 return (tmp
>> field
->shift
) & field
->mask
;
299 static int write_field(struct tps6524x
*hw
, const struct field
*field
,
302 if (val
& ~field
->mask
)
305 return rmw_protect(hw
, field
->reg
,
306 field
->mask
<< field
->shift
,
307 val
<< field
->shift
);
310 static const int dcdc1_voltages
[] = {
311 800000, 825000, 850000, 875000,
312 900000, 925000, 950000, 975000,
313 1000000, 1025000, 1050000, 1075000,
314 1100000, 1125000, 1150000, 1175000,
315 1200000, 1225000, 1250000, 1275000,
316 1300000, 1325000, 1350000, 1375000,
317 1400000, 1425000, 1450000, 1475000,
318 1500000, 1525000, 1550000, 1575000,
321 static const int dcdc2_voltages
[] = {
322 1400000, 1450000, 1500000, 1550000,
323 1600000, 1650000, 1700000, 1750000,
324 1800000, 1850000, 1900000, 1950000,
325 2000000, 2050000, 2100000, 2150000,
326 2200000, 2250000, 2300000, 2350000,
327 2400000, 2450000, 2500000, 2550000,
328 2600000, 2650000, 2700000, 2750000,
329 2800000, 2850000, 2900000, 2950000,
332 static const int dcdc3_voltages
[] = {
333 2400000, 2450000, 2500000, 2550000, 2600000,
334 2650000, 2700000, 2750000, 2800000, 2850000,
335 2900000, 2950000, 3000000, 3050000, 3100000,
336 3150000, 3200000, 3250000, 3300000, 3350000,
337 3400000, 3450000, 3500000, 3550000, 3600000,
340 static const int ldo1_voltages
[] = {
341 4300000, 4350000, 4400000, 4450000,
342 4500000, 4550000, 4600000, 4650000,
343 4700000, 4750000, 4800000, 4850000,
344 4900000, 4950000, 5000000, 5050000,
347 static const int ldo2_voltages
[] = {
348 1100000, 1150000, 1200000, 1250000,
349 1300000, 1700000, 1750000, 1800000,
350 1850000, 1900000, 3150000, 3200000,
351 3250000, 3300000, 3350000, 3400000,
354 static const int ldo_ilimsel
[] = {
358 static const int usb_ilimsel
[] = {
359 200000, 400000, 800000, 1000000
362 #define __MK_FIELD(_reg, _mask, _shift) \
363 { .reg = (_reg), .mask = (_mask), .shift = (_shift), }
365 static const struct supply_info supply_info
[N_REGULATORS
] = {
368 .flags
= FIXED_ILIMSEL
,
369 .n_voltages
= ARRAY_SIZE(dcdc1_voltages
),
370 .voltages
= dcdc1_voltages
,
371 .fixed_ilimsel
= 2400000,
372 .enable
= __MK_FIELD(REG_DCDC_EN
, DCDCDCDC_EN_MASK
,
374 .voltage
= __MK_FIELD(REG_DCDC_SET
, DCDC_VDCDC_MASK
,
379 .flags
= FIXED_ILIMSEL
,
380 .n_voltages
= ARRAY_SIZE(dcdc2_voltages
),
381 .voltages
= dcdc2_voltages
,
382 .fixed_ilimsel
= 1200000,
383 .enable
= __MK_FIELD(REG_DCDC_EN
, DCDCDCDC_EN_MASK
,
385 .voltage
= __MK_FIELD(REG_DCDC_SET
, DCDC_VDCDC_MASK
,
390 .flags
= FIXED_ILIMSEL
,
391 .n_voltages
= ARRAY_SIZE(dcdc3_voltages
),
392 .voltages
= dcdc3_voltages
,
393 .fixed_ilimsel
= 1200000,
394 .enable
= __MK_FIELD(REG_DCDC_EN
, DCDCDCDC_EN_MASK
,
396 .voltage
= __MK_FIELD(REG_DCDC_SET
, DCDC_VDCDC_MASK
,
401 .n_voltages
= ARRAY_SIZE(ldo1_voltages
),
402 .voltages
= ldo1_voltages
,
403 .n_ilimsels
= ARRAY_SIZE(ldo_ilimsel
),
404 .ilimsels
= ldo_ilimsel
,
405 .enable
= __MK_FIELD(REG_BLOCK_EN
, BLOCK_MASK
,
407 .voltage
= __MK_FIELD(REG_LDO_SET
, LDO_VSEL_MASK
,
409 .ilimsel
= __MK_FIELD(REG_LDO_SET
, LDO_ILIM_MASK
,
414 .n_voltages
= ARRAY_SIZE(ldo2_voltages
),
415 .voltages
= ldo2_voltages
,
416 .n_ilimsels
= ARRAY_SIZE(ldo_ilimsel
),
417 .ilimsels
= ldo_ilimsel
,
418 .enable
= __MK_FIELD(REG_BLOCK_EN
, BLOCK_MASK
,
420 .voltage
= __MK_FIELD(REG_LDO_SET
, LDO_VSEL_MASK
,
422 .ilimsel
= __MK_FIELD(REG_LDO_SET
, LDO_ILIM_MASK
,
427 .flags
= FIXED_VOLTAGE
,
428 .fixed_voltage
= 5000000,
429 .n_ilimsels
= ARRAY_SIZE(usb_ilimsel
),
430 .ilimsels
= usb_ilimsel
,
431 .enable
= __MK_FIELD(REG_BLOCK_EN
, BLOCK_MASK
,
433 .ilimsel
= __MK_FIELD(REG_USB
, USB_ILIM_MASK
,
438 .flags
= FIXED_VOLTAGE
| FIXED_ILIMSEL
,
439 .fixed_voltage
= 5000000,
440 .fixed_ilimsel
= 400000,
441 .enable
= __MK_FIELD(REG_BLOCK_EN
, BLOCK_MASK
,
446 static int list_voltage(struct regulator_dev
*rdev
, unsigned selector
)
448 const struct supply_info
*info
;
451 hw
= rdev_get_drvdata(rdev
);
452 info
= &supply_info
[rdev_get_id(rdev
)];
454 if (info
->flags
& FIXED_VOLTAGE
)
455 return selector
? -EINVAL
: info
->fixed_voltage
;
457 return ((selector
< info
->n_voltages
) ?
458 info
->voltages
[selector
] : -EINVAL
);
461 static int set_voltage_sel(struct regulator_dev
*rdev
, unsigned selector
)
463 const struct supply_info
*info
;
466 hw
= rdev_get_drvdata(rdev
);
467 info
= &supply_info
[rdev_get_id(rdev
)];
469 if (info
->flags
& FIXED_VOLTAGE
)
472 return write_field(hw
, &info
->voltage
, selector
);
475 static int get_voltage_sel(struct regulator_dev
*rdev
)
477 const struct supply_info
*info
;
481 hw
= rdev_get_drvdata(rdev
);
482 info
= &supply_info
[rdev_get_id(rdev
)];
484 if (info
->flags
& FIXED_VOLTAGE
)
485 return info
->fixed_voltage
;
487 ret
= read_field(hw
, &info
->voltage
);
490 if (WARN_ON(ret
>= info
->n_voltages
))
496 static int set_current_limit(struct regulator_dev
*rdev
, int min_uA
,
499 const struct supply_info
*info
;
503 hw
= rdev_get_drvdata(rdev
);
504 info
= &supply_info
[rdev_get_id(rdev
)];
506 if (info
->flags
& FIXED_ILIMSEL
)
509 for (i
= 0; i
< info
->n_ilimsels
; i
++)
510 if (min_uA
<= info
->ilimsels
[i
] &&
511 max_uA
>= info
->ilimsels
[i
])
514 if (i
>= info
->n_ilimsels
)
517 return write_field(hw
, &info
->ilimsel
, i
);
520 static int get_current_limit(struct regulator_dev
*rdev
)
522 const struct supply_info
*info
;
526 hw
= rdev_get_drvdata(rdev
);
527 info
= &supply_info
[rdev_get_id(rdev
)];
529 if (info
->flags
& FIXED_ILIMSEL
)
530 return info
->fixed_ilimsel
;
532 ret
= read_field(hw
, &info
->ilimsel
);
535 if (WARN_ON(ret
>= info
->n_ilimsels
))
538 return info
->ilimsels
[ret
];
541 static int enable_supply(struct regulator_dev
*rdev
)
543 const struct supply_info
*info
;
546 hw
= rdev_get_drvdata(rdev
);
547 info
= &supply_info
[rdev_get_id(rdev
)];
549 return write_field(hw
, &info
->enable
, 1);
552 static int disable_supply(struct regulator_dev
*rdev
)
554 const struct supply_info
*info
;
557 hw
= rdev_get_drvdata(rdev
);
558 info
= &supply_info
[rdev_get_id(rdev
)];
560 return write_field(hw
, &info
->enable
, 0);
563 static int is_supply_enabled(struct regulator_dev
*rdev
)
565 const struct supply_info
*info
;
568 hw
= rdev_get_drvdata(rdev
);
569 info
= &supply_info
[rdev_get_id(rdev
)];
571 return read_field(hw
, &info
->enable
);
574 static struct regulator_ops regulator_ops
= {
575 .is_enabled
= is_supply_enabled
,
576 .enable
= enable_supply
,
577 .disable
= disable_supply
,
578 .get_voltage_sel
= get_voltage_sel
,
579 .set_voltage_sel
= set_voltage_sel
,
580 .list_voltage
= list_voltage
,
581 .set_current_limit
= set_current_limit
,
582 .get_current_limit
= get_current_limit
,
585 static int pmic_remove(struct spi_device
*spi
)
587 struct tps6524x
*hw
= spi_get_drvdata(spi
);
592 for (i
= 0; i
< N_REGULATORS
; i
++) {
594 regulator_unregister(hw
->rdev
[i
]);
597 spi_set_drvdata(spi
, NULL
);
601 static int __devinit
pmic_probe(struct spi_device
*spi
)
604 struct device
*dev
= &spi
->dev
;
605 const struct supply_info
*info
= supply_info
;
606 struct regulator_init_data
*init_data
;
607 struct regulator_config config
= { };
610 init_data
= dev
->platform_data
;
612 dev_err(dev
, "could not find regulator platform data\n");
616 hw
= devm_kzalloc(&spi
->dev
, sizeof(struct tps6524x
), GFP_KERNEL
);
618 dev_err(dev
, "cannot allocate regulator private data\n");
621 spi_set_drvdata(spi
, hw
);
623 memset(hw
, 0, sizeof(struct tps6524x
));
625 hw
->spi
= spi_dev_get(spi
);
626 mutex_init(&hw
->lock
);
628 for (i
= 0; i
< N_REGULATORS
; i
++, info
++, init_data
++) {
629 hw
->desc
[i
].name
= info
->name
;
631 hw
->desc
[i
].n_voltages
= info
->n_voltages
;
632 hw
->desc
[i
].ops
= ®ulator_ops
;
633 hw
->desc
[i
].type
= REGULATOR_VOLTAGE
;
634 hw
->desc
[i
].owner
= THIS_MODULE
;
636 if (info
->flags
& FIXED_VOLTAGE
)
637 hw
->desc
[i
].n_voltages
= 1;
640 config
.init_data
= init_data
;
641 config
.driver_data
= hw
;
643 hw
->rdev
[i
] = regulator_register(&hw
->desc
[i
], &config
);
644 if (IS_ERR(hw
->rdev
[i
])) {
645 ret
= PTR_ERR(hw
->rdev
[i
]);
658 static struct spi_driver pmic_driver
= {
660 .remove
= __devexit_p(pmic_remove
),
663 .owner
= THIS_MODULE
,
667 module_spi_driver(pmic_driver
);
669 MODULE_DESCRIPTION("TPS6524X PMIC Driver");
670 MODULE_AUTHOR("Cyril Chemparathy");
671 MODULE_LICENSE("GPL");
672 MODULE_ALIAS("spi:tps6524x");