16 #include <linux/kernel.h>
17 #include <linux/module.h>
19 #include <linux/errno.h>
20 #include <linux/slab.h>
25 #define REG_LDO_SET 0x0
26 #define LDO_ILIM_MASK 1
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)
151 spi_message_init(&m);
157 spi_message_add_tail(&t[0], &m);
162 spi_message_add_tail(&t[1], &m);
167 spi_message_add_tail(&t[2], &m);
173 dev_dbg(hw->
dev,
"read reg %d, data %x, status %x\n",
190 ret = __read_reg(hw, reg);
204 spi_message_init(&
m);
209 t[0].bits_per_word = 12;
210 spi_message_add_tail(&
t[0], &
m);
214 t[1].bits_per_word = 16;
215 spi_message_add_tail(&
t[1], &
m);
219 t[2].bits_per_word = 4;
220 spi_message_add_tail(&
t[2], &
m);
226 dev_dbg(hw->
dev,
"wrote reg %d, data %x, status %x\n",
238 static int __rmw_reg(
struct tps6524x *hw,
int reg,
int mask,
int val)
242 ret = __read_reg(hw, reg);
249 ret = __write_reg(hw, reg, ret);
251 return (ret < 0) ? ret : 0;
254 static int rmw_protect(
struct tps6524x *hw,
int reg,
int mask,
int val)
262 dev_err(hw->
dev,
"failed to set write enable\n");
266 ret = __rmw_reg(hw, reg, mask, val);
268 dev_err(hw->
dev,
"failed to rmw register %d\n", reg);
272 dev_err(hw->
dev,
"failed to clear write enable\n");
290 return (tmp >> field->
shift) & field->
mask;
293 static int write_field(
struct tps6524x *hw,
const struct field *field,
296 if (val & ~field->
mask)
299 return rmw_protect(hw, field->
reg,
301 val << field->
shift);
304 static const unsigned int dcdc1_voltages[] = {
305 800000, 825000, 850000, 875000,
306 900000, 925000, 950000, 975000,
307 1000000, 1025000, 1050000, 1075000,
308 1100000, 1125000, 1150000, 1175000,
309 1200000, 1225000, 1250000, 1275000,
310 1300000, 1325000, 1350000, 1375000,
311 1400000, 1425000, 1450000, 1475000,
312 1500000, 1525000, 1550000, 1575000,
315 static const unsigned int dcdc2_voltages[] = {
316 1400000, 1450000, 1500000, 1550000,
317 1600000, 1650000, 1700000, 1750000,
318 1800000, 1850000, 1900000, 1950000,
319 2000000, 2050000, 2100000, 2150000,
320 2200000, 2250000, 2300000, 2350000,
321 2400000, 2450000, 2500000, 2550000,
322 2600000, 2650000, 2700000, 2750000,
323 2800000, 2850000, 2900000, 2950000,
326 static const unsigned int dcdc3_voltages[] = {
327 2400000, 2450000, 2500000, 2550000, 2600000,
328 2650000, 2700000, 2750000, 2800000, 2850000,
329 2900000, 2950000, 3000000, 3050000, 3100000,
330 3150000, 3200000, 3250000, 3300000, 3350000,
331 3400000, 3450000, 3500000, 3550000, 3600000,
334 static const unsigned int ldo1_voltages[] = {
335 4300000, 4350000, 4400000, 4450000,
336 4500000, 4550000, 4600000, 4650000,
337 4700000, 4750000, 4800000, 4850000,
338 4900000, 4950000, 5000000, 5050000,
341 static const unsigned int ldo2_voltages[] = {
342 1100000, 1150000, 1200000, 1250000,
343 1300000, 1700000, 1750000, 1800000,
344 1850000, 1900000, 3150000, 3200000,
345 3250000, 3300000, 3350000, 3400000,
348 static const unsigned int fixed_5000000_voltage[] = {
352 static const unsigned int ldo_ilimsel[] = {
356 static const unsigned int usb_ilimsel[] = {
357 200000, 400000, 800000, 1000000
360 static const unsigned int fixed_2400000_ilimsel[] = {
364 static const unsigned int fixed_1200000_ilimsel[] = {
368 static const unsigned int fixed_400000_ilimsel[] = {
372 #define __MK_FIELD(_reg, _mask, _shift) \
373 { .reg = (_reg), .mask = (_mask), .shift = (_shift), }
379 .voltages = dcdc1_voltages,
380 .n_ilimsels =
ARRAY_SIZE(fixed_2400000_ilimsel),
381 .ilimsels = fixed_2400000_ilimsel,
390 .voltages = dcdc2_voltages,
391 .n_ilimsels =
ARRAY_SIZE(fixed_1200000_ilimsel),
392 .ilimsels = fixed_1200000_ilimsel,
401 .voltages = dcdc3_voltages,
402 .n_ilimsels =
ARRAY_SIZE(fixed_1200000_ilimsel),
403 .ilimsels = fixed_1200000_ilimsel,
412 .voltages = ldo1_voltages,
414 .ilimsels = ldo_ilimsel,
425 .voltages = ldo2_voltages,
427 .ilimsels = ldo_ilimsel,
437 .n_voltages =
ARRAY_SIZE(fixed_5000000_voltage),
438 .voltages = fixed_5000000_voltage,
440 .ilimsels = usb_ilimsel,
448 .n_voltages =
ARRAY_SIZE(fixed_5000000_voltage),
449 .voltages = fixed_5000000_voltage,
450 .n_ilimsels =
ARRAY_SIZE(fixed_400000_ilimsel),
451 .ilimsels = fixed_400000_ilimsel,
459 const struct supply_info *
info;
465 if (rdev->
desc->n_voltages == 1)
468 return write_field(hw, &info->voltage, selector);
473 const struct supply_info *
info;
480 if (rdev->
desc->n_voltages == 1)
483 ret = read_field(hw, &info->voltage);
492 static int set_current_limit(
struct regulator_dev *rdev,
int min_uA,
495 const struct supply_info *
info;
506 if (min_uA <= info->ilimsels[i] &&
508 return write_field(hw, &info->
ilimsel, i);
516 const struct supply_info *
info;
526 ret = read_field(hw, &info->
ilimsel);
537 const struct supply_info *
info;
543 return write_field(hw, &info->enable, 1);
548 const struct supply_info *
info;
554 return write_field(hw, &info->enable, 0);
559 const struct supply_info *
info;
565 return read_field(hw, &info->enable);
570 .enable = enable_supply,
571 .disable = disable_supply,
581 struct tps6524x *hw = spi_get_drvdata(spi);
591 spi_set_drvdata(spi,
NULL);
599 const struct supply_info *info = supply_info;
606 dev_err(dev,
"could not find regulator platform data\n");
612 dev_err(dev,
"cannot allocate regulator private data\n");
615 spi_set_drvdata(spi, hw);
619 hw->
spi = spi_dev_get(spi);
622 for (i = 0; i <
N_REGULATORS; i++, info++, init_data++) {
623 hw->
desc[
i].name = info->name;
625 hw->
desc[
i].n_voltages = info->n_voltages;
626 hw->
desc[
i].volt_table = info->voltages;
627 hw->
desc[
i].ops = ®ulator_ops;
636 if (IS_ERR(hw->
rdev[i])) {
637 ret = PTR_ERR(hw->
rdev[i]);