drivers: media: cfe: Increase default size of embedded buffer
[platform/kernel/linux-rpi.git] / drivers / regulator / bd71828-regulator.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (C) 2019 ROHM Semiconductors
3 // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver
4 //
5
6 #include <linux/delay.h>
7 #include <linux/err.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/mfd/rohm-bd71828.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/platform_device.h>
14 #include <linux/regmap.h>
15 #include <linux/regulator/driver.h>
16 #include <linux/regulator/machine.h>
17 #include <linux/regulator/of_regulator.h>
18
19 struct reg_init {
20         unsigned int reg;
21         unsigned int mask;
22         unsigned int val;
23 };
24 struct bd71828_regulator_data {
25         struct regulator_desc desc;
26         const struct rohm_dvs_config dvs;
27         const struct reg_init *reg_inits;
28         int reg_init_amnt;
29 };
30
31 static const struct reg_init buck1_inits[] = {
32         /*
33          * DVS Buck voltages can be changed by register values or via GPIO.
34          * Use register accesses by default.
35          */
36         {
37                 .reg = BD71828_REG_PS_CTRL_1,
38                 .mask = BD71828_MASK_DVS_BUCK1_CTRL,
39                 .val = BD71828_DVS_BUCK1_CTRL_I2C,
40         },
41 };
42
43 static const struct reg_init buck2_inits[] = {
44         {
45                 .reg = BD71828_REG_PS_CTRL_1,
46                 .mask = BD71828_MASK_DVS_BUCK2_CTRL,
47                 .val = BD71828_DVS_BUCK2_CTRL_I2C,
48         },
49 };
50
51 static const struct reg_init buck6_inits[] = {
52         {
53                 .reg = BD71828_REG_PS_CTRL_1,
54                 .mask = BD71828_MASK_DVS_BUCK6_CTRL,
55                 .val = BD71828_DVS_BUCK6_CTRL_I2C,
56         },
57 };
58
59 static const struct reg_init buck7_inits[] = {
60         {
61                 .reg = BD71828_REG_PS_CTRL_1,
62                 .mask = BD71828_MASK_DVS_BUCK7_CTRL,
63                 .val = BD71828_DVS_BUCK7_CTRL_I2C,
64         },
65 };
66
67 static const struct linear_range bd71828_buck1267_volts[] = {
68         REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
69         REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
70 };
71
72 static const struct linear_range bd71828_buck3_volts[] = {
73         REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000),
74         REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0),
75 };
76
77 static const struct linear_range bd71828_buck4_volts[] = {
78         REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000),
79         REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0),
80 };
81
82 static const struct linear_range bd71828_buck5_volts[] = {
83         REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000),
84         REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
85 };
86
87 static const struct linear_range bd71828_ldo_volts[] = {
88         REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
89         REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
90 };
91
92 static const unsigned int bd71828_ramp_delay[] = { 2500, 5000, 10000, 20000 };
93
94 static int buck_set_hw_dvs_levels(struct device_node *np,
95                                   const struct regulator_desc *desc,
96                                   struct regulator_config *cfg)
97 {
98         struct bd71828_regulator_data *data;
99
100         data = container_of(desc, struct bd71828_regulator_data, desc);
101
102         return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap);
103 }
104
105 static int ldo6_parse_dt(struct device_node *np,
106                          const struct regulator_desc *desc,
107                          struct regulator_config *cfg)
108 {
109         int ret, i;
110         uint32_t uv = 0;
111         unsigned int en;
112         struct regmap *regmap = cfg->regmap;
113         static const char * const props[] = { "rohm,dvs-run-voltage",
114                                               "rohm,dvs-idle-voltage",
115                                               "rohm,dvs-suspend-voltage",
116                                               "rohm,dvs-lpsr-voltage" };
117         unsigned int mask[] = { BD71828_MASK_RUN_EN, BD71828_MASK_IDLE_EN,
118                                BD71828_MASK_SUSP_EN, BD71828_MASK_LPSR_EN };
119
120         for (i = 0; i < ARRAY_SIZE(props); i++) {
121                 ret = of_property_read_u32(np, props[i], &uv);
122                 if (ret) {
123                         if (ret != -EINVAL)
124                                 return ret;
125                         continue;
126                 }
127                 if (uv)
128                         en = 0xffffffff;
129                 else
130                         en = 0;
131
132                 ret = regmap_update_bits(regmap, desc->enable_reg, mask[i], en);
133                 if (ret)
134                         return ret;
135         }
136         return 0;
137 }
138
139 static const struct regulator_ops bd71828_buck_ops = {
140         .enable = regulator_enable_regmap,
141         .disable = regulator_disable_regmap,
142         .is_enabled = regulator_is_enabled_regmap,
143         .list_voltage = regulator_list_voltage_linear_range,
144         .set_voltage_sel = regulator_set_voltage_sel_regmap,
145         .get_voltage_sel = regulator_get_voltage_sel_regmap,
146 };
147
148 static const struct regulator_ops bd71828_dvs_buck_ops = {
149         .enable = regulator_enable_regmap,
150         .disable = regulator_disable_regmap,
151         .is_enabled = regulator_is_enabled_regmap,
152         .list_voltage = regulator_list_voltage_linear_range,
153         .set_voltage_sel = regulator_set_voltage_sel_regmap,
154         .get_voltage_sel = regulator_get_voltage_sel_regmap,
155         .set_voltage_time_sel = regulator_set_voltage_time_sel,
156         .set_ramp_delay = regulator_set_ramp_delay_regmap,
157 };
158
159 static const struct regulator_ops bd71828_ldo_ops = {
160         .enable = regulator_enable_regmap,
161         .disable = regulator_disable_regmap,
162         .is_enabled = regulator_is_enabled_regmap,
163         .list_voltage = regulator_list_voltage_linear_range,
164         .set_voltage_sel = regulator_set_voltage_sel_regmap,
165         .get_voltage_sel = regulator_get_voltage_sel_regmap,
166 };
167
168 static const struct regulator_ops bd71828_ldo6_ops = {
169         .enable = regulator_enable_regmap,
170         .disable = regulator_disable_regmap,
171         .is_enabled = regulator_is_enabled_regmap,
172 };
173
174 static const struct bd71828_regulator_data bd71828_rdata[] = {
175         {
176                 .desc = {
177                         .name = "buck1",
178                         .of_match = of_match_ptr("BUCK1"),
179                         .regulators_node = of_match_ptr("regulators"),
180                         .id = BD71828_BUCK1,
181                         .ops = &bd71828_dvs_buck_ops,
182                         .type = REGULATOR_VOLTAGE,
183                         .linear_ranges = bd71828_buck1267_volts,
184                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
185                         .n_voltages = BD71828_BUCK1267_VOLTS,
186                         .enable_reg = BD71828_REG_BUCK1_EN,
187                         .enable_mask = BD71828_MASK_RUN_EN,
188                         .vsel_reg = BD71828_REG_BUCK1_VOLT,
189                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
190                         .ramp_delay_table = bd71828_ramp_delay,
191                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
192                         .ramp_reg = BD71828_REG_BUCK1_MODE,
193                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
194                         .owner = THIS_MODULE,
195                         .of_parse_cb = buck_set_hw_dvs_levels,
196                 },
197                 .dvs = {
198                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
199                                      ROHM_DVS_LEVEL_SUSPEND |
200                                      ROHM_DVS_LEVEL_LPSR,
201                         .run_reg = BD71828_REG_BUCK1_VOLT,
202                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
203                         .idle_reg = BD71828_REG_BUCK1_IDLE_VOLT,
204                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
205                         .idle_on_mask = BD71828_MASK_IDLE_EN,
206                         .suspend_reg = BD71828_REG_BUCK1_SUSP_VOLT,
207                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
208                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
209                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
210                         /*
211                          * LPSR voltage is same as SUSPEND voltage. Allow
212                          * setting it so that regulator can be set enabled at
213                          * LPSR state
214                          */
215                         .lpsr_reg = BD71828_REG_BUCK1_SUSP_VOLT,
216                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
217                 },
218                 .reg_inits = buck1_inits,
219                 .reg_init_amnt = ARRAY_SIZE(buck1_inits),
220         },
221         {
222                 .desc = {
223                         .name = "buck2",
224                         .of_match = of_match_ptr("BUCK2"),
225                         .regulators_node = of_match_ptr("regulators"),
226                         .id = BD71828_BUCK2,
227                         .ops = &bd71828_dvs_buck_ops,
228                         .type = REGULATOR_VOLTAGE,
229                         .linear_ranges = bd71828_buck1267_volts,
230                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
231                         .n_voltages = BD71828_BUCK1267_VOLTS,
232                         .enable_reg = BD71828_REG_BUCK2_EN,
233                         .enable_mask = BD71828_MASK_RUN_EN,
234                         .vsel_reg = BD71828_REG_BUCK2_VOLT,
235                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
236                         .ramp_delay_table = bd71828_ramp_delay,
237                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
238                         .ramp_reg = BD71828_REG_BUCK2_MODE,
239                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
240                         .owner = THIS_MODULE,
241                         .of_parse_cb = buck_set_hw_dvs_levels,
242                 },
243                 .dvs = {
244                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
245                                      ROHM_DVS_LEVEL_SUSPEND |
246                                      ROHM_DVS_LEVEL_LPSR,
247                         .run_reg = BD71828_REG_BUCK2_VOLT,
248                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
249                         .idle_reg = BD71828_REG_BUCK2_IDLE_VOLT,
250                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
251                         .idle_on_mask = BD71828_MASK_IDLE_EN,
252                         .suspend_reg = BD71828_REG_BUCK2_SUSP_VOLT,
253                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
254                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
255                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
256                         .lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT,
257                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
258                 },
259                 .reg_inits = buck2_inits,
260                 .reg_init_amnt = ARRAY_SIZE(buck2_inits),
261         },
262         {
263                 .desc = {
264                         .name = "buck3",
265                         .of_match = of_match_ptr("BUCK3"),
266                         .regulators_node = of_match_ptr("regulators"),
267                         .id = BD71828_BUCK3,
268                         .ops = &bd71828_buck_ops,
269                         .type = REGULATOR_VOLTAGE,
270                         .linear_ranges = bd71828_buck3_volts,
271                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck3_volts),
272                         .n_voltages = BD71828_BUCK3_VOLTS,
273                         .enable_reg = BD71828_REG_BUCK3_EN,
274                         .enable_mask = BD71828_MASK_RUN_EN,
275                         .vsel_reg = BD71828_REG_BUCK3_VOLT,
276                         .vsel_mask = BD71828_MASK_BUCK3_VOLT,
277                         .owner = THIS_MODULE,
278                         .of_parse_cb = buck_set_hw_dvs_levels,
279                 },
280                 .dvs = {
281                         /*
282                          * BUCK3 only supports single voltage for all states.
283                          * voltage can be individually enabled for each state
284                          * though => allow setting all states to support
285                          * enabling power rail on different states.
286                          */
287                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
288                                      ROHM_DVS_LEVEL_SUSPEND |
289                                      ROHM_DVS_LEVEL_LPSR,
290                         .run_reg = BD71828_REG_BUCK3_VOLT,
291                         .idle_reg = BD71828_REG_BUCK3_VOLT,
292                         .suspend_reg = BD71828_REG_BUCK3_VOLT,
293                         .lpsr_reg = BD71828_REG_BUCK3_VOLT,
294                         .run_mask = BD71828_MASK_BUCK3_VOLT,
295                         .idle_mask = BD71828_MASK_BUCK3_VOLT,
296                         .suspend_mask = BD71828_MASK_BUCK3_VOLT,
297                         .lpsr_mask = BD71828_MASK_BUCK3_VOLT,
298                         .idle_on_mask = BD71828_MASK_IDLE_EN,
299                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
300                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
301                 },
302         },
303         {
304                 .desc = {
305                         .name = "buck4",
306                         .of_match = of_match_ptr("BUCK4"),
307                         .regulators_node = of_match_ptr("regulators"),
308                         .id = BD71828_BUCK4,
309                         .ops = &bd71828_buck_ops,
310                         .type = REGULATOR_VOLTAGE,
311                         .linear_ranges = bd71828_buck4_volts,
312                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck4_volts),
313                         .n_voltages = BD71828_BUCK4_VOLTS,
314                         .enable_reg = BD71828_REG_BUCK4_EN,
315                         .enable_mask = BD71828_MASK_RUN_EN,
316                         .vsel_reg = BD71828_REG_BUCK4_VOLT,
317                         .vsel_mask = BD71828_MASK_BUCK4_VOLT,
318                         .owner = THIS_MODULE,
319                         .of_parse_cb = buck_set_hw_dvs_levels,
320                 },
321                 .dvs = {
322                         /*
323                          * BUCK4 only supports single voltage for all states.
324                          * voltage can be individually enabled for each state
325                          * though => allow setting all states to support
326                          * enabling power rail on different states.
327                          */
328                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
329                                      ROHM_DVS_LEVEL_SUSPEND |
330                                      ROHM_DVS_LEVEL_LPSR,
331                         .run_reg = BD71828_REG_BUCK4_VOLT,
332                         .idle_reg = BD71828_REG_BUCK4_VOLT,
333                         .suspend_reg = BD71828_REG_BUCK4_VOLT,
334                         .lpsr_reg = BD71828_REG_BUCK4_VOLT,
335                         .run_mask = BD71828_MASK_BUCK4_VOLT,
336                         .idle_mask = BD71828_MASK_BUCK4_VOLT,
337                         .suspend_mask = BD71828_MASK_BUCK4_VOLT,
338                         .lpsr_mask = BD71828_MASK_BUCK4_VOLT,
339                         .idle_on_mask = BD71828_MASK_IDLE_EN,
340                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
341                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
342                 },
343         },
344         {
345                 .desc = {
346                         .name = "buck5",
347                         .of_match = of_match_ptr("BUCK5"),
348                         .regulators_node = of_match_ptr("regulators"),
349                         .id = BD71828_BUCK5,
350                         .ops = &bd71828_buck_ops,
351                         .type = REGULATOR_VOLTAGE,
352                         .linear_ranges = bd71828_buck5_volts,
353                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck5_volts),
354                         .n_voltages = BD71828_BUCK5_VOLTS,
355                         .enable_reg = BD71828_REG_BUCK5_EN,
356                         .enable_mask = BD71828_MASK_RUN_EN,
357                         .vsel_reg = BD71828_REG_BUCK5_VOLT,
358                         .vsel_mask = BD71828_MASK_BUCK5_VOLT,
359                         .owner = THIS_MODULE,
360                         .of_parse_cb = buck_set_hw_dvs_levels,
361                 },
362                 .dvs = {
363                         /*
364                          * BUCK5 only supports single voltage for all states.
365                          * voltage can be individually enabled for each state
366                          * though => allow setting all states to support
367                          * enabling power rail on different states.
368                          */
369                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
370                                      ROHM_DVS_LEVEL_SUSPEND |
371                                      ROHM_DVS_LEVEL_LPSR,
372                         .run_reg = BD71828_REG_BUCK5_VOLT,
373                         .idle_reg = BD71828_REG_BUCK5_VOLT,
374                         .suspend_reg = BD71828_REG_BUCK5_VOLT,
375                         .lpsr_reg = BD71828_REG_BUCK5_VOLT,
376                         .run_mask = BD71828_MASK_BUCK5_VOLT,
377                         .idle_mask = BD71828_MASK_BUCK5_VOLT,
378                         .suspend_mask = BD71828_MASK_BUCK5_VOLT,
379                         .lpsr_mask = BD71828_MASK_BUCK5_VOLT,
380                         .idle_on_mask = BD71828_MASK_IDLE_EN,
381                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
382                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
383                 },
384         },
385         {
386                 .desc = {
387                         .name = "buck6",
388                         .of_match = of_match_ptr("BUCK6"),
389                         .regulators_node = of_match_ptr("regulators"),
390                         .id = BD71828_BUCK6,
391                         .ops = &bd71828_dvs_buck_ops,
392                         .type = REGULATOR_VOLTAGE,
393                         .linear_ranges = bd71828_buck1267_volts,
394                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
395                         .n_voltages = BD71828_BUCK1267_VOLTS,
396                         .enable_reg = BD71828_REG_BUCK6_EN,
397                         .enable_mask = BD71828_MASK_RUN_EN,
398                         .vsel_reg = BD71828_REG_BUCK6_VOLT,
399                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
400                         .ramp_delay_table = bd71828_ramp_delay,
401                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
402                         .ramp_reg = BD71828_REG_BUCK6_MODE,
403                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
404                         .owner = THIS_MODULE,
405                         .of_parse_cb = buck_set_hw_dvs_levels,
406                 },
407                 .dvs = {
408                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
409                                      ROHM_DVS_LEVEL_SUSPEND |
410                                      ROHM_DVS_LEVEL_LPSR,
411                         .run_reg = BD71828_REG_BUCK6_VOLT,
412                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
413                         .idle_reg = BD71828_REG_BUCK6_IDLE_VOLT,
414                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
415                         .idle_on_mask = BD71828_MASK_IDLE_EN,
416                         .suspend_reg = BD71828_REG_BUCK6_SUSP_VOLT,
417                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
418                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
419                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
420                         .lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT,
421                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
422                 },
423                 .reg_inits = buck6_inits,
424                 .reg_init_amnt = ARRAY_SIZE(buck6_inits),
425         },
426         {
427                 .desc = {
428                         .name = "buck7",
429                         .of_match = of_match_ptr("BUCK7"),
430                         .regulators_node = of_match_ptr("regulators"),
431                         .id = BD71828_BUCK7,
432                         .ops = &bd71828_dvs_buck_ops,
433                         .type = REGULATOR_VOLTAGE,
434                         .linear_ranges = bd71828_buck1267_volts,
435                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
436                         .n_voltages = BD71828_BUCK1267_VOLTS,
437                         .enable_reg = BD71828_REG_BUCK7_EN,
438                         .enable_mask = BD71828_MASK_RUN_EN,
439                         .vsel_reg = BD71828_REG_BUCK7_VOLT,
440                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
441                         .ramp_delay_table = bd71828_ramp_delay,
442                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
443                         .ramp_reg = BD71828_REG_BUCK7_MODE,
444                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
445                         .owner = THIS_MODULE,
446                         .of_parse_cb = buck_set_hw_dvs_levels,
447                 },
448                 .dvs = {
449                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
450                                      ROHM_DVS_LEVEL_SUSPEND |
451                                      ROHM_DVS_LEVEL_LPSR,
452                         .run_reg = BD71828_REG_BUCK7_VOLT,
453                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
454                         .idle_reg = BD71828_REG_BUCK7_IDLE_VOLT,
455                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
456                         .idle_on_mask = BD71828_MASK_IDLE_EN,
457                         .suspend_reg = BD71828_REG_BUCK7_SUSP_VOLT,
458                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
459                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
460                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
461                         .lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT,
462                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
463                 },
464                 .reg_inits = buck7_inits,
465                 .reg_init_amnt = ARRAY_SIZE(buck7_inits),
466         },
467         {
468                 .desc = {
469                         .name = "ldo1",
470                         .of_match = of_match_ptr("LDO1"),
471                         .regulators_node = of_match_ptr("regulators"),
472                         .id = BD71828_LDO1,
473                         .ops = &bd71828_ldo_ops,
474                         .type = REGULATOR_VOLTAGE,
475                         .linear_ranges = bd71828_ldo_volts,
476                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
477                         .n_voltages = BD71828_LDO_VOLTS,
478                         .enable_reg = BD71828_REG_LDO1_EN,
479                         .enable_mask = BD71828_MASK_RUN_EN,
480                         .vsel_reg = BD71828_REG_LDO1_VOLT,
481                         .vsel_mask = BD71828_MASK_LDO_VOLT,
482                         .owner = THIS_MODULE,
483                         .of_parse_cb = buck_set_hw_dvs_levels,
484                 },
485                 .dvs = {
486                         /*
487                          * LDO1 only supports single voltage for all states.
488                          * voltage can be individually enabled for each state
489                          * though => allow setting all states to support
490                          * enabling power rail on different states.
491                          */
492                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
493                                      ROHM_DVS_LEVEL_SUSPEND |
494                                      ROHM_DVS_LEVEL_LPSR,
495                         .run_reg = BD71828_REG_LDO1_VOLT,
496                         .idle_reg = BD71828_REG_LDO1_VOLT,
497                         .suspend_reg = BD71828_REG_LDO1_VOLT,
498                         .lpsr_reg = BD71828_REG_LDO1_VOLT,
499                         .run_mask = BD71828_MASK_LDO_VOLT,
500                         .idle_mask = BD71828_MASK_LDO_VOLT,
501                         .suspend_mask = BD71828_MASK_LDO_VOLT,
502                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
503                         .idle_on_mask = BD71828_MASK_IDLE_EN,
504                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
505                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
506                 },
507         }, {
508                 .desc = {
509                         .name = "ldo2",
510                         .of_match = of_match_ptr("LDO2"),
511                         .regulators_node = of_match_ptr("regulators"),
512                         .id = BD71828_LDO2,
513                         .ops = &bd71828_ldo_ops,
514                         .type = REGULATOR_VOLTAGE,
515                         .linear_ranges = bd71828_ldo_volts,
516                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
517                         .n_voltages = BD71828_LDO_VOLTS,
518                         .enable_reg = BD71828_REG_LDO2_EN,
519                         .enable_mask = BD71828_MASK_RUN_EN,
520                         .vsel_reg = BD71828_REG_LDO2_VOLT,
521                         .vsel_mask = BD71828_MASK_LDO_VOLT,
522                         .owner = THIS_MODULE,
523                         .of_parse_cb = buck_set_hw_dvs_levels,
524                 },
525                 .dvs = {
526                         /*
527                          * LDO2 only supports single voltage for all states.
528                          * voltage can be individually enabled for each state
529                          * though => allow setting all states to support
530                          * enabling power rail on different states.
531                          */
532                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
533                                      ROHM_DVS_LEVEL_SUSPEND |
534                                      ROHM_DVS_LEVEL_LPSR,
535                         .run_reg = BD71828_REG_LDO2_VOLT,
536                         .idle_reg = BD71828_REG_LDO2_VOLT,
537                         .suspend_reg = BD71828_REG_LDO2_VOLT,
538                         .lpsr_reg = BD71828_REG_LDO2_VOLT,
539                         .run_mask = BD71828_MASK_LDO_VOLT,
540                         .idle_mask = BD71828_MASK_LDO_VOLT,
541                         .suspend_mask = BD71828_MASK_LDO_VOLT,
542                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
543                         .idle_on_mask = BD71828_MASK_IDLE_EN,
544                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
545                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
546                 },
547         }, {
548                 .desc = {
549                         .name = "ldo3",
550                         .of_match = of_match_ptr("LDO3"),
551                         .regulators_node = of_match_ptr("regulators"),
552                         .id = BD71828_LDO3,
553                         .ops = &bd71828_ldo_ops,
554                         .type = REGULATOR_VOLTAGE,
555                         .linear_ranges = bd71828_ldo_volts,
556                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
557                         .n_voltages = BD71828_LDO_VOLTS,
558                         .enable_reg = BD71828_REG_LDO3_EN,
559                         .enable_mask = BD71828_MASK_RUN_EN,
560                         .vsel_reg = BD71828_REG_LDO3_VOLT,
561                         .vsel_mask = BD71828_MASK_LDO_VOLT,
562                         .owner = THIS_MODULE,
563                         .of_parse_cb = buck_set_hw_dvs_levels,
564                 },
565                 .dvs = {
566                         /*
567                          * LDO3 only supports single voltage for all states.
568                          * voltage can be individually enabled for each state
569                          * though => allow setting all states to support
570                          * enabling power rail on different states.
571                          */
572                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
573                                      ROHM_DVS_LEVEL_SUSPEND |
574                                      ROHM_DVS_LEVEL_LPSR,
575                         .run_reg = BD71828_REG_LDO3_VOLT,
576                         .idle_reg = BD71828_REG_LDO3_VOLT,
577                         .suspend_reg = BD71828_REG_LDO3_VOLT,
578                         .lpsr_reg = BD71828_REG_LDO3_VOLT,
579                         .run_mask = BD71828_MASK_LDO_VOLT,
580                         .idle_mask = BD71828_MASK_LDO_VOLT,
581                         .suspend_mask = BD71828_MASK_LDO_VOLT,
582                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
583                         .idle_on_mask = BD71828_MASK_IDLE_EN,
584                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
585                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
586                 },
587
588         }, {
589                 .desc = {
590                         .name = "ldo4",
591                         .of_match = of_match_ptr("LDO4"),
592                         .regulators_node = of_match_ptr("regulators"),
593                         .id = BD71828_LDO4,
594                         .ops = &bd71828_ldo_ops,
595                         .type = REGULATOR_VOLTAGE,
596                         .linear_ranges = bd71828_ldo_volts,
597                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
598                         .n_voltages = BD71828_LDO_VOLTS,
599                         .enable_reg = BD71828_REG_LDO4_EN,
600                         .enable_mask = BD71828_MASK_RUN_EN,
601                         .vsel_reg = BD71828_REG_LDO4_VOLT,
602                         .vsel_mask = BD71828_MASK_LDO_VOLT,
603                         .owner = THIS_MODULE,
604                         .of_parse_cb = buck_set_hw_dvs_levels,
605                 },
606                 .dvs = {
607                         /*
608                          * LDO1 only supports single voltage for all states.
609                          * voltage can be individually enabled for each state
610                          * though => allow setting all states to support
611                          * enabling power rail on different states.
612                          */
613                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
614                                      ROHM_DVS_LEVEL_SUSPEND |
615                                      ROHM_DVS_LEVEL_LPSR,
616                         .run_reg = BD71828_REG_LDO4_VOLT,
617                         .idle_reg = BD71828_REG_LDO4_VOLT,
618                         .suspend_reg = BD71828_REG_LDO4_VOLT,
619                         .lpsr_reg = BD71828_REG_LDO4_VOLT,
620                         .run_mask = BD71828_MASK_LDO_VOLT,
621                         .idle_mask = BD71828_MASK_LDO_VOLT,
622                         .suspend_mask = BD71828_MASK_LDO_VOLT,
623                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
624                         .idle_on_mask = BD71828_MASK_IDLE_EN,
625                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
626                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
627                 },
628         }, {
629                 .desc = {
630                         .name = "ldo5",
631                         .of_match = of_match_ptr("LDO5"),
632                         .regulators_node = of_match_ptr("regulators"),
633                         .id = BD71828_LDO5,
634                         .ops = &bd71828_ldo_ops,
635                         .type = REGULATOR_VOLTAGE,
636                         .linear_ranges = bd71828_ldo_volts,
637                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
638                         .n_voltages = BD71828_LDO_VOLTS,
639                         .enable_reg = BD71828_REG_LDO5_EN,
640                         .enable_mask = BD71828_MASK_RUN_EN,
641                         .vsel_reg = BD71828_REG_LDO5_VOLT,
642                         .vsel_mask = BD71828_MASK_LDO_VOLT,
643                         .of_parse_cb = buck_set_hw_dvs_levels,
644                         .owner = THIS_MODULE,
645                 },
646                 /*
647                  * LDO5 is special. It can choose vsel settings to be configured
648                  * from 2 different registers (by GPIO).
649                  *
650                  * This driver supports only configuration where
651                  * BD71828_REG_LDO5_VOLT_L is used.
652                  */
653                 .dvs = {
654                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
655                                      ROHM_DVS_LEVEL_SUSPEND |
656                                      ROHM_DVS_LEVEL_LPSR,
657                         .run_reg = BD71828_REG_LDO5_VOLT,
658                         .idle_reg = BD71828_REG_LDO5_VOLT,
659                         .suspend_reg = BD71828_REG_LDO5_VOLT,
660                         .lpsr_reg = BD71828_REG_LDO5_VOLT,
661                         .run_mask = BD71828_MASK_LDO_VOLT,
662                         .idle_mask = BD71828_MASK_LDO_VOLT,
663                         .suspend_mask = BD71828_MASK_LDO_VOLT,
664                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
665                         .idle_on_mask = BD71828_MASK_IDLE_EN,
666                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
667                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
668                 },
669
670         }, {
671                 .desc = {
672                         .name = "ldo6",
673                         .of_match = of_match_ptr("LDO6"),
674                         .regulators_node = of_match_ptr("regulators"),
675                         .id = BD71828_LDO6,
676                         .ops = &bd71828_ldo6_ops,
677                         .type = REGULATOR_VOLTAGE,
678                         .fixed_uV = BD71828_LDO_6_VOLTAGE,
679                         .n_voltages = 1,
680                         .enable_reg = BD71828_REG_LDO6_EN,
681                         .enable_mask = BD71828_MASK_RUN_EN,
682                         .owner = THIS_MODULE,
683                         /*
684                          * LDO6 only supports enable/disable for all states.
685                          * Voltage for LDO6 is fixed.
686                          */
687                         .of_parse_cb = ldo6_parse_dt,
688                 },
689         }, {
690                 .desc = {
691                         /* SNVS LDO in data-sheet */
692                         .name = "ldo7",
693                         .of_match = of_match_ptr("LDO7"),
694                         .regulators_node = of_match_ptr("regulators"),
695                         .id = BD71828_LDO_SNVS,
696                         .ops = &bd71828_ldo_ops,
697                         .type = REGULATOR_VOLTAGE,
698                         .linear_ranges = bd71828_ldo_volts,
699                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
700                         .n_voltages = BD71828_LDO_VOLTS,
701                         .enable_reg = BD71828_REG_LDO7_EN,
702                         .enable_mask = BD71828_MASK_RUN_EN,
703                         .vsel_reg = BD71828_REG_LDO7_VOLT,
704                         .vsel_mask = BD71828_MASK_LDO_VOLT,
705                         .owner = THIS_MODULE,
706                         .of_parse_cb = buck_set_hw_dvs_levels,
707                 },
708                 .dvs = {
709                         /*
710                          * LDO7 only supports single voltage for all states.
711                          * voltage can be individually enabled for each state
712                          * though => allow setting all states to support
713                          * enabling power rail on different states.
714                          */
715                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
716                                      ROHM_DVS_LEVEL_SUSPEND |
717                                      ROHM_DVS_LEVEL_LPSR,
718                         .run_reg = BD71828_REG_LDO7_VOLT,
719                         .idle_reg = BD71828_REG_LDO7_VOLT,
720                         .suspend_reg = BD71828_REG_LDO7_VOLT,
721                         .lpsr_reg = BD71828_REG_LDO7_VOLT,
722                         .run_mask = BD71828_MASK_LDO_VOLT,
723                         .idle_mask = BD71828_MASK_LDO_VOLT,
724                         .suspend_mask = BD71828_MASK_LDO_VOLT,
725                         .lpsr_mask = BD71828_MASK_LDO_VOLT,
726                         .idle_on_mask = BD71828_MASK_IDLE_EN,
727                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
728                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
729                 },
730
731         },
732 };
733
734 static int bd71828_probe(struct platform_device *pdev)
735 {
736         int i, j, ret;
737         struct regulator_config config = {
738                 .dev = pdev->dev.parent,
739         };
740
741         config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
742         if (!config.regmap)
743                 return -ENODEV;
744
745         for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) {
746                 struct regulator_dev *rdev;
747                 const struct bd71828_regulator_data *rd;
748
749                 rd = &bd71828_rdata[i];
750                 rdev = devm_regulator_register(&pdev->dev,
751                                                &rd->desc, &config);
752                 if (IS_ERR(rdev))
753                         return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
754                                              "failed to register %s regulator\n",
755                                              rd->desc.name);
756
757                 for (j = 0; j < rd->reg_init_amnt; j++) {
758                         ret = regmap_update_bits(config.regmap,
759                                                  rd->reg_inits[j].reg,
760                                                  rd->reg_inits[j].mask,
761                                                  rd->reg_inits[j].val);
762                         if (ret)
763                                 return dev_err_probe(&pdev->dev, ret,
764                                                      "regulator %s init failed\n",
765                                                      rd->desc.name);
766                 }
767         }
768         return 0;
769 }
770
771 static struct platform_driver bd71828_regulator = {
772         .driver = {
773                 .name = "bd71828-pmic",
774                 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
775         },
776         .probe = bd71828_probe,
777 };
778
779 module_platform_driver(bd71828_regulator);
780
781 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
782 MODULE_DESCRIPTION("BD71828 voltage regulator driver");
783 MODULE_LICENSE("GPL");
784 MODULE_ALIAS("platform:bd71828-pmic");