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 CMD_READ(reg) ((reg) << 6)
114 #define CMD_WRITE(reg) (BIT(5) | (reg) << 6)
115 #define STAT_CLK BIT(3)
116 #define STAT_WRITE BIT(2)
117 #define STAT_INVALID BIT(1)
118 #define STAT_WP BIT(0)
129 const unsigned int *voltages;
131 const unsigned int *ilimsels;
132 struct field enable, voltage, ilimsel;
137 struct spi_device *spi;
139 struct regulator_desc desc[N_REGULATORS];
142 static int __read_reg(struct tps6524x *hw, int reg)
145 u16 cmd = CMD_READ(reg), in;
147 struct spi_message m;
148 struct spi_transfer t[3];
150 spi_message_init(&m);
151 memset(t, 0, sizeof(t));
155 t[0].bits_per_word = 12;
156 spi_message_add_tail(&t[0], &m);
160 t[1].bits_per_word = 16;
161 spi_message_add_tail(&t[1], &m);
163 t[2].rx_buf = &status;
165 t[2].bits_per_word = 4;
166 spi_message_add_tail(&t[2], &m);
168 error = spi_sync(hw->spi, &m);
172 dev_dbg(hw->dev, "read reg %d, data %x, status %x\n",
175 if (!(status & STAT_CLK) || (status & STAT_WRITE))
178 if (status & STAT_INVALID)
184 static int read_reg(struct tps6524x *hw, int reg)
188 mutex_lock(&hw->lock);
189 ret = __read_reg(hw, reg);
190 mutex_unlock(&hw->lock);
195 static int __write_reg(struct tps6524x *hw, int reg, int val)
198 u16 cmd = CMD_WRITE(reg), out = val;
200 struct spi_message m;
201 struct spi_transfer t[3];
203 spi_message_init(&m);
204 memset(t, 0, sizeof(t));
208 t[0].bits_per_word = 12;
209 spi_message_add_tail(&t[0], &m);
213 t[1].bits_per_word = 16;
214 spi_message_add_tail(&t[1], &m);
216 t[2].rx_buf = &status;
218 t[2].bits_per_word = 4;
219 spi_message_add_tail(&t[2], &m);
221 error = spi_sync(hw->spi, &m);
225 dev_dbg(hw->dev, "wrote reg %d, data %x, status %x\n",
228 if (!(status & STAT_CLK) || !(status & STAT_WRITE))
231 if (status & (STAT_INVALID | STAT_WP))
237 static int __rmw_reg(struct tps6524x *hw, int reg, int mask, int val)
241 ret = __read_reg(hw, reg);
248 ret = __write_reg(hw, reg, ret);
250 return (ret < 0) ? ret : 0;
253 static int rmw_protect(struct tps6524x *hw, int reg, int mask, int val)
257 mutex_lock(&hw->lock);
259 ret = __write_reg(hw, REG_WRITE_ENABLE, 1);
261 dev_err(hw->dev, "failed to set write enable\n");
265 ret = __rmw_reg(hw, reg, mask, val);
267 dev_err(hw->dev, "failed to rmw register %d\n", reg);
269 ret = __write_reg(hw, REG_WRITE_ENABLE, 0);
271 dev_err(hw->dev, "failed to clear write enable\n");
276 mutex_unlock(&hw->lock);
281 static int read_field(struct tps6524x *hw, const struct field *field)
285 tmp = read_reg(hw, field->reg);
289 return (tmp >> field->shift) & field->mask;
292 static int write_field(struct tps6524x *hw, const struct field *field,
295 if (val & ~field->mask)
298 return rmw_protect(hw, field->reg,
299 field->mask << field->shift,
300 val << field->shift);
303 static const unsigned int dcdc1_voltages[] = {
304 800000, 825000, 850000, 875000,
305 900000, 925000, 950000, 975000,
306 1000000, 1025000, 1050000, 1075000,
307 1100000, 1125000, 1150000, 1175000,
308 1200000, 1225000, 1250000, 1275000,
309 1300000, 1325000, 1350000, 1375000,
310 1400000, 1425000, 1450000, 1475000,
311 1500000, 1525000, 1550000, 1575000,
314 static const unsigned int dcdc2_voltages[] = {
315 1400000, 1450000, 1500000, 1550000,
316 1600000, 1650000, 1700000, 1750000,
317 1800000, 1850000, 1900000, 1950000,
318 2000000, 2050000, 2100000, 2150000,
319 2200000, 2250000, 2300000, 2350000,
320 2400000, 2450000, 2500000, 2550000,
321 2600000, 2650000, 2700000, 2750000,
322 2800000, 2850000, 2900000, 2950000,
325 static const unsigned int dcdc3_voltages[] = {
326 2400000, 2450000, 2500000, 2550000, 2600000,
327 2650000, 2700000, 2750000, 2800000, 2850000,
328 2900000, 2950000, 3000000, 3050000, 3100000,
329 3150000, 3200000, 3250000, 3300000, 3350000,
330 3400000, 3450000, 3500000, 3550000, 3600000,
333 static const unsigned int ldo1_voltages[] = {
334 4300000, 4350000, 4400000, 4450000,
335 4500000, 4550000, 4600000, 4650000,
336 4700000, 4750000, 4800000, 4850000,
337 4900000, 4950000, 5000000, 5050000,
340 static const unsigned int ldo2_voltages[] = {
341 1100000, 1150000, 1200000, 1250000,
342 1300000, 1700000, 1750000, 1800000,
343 1850000, 1900000, 3150000, 3200000,
344 3250000, 3300000, 3350000, 3400000,
347 static const unsigned int fixed_5000000_voltage[] = {
351 static const unsigned int ldo_ilimsel[] = {
355 static const unsigned int usb_ilimsel[] = {
356 200000, 400000, 800000, 1000000
359 static const unsigned int fixed_2400000_ilimsel[] = {
363 static const unsigned int fixed_1200000_ilimsel[] = {
367 static const unsigned int fixed_400000_ilimsel[] = {
371 #define __MK_FIELD(_reg, _mask, _shift) \
372 { .reg = (_reg), .mask = (_mask), .shift = (_shift), }
374 static const struct supply_info supply_info[N_REGULATORS] = {
377 .n_voltages = ARRAY_SIZE(dcdc1_voltages),
378 .voltages = dcdc1_voltages,
379 .n_ilimsels = ARRAY_SIZE(fixed_2400000_ilimsel),
380 .ilimsels = fixed_2400000_ilimsel,
381 .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
383 .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
388 .n_voltages = ARRAY_SIZE(dcdc2_voltages),
389 .voltages = dcdc2_voltages,
390 .n_ilimsels = ARRAY_SIZE(fixed_1200000_ilimsel),
391 .ilimsels = fixed_1200000_ilimsel,
392 .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
394 .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
399 .n_voltages = ARRAY_SIZE(dcdc3_voltages),
400 .voltages = dcdc3_voltages,
401 .n_ilimsels = ARRAY_SIZE(fixed_1200000_ilimsel),
402 .ilimsels = fixed_1200000_ilimsel,
403 .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
405 .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
410 .n_voltages = ARRAY_SIZE(ldo1_voltages),
411 .voltages = ldo1_voltages,
412 .n_ilimsels = ARRAY_SIZE(ldo_ilimsel),
413 .ilimsels = ldo_ilimsel,
414 .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
416 .voltage = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
418 .ilimsel = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
423 .n_voltages = ARRAY_SIZE(ldo2_voltages),
424 .voltages = ldo2_voltages,
425 .n_ilimsels = ARRAY_SIZE(ldo_ilimsel),
426 .ilimsels = ldo_ilimsel,
427 .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
429 .voltage = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
431 .ilimsel = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
436 .n_voltages = ARRAY_SIZE(fixed_5000000_voltage),
437 .voltages = fixed_5000000_voltage,
438 .n_ilimsels = ARRAY_SIZE(usb_ilimsel),
439 .ilimsels = usb_ilimsel,
440 .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
442 .ilimsel = __MK_FIELD(REG_USB, USB_ILIM_MASK,
447 .n_voltages = ARRAY_SIZE(fixed_5000000_voltage),
448 .voltages = fixed_5000000_voltage,
449 .n_ilimsels = ARRAY_SIZE(fixed_400000_ilimsel),
450 .ilimsels = fixed_400000_ilimsel,
451 .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
456 static int set_voltage_sel(struct regulator_dev *rdev, unsigned selector)
458 const struct supply_info *info;
461 hw = rdev_get_drvdata(rdev);
462 info = &supply_info[rdev_get_id(rdev)];
464 if (rdev->desc->n_voltages == 1)
467 return write_field(hw, &info->voltage, selector);
470 static int get_voltage_sel(struct regulator_dev *rdev)
472 const struct supply_info *info;
476 hw = rdev_get_drvdata(rdev);
477 info = &supply_info[rdev_get_id(rdev)];
479 if (rdev->desc->n_voltages == 1)
482 ret = read_field(hw, &info->voltage);
485 if (WARN_ON(ret >= info->n_voltages))
491 static int set_current_limit(struct regulator_dev *rdev, int min_uA,
494 const struct supply_info *info;
498 hw = rdev_get_drvdata(rdev);
499 info = &supply_info[rdev_get_id(rdev)];
501 if (info->n_ilimsels == 1)
504 for (i = info->n_ilimsels - 1; i >= 0; i--) {
505 if (min_uA <= info->ilimsels[i] &&
506 max_uA >= info->ilimsels[i])
507 return write_field(hw, &info->ilimsel, i);
513 static int get_current_limit(struct regulator_dev *rdev)
515 const struct supply_info *info;
519 hw = rdev_get_drvdata(rdev);
520 info = &supply_info[rdev_get_id(rdev)];
522 if (info->n_ilimsels == 1)
523 return info->ilimsels[0];
525 ret = read_field(hw, &info->ilimsel);
528 if (WARN_ON(ret >= info->n_ilimsels))
531 return info->ilimsels[ret];
534 static int enable_supply(struct regulator_dev *rdev)
536 const struct supply_info *info;
539 hw = rdev_get_drvdata(rdev);
540 info = &supply_info[rdev_get_id(rdev)];
542 return write_field(hw, &info->enable, 1);
545 static int disable_supply(struct regulator_dev *rdev)
547 const struct supply_info *info;
550 hw = rdev_get_drvdata(rdev);
551 info = &supply_info[rdev_get_id(rdev)];
553 return write_field(hw, &info->enable, 0);
556 static int is_supply_enabled(struct regulator_dev *rdev)
558 const struct supply_info *info;
561 hw = rdev_get_drvdata(rdev);
562 info = &supply_info[rdev_get_id(rdev)];
564 return read_field(hw, &info->enable);
567 static const struct regulator_ops regulator_ops = {
568 .is_enabled = is_supply_enabled,
569 .enable = enable_supply,
570 .disable = disable_supply,
571 .get_voltage_sel = get_voltage_sel,
572 .set_voltage_sel = set_voltage_sel,
573 .list_voltage = regulator_list_voltage_table,
574 .map_voltage = regulator_map_voltage_ascend,
575 .set_current_limit = set_current_limit,
576 .get_current_limit = get_current_limit,
579 static int pmic_probe(struct spi_device *spi)
582 struct device *dev = &spi->dev;
583 const struct supply_info *info = supply_info;
584 struct regulator_init_data *init_data;
585 struct regulator_config config = { };
586 struct regulator_dev *rdev;
589 init_data = dev_get_platdata(dev);
591 dev_err(dev, "could not find regulator platform data\n");
595 hw = devm_kzalloc(&spi->dev, sizeof(struct tps6524x), GFP_KERNEL);
599 spi_set_drvdata(spi, hw);
601 memset(hw, 0, sizeof(struct tps6524x));
604 mutex_init(&hw->lock);
606 for (i = 0; i < N_REGULATORS; i++, info++, init_data++) {
607 hw->desc[i].name = info->name;
609 hw->desc[i].n_voltages = info->n_voltages;
610 hw->desc[i].volt_table = info->voltages;
611 hw->desc[i].ops = ®ulator_ops;
612 hw->desc[i].type = REGULATOR_VOLTAGE;
613 hw->desc[i].owner = THIS_MODULE;
616 config.init_data = init_data;
617 config.driver_data = hw;
619 rdev = devm_regulator_register(dev, &hw->desc[i], &config);
621 return PTR_ERR(rdev);
627 static struct spi_driver pmic_driver = {
634 module_spi_driver(pmic_driver);
636 MODULE_DESCRIPTION("TPS6524X PMIC Driver");
637 MODULE_AUTHOR("Cyril Chemparathy");
638 MODULE_LICENSE("GPL");
639 MODULE_ALIAS("spi:tps6524x");