]> Git Repo - J-linux.git/blob - drivers/regulator/bd71828-regulator.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.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                         /*
210                          * LPSR voltage is same as SUSPEND voltage. Allow
211                          * only enabling/disabling regulator for LPSR state
212                          */
213                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
214                 },
215                 .reg_inits = buck1_inits,
216                 .reg_init_amnt = ARRAY_SIZE(buck1_inits),
217         },
218         {
219                 .desc = {
220                         .name = "buck2",
221                         .of_match = of_match_ptr("BUCK2"),
222                         .regulators_node = of_match_ptr("regulators"),
223                         .id = BD71828_BUCK2,
224                         .ops = &bd71828_dvs_buck_ops,
225                         .type = REGULATOR_VOLTAGE,
226                         .linear_ranges = bd71828_buck1267_volts,
227                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
228                         .n_voltages = BD71828_BUCK1267_VOLTS,
229                         .enable_reg = BD71828_REG_BUCK2_EN,
230                         .enable_mask = BD71828_MASK_RUN_EN,
231                         .vsel_reg = BD71828_REG_BUCK2_VOLT,
232                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
233                         .ramp_delay_table = bd71828_ramp_delay,
234                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
235                         .ramp_reg = BD71828_REG_BUCK2_MODE,
236                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
237                         .owner = THIS_MODULE,
238                         .of_parse_cb = buck_set_hw_dvs_levels,
239                 },
240                 .dvs = {
241                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
242                                      ROHM_DVS_LEVEL_SUSPEND |
243                                      ROHM_DVS_LEVEL_LPSR,
244                         .run_reg = BD71828_REG_BUCK2_VOLT,
245                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
246                         .idle_reg = BD71828_REG_BUCK2_IDLE_VOLT,
247                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
248                         .idle_on_mask = BD71828_MASK_IDLE_EN,
249                         .suspend_reg = BD71828_REG_BUCK2_SUSP_VOLT,
250                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
251                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
252                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
253                         .lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT,
254                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
255                 },
256                 .reg_inits = buck2_inits,
257                 .reg_init_amnt = ARRAY_SIZE(buck2_inits),
258         },
259         {
260                 .desc = {
261                         .name = "buck3",
262                         .of_match = of_match_ptr("BUCK3"),
263                         .regulators_node = of_match_ptr("regulators"),
264                         .id = BD71828_BUCK3,
265                         .ops = &bd71828_buck_ops,
266                         .type = REGULATOR_VOLTAGE,
267                         .linear_ranges = bd71828_buck3_volts,
268                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck3_volts),
269                         .n_voltages = BD71828_BUCK3_VOLTS,
270                         .enable_reg = BD71828_REG_BUCK3_EN,
271                         .enable_mask = BD71828_MASK_RUN_EN,
272                         .vsel_reg = BD71828_REG_BUCK3_VOLT,
273                         .vsel_mask = BD71828_MASK_BUCK3_VOLT,
274                         .owner = THIS_MODULE,
275                         .of_parse_cb = buck_set_hw_dvs_levels,
276                 },
277                 .dvs = {
278                         /*
279                          * BUCK3 only supports single voltage for all states.
280                          * voltage can be individually enabled for each state
281                          * though => allow setting all states to support
282                          * enabling power rail on different states.
283                          */
284                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
285                                      ROHM_DVS_LEVEL_SUSPEND |
286                                      ROHM_DVS_LEVEL_LPSR,
287                         .run_reg = BD71828_REG_BUCK3_VOLT,
288                         .run_mask = BD71828_MASK_BUCK3_VOLT,
289                         .idle_on_mask = BD71828_MASK_IDLE_EN,
290                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
291                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
292                 },
293         },
294         {
295                 .desc = {
296                         .name = "buck4",
297                         .of_match = of_match_ptr("BUCK4"),
298                         .regulators_node = of_match_ptr("regulators"),
299                         .id = BD71828_BUCK4,
300                         .ops = &bd71828_buck_ops,
301                         .type = REGULATOR_VOLTAGE,
302                         .linear_ranges = bd71828_buck4_volts,
303                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck4_volts),
304                         .n_voltages = BD71828_BUCK4_VOLTS,
305                         .enable_reg = BD71828_REG_BUCK4_EN,
306                         .enable_mask = BD71828_MASK_RUN_EN,
307                         .vsel_reg = BD71828_REG_BUCK4_VOLT,
308                         .vsel_mask = BD71828_MASK_BUCK4_VOLT,
309                         .owner = THIS_MODULE,
310                         .of_parse_cb = buck_set_hw_dvs_levels,
311                 },
312                 .dvs = {
313                         /*
314                          * BUCK4 only supports single voltage for all states.
315                          * voltage can be individually enabled for each state
316                          * though => allow setting all states to support
317                          * enabling power rail on different states.
318                          */
319                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
320                                      ROHM_DVS_LEVEL_SUSPEND |
321                                      ROHM_DVS_LEVEL_LPSR,
322                         .run_reg = BD71828_REG_BUCK4_VOLT,
323                         .run_mask = BD71828_MASK_BUCK4_VOLT,
324                         .idle_on_mask = BD71828_MASK_IDLE_EN,
325                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
326                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
327                 },
328         },
329         {
330                 .desc = {
331                         .name = "buck5",
332                         .of_match = of_match_ptr("BUCK5"),
333                         .regulators_node = of_match_ptr("regulators"),
334                         .id = BD71828_BUCK5,
335                         .ops = &bd71828_buck_ops,
336                         .type = REGULATOR_VOLTAGE,
337                         .linear_ranges = bd71828_buck5_volts,
338                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck5_volts),
339                         .n_voltages = BD71828_BUCK5_VOLTS,
340                         .enable_reg = BD71828_REG_BUCK5_EN,
341                         .enable_mask = BD71828_MASK_RUN_EN,
342                         .vsel_reg = BD71828_REG_BUCK5_VOLT,
343                         .vsel_mask = BD71828_MASK_BUCK5_VOLT,
344                         .owner = THIS_MODULE,
345                         .of_parse_cb = buck_set_hw_dvs_levels,
346                 },
347                 .dvs = {
348                         /*
349                          * BUCK5 only supports single voltage for all states.
350                          * voltage can be individually enabled for each state
351                          * though => allow setting all states to support
352                          * enabling power rail on different states.
353                          */
354                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
355                                      ROHM_DVS_LEVEL_SUSPEND |
356                                      ROHM_DVS_LEVEL_LPSR,
357                         .run_reg = BD71828_REG_BUCK5_VOLT,
358                         .run_mask = BD71828_MASK_BUCK5_VOLT,
359                         .idle_on_mask = BD71828_MASK_IDLE_EN,
360                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
361                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
362                 },
363         },
364         {
365                 .desc = {
366                         .name = "buck6",
367                         .of_match = of_match_ptr("BUCK6"),
368                         .regulators_node = of_match_ptr("regulators"),
369                         .id = BD71828_BUCK6,
370                         .ops = &bd71828_dvs_buck_ops,
371                         .type = REGULATOR_VOLTAGE,
372                         .linear_ranges = bd71828_buck1267_volts,
373                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
374                         .n_voltages = BD71828_BUCK1267_VOLTS,
375                         .enable_reg = BD71828_REG_BUCK6_EN,
376                         .enable_mask = BD71828_MASK_RUN_EN,
377                         .vsel_reg = BD71828_REG_BUCK6_VOLT,
378                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
379                         .ramp_delay_table = bd71828_ramp_delay,
380                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
381                         .ramp_reg = BD71828_REG_BUCK6_MODE,
382                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
383                         .owner = THIS_MODULE,
384                         .of_parse_cb = buck_set_hw_dvs_levels,
385                 },
386                 .dvs = {
387                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
388                                      ROHM_DVS_LEVEL_SUSPEND |
389                                      ROHM_DVS_LEVEL_LPSR,
390                         .run_reg = BD71828_REG_BUCK6_VOLT,
391                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
392                         .idle_reg = BD71828_REG_BUCK6_IDLE_VOLT,
393                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
394                         .idle_on_mask = BD71828_MASK_IDLE_EN,
395                         .suspend_reg = BD71828_REG_BUCK6_SUSP_VOLT,
396                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
397                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
398                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
399                         .lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT,
400                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
401                 },
402                 .reg_inits = buck6_inits,
403                 .reg_init_amnt = ARRAY_SIZE(buck6_inits),
404         },
405         {
406                 .desc = {
407                         .name = "buck7",
408                         .of_match = of_match_ptr("BUCK7"),
409                         .regulators_node = of_match_ptr("regulators"),
410                         .id = BD71828_BUCK7,
411                         .ops = &bd71828_dvs_buck_ops,
412                         .type = REGULATOR_VOLTAGE,
413                         .linear_ranges = bd71828_buck1267_volts,
414                         .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
415                         .n_voltages = BD71828_BUCK1267_VOLTS,
416                         .enable_reg = BD71828_REG_BUCK7_EN,
417                         .enable_mask = BD71828_MASK_RUN_EN,
418                         .vsel_reg = BD71828_REG_BUCK7_VOLT,
419                         .vsel_mask = BD71828_MASK_BUCK1267_VOLT,
420                         .ramp_delay_table = bd71828_ramp_delay,
421                         .n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
422                         .ramp_reg = BD71828_REG_BUCK7_MODE,
423                         .ramp_mask = BD71828_MASK_RAMP_DELAY,
424                         .owner = THIS_MODULE,
425                         .of_parse_cb = buck_set_hw_dvs_levels,
426                 },
427                 .dvs = {
428                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
429                                      ROHM_DVS_LEVEL_SUSPEND |
430                                      ROHM_DVS_LEVEL_LPSR,
431                         .run_reg = BD71828_REG_BUCK7_VOLT,
432                         .run_mask = BD71828_MASK_BUCK1267_VOLT,
433                         .idle_reg = BD71828_REG_BUCK7_IDLE_VOLT,
434                         .idle_mask = BD71828_MASK_BUCK1267_VOLT,
435                         .idle_on_mask = BD71828_MASK_IDLE_EN,
436                         .suspend_reg = BD71828_REG_BUCK7_SUSP_VOLT,
437                         .suspend_mask = BD71828_MASK_BUCK1267_VOLT,
438                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
439                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
440                         .lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT,
441                         .lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
442                 },
443                 .reg_inits = buck7_inits,
444                 .reg_init_amnt = ARRAY_SIZE(buck7_inits),
445         },
446         {
447                 .desc = {
448                         .name = "ldo1",
449                         .of_match = of_match_ptr("LDO1"),
450                         .regulators_node = of_match_ptr("regulators"),
451                         .id = BD71828_LDO1,
452                         .ops = &bd71828_ldo_ops,
453                         .type = REGULATOR_VOLTAGE,
454                         .linear_ranges = bd71828_ldo_volts,
455                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
456                         .n_voltages = BD71828_LDO_VOLTS,
457                         .enable_reg = BD71828_REG_LDO1_EN,
458                         .enable_mask = BD71828_MASK_RUN_EN,
459                         .vsel_reg = BD71828_REG_LDO1_VOLT,
460                         .vsel_mask = BD71828_MASK_LDO_VOLT,
461                         .owner = THIS_MODULE,
462                         .of_parse_cb = buck_set_hw_dvs_levels,
463                 },
464                 .dvs = {
465                         /*
466                          * LDO1 only supports single voltage for all states.
467                          * voltage can be individually enabled for each state
468                          * though => allow setting all states to support
469                          * enabling power rail on different states.
470                          */
471                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
472                                      ROHM_DVS_LEVEL_SUSPEND |
473                                      ROHM_DVS_LEVEL_LPSR,
474                         .run_reg = BD71828_REG_LDO1_VOLT,
475                         .run_mask = BD71828_MASK_LDO_VOLT,
476                         .idle_on_mask = BD71828_MASK_IDLE_EN,
477                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
478                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
479                 },
480         }, {
481                 .desc = {
482                         .name = "ldo2",
483                         .of_match = of_match_ptr("LDO2"),
484                         .regulators_node = of_match_ptr("regulators"),
485                         .id = BD71828_LDO2,
486                         .ops = &bd71828_ldo_ops,
487                         .type = REGULATOR_VOLTAGE,
488                         .linear_ranges = bd71828_ldo_volts,
489                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
490                         .n_voltages = BD71828_LDO_VOLTS,
491                         .enable_reg = BD71828_REG_LDO2_EN,
492                         .enable_mask = BD71828_MASK_RUN_EN,
493                         .vsel_reg = BD71828_REG_LDO2_VOLT,
494                         .vsel_mask = BD71828_MASK_LDO_VOLT,
495                         .owner = THIS_MODULE,
496                         .of_parse_cb = buck_set_hw_dvs_levels,
497                 },
498                 .dvs = {
499                         /*
500                          * LDO2 only supports single voltage for all states.
501                          * voltage can be individually enabled for each state
502                          * though => allow setting all states to support
503                          * enabling power rail on different states.
504                          */
505                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
506                                      ROHM_DVS_LEVEL_SUSPEND |
507                                      ROHM_DVS_LEVEL_LPSR,
508                         .run_reg = BD71828_REG_LDO2_VOLT,
509                         .run_mask = BD71828_MASK_LDO_VOLT,
510                         .idle_on_mask = BD71828_MASK_IDLE_EN,
511                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
512                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
513                 },
514         }, {
515                 .desc = {
516                         .name = "ldo3",
517                         .of_match = of_match_ptr("LDO3"),
518                         .regulators_node = of_match_ptr("regulators"),
519                         .id = BD71828_LDO3,
520                         .ops = &bd71828_ldo_ops,
521                         .type = REGULATOR_VOLTAGE,
522                         .linear_ranges = bd71828_ldo_volts,
523                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
524                         .n_voltages = BD71828_LDO_VOLTS,
525                         .enable_reg = BD71828_REG_LDO3_EN,
526                         .enable_mask = BD71828_MASK_RUN_EN,
527                         .vsel_reg = BD71828_REG_LDO3_VOLT,
528                         .vsel_mask = BD71828_MASK_LDO_VOLT,
529                         .owner = THIS_MODULE,
530                         .of_parse_cb = buck_set_hw_dvs_levels,
531                 },
532                 .dvs = {
533                         /*
534                          * LDO3 only supports single voltage for all states.
535                          * voltage can be individually enabled for each state
536                          * though => allow setting all states to support
537                          * enabling power rail on different states.
538                          */
539                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
540                                      ROHM_DVS_LEVEL_SUSPEND |
541                                      ROHM_DVS_LEVEL_LPSR,
542                         .run_reg = BD71828_REG_LDO3_VOLT,
543                         .run_mask = BD71828_MASK_LDO_VOLT,
544                         .idle_on_mask = BD71828_MASK_IDLE_EN,
545                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
546                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
547                 },
548
549         }, {
550                 .desc = {
551                         .name = "ldo4",
552                         .of_match = of_match_ptr("LDO4"),
553                         .regulators_node = of_match_ptr("regulators"),
554                         .id = BD71828_LDO4,
555                         .ops = &bd71828_ldo_ops,
556                         .type = REGULATOR_VOLTAGE,
557                         .linear_ranges = bd71828_ldo_volts,
558                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
559                         .n_voltages = BD71828_LDO_VOLTS,
560                         .enable_reg = BD71828_REG_LDO4_EN,
561                         .enable_mask = BD71828_MASK_RUN_EN,
562                         .vsel_reg = BD71828_REG_LDO4_VOLT,
563                         .vsel_mask = BD71828_MASK_LDO_VOLT,
564                         .owner = THIS_MODULE,
565                         .of_parse_cb = buck_set_hw_dvs_levels,
566                 },
567                 .dvs = {
568                         /*
569                          * LDO1 only supports single voltage for all states.
570                          * voltage can be individually enabled for each state
571                          * though => allow setting all states to support
572                          * enabling power rail on different states.
573                          */
574                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
575                                      ROHM_DVS_LEVEL_SUSPEND |
576                                      ROHM_DVS_LEVEL_LPSR,
577                         .run_reg = BD71828_REG_LDO4_VOLT,
578                         .run_mask = BD71828_MASK_LDO_VOLT,
579                         .idle_on_mask = BD71828_MASK_IDLE_EN,
580                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
581                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
582                 },
583         }, {
584                 .desc = {
585                         .name = "ldo5",
586                         .of_match = of_match_ptr("LDO5"),
587                         .regulators_node = of_match_ptr("regulators"),
588                         .id = BD71828_LDO5,
589                         .ops = &bd71828_ldo_ops,
590                         .type = REGULATOR_VOLTAGE,
591                         .linear_ranges = bd71828_ldo_volts,
592                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
593                         .n_voltages = BD71828_LDO_VOLTS,
594                         .enable_reg = BD71828_REG_LDO5_EN,
595                         .enable_mask = BD71828_MASK_RUN_EN,
596                         .vsel_reg = BD71828_REG_LDO5_VOLT,
597                         .vsel_mask = BD71828_MASK_LDO_VOLT,
598                         .of_parse_cb = buck_set_hw_dvs_levels,
599                         .owner = THIS_MODULE,
600                 },
601                 /*
602                  * LDO5 is special. It can choose vsel settings to be configured
603                  * from 2 different registers (by GPIO).
604                  *
605                  * This driver supports only configuration where
606                  * BD71828_REG_LDO5_VOLT_L is used.
607                  */
608                 .dvs = {
609                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
610                                      ROHM_DVS_LEVEL_SUSPEND |
611                                      ROHM_DVS_LEVEL_LPSR,
612                         .run_reg = BD71828_REG_LDO5_VOLT,
613                         .run_mask = BD71828_MASK_LDO_VOLT,
614                         .idle_on_mask = BD71828_MASK_IDLE_EN,
615                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
616                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
617                 },
618
619         }, {
620                 .desc = {
621                         .name = "ldo6",
622                         .of_match = of_match_ptr("LDO6"),
623                         .regulators_node = of_match_ptr("regulators"),
624                         .id = BD71828_LDO6,
625                         .ops = &bd71828_ldo6_ops,
626                         .type = REGULATOR_VOLTAGE,
627                         .fixed_uV = BD71828_LDO_6_VOLTAGE,
628                         .n_voltages = 1,
629                         .enable_reg = BD71828_REG_LDO6_EN,
630                         .enable_mask = BD71828_MASK_RUN_EN,
631                         .owner = THIS_MODULE,
632                         /*
633                          * LDO6 only supports enable/disable for all states.
634                          * Voltage for LDO6 is fixed.
635                          */
636                         .of_parse_cb = ldo6_parse_dt,
637                 },
638         }, {
639                 .desc = {
640                         /* SNVS LDO in data-sheet */
641                         .name = "ldo7",
642                         .of_match = of_match_ptr("LDO7"),
643                         .regulators_node = of_match_ptr("regulators"),
644                         .id = BD71828_LDO_SNVS,
645                         .ops = &bd71828_ldo_ops,
646                         .type = REGULATOR_VOLTAGE,
647                         .linear_ranges = bd71828_ldo_volts,
648                         .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
649                         .n_voltages = BD71828_LDO_VOLTS,
650                         .enable_reg = BD71828_REG_LDO7_EN,
651                         .enable_mask = BD71828_MASK_RUN_EN,
652                         .vsel_reg = BD71828_REG_LDO7_VOLT,
653                         .vsel_mask = BD71828_MASK_LDO_VOLT,
654                         .owner = THIS_MODULE,
655                         .of_parse_cb = buck_set_hw_dvs_levels,
656                 },
657                 .dvs = {
658                         /*
659                          * LDO7 only supports single voltage for all states.
660                          * voltage can be individually enabled for each state
661                          * though => allow setting all states to support
662                          * enabling power rail on different states.
663                          */
664                         .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
665                                      ROHM_DVS_LEVEL_SUSPEND |
666                                      ROHM_DVS_LEVEL_LPSR,
667                         .run_reg = BD71828_REG_LDO7_VOLT,
668                         .idle_reg = BD71828_REG_LDO7_VOLT,
669                         .suspend_reg = BD71828_REG_LDO7_VOLT,
670                         .lpsr_reg = BD71828_REG_LDO7_VOLT,
671                         .run_mask = BD71828_MASK_LDO_VOLT,
672                         .idle_on_mask = BD71828_MASK_IDLE_EN,
673                         .suspend_on_mask = BD71828_MASK_SUSP_EN,
674                         .lpsr_on_mask = BD71828_MASK_LPSR_EN,
675                 },
676
677         },
678 };
679
680 static int bd71828_probe(struct platform_device *pdev)
681 {
682         int i, j, ret;
683         struct regulator_config config = {
684                 .dev = pdev->dev.parent,
685         };
686
687         config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
688         if (!config.regmap)
689                 return -ENODEV;
690
691         for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) {
692                 struct regulator_dev *rdev;
693                 const struct bd71828_regulator_data *rd;
694
695                 rd = &bd71828_rdata[i];
696                 rdev = devm_regulator_register(&pdev->dev,
697                                                &rd->desc, &config);
698                 if (IS_ERR(rdev))
699                         return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
700                                              "failed to register %s regulator\n",
701                                              rd->desc.name);
702
703                 for (j = 0; j < rd->reg_init_amnt; j++) {
704                         ret = regmap_update_bits(config.regmap,
705                                                  rd->reg_inits[j].reg,
706                                                  rd->reg_inits[j].mask,
707                                                  rd->reg_inits[j].val);
708                         if (ret)
709                                 return dev_err_probe(&pdev->dev, ret,
710                                                      "regulator %s init failed\n",
711                                                      rd->desc.name);
712                 }
713         }
714         return 0;
715 }
716
717 static struct platform_driver bd71828_regulator = {
718         .driver = {
719                 .name = "bd71828-pmic",
720                 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
721         },
722         .probe = bd71828_probe,
723 };
724
725 module_platform_driver(bd71828_regulator);
726
727 MODULE_AUTHOR("Matti Vaittinen <[email protected]>");
728 MODULE_DESCRIPTION("BD71828 voltage regulator driver");
729 MODULE_LICENSE("GPL");
730 MODULE_ALIAS("platform:bd71828-pmic");
This page took 0.071608 seconds and 4 git commands to generate.