Linux-libre 5.4.47-gnu
[librecmc/linux-libre.git] / drivers / regulator / tps6524x-regulator.c
1 /*
2  * Regulator driver for TPS6524x PMIC
3  *
4  * Copyright (C) 2010 Texas Instruments
5  *
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.
9  *
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.
14  */
15
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>
24
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
32
33 #define REG_BLOCK_EN            0x1
34 #define BLOCK_MASK              1
35 #define BLOCK_LDO1_SHIFT        0
36 #define BLOCK_LDO2_SHIFT        1
37 #define BLOCK_LCD_SHIFT         2
38 #define BLOCK_USB_SHIFT         3
39
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
45
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)
54
55 #define REG_USB                 0x4
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)
64
65 #define REG_ALARM               0x5
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)
78
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)
91
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)
103
104 #define REG_SOFTWARE_RESET      0xb
105 #define REG_WRITE_ENABLE        0xd
106 #define REG_REV_ID              0xf
107
108 #define N_DCDC                  3
109 #define N_LDO                   2
110 #define N_SWITCH                2
111 #define N_REGULATORS            (N_DCDC + N_LDO + N_SWITCH)
112
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)
119
120 struct field {
121         int             reg;
122         int             shift;
123         int             mask;
124 };
125
126 struct supply_info {
127         const char      *name;
128         int             n_voltages;
129         const unsigned int *voltages;
130         int             n_ilimsels;
131         const unsigned int *ilimsels;
132         struct field    enable, voltage, ilimsel;
133 };
134
135 struct tps6524x {
136         struct device           *dev;
137         struct spi_device       *spi;
138         struct mutex            lock;
139         struct regulator_desc   desc[N_REGULATORS];
140 };
141
142 static int __read_reg(struct tps6524x *hw, int reg)
143 {
144         int error = 0;
145         u16 cmd = CMD_READ(reg), in;
146         u8 status;
147         struct spi_message m;
148         struct spi_transfer t[3];
149
150         spi_message_init(&m);
151         memset(t, 0, sizeof(t));
152
153         t[0].tx_buf = &cmd;
154         t[0].len = 2;
155         t[0].bits_per_word = 12;
156         spi_message_add_tail(&t[0], &m);
157
158         t[1].rx_buf = &in;
159         t[1].len = 2;
160         t[1].bits_per_word = 16;
161         spi_message_add_tail(&t[1], &m);
162
163         t[2].rx_buf = &status;
164         t[2].len = 1;
165         t[2].bits_per_word = 4;
166         spi_message_add_tail(&t[2], &m);
167
168         error = spi_sync(hw->spi, &m);
169         if (error < 0)
170                 return error;
171
172         dev_dbg(hw->dev, "read reg %d, data %x, status %x\n",
173                 reg, in, status);
174
175         if (!(status & STAT_CLK) || (status & STAT_WRITE))
176                 return -EIO;
177
178         if (status & STAT_INVALID)
179                 return -EINVAL;
180
181         return in;
182 }
183
184 static int read_reg(struct tps6524x *hw, int reg)
185 {
186         int ret;
187
188         mutex_lock(&hw->lock);
189         ret = __read_reg(hw, reg);
190         mutex_unlock(&hw->lock);
191
192         return ret;
193 }
194
195 static int __write_reg(struct tps6524x *hw, int reg, int val)
196 {
197         int error = 0;
198         u16 cmd = CMD_WRITE(reg), out = val;
199         u8 status;
200         struct spi_message m;
201         struct spi_transfer t[3];
202
203         spi_message_init(&m);
204         memset(t, 0, sizeof(t));
205
206         t[0].tx_buf = &cmd;
207         t[0].len = 2;
208         t[0].bits_per_word = 12;
209         spi_message_add_tail(&t[0], &m);
210
211         t[1].tx_buf = &out;
212         t[1].len = 2;
213         t[1].bits_per_word = 16;
214         spi_message_add_tail(&t[1], &m);
215
216         t[2].rx_buf = &status;
217         t[2].len = 1;
218         t[2].bits_per_word = 4;
219         spi_message_add_tail(&t[2], &m);
220
221         error = spi_sync(hw->spi, &m);
222         if (error < 0)
223                 return error;
224
225         dev_dbg(hw->dev, "wrote reg %d, data %x, status %x\n",
226                 reg, out, status);
227
228         if (!(status & STAT_CLK) || !(status & STAT_WRITE))
229                 return -EIO;
230
231         if (status & (STAT_INVALID | STAT_WP))
232                 return -EINVAL;
233
234         return error;
235 }
236
237 static int __rmw_reg(struct tps6524x *hw, int reg, int mask, int val)
238 {
239         int ret;
240
241         ret = __read_reg(hw, reg);
242         if (ret < 0)
243                 return ret;
244
245         ret &= ~mask;
246         ret |= val;
247
248         ret = __write_reg(hw, reg, ret);
249
250         return (ret < 0) ? ret : 0;
251 }
252
253 static int rmw_protect(struct tps6524x *hw, int reg, int mask, int val)
254 {
255         int ret;
256
257         mutex_lock(&hw->lock);
258
259         ret = __write_reg(hw, REG_WRITE_ENABLE, 1);
260         if (ret) {
261                 dev_err(hw->dev, "failed to set write enable\n");
262                 goto error;
263         }
264
265         ret = __rmw_reg(hw, reg, mask, val);
266         if (ret)
267                 dev_err(hw->dev, "failed to rmw register %d\n", reg);
268
269         ret = __write_reg(hw, REG_WRITE_ENABLE, 0);
270         if (ret) {
271                 dev_err(hw->dev, "failed to clear write enable\n");
272                 goto error;
273         }
274
275 error:
276         mutex_unlock(&hw->lock);
277
278         return ret;
279 }
280
281 static int read_field(struct tps6524x *hw, const struct field *field)
282 {
283         int tmp;
284
285         tmp = read_reg(hw, field->reg);
286         if (tmp < 0)
287                 return tmp;
288
289         return (tmp >> field->shift) & field->mask;
290 }
291
292 static int write_field(struct tps6524x *hw, const struct field *field,
293                        int val)
294 {
295         if (val & ~field->mask)
296                 return -EOVERFLOW;
297
298         return rmw_protect(hw, field->reg,
299                                     field->mask << field->shift,
300                                     val << field->shift);
301 }
302
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,
312 };
313
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,
323 };
324
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,
331 };
332
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,
338 };
339
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,
345 };
346
347 static const unsigned int fixed_5000000_voltage[] = {
348         5000000
349 };
350
351 static const unsigned int ldo_ilimsel[] = {
352         400000, 1500000
353 };
354
355 static const unsigned int usb_ilimsel[] = {
356         200000, 400000, 800000, 1000000
357 };
358
359 static const unsigned int fixed_2400000_ilimsel[] = {
360         2400000
361 };
362
363 static const unsigned int fixed_1200000_ilimsel[] = {
364         1200000
365 };
366
367 static const unsigned int fixed_400000_ilimsel[] = {
368         400000
369 };
370
371 #define __MK_FIELD(_reg, _mask, _shift) \
372         { .reg = (_reg), .mask = (_mask), .shift = (_shift), }
373
374 static const struct supply_info supply_info[N_REGULATORS] = {
375         {
376                 .name           = "DCDC1",
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,
382                                              DCDCDCDC1_EN_SHIFT),
383                 .voltage        = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
384                                              DCDC_VDCDC1_SHIFT),
385         },
386         {
387                 .name           = "DCDC2",
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,
393                                              DCDCDCDC2_EN_SHIFT),
394                 .voltage        = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
395                                              DCDC_VDCDC2_SHIFT),
396         },
397         {
398                 .name           = "DCDC3",
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,
404                                         DCDCDCDC3_EN_SHIFT),
405                 .voltage        = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
406                                              DCDC_VDCDC3_SHIFT),
407         },
408         {
409                 .name           = "LDO1",
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,
415                                              BLOCK_LDO1_SHIFT),
416                 .voltage        = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
417                                              LDO1_VSEL_SHIFT),
418                 .ilimsel        = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
419                                              LDO1_ILIM_SHIFT),
420         },
421         {
422                 .name           = "LDO2",
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,
428                                              BLOCK_LDO2_SHIFT),
429                 .voltage        = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
430                                              LDO2_VSEL_SHIFT),
431                 .ilimsel        = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
432                                              LDO2_ILIM_SHIFT),
433         },
434         {
435                 .name           = "USB",
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,
441                                              BLOCK_USB_SHIFT),
442                 .ilimsel        = __MK_FIELD(REG_USB, USB_ILIM_MASK,
443                                              USB_ILIM_SHIFT),
444         },
445         {
446                 .name           = "LCD",
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,
452                                              BLOCK_LCD_SHIFT),
453         },
454 };
455
456 static int set_voltage_sel(struct regulator_dev *rdev, unsigned selector)
457 {
458         const struct supply_info *info;
459         struct tps6524x *hw;
460
461         hw      = rdev_get_drvdata(rdev);
462         info    = &supply_info[rdev_get_id(rdev)];
463
464         if (rdev->desc->n_voltages == 1)
465                 return -EINVAL;
466
467         return write_field(hw, &info->voltage, selector);
468 }
469
470 static int get_voltage_sel(struct regulator_dev *rdev)
471 {
472         const struct supply_info *info;
473         struct tps6524x *hw;
474         int ret;
475
476         hw      = rdev_get_drvdata(rdev);
477         info    = &supply_info[rdev_get_id(rdev)];
478
479         if (rdev->desc->n_voltages == 1)
480                 return 0;
481
482         ret = read_field(hw, &info->voltage);
483         if (ret < 0)
484                 return ret;
485         if (WARN_ON(ret >= info->n_voltages))
486                 return -EIO;
487
488         return ret;
489 }
490
491 static int set_current_limit(struct regulator_dev *rdev, int min_uA,
492                              int max_uA)
493 {
494         const struct supply_info *info;
495         struct tps6524x *hw;
496         int i;
497
498         hw      = rdev_get_drvdata(rdev);
499         info    = &supply_info[rdev_get_id(rdev)];
500
501         if (info->n_ilimsels == 1)
502                 return -EINVAL;
503
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);
508         }
509
510         return -EINVAL;
511 }
512
513 static int get_current_limit(struct regulator_dev *rdev)
514 {
515         const struct supply_info *info;
516         struct tps6524x *hw;
517         int ret;
518
519         hw      = rdev_get_drvdata(rdev);
520         info    = &supply_info[rdev_get_id(rdev)];
521
522         if (info->n_ilimsels == 1)
523                 return info->ilimsels[0];
524
525         ret = read_field(hw, &info->ilimsel);
526         if (ret < 0)
527                 return ret;
528         if (WARN_ON(ret >= info->n_ilimsels))
529                 return -EIO;
530
531         return info->ilimsels[ret];
532 }
533
534 static int enable_supply(struct regulator_dev *rdev)
535 {
536         const struct supply_info *info;
537         struct tps6524x *hw;
538
539         hw      = rdev_get_drvdata(rdev);
540         info    = &supply_info[rdev_get_id(rdev)];
541
542         return write_field(hw, &info->enable, 1);
543 }
544
545 static int disable_supply(struct regulator_dev *rdev)
546 {
547         const struct supply_info *info;
548         struct tps6524x *hw;
549
550         hw      = rdev_get_drvdata(rdev);
551         info    = &supply_info[rdev_get_id(rdev)];
552
553         return write_field(hw, &info->enable, 0);
554 }
555
556 static int is_supply_enabled(struct regulator_dev *rdev)
557 {
558         const struct supply_info *info;
559         struct tps6524x *hw;
560
561         hw      = rdev_get_drvdata(rdev);
562         info    = &supply_info[rdev_get_id(rdev)];
563
564         return read_field(hw, &info->enable);
565 }
566
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,
577 };
578
579 static int pmic_probe(struct spi_device *spi)
580 {
581         struct tps6524x *hw;
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;
587         int i;
588
589         init_data = dev_get_platdata(dev);
590         if (!init_data) {
591                 dev_err(dev, "could not find regulator platform data\n");
592                 return -EINVAL;
593         }
594
595         hw = devm_kzalloc(&spi->dev, sizeof(struct tps6524x), GFP_KERNEL);
596         if (!hw)
597                 return -ENOMEM;
598
599         spi_set_drvdata(spi, hw);
600
601         memset(hw, 0, sizeof(struct tps6524x));
602         hw->dev = dev;
603         hw->spi = spi;
604         mutex_init(&hw->lock);
605
606         for (i = 0; i < N_REGULATORS; i++, info++, init_data++) {
607                 hw->desc[i].name        = info->name;
608                 hw->desc[i].id          = i;
609                 hw->desc[i].n_voltages  = info->n_voltages;
610                 hw->desc[i].volt_table  = info->voltages;
611                 hw->desc[i].ops         = &regulator_ops;
612                 hw->desc[i].type        = REGULATOR_VOLTAGE;
613                 hw->desc[i].owner       = THIS_MODULE;
614
615                 config.dev = dev;
616                 config.init_data = init_data;
617                 config.driver_data = hw;
618
619                 rdev = devm_regulator_register(dev, &hw->desc[i], &config);
620                 if (IS_ERR(rdev))
621                         return PTR_ERR(rdev);
622         }
623
624         return 0;
625 }
626
627 static struct spi_driver pmic_driver = {
628         .probe          = pmic_probe,
629         .driver         = {
630                 .name   = "tps6524x",
631         },
632 };
633
634 module_spi_driver(pmic_driver);
635
636 MODULE_DESCRIPTION("TPS6524X PMIC Driver");
637 MODULE_AUTHOR("Cyril Chemparathy");
638 MODULE_LICENSE("GPL");
639 MODULE_ALIAS("spi:tps6524x");