Version:  2.0.40 2.2.26 2.4.37 2.6.39 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15

Linux/drivers/regulator/lp872x.c

  1 /*
  2  * Copyright 2012 Texas Instruments
  3  *
  4  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
  5  *
  6  * This program is free software; you can redistribute it and/or modify
  7  * it under the terms of the GNU General Public License version 2 as
  8  * published by the Free Software Foundation.
  9  *
 10  */
 11 
 12 #include <linux/module.h>
 13 #include <linux/slab.h>
 14 #include <linux/i2c.h>
 15 #include <linux/regmap.h>
 16 #include <linux/err.h>
 17 #include <linux/gpio.h>
 18 #include <linux/regulator/lp872x.h>
 19 #include <linux/regulator/driver.h>
 20 #include <linux/platform_device.h>
 21 #include <linux/of.h>
 22 #include <linux/of_gpio.h>
 23 #include <linux/regulator/of_regulator.h>
 24 
 25 /* Registers : LP8720/8725 shared */
 26 #define LP872X_GENERAL_CFG              0x00
 27 #define LP872X_LDO1_VOUT                0x01
 28 #define LP872X_LDO2_VOUT                0x02
 29 #define LP872X_LDO3_VOUT                0x03
 30 #define LP872X_LDO4_VOUT                0x04
 31 #define LP872X_LDO5_VOUT                0x05
 32 
 33 /* Registers : LP8720 */
 34 #define LP8720_BUCK_VOUT1               0x06
 35 #define LP8720_BUCK_VOUT2               0x07
 36 #define LP8720_ENABLE                   0x08
 37 
 38 /* Registers : LP8725 */
 39 #define LP8725_LILO1_VOUT               0x06
 40 #define LP8725_LILO2_VOUT               0x07
 41 #define LP8725_BUCK1_VOUT1              0x08
 42 #define LP8725_BUCK1_VOUT2              0x09
 43 #define LP8725_BUCK2_VOUT1              0x0A
 44 #define LP8725_BUCK2_VOUT2              0x0B
 45 #define LP8725_BUCK_CTRL                0x0C
 46 #define LP8725_LDO_CTRL                 0x0D
 47 
 48 /* Mask/shift : LP8720/LP8725 shared */
 49 #define LP872X_VOUT_M                   0x1F
 50 #define LP872X_START_DELAY_M            0xE0
 51 #define LP872X_START_DELAY_S            5
 52 #define LP872X_EN_LDO1_M                BIT(0)
 53 #define LP872X_EN_LDO2_M                BIT(1)
 54 #define LP872X_EN_LDO3_M                BIT(2)
 55 #define LP872X_EN_LDO4_M                BIT(3)
 56 #define LP872X_EN_LDO5_M                BIT(4)
 57 
 58 /* Mask/shift : LP8720 */
 59 #define LP8720_TIMESTEP_S               0               /* Addr 00h */
 60 #define LP8720_TIMESTEP_M               BIT(0)
 61 #define LP8720_EXT_DVS_M                BIT(2)
 62 #define LP8720_BUCK_FPWM_S              5               /* Addr 07h */
 63 #define LP8720_BUCK_FPWM_M              BIT(5)
 64 #define LP8720_EN_BUCK_M                BIT(5)          /* Addr 08h */
 65 #define LP8720_DVS_SEL_M                BIT(7)
 66 
 67 /* Mask/shift : LP8725 */
 68 #define LP8725_TIMESTEP_M               0xC0            /* Addr 00h */
 69 #define LP8725_TIMESTEP_S               6
 70 #define LP8725_BUCK1_EN_M               BIT(0)
 71 #define LP8725_DVS1_M                   BIT(2)
 72 #define LP8725_DVS2_M                   BIT(3)
 73 #define LP8725_BUCK2_EN_M               BIT(4)
 74 #define LP8725_BUCK_CL_M                0xC0            /* Addr 09h, 0Bh */
 75 #define LP8725_BUCK_CL_S                6
 76 #define LP8725_BUCK1_FPWM_S             1               /* Addr 0Ch */
 77 #define LP8725_BUCK1_FPWM_M             BIT(1)
 78 #define LP8725_BUCK2_FPWM_S             5
 79 #define LP8725_BUCK2_FPWM_M             BIT(5)
 80 #define LP8725_EN_LILO1_M               BIT(5)          /* Addr 0Dh */
 81 #define LP8725_EN_LILO2_M               BIT(6)
 82 
 83 /* PWM mode */
 84 #define LP872X_FORCE_PWM                1
 85 #define LP872X_AUTO_PWM                 0
 86 
 87 #define LP8720_NUM_REGULATORS           6
 88 #define LP8725_NUM_REGULATORS           9
 89 #define EXTERN_DVS_USED                 0
 90 #define MAX_DELAY                       6
 91 
 92 /* Default DVS Mode */
 93 #define LP8720_DEFAULT_DVS              0
 94 #define LP8725_DEFAULT_DVS              BIT(2)
 95 
 96 /* dump registers in regmap-debugfs */
 97 #define MAX_REGISTERS                   0x0F
 98 
 99 enum lp872x_id {
100         LP8720,
101         LP8725,
102 };
103 
104 struct lp872x {
105         struct regmap *regmap;
106         struct device *dev;
107         enum lp872x_id chipid;
108         struct lp872x_platform_data *pdata;
109         struct regulator_dev **regulators;
110         int num_regulators;
111         enum lp872x_dvs_state dvs_pin;
112         int dvs_gpio;
113 };
114 
115 /* LP8720/LP8725 shared voltage table for LDOs */
116 static const unsigned int lp872x_ldo_vtbl[] = {
117         1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000,
118         1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 2000000,
119         2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2650000, 2700000,
120         2750000, 2800000, 2850000, 2900000, 2950000, 3000000, 3100000, 3300000,
121 };
122 
123 /* LP8720 LDO4 voltage table */
124 static const unsigned int lp8720_ldo4_vtbl[] = {
125          800000,  850000,  900000, 1000000, 1100000, 1200000, 1250000, 1300000,
126         1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
127         1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
128         2400000, 2500000, 2600000, 2650000, 2700000, 2750000, 2800000, 2850000,
129 };
130 
131 /* LP8725 LILO(Low Input Low Output) voltage table */
132 static const unsigned int lp8725_lilo_vtbl[] = {
133          800000,  850000,  900000,  950000, 1000000, 1050000, 1100000, 1150000,
134         1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
135         1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
136         2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
137 };
138 
139 /* LP8720 BUCK voltage table */
140 #define EXT_R           0       /* external resistor divider */
141 static const unsigned int lp8720_buck_vtbl[] = {
142           EXT_R,  800000,  850000,  900000,  950000, 1000000, 1050000, 1100000,
143         1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000,
144         1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000,
145         1950000, 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000,
146 };
147 
148 /* LP8725 BUCK voltage table */
149 static const unsigned int lp8725_buck_vtbl[] = {
150          800000,  850000,  900000,  950000, 1000000, 1050000, 1100000, 1150000,
151         1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
152         1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
153         2400000, 2500000, 2600000, 2700000, 2800000, 2850000, 2900000, 3000000,
154 };
155 
156 /* LP8725 BUCK current limit */
157 static const unsigned int lp8725_buck_uA[] = {
158         460000, 780000, 1050000, 1370000,
159 };
160 
161 static int lp872x_read_byte(struct lp872x *lp, u8 addr, u8 *data)
162 {
163         int ret;
164         unsigned int val;
165 
166         ret = regmap_read(lp->regmap, addr, &val);
167         if (ret < 0) {
168                 dev_err(lp->dev, "failed to read 0x%.2x\n", addr);
169                 return ret;
170         }
171 
172         *data = (u8)val;
173         return 0;
174 }
175 
176 static inline int lp872x_write_byte(struct lp872x *lp, u8 addr, u8 data)
177 {
178         return regmap_write(lp->regmap, addr, data);
179 }
180 
181 static inline int lp872x_update_bits(struct lp872x *lp, u8 addr,
182                                 unsigned int mask, u8 data)
183 {
184         return regmap_update_bits(lp->regmap, addr, mask, data);
185 }
186 
187 static int lp872x_get_timestep_usec(struct lp872x *lp)
188 {
189         enum lp872x_id chip = lp->chipid;
190         u8 val, mask, shift;
191         int *time_usec, size, ret;
192         int lp8720_time_usec[] = { 25, 50 };
193         int lp8725_time_usec[] = { 32, 64, 128, 256 };
194 
195         switch (chip) {
196         case LP8720:
197                 mask = LP8720_TIMESTEP_M;
198                 shift = LP8720_TIMESTEP_S;
199                 time_usec = &lp8720_time_usec[0];
200                 size = ARRAY_SIZE(lp8720_time_usec);
201                 break;
202         case LP8725:
203                 mask = LP8725_TIMESTEP_M;
204                 shift = LP8725_TIMESTEP_S;
205                 time_usec = &lp8725_time_usec[0];
206                 size = ARRAY_SIZE(lp8725_time_usec);
207                 break;
208         default:
209                 return -EINVAL;
210         }
211 
212         ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val);
213         if (ret)
214                 return ret;
215 
216         val = (val & mask) >> shift;
217         if (val >= size)
218                 return -EINVAL;
219 
220         return *(time_usec + val);
221 }
222 
223 static int lp872x_regulator_enable_time(struct regulator_dev *rdev)
224 {
225         struct lp872x *lp = rdev_get_drvdata(rdev);
226         enum lp872x_regulator_id rid = rdev_get_id(rdev);
227         int time_step_us = lp872x_get_timestep_usec(lp);
228         int ret;
229         u8 addr, val;
230 
231         if (time_step_us < 0)
232                 return time_step_us;
233 
234         switch (rid) {
235         case LP8720_ID_LDO1 ... LP8720_ID_BUCK:
236                 addr = LP872X_LDO1_VOUT + rid;
237                 break;
238         case LP8725_ID_LDO1 ... LP8725_ID_BUCK1:
239                 addr = LP872X_LDO1_VOUT + rid - LP8725_ID_BASE;
240                 break;
241         case LP8725_ID_BUCK2:
242                 addr = LP8725_BUCK2_VOUT1;
243                 break;
244         default:
245                 return -EINVAL;
246         }
247 
248         ret = lp872x_read_byte(lp, addr, &val);
249         if (ret)
250                 return ret;
251 
252         val = (val & LP872X_START_DELAY_M) >> LP872X_START_DELAY_S;
253 
254         return val > MAX_DELAY ? 0 : val * time_step_us;
255 }
256 
257 static void lp872x_set_dvs(struct lp872x *lp, enum lp872x_dvs_sel dvs_sel,
258                         int gpio)
259 {
260         enum lp872x_dvs_state state;
261 
262         state = dvs_sel == SEL_V1 ? DVS_HIGH : DVS_LOW;
263         gpio_set_value(gpio, state);
264         lp->dvs_pin = state;
265 }
266 
267 static u8 lp872x_select_buck_vout_addr(struct lp872x *lp,
268                                 enum lp872x_regulator_id buck)
269 {
270         u8 val, addr;
271 
272         if (lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val))
273                 return 0;
274 
275         switch (buck) {
276         case LP8720_ID_BUCK:
277                 if (val & LP8720_EXT_DVS_M) {
278                         addr = (lp->dvs_pin == DVS_HIGH) ?
279                                 LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
280                 } else {
281                         if (lp872x_read_byte(lp, LP8720_ENABLE, &val))
282                                 return 0;
283 
284                         addr = val & LP8720_DVS_SEL_M ?
285                                 LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
286                 }
287                 break;
288         case LP8725_ID_BUCK1:
289                 if (val & LP8725_DVS1_M)
290                         addr = LP8725_BUCK1_VOUT1;
291                 else
292                         addr = (lp->dvs_pin == DVS_HIGH) ?
293                                 LP8725_BUCK1_VOUT1 : LP8725_BUCK1_VOUT2;
294                 break;
295         case LP8725_ID_BUCK2:
296                 addr =  val & LP8725_DVS2_M ?
297                         LP8725_BUCK2_VOUT1 : LP8725_BUCK2_VOUT2;
298                 break;
299         default:
300                 return 0;
301         }
302 
303         return addr;
304 }
305 
306 static bool lp872x_is_valid_buck_addr(u8 addr)
307 {
308         switch (addr) {
309         case LP8720_BUCK_VOUT1:
310         case LP8720_BUCK_VOUT2:
311         case LP8725_BUCK1_VOUT1:
312         case LP8725_BUCK1_VOUT2:
313         case LP8725_BUCK2_VOUT1:
314         case LP8725_BUCK2_VOUT2:
315                 return true;
316         default:
317                 return false;
318         }
319 }
320 
321 static int lp872x_buck_set_voltage_sel(struct regulator_dev *rdev,
322                                         unsigned selector)
323 {
324         struct lp872x *lp = rdev_get_drvdata(rdev);
325         enum lp872x_regulator_id buck = rdev_get_id(rdev);
326         u8 addr, mask = LP872X_VOUT_M;
327         struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL;
328 
329         if (dvs && gpio_is_valid(dvs->gpio))
330                 lp872x_set_dvs(lp, dvs->vsel, dvs->gpio);
331 
332         addr = lp872x_select_buck_vout_addr(lp, buck);
333         if (!lp872x_is_valid_buck_addr(addr))
334                 return -EINVAL;
335 
336         return lp872x_update_bits(lp, addr, mask, selector);
337 }
338 
339 static int lp872x_buck_get_voltage_sel(struct regulator_dev *rdev)
340 {
341         struct lp872x *lp = rdev_get_drvdata(rdev);
342         enum lp872x_regulator_id buck = rdev_get_id(rdev);
343         u8 addr, val;
344         int ret;
345 
346         addr = lp872x_select_buck_vout_addr(lp, buck);
347         if (!lp872x_is_valid_buck_addr(addr))
348                 return -EINVAL;
349 
350         ret = lp872x_read_byte(lp, addr, &val);
351         if (ret)
352                 return ret;
353 
354         return val & LP872X_VOUT_M;
355 }
356 
357 static int lp8725_buck_set_current_limit(struct regulator_dev *rdev,
358                                         int min_uA, int max_uA)
359 {
360         struct lp872x *lp = rdev_get_drvdata(rdev);
361         enum lp872x_regulator_id buck = rdev_get_id(rdev);
362         int i;
363         u8 addr;
364 
365         switch (buck) {
366         case LP8725_ID_BUCK1:
367                 addr = LP8725_BUCK1_VOUT2;
368                 break;
369         case LP8725_ID_BUCK2:
370                 addr = LP8725_BUCK2_VOUT2;
371                 break;
372         default:
373                 return -EINVAL;
374         }
375 
376         for (i = ARRAY_SIZE(lp8725_buck_uA) - 1; i >= 0; i--) {
377                 if (lp8725_buck_uA[i] >= min_uA &&
378                         lp8725_buck_uA[i] <= max_uA)
379                         return lp872x_update_bits(lp, addr,
380                                                   LP8725_BUCK_CL_M,
381                                                   i << LP8725_BUCK_CL_S);
382         }
383 
384         return -EINVAL;
385 }
386 
387 static int lp8725_buck_get_current_limit(struct regulator_dev *rdev)
388 {
389         struct lp872x *lp = rdev_get_drvdata(rdev);
390         enum lp872x_regulator_id buck = rdev_get_id(rdev);
391         u8 addr, val;
392         int ret;
393 
394         switch (buck) {
395         case LP8725_ID_BUCK1:
396                 addr = LP8725_BUCK1_VOUT2;
397                 break;
398         case LP8725_ID_BUCK2:
399                 addr = LP8725_BUCK2_VOUT2;
400                 break;
401         default:
402                 return -EINVAL;
403         }
404 
405         ret = lp872x_read_byte(lp, addr, &val);
406         if (ret)
407                 return ret;
408 
409         val = (val & LP8725_BUCK_CL_M) >> LP8725_BUCK_CL_S;
410 
411         return (val < ARRAY_SIZE(lp8725_buck_uA)) ?
412                         lp8725_buck_uA[val] : -EINVAL;
413 }
414 
415 static int lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
416 {
417         struct lp872x *lp = rdev_get_drvdata(rdev);
418         enum lp872x_regulator_id buck = rdev_get_id(rdev);
419         u8 addr, mask, shift, val;
420 
421         switch (buck) {
422         case LP8720_ID_BUCK:
423                 addr = LP8720_BUCK_VOUT2;
424                 mask = LP8720_BUCK_FPWM_M;
425                 shift = LP8720_BUCK_FPWM_S;
426                 break;
427         case LP8725_ID_BUCK1:
428                 addr = LP8725_BUCK_CTRL;
429                 mask = LP8725_BUCK1_FPWM_M;
430                 shift = LP8725_BUCK1_FPWM_S;
431                 break;
432         case LP8725_ID_BUCK2:
433                 addr = LP8725_BUCK_CTRL;
434                 mask = LP8725_BUCK2_FPWM_M;
435                 shift = LP8725_BUCK2_FPWM_S;
436                 break;
437         default:
438                 return -EINVAL;
439         }
440 
441         if (mode == REGULATOR_MODE_FAST)
442                 val = LP872X_FORCE_PWM << shift;
443         else if (mode == REGULATOR_MODE_NORMAL)
444                 val = LP872X_AUTO_PWM << shift;
445         else
446                 return -EINVAL;
447 
448         return lp872x_update_bits(lp, addr, mask, val);
449 }
450 
451 static unsigned int lp872x_buck_get_mode(struct regulator_dev *rdev)
452 {
453         struct lp872x *lp = rdev_get_drvdata(rdev);
454         enum lp872x_regulator_id buck = rdev_get_id(rdev);
455         u8 addr, mask, val;
456         int ret;
457 
458         switch (buck) {
459         case LP8720_ID_BUCK:
460                 addr = LP8720_BUCK_VOUT2;
461                 mask = LP8720_BUCK_FPWM_M;
462                 break;
463         case LP8725_ID_BUCK1:
464                 addr = LP8725_BUCK_CTRL;
465                 mask = LP8725_BUCK1_FPWM_M;
466                 break;
467         case LP8725_ID_BUCK2:
468                 addr = LP8725_BUCK_CTRL;
469                 mask = LP8725_BUCK2_FPWM_M;
470                 break;
471         default:
472                 return -EINVAL;
473         }
474 
475         ret = lp872x_read_byte(lp, addr, &val);
476         if (ret)
477                 return ret;
478 
479         return val & mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
480 }
481 
482 static struct regulator_ops lp872x_ldo_ops = {
483         .list_voltage = regulator_list_voltage_table,
484         .map_voltage = regulator_map_voltage_ascend,
485         .set_voltage_sel = regulator_set_voltage_sel_regmap,
486         .get_voltage_sel = regulator_get_voltage_sel_regmap,
487         .enable = regulator_enable_regmap,
488         .disable = regulator_disable_regmap,
489         .is_enabled = regulator_is_enabled_regmap,
490         .enable_time = lp872x_regulator_enable_time,
491 };
492 
493 static struct regulator_ops lp8720_buck_ops = {
494         .list_voltage = regulator_list_voltage_table,
495         .map_voltage = regulator_map_voltage_ascend,
496         .set_voltage_sel = lp872x_buck_set_voltage_sel,
497         .get_voltage_sel = lp872x_buck_get_voltage_sel,
498         .enable = regulator_enable_regmap,
499         .disable = regulator_disable_regmap,
500         .is_enabled = regulator_is_enabled_regmap,
501         .enable_time = lp872x_regulator_enable_time,
502         .set_mode = lp872x_buck_set_mode,
503         .get_mode = lp872x_buck_get_mode,
504 };
505 
506 static struct regulator_ops lp8725_buck_ops = {
507         .list_voltage = regulator_list_voltage_table,
508         .map_voltage = regulator_map_voltage_ascend,
509         .set_voltage_sel = lp872x_buck_set_voltage_sel,
510         .get_voltage_sel = lp872x_buck_get_voltage_sel,
511         .enable = regulator_enable_regmap,
512         .disable = regulator_disable_regmap,
513         .is_enabled = regulator_is_enabled_regmap,
514         .enable_time = lp872x_regulator_enable_time,
515         .set_mode = lp872x_buck_set_mode,
516         .get_mode = lp872x_buck_get_mode,
517         .set_current_limit = lp8725_buck_set_current_limit,
518         .get_current_limit = lp8725_buck_get_current_limit,
519 };
520 
521 static struct regulator_desc lp8720_regulator_desc[] = {
522         {
523                 .name = "ldo1",
524                 .id = LP8720_ID_LDO1,
525                 .ops = &lp872x_ldo_ops,
526                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
527                 .volt_table = lp872x_ldo_vtbl,
528                 .type = REGULATOR_VOLTAGE,
529                 .owner = THIS_MODULE,
530                 .vsel_reg = LP872X_LDO1_VOUT,
531                 .vsel_mask = LP872X_VOUT_M,
532                 .enable_reg = LP8720_ENABLE,
533                 .enable_mask = LP872X_EN_LDO1_M,
534         },
535         {
536                 .name = "ldo2",
537                 .id = LP8720_ID_LDO2,
538                 .ops = &lp872x_ldo_ops,
539                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
540                 .volt_table = lp872x_ldo_vtbl,
541                 .type = REGULATOR_VOLTAGE,
542                 .owner = THIS_MODULE,
543                 .vsel_reg = LP872X_LDO2_VOUT,
544                 .vsel_mask = LP872X_VOUT_M,
545                 .enable_reg = LP8720_ENABLE,
546                 .enable_mask = LP872X_EN_LDO2_M,
547         },
548         {
549                 .name = "ldo3",
550                 .id = LP8720_ID_LDO3,
551                 .ops = &lp872x_ldo_ops,
552                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
553                 .volt_table = lp872x_ldo_vtbl,
554                 .type = REGULATOR_VOLTAGE,
555                 .owner = THIS_MODULE,
556                 .vsel_reg = LP872X_LDO3_VOUT,
557                 .vsel_mask = LP872X_VOUT_M,
558                 .enable_reg = LP8720_ENABLE,
559                 .enable_mask = LP872X_EN_LDO3_M,
560         },
561         {
562                 .name = "ldo4",
563                 .id = LP8720_ID_LDO4,
564                 .ops = &lp872x_ldo_ops,
565                 .n_voltages = ARRAY_SIZE(lp8720_ldo4_vtbl),
566                 .volt_table = lp8720_ldo4_vtbl,
567                 .type = REGULATOR_VOLTAGE,
568                 .owner = THIS_MODULE,
569                 .vsel_reg = LP872X_LDO4_VOUT,
570                 .vsel_mask = LP872X_VOUT_M,
571                 .enable_reg = LP8720_ENABLE,
572                 .enable_mask = LP872X_EN_LDO4_M,
573         },
574         {
575                 .name = "ldo5",
576                 .id = LP8720_ID_LDO5,
577                 .ops = &lp872x_ldo_ops,
578                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
579                 .volt_table = lp872x_ldo_vtbl,
580                 .type = REGULATOR_VOLTAGE,
581                 .owner = THIS_MODULE,
582                 .vsel_reg = LP872X_LDO5_VOUT,
583                 .vsel_mask = LP872X_VOUT_M,
584                 .enable_reg = LP8720_ENABLE,
585                 .enable_mask = LP872X_EN_LDO5_M,
586         },
587         {
588                 .name = "buck",
589                 .id = LP8720_ID_BUCK,
590                 .ops = &lp8720_buck_ops,
591                 .n_voltages = ARRAY_SIZE(lp8720_buck_vtbl),
592                 .volt_table = lp8720_buck_vtbl,
593                 .type = REGULATOR_VOLTAGE,
594                 .owner = THIS_MODULE,
595                 .enable_reg = LP8720_ENABLE,
596                 .enable_mask = LP8720_EN_BUCK_M,
597         },
598 };
599 
600 static struct regulator_desc lp8725_regulator_desc[] = {
601         {
602                 .name = "ldo1",
603                 .id = LP8725_ID_LDO1,
604                 .ops = &lp872x_ldo_ops,
605                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
606                 .volt_table = lp872x_ldo_vtbl,
607                 .type = REGULATOR_VOLTAGE,
608                 .owner = THIS_MODULE,
609                 .vsel_reg = LP872X_LDO1_VOUT,
610                 .vsel_mask = LP872X_VOUT_M,
611                 .enable_reg = LP8725_LDO_CTRL,
612                 .enable_mask = LP872X_EN_LDO1_M,
613         },
614         {
615                 .name = "ldo2",
616                 .id = LP8725_ID_LDO2,
617                 .ops = &lp872x_ldo_ops,
618                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
619                 .volt_table = lp872x_ldo_vtbl,
620                 .type = REGULATOR_VOLTAGE,
621                 .owner = THIS_MODULE,
622                 .vsel_reg = LP872X_LDO2_VOUT,
623                 .vsel_mask = LP872X_VOUT_M,
624                 .enable_reg = LP8725_LDO_CTRL,
625                 .enable_mask = LP872X_EN_LDO2_M,
626         },
627         {
628                 .name = "ldo3",
629                 .id = LP8725_ID_LDO3,
630                 .ops = &lp872x_ldo_ops,
631                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
632                 .volt_table = lp872x_ldo_vtbl,
633                 .type = REGULATOR_VOLTAGE,
634                 .owner = THIS_MODULE,
635                 .vsel_reg = LP872X_LDO3_VOUT,
636                 .vsel_mask = LP872X_VOUT_M,
637                 .enable_reg = LP8725_LDO_CTRL,
638                 .enable_mask = LP872X_EN_LDO3_M,
639         },
640         {
641                 .name = "ldo4",
642                 .id = LP8725_ID_LDO4,
643                 .ops = &lp872x_ldo_ops,
644                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
645                 .volt_table = lp872x_ldo_vtbl,
646                 .type = REGULATOR_VOLTAGE,
647                 .owner = THIS_MODULE,
648                 .vsel_reg = LP872X_LDO4_VOUT,
649                 .vsel_mask = LP872X_VOUT_M,
650                 .enable_reg = LP8725_LDO_CTRL,
651                 .enable_mask = LP872X_EN_LDO4_M,
652         },
653         {
654                 .name = "ldo5",
655                 .id = LP8725_ID_LDO5,
656                 .ops = &lp872x_ldo_ops,
657                 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
658                 .volt_table = lp872x_ldo_vtbl,
659                 .type = REGULATOR_VOLTAGE,
660                 .owner = THIS_MODULE,
661                 .vsel_reg = LP872X_LDO5_VOUT,
662                 .vsel_mask = LP872X_VOUT_M,
663                 .enable_reg = LP8725_LDO_CTRL,
664                 .enable_mask = LP872X_EN_LDO5_M,
665         },
666         {
667                 .name = "lilo1",
668                 .id = LP8725_ID_LILO1,
669                 .ops = &lp872x_ldo_ops,
670                 .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
671                 .volt_table = lp8725_lilo_vtbl,
672                 .type = REGULATOR_VOLTAGE,
673                 .owner = THIS_MODULE,
674                 .vsel_reg = LP8725_LILO1_VOUT,
675                 .vsel_mask = LP872X_VOUT_M,
676                 .enable_reg = LP8725_LDO_CTRL,
677                 .enable_mask = LP8725_EN_LILO1_M,
678         },
679         {
680                 .name = "lilo2",
681                 .id = LP8725_ID_LILO2,
682                 .ops = &lp872x_ldo_ops,
683                 .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
684                 .volt_table = lp8725_lilo_vtbl,
685                 .type = REGULATOR_VOLTAGE,
686                 .owner = THIS_MODULE,
687                 .vsel_reg = LP8725_LILO2_VOUT,
688                 .vsel_mask = LP872X_VOUT_M,
689                 .enable_reg = LP8725_LDO_CTRL,
690                 .enable_mask = LP8725_EN_LILO2_M,
691         },
692         {
693                 .name = "buck1",
694                 .id = LP8725_ID_BUCK1,
695                 .ops = &lp8725_buck_ops,
696                 .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
697                 .volt_table = lp8725_buck_vtbl,
698                 .type = REGULATOR_VOLTAGE,
699                 .owner = THIS_MODULE,
700                 .enable_reg = LP872X_GENERAL_CFG,
701                 .enable_mask = LP8725_BUCK1_EN_M,
702         },
703         {
704                 .name = "buck2",
705                 .id = LP8725_ID_BUCK2,
706                 .ops = &lp8725_buck_ops,
707                 .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
708                 .volt_table = lp8725_buck_vtbl,
709                 .type = REGULATOR_VOLTAGE,
710                 .owner = THIS_MODULE,
711                 .enable_reg = LP872X_GENERAL_CFG,
712                 .enable_mask = LP8725_BUCK2_EN_M,
713         },
714 };
715 
716 static int lp872x_init_dvs(struct lp872x *lp)
717 {
718         int ret, gpio;
719         struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL;
720         enum lp872x_dvs_state pinstate;
721         u8 mask[] = { LP8720_EXT_DVS_M, LP8725_DVS1_M | LP8725_DVS2_M };
722         u8 default_dvs_mode[] = { LP8720_DEFAULT_DVS, LP8725_DEFAULT_DVS };
723 
724         if (!dvs)
725                 goto set_default_dvs_mode;
726 
727         gpio = dvs->gpio;
728         if (!gpio_is_valid(gpio)) {
729                 dev_warn(lp->dev, "invalid gpio: %d\n", gpio);
730                 goto set_default_dvs_mode;
731         }
732 
733         pinstate = dvs->init_state;
734         ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS");
735         if (ret) {
736                 dev_err(lp->dev, "gpio request err: %d\n", ret);
737                 return ret;
738         }
739 
740         lp->dvs_pin = pinstate;
741         lp->dvs_gpio = gpio;
742 
743         return 0;
744 
745 set_default_dvs_mode:
746         return lp872x_update_bits(lp, LP872X_GENERAL_CFG, mask[lp->chipid],
747                                 default_dvs_mode[lp->chipid]);
748 }
749 
750 static int lp872x_config(struct lp872x *lp)
751 {
752         struct lp872x_platform_data *pdata = lp->pdata;
753         int ret;
754 
755         if (!pdata || !pdata->update_config)
756                 goto init_dvs;
757 
758         ret = lp872x_write_byte(lp, LP872X_GENERAL_CFG, pdata->general_config);
759         if (ret)
760                 return ret;
761 
762 init_dvs:
763         return lp872x_init_dvs(lp);
764 }
765 
766 static struct regulator_init_data
767 *lp872x_find_regulator_init_data(int id, struct lp872x *lp)
768 {
769         struct lp872x_platform_data *pdata = lp->pdata;
770         int i;
771 
772         if (!pdata)
773                 return NULL;
774 
775         for (i = 0; i < lp->num_regulators; i++) {
776                 if (pdata->regulator_data[i].id == id)
777                         return pdata->regulator_data[i].init_data;
778         }
779 
780         return NULL;
781 }
782 
783 static int lp872x_regulator_register(struct lp872x *lp)
784 {
785         struct regulator_desc *desc;
786         struct regulator_config cfg = { };
787         struct regulator_dev *rdev;
788         int i;
789 
790         for (i = 0; i < lp->num_regulators; i++) {
791                 desc = (lp->chipid == LP8720) ? &lp8720_regulator_desc[i] :
792                                                 &lp8725_regulator_desc[i];
793 
794                 cfg.dev = lp->dev;
795                 cfg.init_data = lp872x_find_regulator_init_data(desc->id, lp);
796                 cfg.driver_data = lp;
797                 cfg.regmap = lp->regmap;
798 
799                 rdev = devm_regulator_register(lp->dev, desc, &cfg);
800                 if (IS_ERR(rdev)) {
801                         dev_err(lp->dev, "regulator register err");
802                         return PTR_ERR(rdev);
803                 }
804 
805                 *(lp->regulators + i) = rdev;
806         }
807 
808         return 0;
809 }
810 
811 static const struct regmap_config lp872x_regmap_config = {
812         .reg_bits = 8,
813         .val_bits = 8,
814         .max_register = MAX_REGISTERS,
815 };
816 
817 #ifdef CONFIG_OF
818 
819 #define LP872X_VALID_OPMODE     (REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL)
820 
821 static struct of_regulator_match lp8720_matches[] = {
822         { .name = "ldo1", .driver_data = (void *)LP8720_ID_LDO1, },
823         { .name = "ldo2", .driver_data = (void *)LP8720_ID_LDO2, },
824         { .name = "ldo3", .driver_data = (void *)LP8720_ID_LDO3, },
825         { .name = "ldo4", .driver_data = (void *)LP8720_ID_LDO4, },
826         { .name = "ldo5", .driver_data = (void *)LP8720_ID_LDO5, },
827         { .name = "buck", .driver_data = (void *)LP8720_ID_BUCK, },
828 };
829 
830 static struct of_regulator_match lp8725_matches[] = {
831         { .name = "ldo1", .driver_data = (void *)LP8725_ID_LDO1, },
832         { .name = "ldo2", .driver_data = (void *)LP8725_ID_LDO2, },
833         { .name = "ldo3", .driver_data = (void *)LP8725_ID_LDO3, },
834         { .name = "ldo4", .driver_data = (void *)LP8725_ID_LDO4, },
835         { .name = "ldo5", .driver_data = (void *)LP8725_ID_LDO5, },
836         { .name = "lilo1", .driver_data = (void *)LP8725_ID_LILO1, },
837         { .name = "lilo2", .driver_data = (void *)LP8725_ID_LILO2, },
838         { .name = "buck1", .driver_data = (void *)LP8725_ID_BUCK1, },
839         { .name = "buck2", .driver_data = (void *)LP8725_ID_BUCK2, },
840 };
841 
842 static struct lp872x_platform_data
843 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
844 {
845         struct device_node *np = dev->of_node;
846         struct lp872x_platform_data *pdata;
847         struct of_regulator_match *match;
848         struct regulator_init_data *d;
849         int num_matches;
850         int count;
851         int i;
852         u8 dvs_state;
853 
854         pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
855         if (!pdata)
856                 goto out;
857 
858         of_property_read_u8(np, "ti,general-config", &pdata->general_config);
859         if (of_find_property(np, "ti,update-config", NULL))
860                 pdata->update_config = true;
861 
862         pdata->dvs = devm_kzalloc(dev, sizeof(struct lp872x_dvs), GFP_KERNEL);
863         if (!pdata->dvs)
864                 goto out;
865 
866         pdata->dvs->gpio = of_get_named_gpio(np, "ti,dvs-gpio", 0);
867         of_property_read_u8(np, "ti,dvs-vsel", (u8 *)&pdata->dvs->vsel);
868         of_property_read_u8(np, "ti,dvs-state", &dvs_state);
869         pdata->dvs->init_state = dvs_state ? DVS_HIGH : DVS_LOW;
870 
871         if (of_get_child_count(np) == 0)
872                 goto out;
873 
874         switch (which) {
875         case LP8720:
876                 match = lp8720_matches;
877                 num_matches = ARRAY_SIZE(lp8720_matches);
878                 break;
879         case LP8725:
880                 match = lp8725_matches;
881                 num_matches = ARRAY_SIZE(lp8725_matches);
882                 break;
883         default:
884                 goto out;
885         }
886 
887         count = of_regulator_match(dev, np, match, num_matches);
888         if (count <= 0)
889                 goto out;
890 
891         for (i = 0; i < num_matches; i++) {
892                 pdata->regulator_data[i].id =
893                                 (enum lp872x_regulator_id)match[i].driver_data;
894                 pdata->regulator_data[i].init_data = match[i].init_data;
895 
896                 /* Operation mode configuration for buck/buck1/buck2 */
897                 if (strncmp(match[i].name, "buck", 4))
898                         continue;
899 
900                 d = pdata->regulator_data[i].init_data;
901                 d->constraints.valid_modes_mask |= LP872X_VALID_OPMODE;
902                 d->constraints.valid_ops_mask |= REGULATOR_CHANGE_MODE;
903         }
904 out:
905         return pdata;
906 }
907 #else
908 static struct lp872x_platform_data
909 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
910 {
911         return NULL;
912 }
913 #endif
914 
915 static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
916 {
917         struct lp872x *lp;
918         int ret, size, num_regulators;
919         const int lp872x_num_regulators[] = {
920                 [LP8720] = LP8720_NUM_REGULATORS,
921                 [LP8725] = LP8725_NUM_REGULATORS,
922         };
923 
924         if (cl->dev.of_node)
925                 cl->dev.platform_data = lp872x_populate_pdata_from_dt(&cl->dev,
926                                               (enum lp872x_id)id->driver_data);
927 
928         lp = devm_kzalloc(&cl->dev, sizeof(struct lp872x), GFP_KERNEL);
929         if (!lp)
930                 goto err_mem;
931 
932         num_regulators = lp872x_num_regulators[id->driver_data];
933         size = sizeof(struct regulator_dev *) * num_regulators;
934 
935         lp->regulators = devm_kzalloc(&cl->dev, size, GFP_KERNEL);
936         if (!lp->regulators)
937                 goto err_mem;
938 
939         lp->regmap = devm_regmap_init_i2c(cl, &lp872x_regmap_config);
940         if (IS_ERR(lp->regmap)) {
941                 ret = PTR_ERR(lp->regmap);
942                 dev_err(&cl->dev, "regmap init i2c err: %d\n", ret);
943                 goto err_dev;
944         }
945 
946         lp->dev = &cl->dev;
947         lp->pdata = dev_get_platdata(&cl->dev);
948         lp->chipid = id->driver_data;
949         lp->num_regulators = num_regulators;
950         i2c_set_clientdata(cl, lp);
951 
952         ret = lp872x_config(lp);
953         if (ret)
954                 goto err_dev;
955 
956         return lp872x_regulator_register(lp);
957 
958 err_mem:
959         return -ENOMEM;
960 err_dev:
961         return ret;
962 }
963 
964 static const struct of_device_id lp872x_dt_ids[] = {
965         { .compatible = "ti,lp8720", },
966         { .compatible = "ti,lp8725", },
967         { }
968 };
969 MODULE_DEVICE_TABLE(of, lp872x_dt_ids);
970 
971 static const struct i2c_device_id lp872x_ids[] = {
972         {"lp8720", LP8720},
973         {"lp8725", LP8725},
974         { }
975 };
976 MODULE_DEVICE_TABLE(i2c, lp872x_ids);
977 
978 static struct i2c_driver lp872x_driver = {
979         .driver = {
980                 .name = "lp872x",
981                 .owner = THIS_MODULE,
982                 .of_match_table = of_match_ptr(lp872x_dt_ids),
983         },
984         .probe = lp872x_probe,
985         .id_table = lp872x_ids,
986 };
987 
988 module_i2c_driver(lp872x_driver);
989 
990 MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver");
991 MODULE_AUTHOR("Milo Kim");
992 MODULE_LICENSE("GPL");
993 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us