Merge tag 'locking-debug-2021-09-01' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / regulator / stpmic1_regulator.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) STMicroelectronics 2018
3 // Author: Pascal Paillet <p.paillet@st.com> for STMicroelectronics.
4
5 #include <linux/interrupt.h>
6 #include <linux/mfd/stpmic1.h>
7 #include <linux/module.h>
8 #include <linux/of_irq.h>
9 #include <linux/platform_device.h>
10 #include <linux/regmap.h>
11 #include <linux/regulator/driver.h>
12 #include <linux/regulator/machine.h>
13 #include <linux/regulator/of_regulator.h>
14
15 #include <dt-bindings/mfd/st,stpmic1.h>
16
17 /**
18  * struct stpmic1 regulator description: this structure is used as driver data
19  * @desc: regulator framework description
20  * @mask_reset_reg: mask reset register address
21  * @mask_reset_mask: mask rank and mask reset register mask
22  * @icc_reg: icc register address
23  * @icc_mask: icc register mask
24  */
25 struct stpmic1_regulator_cfg {
26         struct regulator_desc desc;
27         u8 mask_reset_reg;
28         u8 mask_reset_mask;
29         u8 icc_reg;
30         u8 icc_mask;
31 };
32
33 static int stpmic1_set_mode(struct regulator_dev *rdev, unsigned int mode);
34 static unsigned int stpmic1_get_mode(struct regulator_dev *rdev);
35 static int stpmic1_set_icc(struct regulator_dev *rdev, int lim, int severity,
36                            bool enable);
37 static unsigned int stpmic1_map_mode(unsigned int mode);
38
39 enum {
40         STPMIC1_BUCK1 = 0,
41         STPMIC1_BUCK2 = 1,
42         STPMIC1_BUCK3 = 2,
43         STPMIC1_BUCK4 = 3,
44         STPMIC1_LDO1 = 4,
45         STPMIC1_LDO2 = 5,
46         STPMIC1_LDO3 = 6,
47         STPMIC1_LDO4 = 7,
48         STPMIC1_LDO5 = 8,
49         STPMIC1_LDO6 = 9,
50         STPMIC1_VREF_DDR = 10,
51         STPMIC1_BOOST = 11,
52         STPMIC1_VBUS_OTG = 12,
53         STPMIC1_SW_OUT = 13,
54 };
55
56 /* Enable time worst case is 5000mV/(2250uV/uS) */
57 #define PMIC_ENABLE_TIME_US 2200
58 /* Ramp delay worst case is (2250uV/uS) */
59 #define PMIC_RAMP_DELAY 2200
60
61 static const struct linear_range buck1_ranges[] = {
62         REGULATOR_LINEAR_RANGE(725000, 0, 4, 0),
63         REGULATOR_LINEAR_RANGE(725000, 5, 36, 25000),
64         REGULATOR_LINEAR_RANGE(1500000, 37, 63, 0),
65 };
66
67 static const struct linear_range buck2_ranges[] = {
68         REGULATOR_LINEAR_RANGE(1000000, 0, 17, 0),
69         REGULATOR_LINEAR_RANGE(1050000, 18, 19, 0),
70         REGULATOR_LINEAR_RANGE(1100000, 20, 21, 0),
71         REGULATOR_LINEAR_RANGE(1150000, 22, 23, 0),
72         REGULATOR_LINEAR_RANGE(1200000, 24, 25, 0),
73         REGULATOR_LINEAR_RANGE(1250000, 26, 27, 0),
74         REGULATOR_LINEAR_RANGE(1300000, 28, 29, 0),
75         REGULATOR_LINEAR_RANGE(1350000, 30, 31, 0),
76         REGULATOR_LINEAR_RANGE(1400000, 32, 33, 0),
77         REGULATOR_LINEAR_RANGE(1450000, 34, 35, 0),
78         REGULATOR_LINEAR_RANGE(1500000, 36, 63, 0),
79 };
80
81 static const struct linear_range buck3_ranges[] = {
82         REGULATOR_LINEAR_RANGE(1000000, 0, 19, 0),
83         REGULATOR_LINEAR_RANGE(1100000, 20, 23, 0),
84         REGULATOR_LINEAR_RANGE(1200000, 24, 27, 0),
85         REGULATOR_LINEAR_RANGE(1300000, 28, 31, 0),
86         REGULATOR_LINEAR_RANGE(1400000, 32, 35, 0),
87         REGULATOR_LINEAR_RANGE(1500000, 36, 55, 100000),
88         REGULATOR_LINEAR_RANGE(3400000, 56, 63, 0),
89 };
90
91 static const struct linear_range buck4_ranges[] = {
92         REGULATOR_LINEAR_RANGE(600000, 0, 27, 25000),
93         REGULATOR_LINEAR_RANGE(1300000, 28, 29, 0),
94         REGULATOR_LINEAR_RANGE(1350000, 30, 31, 0),
95         REGULATOR_LINEAR_RANGE(1400000, 32, 33, 0),
96         REGULATOR_LINEAR_RANGE(1450000, 34, 35, 0),
97         REGULATOR_LINEAR_RANGE(1500000, 36, 60, 100000),
98         REGULATOR_LINEAR_RANGE(3900000, 61, 63, 0),
99 };
100
101 static const struct linear_range ldo1_ranges[] = {
102         REGULATOR_LINEAR_RANGE(1700000, 0, 7, 0),
103         REGULATOR_LINEAR_RANGE(1700000, 8, 24, 100000),
104         REGULATOR_LINEAR_RANGE(3300000, 25, 31, 0),
105 };
106
107 static const struct linear_range ldo2_ranges[] = {
108         REGULATOR_LINEAR_RANGE(1700000, 0, 7, 0),
109         REGULATOR_LINEAR_RANGE(1700000, 8, 24, 100000),
110         REGULATOR_LINEAR_RANGE(3300000, 25, 30, 0),
111 };
112
113 static const struct linear_range ldo3_ranges[] = {
114         REGULATOR_LINEAR_RANGE(1700000, 0, 7, 0),
115         REGULATOR_LINEAR_RANGE(1700000, 8, 24, 100000),
116         REGULATOR_LINEAR_RANGE(3300000, 25, 30, 0),
117         /* with index 31 LDO3 is in DDR mode */
118         REGULATOR_LINEAR_RANGE(500000, 31, 31, 0),
119 };
120
121 static const struct linear_range ldo5_ranges[] = {
122         REGULATOR_LINEAR_RANGE(1700000, 0, 7, 0),
123         REGULATOR_LINEAR_RANGE(1700000, 8, 30, 100000),
124         REGULATOR_LINEAR_RANGE(3900000, 31, 31, 0),
125 };
126
127 static const struct linear_range ldo6_ranges[] = {
128         REGULATOR_LINEAR_RANGE(900000, 0, 24, 100000),
129         REGULATOR_LINEAR_RANGE(3300000, 25, 31, 0),
130 };
131
132 static const struct regulator_ops stpmic1_ldo_ops = {
133         .list_voltage = regulator_list_voltage_linear_range,
134         .map_voltage = regulator_map_voltage_linear_range,
135         .is_enabled = regulator_is_enabled_regmap,
136         .enable = regulator_enable_regmap,
137         .disable = regulator_disable_regmap,
138         .get_voltage_sel = regulator_get_voltage_sel_regmap,
139         .set_voltage_sel = regulator_set_voltage_sel_regmap,
140         .set_over_current_protection = stpmic1_set_icc,
141 };
142
143 static const struct regulator_ops stpmic1_ldo3_ops = {
144         .list_voltage = regulator_list_voltage_linear_range,
145         .map_voltage = regulator_map_voltage_iterate,
146         .is_enabled = regulator_is_enabled_regmap,
147         .enable = regulator_enable_regmap,
148         .disable = regulator_disable_regmap,
149         .get_voltage_sel = regulator_get_voltage_sel_regmap,
150         .set_voltage_sel = regulator_set_voltage_sel_regmap,
151         .get_bypass = regulator_get_bypass_regmap,
152         .set_bypass = regulator_set_bypass_regmap,
153         .set_over_current_protection = stpmic1_set_icc,
154 };
155
156 static const struct regulator_ops stpmic1_ldo4_fixed_regul_ops = {
157         .is_enabled = regulator_is_enabled_regmap,
158         .enable = regulator_enable_regmap,
159         .disable = regulator_disable_regmap,
160         .set_over_current_protection = stpmic1_set_icc,
161 };
162
163 static const struct regulator_ops stpmic1_buck_ops = {
164         .list_voltage = regulator_list_voltage_linear_range,
165         .map_voltage = regulator_map_voltage_linear_range,
166         .is_enabled = regulator_is_enabled_regmap,
167         .enable = regulator_enable_regmap,
168         .disable = regulator_disable_regmap,
169         .get_voltage_sel = regulator_get_voltage_sel_regmap,
170         .set_voltage_sel = regulator_set_voltage_sel_regmap,
171         .set_pull_down = regulator_set_pull_down_regmap,
172         .set_mode = stpmic1_set_mode,
173         .get_mode = stpmic1_get_mode,
174         .set_over_current_protection = stpmic1_set_icc,
175 };
176
177 static const struct regulator_ops stpmic1_vref_ddr_ops = {
178         .is_enabled = regulator_is_enabled_regmap,
179         .enable = regulator_enable_regmap,
180         .disable = regulator_disable_regmap,
181 };
182
183 static const struct regulator_ops stpmic1_boost_regul_ops = {
184         .is_enabled = regulator_is_enabled_regmap,
185         .enable = regulator_enable_regmap,
186         .disable = regulator_disable_regmap,
187         .set_over_current_protection = stpmic1_set_icc,
188 };
189
190 static const struct regulator_ops stpmic1_switch_regul_ops = {
191         .is_enabled = regulator_is_enabled_regmap,
192         .enable = regulator_enable_regmap,
193         .disable = regulator_disable_regmap,
194         .set_over_current_protection = stpmic1_set_icc,
195         .set_active_discharge = regulator_set_active_discharge_regmap,
196 };
197
198 #define REG_LDO(ids, base) { \
199         .name = #ids, \
200         .id = STPMIC1_##ids, \
201         .n_voltages = 32, \
202         .ops = &stpmic1_ldo_ops, \
203         .linear_ranges = base ## _ranges, \
204         .n_linear_ranges = ARRAY_SIZE(base ## _ranges), \
205         .type = REGULATOR_VOLTAGE, \
206         .owner = THIS_MODULE, \
207         .vsel_reg = ids##_ACTIVE_CR, \
208         .vsel_mask = LDO_VOLTAGE_MASK, \
209         .enable_reg = ids##_ACTIVE_CR, \
210         .enable_mask = LDO_ENABLE_MASK, \
211         .enable_val = 1, \
212         .disable_val = 0, \
213         .enable_time = PMIC_ENABLE_TIME_US, \
214         .ramp_delay = PMIC_RAMP_DELAY, \
215         .supply_name = #base, \
216 }
217
218 #define REG_LDO3(ids, base) { \
219         .name = #ids, \
220         .id = STPMIC1_##ids, \
221         .n_voltages = 32, \
222         .ops = &stpmic1_ldo3_ops, \
223         .linear_ranges = ldo3_ranges, \
224         .n_linear_ranges = ARRAY_SIZE(ldo3_ranges), \
225         .type = REGULATOR_VOLTAGE, \
226         .owner = THIS_MODULE, \
227         .vsel_reg = LDO3_ACTIVE_CR, \
228         .vsel_mask = LDO_VOLTAGE_MASK, \
229         .enable_reg = LDO3_ACTIVE_CR, \
230         .enable_mask = LDO_ENABLE_MASK, \
231         .enable_val = 1, \
232         .disable_val = 0, \
233         .enable_time = PMIC_ENABLE_TIME_US, \
234         .ramp_delay = PMIC_RAMP_DELAY, \
235         .bypass_reg = LDO3_ACTIVE_CR, \
236         .bypass_mask = LDO_BYPASS_MASK, \
237         .bypass_val_on = LDO_BYPASS_MASK, \
238         .bypass_val_off = 0, \
239         .supply_name = #base, \
240 }
241
242 #define REG_LDO4(ids, base) { \
243         .name = #ids, \
244         .id = STPMIC1_##ids, \
245         .n_voltages = 1, \
246         .ops = &stpmic1_ldo4_fixed_regul_ops, \
247         .type = REGULATOR_VOLTAGE, \
248         .owner = THIS_MODULE, \
249         .min_uV = 3300000, \
250         .fixed_uV = 3300000, \
251         .enable_reg = LDO4_ACTIVE_CR, \
252         .enable_mask = LDO_ENABLE_MASK, \
253         .enable_val = 1, \
254         .disable_val = 0, \
255         .enable_time = PMIC_ENABLE_TIME_US, \
256         .ramp_delay = PMIC_RAMP_DELAY, \
257         .supply_name = #base, \
258 }
259
260 #define REG_BUCK(ids, base) { \
261         .name = #ids, \
262         .id = STPMIC1_##ids, \
263         .ops = &stpmic1_buck_ops, \
264         .n_voltages = 64, \
265         .linear_ranges = base ## _ranges, \
266         .n_linear_ranges = ARRAY_SIZE(base ## _ranges), \
267         .type = REGULATOR_VOLTAGE, \
268         .owner = THIS_MODULE, \
269         .vsel_reg = ids##_ACTIVE_CR, \
270         .vsel_mask = BUCK_VOLTAGE_MASK, \
271         .enable_reg = ids##_ACTIVE_CR, \
272         .enable_mask = BUCK_ENABLE_MASK, \
273         .enable_val = 1, \
274         .disable_val = 0, \
275         .enable_time = PMIC_ENABLE_TIME_US, \
276         .ramp_delay = PMIC_RAMP_DELAY, \
277         .of_map_mode = stpmic1_map_mode, \
278         .pull_down_reg = ids##_PULL_DOWN_REG, \
279         .pull_down_mask = ids##_PULL_DOWN_MASK, \
280         .supply_name = #base, \
281 }
282
283 #define REG_VREF_DDR(ids, base) { \
284         .name = #ids, \
285         .id = STPMIC1_##ids, \
286         .n_voltages = 1, \
287         .ops = &stpmic1_vref_ddr_ops, \
288         .type = REGULATOR_VOLTAGE, \
289         .owner = THIS_MODULE, \
290         .min_uV = 500000, \
291         .fixed_uV = 500000, \
292         .enable_reg = VREF_DDR_ACTIVE_CR, \
293         .enable_mask = BUCK_ENABLE_MASK, \
294         .enable_val = 1, \
295         .disable_val = 0, \
296         .enable_time = PMIC_ENABLE_TIME_US, \
297         .supply_name = #base, \
298 }
299
300 #define REG_BOOST(ids, base) { \
301         .name = #ids, \
302         .id = STPMIC1_##ids, \
303         .n_voltages = 1, \
304         .ops = &stpmic1_boost_regul_ops, \
305         .type = REGULATOR_VOLTAGE, \
306         .owner = THIS_MODULE, \
307         .min_uV = 0, \
308         .fixed_uV = 5000000, \
309         .enable_reg = BST_SW_CR, \
310         .enable_mask = BOOST_ENABLED, \
311         .enable_val = BOOST_ENABLED, \
312         .disable_val = 0, \
313         .enable_time = PMIC_ENABLE_TIME_US, \
314         .supply_name = #base, \
315 }
316
317 #define REG_VBUS_OTG(ids, base) { \
318         .name = #ids, \
319         .id = STPMIC1_##ids, \
320         .n_voltages = 1, \
321         .ops = &stpmic1_switch_regul_ops, \
322         .type = REGULATOR_VOLTAGE, \
323         .owner = THIS_MODULE, \
324         .min_uV = 0, \
325         .fixed_uV = 5000000, \
326         .enable_reg = BST_SW_CR, \
327         .enable_mask = USBSW_OTG_SWITCH_ENABLED, \
328         .enable_val = USBSW_OTG_SWITCH_ENABLED, \
329         .disable_val = 0, \
330         .enable_time = PMIC_ENABLE_TIME_US, \
331         .supply_name = #base, \
332         .active_discharge_reg = BST_SW_CR, \
333         .active_discharge_mask = VBUS_OTG_DISCHARGE, \
334         .active_discharge_on = VBUS_OTG_DISCHARGE, \
335 }
336
337 #define REG_SW_OUT(ids, base) { \
338         .name = #ids, \
339         .id = STPMIC1_##ids, \
340         .n_voltages = 1, \
341         .ops = &stpmic1_switch_regul_ops, \
342         .type = REGULATOR_VOLTAGE, \
343         .owner = THIS_MODULE, \
344         .min_uV = 0, \
345         .fixed_uV = 5000000, \
346         .enable_reg = BST_SW_CR, \
347         .enable_mask = SWIN_SWOUT_ENABLED, \
348         .enable_val = SWIN_SWOUT_ENABLED, \
349         .disable_val = 0, \
350         .enable_time = PMIC_ENABLE_TIME_US, \
351         .supply_name = #base, \
352         .active_discharge_reg = BST_SW_CR, \
353         .active_discharge_mask = SW_OUT_DISCHARGE, \
354         .active_discharge_on = SW_OUT_DISCHARGE, \
355 }
356
357 static const struct stpmic1_regulator_cfg stpmic1_regulator_cfgs[] = {
358         [STPMIC1_BUCK1] = {
359                 .desc = REG_BUCK(BUCK1, buck1),
360                 .icc_reg = BUCKS_ICCTO_CR,
361                 .icc_mask = BIT(0),
362                 .mask_reset_reg = BUCKS_MASK_RESET_CR,
363                 .mask_reset_mask = BIT(0),
364         },
365         [STPMIC1_BUCK2] = {
366                 .desc = REG_BUCK(BUCK2, buck2),
367                 .icc_reg = BUCKS_ICCTO_CR,
368                 .icc_mask = BIT(1),
369                 .mask_reset_reg = BUCKS_MASK_RESET_CR,
370                 .mask_reset_mask = BIT(1),
371         },
372         [STPMIC1_BUCK3] = {
373                 .desc = REG_BUCK(BUCK3, buck3),
374                 .icc_reg = BUCKS_ICCTO_CR,
375                 .icc_mask = BIT(2),
376                 .mask_reset_reg = BUCKS_MASK_RESET_CR,
377                 .mask_reset_mask = BIT(2),
378         },
379         [STPMIC1_BUCK4] = {
380                 .desc = REG_BUCK(BUCK4, buck4),
381                 .icc_reg = BUCKS_ICCTO_CR,
382                 .icc_mask = BIT(3),
383                 .mask_reset_reg = BUCKS_MASK_RESET_CR,
384                 .mask_reset_mask = BIT(3),
385         },
386         [STPMIC1_LDO1] = {
387                 .desc = REG_LDO(LDO1, ldo1),
388                 .icc_reg = LDOS_ICCTO_CR,
389                 .icc_mask = BIT(0),
390                 .mask_reset_reg = LDOS_MASK_RESET_CR,
391                 .mask_reset_mask = BIT(0),
392         },
393         [STPMIC1_LDO2] = {
394                 .desc = REG_LDO(LDO2, ldo2),
395                 .icc_reg = LDOS_ICCTO_CR,
396                 .icc_mask = BIT(1),
397                 .mask_reset_reg = LDOS_MASK_RESET_CR,
398                 .mask_reset_mask = BIT(1),
399         },
400         [STPMIC1_LDO3] = {
401                 .desc = REG_LDO3(LDO3, ldo3),
402                 .icc_reg = LDOS_ICCTO_CR,
403                 .icc_mask = BIT(2),
404                 .mask_reset_reg = LDOS_MASK_RESET_CR,
405                 .mask_reset_mask = BIT(2),
406         },
407         [STPMIC1_LDO4] = {
408                 .desc = REG_LDO4(LDO4, ldo4),
409                 .icc_reg = LDOS_ICCTO_CR,
410                 .icc_mask = BIT(3),
411                 .mask_reset_reg = LDOS_MASK_RESET_CR,
412                 .mask_reset_mask = BIT(3),
413         },
414         [STPMIC1_LDO5] = {
415                 .desc = REG_LDO(LDO5, ldo5),
416                 .icc_reg = LDOS_ICCTO_CR,
417                 .icc_mask = BIT(4),
418                 .mask_reset_reg = LDOS_MASK_RESET_CR,
419                 .mask_reset_mask = BIT(4),
420         },
421         [STPMIC1_LDO6] = {
422                 .desc = REG_LDO(LDO6, ldo6),
423                 .icc_reg = LDOS_ICCTO_CR,
424                 .icc_mask = BIT(5),
425                 .mask_reset_reg = LDOS_MASK_RESET_CR,
426                 .mask_reset_mask = BIT(5),
427         },
428         [STPMIC1_VREF_DDR] = {
429                 .desc = REG_VREF_DDR(VREF_DDR, vref_ddr),
430                 .mask_reset_reg = LDOS_MASK_RESET_CR,
431                 .mask_reset_mask = BIT(6),
432         },
433         [STPMIC1_BOOST] = {
434                 .desc = REG_BOOST(BOOST, boost),
435                 .icc_reg = BUCKS_ICCTO_CR,
436                 .icc_mask = BIT(6),
437         },
438         [STPMIC1_VBUS_OTG] = {
439                 .desc = REG_VBUS_OTG(VBUS_OTG, pwr_sw1),
440                 .icc_reg = BUCKS_ICCTO_CR,
441                 .icc_mask = BIT(4),
442         },
443         [STPMIC1_SW_OUT] = {
444                 .desc = REG_SW_OUT(SW_OUT, pwr_sw2),
445                 .icc_reg = BUCKS_ICCTO_CR,
446                 .icc_mask = BIT(5),
447         },
448 };
449
450 static unsigned int stpmic1_map_mode(unsigned int mode)
451 {
452         switch (mode) {
453         case STPMIC1_BUCK_MODE_NORMAL:
454                 return REGULATOR_MODE_NORMAL;
455         case STPMIC1_BUCK_MODE_LP:
456                 return REGULATOR_MODE_STANDBY;
457         default:
458                 return REGULATOR_MODE_INVALID;
459         }
460 }
461
462 static unsigned int stpmic1_get_mode(struct regulator_dev *rdev)
463 {
464         int value;
465         struct regmap *regmap = rdev_get_regmap(rdev);
466
467         regmap_read(regmap, rdev->desc->enable_reg, &value);
468
469         if (value & STPMIC1_BUCK_MODE_LP)
470                 return REGULATOR_MODE_STANDBY;
471
472         return REGULATOR_MODE_NORMAL;
473 }
474
475 static int stpmic1_set_mode(struct regulator_dev *rdev, unsigned int mode)
476 {
477         int value;
478         struct regmap *regmap = rdev_get_regmap(rdev);
479
480         switch (mode) {
481         case REGULATOR_MODE_NORMAL:
482                 value = STPMIC1_BUCK_MODE_NORMAL;
483                 break;
484         case REGULATOR_MODE_STANDBY:
485                 value = STPMIC1_BUCK_MODE_LP;
486                 break;
487         default:
488                 return -EINVAL;
489         }
490
491         return regmap_update_bits(regmap, rdev->desc->enable_reg,
492                                   STPMIC1_BUCK_MODE_LP, value);
493 }
494
495 static int stpmic1_set_icc(struct regulator_dev *rdev, int lim, int severity,
496                            bool enable)
497 {
498         struct stpmic1_regulator_cfg *cfg = rdev_get_drvdata(rdev);
499         struct regmap *regmap = rdev_get_regmap(rdev);
500
501         /*
502          * The code seems like one bit in a register controls whether OCP is
503          * enabled. So we might be able to turn it off here is if that
504          * was requested. I won't support this because I don't have the HW.
505          * Feel free to try and implement if you have the HW and need kernel
506          * to disable this.
507          *
508          * Also, I don't know if limit can be configured or if we support
509          * error/warning instead of protect. So I just keep existing logic
510          * and assume no.
511          */
512         if (lim || severity != REGULATOR_SEVERITY_PROT || !enable)
513                 return -EINVAL;
514
515         /* enable switch off in case of over current */
516         return regmap_update_bits(regmap, cfg->icc_reg, cfg->icc_mask,
517                                   cfg->icc_mask);
518 }
519
520 static irqreturn_t stpmic1_curlim_irq_handler(int irq, void *data)
521 {
522         struct regulator_dev *rdev = (struct regulator_dev *)data;
523
524         /* Send an overcurrent notification */
525         regulator_notifier_call_chain(rdev,
526                                       REGULATOR_EVENT_OVER_CURRENT,
527                                       NULL);
528
529         return IRQ_HANDLED;
530 }
531
532 #define MATCH(_name, _id) \
533         [STPMIC1_##_id] = { \
534                 .name = #_name, \
535                 .desc = &stpmic1_regulator_cfgs[STPMIC1_##_id].desc, \
536         }
537
538 static struct of_regulator_match stpmic1_matches[] = {
539         MATCH(buck1, BUCK1),
540         MATCH(buck2, BUCK2),
541         MATCH(buck3, BUCK3),
542         MATCH(buck4, BUCK4),
543         MATCH(ldo1, LDO1),
544         MATCH(ldo2, LDO2),
545         MATCH(ldo3, LDO3),
546         MATCH(ldo4, LDO4),
547         MATCH(ldo5, LDO5),
548         MATCH(ldo6, LDO6),
549         MATCH(vref_ddr, VREF_DDR),
550         MATCH(boost, BOOST),
551         MATCH(pwr_sw1, VBUS_OTG),
552         MATCH(pwr_sw2, SW_OUT),
553 };
554
555 static int stpmic1_regulator_register(struct platform_device *pdev, int id,
556                                       struct of_regulator_match *match,
557                                       const struct stpmic1_regulator_cfg *cfg)
558 {
559         struct stpmic1 *pmic_dev = dev_get_drvdata(pdev->dev.parent);
560         struct regulator_dev *rdev;
561         struct regulator_config config = {};
562         int ret = 0;
563         int irq;
564
565         config.dev = &pdev->dev;
566         config.init_data = match->init_data;
567         config.of_node = match->of_node;
568         config.regmap = pmic_dev->regmap;
569         config.driver_data = (void *)cfg;
570
571         rdev = devm_regulator_register(&pdev->dev, &cfg->desc, &config);
572         if (IS_ERR(rdev)) {
573                 dev_err(&pdev->dev, "failed to register %s regulator\n",
574                         cfg->desc.name);
575                 return PTR_ERR(rdev);
576         }
577
578         /* set mask reset */
579         if (of_get_property(config.of_node, "st,mask-reset", NULL) &&
580             cfg->mask_reset_reg != 0) {
581                 ret = regmap_update_bits(pmic_dev->regmap,
582                                          cfg->mask_reset_reg,
583                                          cfg->mask_reset_mask,
584                                          cfg->mask_reset_mask);
585                 if (ret) {
586                         dev_err(&pdev->dev, "set mask reset failed\n");
587                         return ret;
588                 }
589         }
590
591         /* setup an irq handler for over-current detection */
592         irq = of_irq_get(config.of_node, 0);
593         if (irq > 0) {
594                 ret = devm_request_threaded_irq(&pdev->dev,
595                                                 irq, NULL,
596                                                 stpmic1_curlim_irq_handler,
597                                                 IRQF_ONESHOT | IRQF_SHARED,
598                                                 pdev->name, rdev);
599                 if (ret) {
600                         dev_err(&pdev->dev, "Request IRQ failed\n");
601                         return ret;
602                 }
603         }
604         return 0;
605 }
606
607 static int stpmic1_regulator_probe(struct platform_device *pdev)
608 {
609         int i, ret;
610
611         ret = of_regulator_match(&pdev->dev, pdev->dev.of_node, stpmic1_matches,
612                                  ARRAY_SIZE(stpmic1_matches));
613         if (ret < 0) {
614                 dev_err(&pdev->dev,
615                         "Error in PMIC regulator device tree node");
616                 return ret;
617         }
618
619         for (i = 0; i < ARRAY_SIZE(stpmic1_regulator_cfgs); i++) {
620                 ret = stpmic1_regulator_register(pdev, i, &stpmic1_matches[i],
621                                                  &stpmic1_regulator_cfgs[i]);
622                 if (ret < 0)
623                         return ret;
624         }
625
626         dev_dbg(&pdev->dev, "stpmic1_regulator driver probed\n");
627
628         return 0;
629 }
630
631 static const struct of_device_id of_pmic_regulator_match[] = {
632         { .compatible = "st,stpmic1-regulators" },
633         { },
634 };
635
636 MODULE_DEVICE_TABLE(of, of_pmic_regulator_match);
637
638 static struct platform_driver stpmic1_regulator_driver = {
639         .driver = {
640                 .name = "stpmic1-regulator",
641                 .of_match_table = of_match_ptr(of_pmic_regulator_match),
642         },
643         .probe = stpmic1_regulator_probe,
644 };
645
646 module_platform_driver(stpmic1_regulator_driver);
647
648 MODULE_DESCRIPTION("STPMIC1 PMIC voltage regulator driver");
649 MODULE_AUTHOR("Pascal Paillet <p.paillet@st.com>");
650 MODULE_LICENSE("GPL v2");