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  
buck_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)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  
ldo6_parse_dt(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)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  
bd71828_probe(struct platform_device * pdev)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 <matti.vaittinen@fi.rohmeurope.com>");
728  MODULE_DESCRIPTION("BD71828 voltage regulator driver");
729  MODULE_LICENSE("GPL");
730  MODULE_ALIAS("platform:bd71828-pmic");
731