1522498f8SMatti Vaittinen // SPDX-License-Identifier: GPL-2.0-only
2522498f8SMatti Vaittinen // Copyright (C) 2019 ROHM Semiconductors
3522498f8SMatti Vaittinen // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver
4522498f8SMatti Vaittinen //
5522498f8SMatti Vaittinen 
6522498f8SMatti Vaittinen #include <linux/delay.h>
7522498f8SMatti Vaittinen #include <linux/err.h>
8522498f8SMatti Vaittinen #include <linux/interrupt.h>
9522498f8SMatti Vaittinen #include <linux/kernel.h>
10522498f8SMatti Vaittinen #include <linux/mfd/rohm-bd71828.h>
11522498f8SMatti Vaittinen #include <linux/module.h>
12522498f8SMatti Vaittinen #include <linux/of.h>
13522498f8SMatti Vaittinen #include <linux/platform_device.h>
14522498f8SMatti Vaittinen #include <linux/regmap.h>
15522498f8SMatti Vaittinen #include <linux/regulator/driver.h>
16522498f8SMatti Vaittinen #include <linux/regulator/machine.h>
17522498f8SMatti Vaittinen #include <linux/regulator/of_regulator.h>
18522498f8SMatti Vaittinen 
19522498f8SMatti Vaittinen struct reg_init {
20522498f8SMatti Vaittinen 	unsigned int reg;
21522498f8SMatti Vaittinen 	unsigned int mask;
22522498f8SMatti Vaittinen 	unsigned int val;
23522498f8SMatti Vaittinen };
24522498f8SMatti Vaittinen struct bd71828_regulator_data {
25522498f8SMatti Vaittinen 	struct regulator_desc desc;
26522498f8SMatti Vaittinen 	const struct rohm_dvs_config dvs;
27522498f8SMatti Vaittinen 	const struct reg_init *reg_inits;
28522498f8SMatti Vaittinen 	int reg_init_amnt;
29522498f8SMatti Vaittinen };
30522498f8SMatti Vaittinen 
31522498f8SMatti Vaittinen static const struct reg_init buck1_inits[] = {
32522498f8SMatti Vaittinen 	/*
33522498f8SMatti Vaittinen 	 * DVS Buck voltages can be changed by register values or via GPIO.
34522498f8SMatti Vaittinen 	 * Use register accesses by default.
35522498f8SMatti Vaittinen 	 */
36522498f8SMatti Vaittinen 	{
37522498f8SMatti Vaittinen 		.reg = BD71828_REG_PS_CTRL_1,
38522498f8SMatti Vaittinen 		.mask = BD71828_MASK_DVS_BUCK1_CTRL,
39522498f8SMatti Vaittinen 		.val = BD71828_DVS_BUCK1_CTRL_I2C,
40522498f8SMatti Vaittinen 	},
41522498f8SMatti Vaittinen };
42522498f8SMatti Vaittinen 
43522498f8SMatti Vaittinen static const struct reg_init buck2_inits[] = {
44522498f8SMatti Vaittinen 	{
45522498f8SMatti Vaittinen 		.reg = BD71828_REG_PS_CTRL_1,
46522498f8SMatti Vaittinen 		.mask = BD71828_MASK_DVS_BUCK2_CTRL,
47522498f8SMatti Vaittinen 		.val = BD71828_DVS_BUCK2_CTRL_I2C,
48522498f8SMatti Vaittinen 	},
49522498f8SMatti Vaittinen };
50522498f8SMatti Vaittinen 
51522498f8SMatti Vaittinen static const struct reg_init buck6_inits[] = {
52522498f8SMatti Vaittinen 	{
53522498f8SMatti Vaittinen 		.reg = BD71828_REG_PS_CTRL_1,
54522498f8SMatti Vaittinen 		.mask = BD71828_MASK_DVS_BUCK6_CTRL,
55522498f8SMatti Vaittinen 		.val = BD71828_DVS_BUCK6_CTRL_I2C,
56522498f8SMatti Vaittinen 	},
57522498f8SMatti Vaittinen };
58522498f8SMatti Vaittinen 
59522498f8SMatti Vaittinen static const struct reg_init buck7_inits[] = {
60522498f8SMatti Vaittinen 	{
61522498f8SMatti Vaittinen 		.reg = BD71828_REG_PS_CTRL_1,
62522498f8SMatti Vaittinen 		.mask = BD71828_MASK_DVS_BUCK7_CTRL,
63522498f8SMatti Vaittinen 		.val = BD71828_DVS_BUCK7_CTRL_I2C,
64522498f8SMatti Vaittinen 	},
65522498f8SMatti Vaittinen };
66522498f8SMatti Vaittinen 
6760ab7f41SMatti Vaittinen static const struct linear_range bd71828_buck1267_volts[] = {
68522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
69522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
70522498f8SMatti Vaittinen };
71522498f8SMatti Vaittinen 
7260ab7f41SMatti Vaittinen static const struct linear_range bd71828_buck3_volts[] = {
73522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000),
74522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0),
75522498f8SMatti Vaittinen };
76522498f8SMatti Vaittinen 
7760ab7f41SMatti Vaittinen static const struct linear_range bd71828_buck4_volts[] = {
78522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000),
79522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0),
80522498f8SMatti Vaittinen };
81522498f8SMatti Vaittinen 
8260ab7f41SMatti Vaittinen static const struct linear_range bd71828_buck5_volts[] = {
83522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000),
84522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
85522498f8SMatti Vaittinen };
86522498f8SMatti Vaittinen 
8760ab7f41SMatti Vaittinen static const struct linear_range bd71828_ldo_volts[] = {
88522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
89522498f8SMatti Vaittinen 	REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
90522498f8SMatti Vaittinen };
91522498f8SMatti Vaittinen 
9218f3c625SMatti Vaittinen static const unsigned int bd71828_ramp_delay[] = { 2500, 5000, 10000, 20000 };
93522498f8SMatti Vaittinen 
buck_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)94522498f8SMatti Vaittinen static int buck_set_hw_dvs_levels(struct device_node *np,
95522498f8SMatti Vaittinen 				  const struct regulator_desc *desc,
96522498f8SMatti Vaittinen 				  struct regulator_config *cfg)
97522498f8SMatti Vaittinen {
98522498f8SMatti Vaittinen 	struct bd71828_regulator_data *data;
99522498f8SMatti Vaittinen 
100522498f8SMatti Vaittinen 	data = container_of(desc, struct bd71828_regulator_data, desc);
101522498f8SMatti Vaittinen 
102522498f8SMatti Vaittinen 	return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap);
103522498f8SMatti Vaittinen }
104522498f8SMatti Vaittinen 
ldo6_parse_dt(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)105522498f8SMatti Vaittinen static int ldo6_parse_dt(struct device_node *np,
106522498f8SMatti Vaittinen 			 const struct regulator_desc *desc,
107522498f8SMatti Vaittinen 			 struct regulator_config *cfg)
108522498f8SMatti Vaittinen {
109522498f8SMatti Vaittinen 	int ret, i;
110522498f8SMatti Vaittinen 	uint32_t uv = 0;
111522498f8SMatti Vaittinen 	unsigned int en;
112522498f8SMatti Vaittinen 	struct regmap *regmap = cfg->regmap;
113522498f8SMatti Vaittinen 	static const char * const props[] = { "rohm,dvs-run-voltage",
114522498f8SMatti Vaittinen 					      "rohm,dvs-idle-voltage",
115522498f8SMatti Vaittinen 					      "rohm,dvs-suspend-voltage",
116522498f8SMatti Vaittinen 					      "rohm,dvs-lpsr-voltage" };
117522498f8SMatti Vaittinen 	unsigned int mask[] = { BD71828_MASK_RUN_EN, BD71828_MASK_IDLE_EN,
118522498f8SMatti Vaittinen 			       BD71828_MASK_SUSP_EN, BD71828_MASK_LPSR_EN };
119522498f8SMatti Vaittinen 
120522498f8SMatti Vaittinen 	for (i = 0; i < ARRAY_SIZE(props); i++) {
121522498f8SMatti Vaittinen 		ret = of_property_read_u32(np, props[i], &uv);
122522498f8SMatti Vaittinen 		if (ret) {
123522498f8SMatti Vaittinen 			if (ret != -EINVAL)
124522498f8SMatti Vaittinen 				return ret;
125522498f8SMatti Vaittinen 			continue;
126522498f8SMatti Vaittinen 		}
127522498f8SMatti Vaittinen 		if (uv)
128522498f8SMatti Vaittinen 			en = 0xffffffff;
129522498f8SMatti Vaittinen 		else
130522498f8SMatti Vaittinen 			en = 0;
131522498f8SMatti Vaittinen 
132522498f8SMatti Vaittinen 		ret = regmap_update_bits(regmap, desc->enable_reg, mask[i], en);
133522498f8SMatti Vaittinen 		if (ret)
134522498f8SMatti Vaittinen 			return ret;
135522498f8SMatti Vaittinen 	}
136522498f8SMatti Vaittinen 	return 0;
137522498f8SMatti Vaittinen }
138522498f8SMatti Vaittinen 
139522498f8SMatti Vaittinen static const struct regulator_ops bd71828_buck_ops = {
140522498f8SMatti Vaittinen 	.enable = regulator_enable_regmap,
141522498f8SMatti Vaittinen 	.disable = regulator_disable_regmap,
142522498f8SMatti Vaittinen 	.is_enabled = regulator_is_enabled_regmap,
143522498f8SMatti Vaittinen 	.list_voltage = regulator_list_voltage_linear_range,
144522498f8SMatti Vaittinen 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
145522498f8SMatti Vaittinen 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
146522498f8SMatti Vaittinen };
147522498f8SMatti Vaittinen 
148522498f8SMatti Vaittinen static const struct regulator_ops bd71828_dvs_buck_ops = {
149522498f8SMatti Vaittinen 	.enable = regulator_enable_regmap,
150522498f8SMatti Vaittinen 	.disable = regulator_disable_regmap,
151522498f8SMatti Vaittinen 	.is_enabled = regulator_is_enabled_regmap,
152522498f8SMatti Vaittinen 	.list_voltage = regulator_list_voltage_linear_range,
153522498f8SMatti Vaittinen 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
154522498f8SMatti Vaittinen 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
155522498f8SMatti Vaittinen 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
15618f3c625SMatti Vaittinen 	.set_ramp_delay = regulator_set_ramp_delay_regmap,
157522498f8SMatti Vaittinen };
158522498f8SMatti Vaittinen 
159522498f8SMatti Vaittinen static const struct regulator_ops bd71828_ldo_ops = {
160522498f8SMatti Vaittinen 	.enable = regulator_enable_regmap,
161522498f8SMatti Vaittinen 	.disable = regulator_disable_regmap,
162522498f8SMatti Vaittinen 	.is_enabled = regulator_is_enabled_regmap,
163522498f8SMatti Vaittinen 	.list_voltage = regulator_list_voltage_linear_range,
164522498f8SMatti Vaittinen 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
165522498f8SMatti Vaittinen 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
166522498f8SMatti Vaittinen };
167522498f8SMatti Vaittinen 
168522498f8SMatti Vaittinen static const struct regulator_ops bd71828_ldo6_ops = {
169522498f8SMatti Vaittinen 	.enable = regulator_enable_regmap,
170522498f8SMatti Vaittinen 	.disable = regulator_disable_regmap,
171522498f8SMatti Vaittinen 	.is_enabled = regulator_is_enabled_regmap,
172522498f8SMatti Vaittinen };
173522498f8SMatti Vaittinen 
174522498f8SMatti Vaittinen static const struct bd71828_regulator_data bd71828_rdata[] = {
175522498f8SMatti Vaittinen 	{
176522498f8SMatti Vaittinen 		.desc = {
177522498f8SMatti Vaittinen 			.name = "buck1",
178522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK1"),
179522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
180522498f8SMatti Vaittinen 			.id = BD71828_BUCK1,
181522498f8SMatti Vaittinen 			.ops = &bd71828_dvs_buck_ops,
182522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
183522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck1267_volts,
184522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
185522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK1267_VOLTS,
186522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK1_EN,
187522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
188522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK1_VOLT,
189522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
19018f3c625SMatti Vaittinen 			.ramp_delay_table = bd71828_ramp_delay,
19118f3c625SMatti Vaittinen 			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
19218f3c625SMatti Vaittinen 			.ramp_reg = BD71828_REG_BUCK1_MODE,
19318f3c625SMatti Vaittinen 			.ramp_mask = BD71828_MASK_RAMP_DELAY,
194522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
195522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
196522498f8SMatti Vaittinen 		},
197522498f8SMatti Vaittinen 		.dvs = {
198522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
199522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
200522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
201522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK1_VOLT,
202522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK1267_VOLT,
203522498f8SMatti Vaittinen 			.idle_reg = BD71828_REG_BUCK1_IDLE_VOLT,
204522498f8SMatti Vaittinen 			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
205522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
206522498f8SMatti Vaittinen 			.suspend_reg = BD71828_REG_BUCK1_SUSP_VOLT,
207522498f8SMatti Vaittinen 			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
208522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
209522498f8SMatti Vaittinen 			/*
210522498f8SMatti Vaittinen 			 * LPSR voltage is same as SUSPEND voltage. Allow
211d08e8799SMatti Vaittinen 			 * only enabling/disabling regulator for LPSR state
212522498f8SMatti Vaittinen 			 */
213d08e8799SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
214522498f8SMatti Vaittinen 		},
215522498f8SMatti Vaittinen 		.reg_inits = buck1_inits,
216522498f8SMatti Vaittinen 		.reg_init_amnt = ARRAY_SIZE(buck1_inits),
217522498f8SMatti Vaittinen 	},
218522498f8SMatti Vaittinen 	{
219522498f8SMatti Vaittinen 		.desc = {
220522498f8SMatti Vaittinen 			.name = "buck2",
221522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK2"),
222522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
223522498f8SMatti Vaittinen 			.id = BD71828_BUCK2,
224522498f8SMatti Vaittinen 			.ops = &bd71828_dvs_buck_ops,
225522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
226522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck1267_volts,
227522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
228522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK1267_VOLTS,
229522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK2_EN,
230522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
231522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK2_VOLT,
232522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
23318f3c625SMatti Vaittinen 			.ramp_delay_table = bd71828_ramp_delay,
23418f3c625SMatti Vaittinen 			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
23518f3c625SMatti Vaittinen 			.ramp_reg = BD71828_REG_BUCK2_MODE,
23618f3c625SMatti Vaittinen 			.ramp_mask = BD71828_MASK_RAMP_DELAY,
237522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
238522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
239522498f8SMatti Vaittinen 		},
240522498f8SMatti Vaittinen 		.dvs = {
241522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
242522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
243522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
244522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK2_VOLT,
245522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK1267_VOLT,
246522498f8SMatti Vaittinen 			.idle_reg = BD71828_REG_BUCK2_IDLE_VOLT,
247522498f8SMatti Vaittinen 			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
248522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
249522498f8SMatti Vaittinen 			.suspend_reg = BD71828_REG_BUCK2_SUSP_VOLT,
250522498f8SMatti Vaittinen 			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
251522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
252522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
253522498f8SMatti Vaittinen 			.lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT,
254522498f8SMatti Vaittinen 			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
255522498f8SMatti Vaittinen 		},
256522498f8SMatti Vaittinen 		.reg_inits = buck2_inits,
257522498f8SMatti Vaittinen 		.reg_init_amnt = ARRAY_SIZE(buck2_inits),
258522498f8SMatti Vaittinen 	},
259522498f8SMatti Vaittinen 	{
260522498f8SMatti Vaittinen 		.desc = {
261522498f8SMatti Vaittinen 			.name = "buck3",
262522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK3"),
263522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
264522498f8SMatti Vaittinen 			.id = BD71828_BUCK3,
265522498f8SMatti Vaittinen 			.ops = &bd71828_buck_ops,
266522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
267522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck3_volts,
268522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck3_volts),
269522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK3_VOLTS,
270522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK3_EN,
271522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
272522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK3_VOLT,
273522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK3_VOLT,
274522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
275522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
276522498f8SMatti Vaittinen 		},
277522498f8SMatti Vaittinen 		.dvs = {
278522498f8SMatti Vaittinen 			/*
279522498f8SMatti Vaittinen 			 * BUCK3 only supports single voltage for all states.
280522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
281522498f8SMatti Vaittinen 			 * though => allow setting all states to support
282522498f8SMatti Vaittinen 			 * enabling power rail on different states.
283522498f8SMatti Vaittinen 			 */
284522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
285522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
286522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
287522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK3_VOLT,
288522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK3_VOLT,
289522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
290522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
291522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
292522498f8SMatti Vaittinen 		},
293522498f8SMatti Vaittinen 	},
294522498f8SMatti Vaittinen 	{
295522498f8SMatti Vaittinen 		.desc = {
296522498f8SMatti Vaittinen 			.name = "buck4",
297522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK4"),
298522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
299522498f8SMatti Vaittinen 			.id = BD71828_BUCK4,
300522498f8SMatti Vaittinen 			.ops = &bd71828_buck_ops,
301522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
302522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck4_volts,
303522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck4_volts),
304522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK4_VOLTS,
305522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK4_EN,
306522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
307522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK4_VOLT,
308522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK4_VOLT,
309522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
310522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
311522498f8SMatti Vaittinen 		},
312522498f8SMatti Vaittinen 		.dvs = {
313522498f8SMatti Vaittinen 			/*
314522498f8SMatti Vaittinen 			 * BUCK4 only supports single voltage for all states.
315522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
316522498f8SMatti Vaittinen 			 * though => allow setting all states to support
317522498f8SMatti Vaittinen 			 * enabling power rail on different states.
318522498f8SMatti Vaittinen 			 */
319522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
320522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
321522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
322522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK4_VOLT,
323522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK4_VOLT,
324522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
325522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
326522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
327522498f8SMatti Vaittinen 		},
328522498f8SMatti Vaittinen 	},
329522498f8SMatti Vaittinen 	{
330522498f8SMatti Vaittinen 		.desc = {
331522498f8SMatti Vaittinen 			.name = "buck5",
332522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK5"),
333522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
334522498f8SMatti Vaittinen 			.id = BD71828_BUCK5,
335522498f8SMatti Vaittinen 			.ops = &bd71828_buck_ops,
336522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
337522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck5_volts,
338522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck5_volts),
339522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK5_VOLTS,
340522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK5_EN,
341522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
342522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK5_VOLT,
343522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK5_VOLT,
344522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
345522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
346522498f8SMatti Vaittinen 		},
347522498f8SMatti Vaittinen 		.dvs = {
348522498f8SMatti Vaittinen 			/*
349522498f8SMatti Vaittinen 			 * BUCK5 only supports single voltage for all states.
350522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
351522498f8SMatti Vaittinen 			 * though => allow setting all states to support
352522498f8SMatti Vaittinen 			 * enabling power rail on different states.
353522498f8SMatti Vaittinen 			 */
354522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
355522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
356522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
357522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK5_VOLT,
358522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK5_VOLT,
359522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
360522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
361522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
362522498f8SMatti Vaittinen 		},
363522498f8SMatti Vaittinen 	},
364522498f8SMatti Vaittinen 	{
365522498f8SMatti Vaittinen 		.desc = {
366522498f8SMatti Vaittinen 			.name = "buck6",
367522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK6"),
368522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
369522498f8SMatti Vaittinen 			.id = BD71828_BUCK6,
370522498f8SMatti Vaittinen 			.ops = &bd71828_dvs_buck_ops,
371522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
372522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck1267_volts,
373522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
374522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK1267_VOLTS,
375522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK6_EN,
376522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
377522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK6_VOLT,
378522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
37918f3c625SMatti Vaittinen 			.ramp_delay_table = bd71828_ramp_delay,
38018f3c625SMatti Vaittinen 			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
38118f3c625SMatti Vaittinen 			.ramp_reg = BD71828_REG_BUCK6_MODE,
38218f3c625SMatti Vaittinen 			.ramp_mask = BD71828_MASK_RAMP_DELAY,
383522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
384522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
385522498f8SMatti Vaittinen 		},
386522498f8SMatti Vaittinen 		.dvs = {
387522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
388522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
389522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
390522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK6_VOLT,
391522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK1267_VOLT,
392522498f8SMatti Vaittinen 			.idle_reg = BD71828_REG_BUCK6_IDLE_VOLT,
393522498f8SMatti Vaittinen 			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
394522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
395522498f8SMatti Vaittinen 			.suspend_reg = BD71828_REG_BUCK6_SUSP_VOLT,
396522498f8SMatti Vaittinen 			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
397522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
398522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
399522498f8SMatti Vaittinen 			.lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT,
400522498f8SMatti Vaittinen 			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
401522498f8SMatti Vaittinen 		},
402522498f8SMatti Vaittinen 		.reg_inits = buck6_inits,
403522498f8SMatti Vaittinen 		.reg_init_amnt = ARRAY_SIZE(buck6_inits),
404522498f8SMatti Vaittinen 	},
405522498f8SMatti Vaittinen 	{
406522498f8SMatti Vaittinen 		.desc = {
407522498f8SMatti Vaittinen 			.name = "buck7",
408522498f8SMatti Vaittinen 			.of_match = of_match_ptr("BUCK7"),
409522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
410522498f8SMatti Vaittinen 			.id = BD71828_BUCK7,
411522498f8SMatti Vaittinen 			.ops = &bd71828_dvs_buck_ops,
412522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
413522498f8SMatti Vaittinen 			.linear_ranges = bd71828_buck1267_volts,
414522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
415522498f8SMatti Vaittinen 			.n_voltages = BD71828_BUCK1267_VOLTS,
416522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_BUCK7_EN,
417522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
418522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_BUCK7_VOLT,
419522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
42018f3c625SMatti Vaittinen 			.ramp_delay_table = bd71828_ramp_delay,
42118f3c625SMatti Vaittinen 			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
42218f3c625SMatti Vaittinen 			.ramp_reg = BD71828_REG_BUCK7_MODE,
42318f3c625SMatti Vaittinen 			.ramp_mask = BD71828_MASK_RAMP_DELAY,
424522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
425522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
426522498f8SMatti Vaittinen 		},
427522498f8SMatti Vaittinen 		.dvs = {
428522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
429522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
430522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
431522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_BUCK7_VOLT,
432522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_BUCK1267_VOLT,
433522498f8SMatti Vaittinen 			.idle_reg = BD71828_REG_BUCK7_IDLE_VOLT,
434522498f8SMatti Vaittinen 			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
435522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
436522498f8SMatti Vaittinen 			.suspend_reg = BD71828_REG_BUCK7_SUSP_VOLT,
437522498f8SMatti Vaittinen 			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
438522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
439522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
440522498f8SMatti Vaittinen 			.lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT,
441522498f8SMatti Vaittinen 			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
442522498f8SMatti Vaittinen 		},
443522498f8SMatti Vaittinen 		.reg_inits = buck7_inits,
444522498f8SMatti Vaittinen 		.reg_init_amnt = ARRAY_SIZE(buck7_inits),
445522498f8SMatti Vaittinen 	},
446522498f8SMatti Vaittinen 	{
447522498f8SMatti Vaittinen 		.desc = {
448522498f8SMatti Vaittinen 			.name = "ldo1",
449522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO1"),
450522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
451522498f8SMatti Vaittinen 			.id = BD71828_LDO1,
452522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
453522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
454522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
455522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
456522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
457522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO1_EN,
458522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
459522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO1_VOLT,
460522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
461522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
462522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
463522498f8SMatti Vaittinen 		},
464522498f8SMatti Vaittinen 		.dvs = {
465522498f8SMatti Vaittinen 			/*
466522498f8SMatti Vaittinen 			 * LDO1 only supports single voltage for all states.
467522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
468522498f8SMatti Vaittinen 			 * though => allow setting all states to support
469522498f8SMatti Vaittinen 			 * enabling power rail on different states.
470522498f8SMatti Vaittinen 			 */
471522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
472522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
473522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
474522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO1_VOLT,
475522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
476522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
477522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
478522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
479522498f8SMatti Vaittinen 		},
480522498f8SMatti Vaittinen 	}, {
481522498f8SMatti Vaittinen 		.desc = {
482522498f8SMatti Vaittinen 			.name = "ldo2",
483522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO2"),
484522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
485522498f8SMatti Vaittinen 			.id = BD71828_LDO2,
486522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
487522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
488522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
489522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
490522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
491522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO2_EN,
492522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
493522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO2_VOLT,
494522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
495522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
496522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
497522498f8SMatti Vaittinen 		},
498522498f8SMatti Vaittinen 		.dvs = {
499522498f8SMatti Vaittinen 			/*
500522498f8SMatti Vaittinen 			 * LDO2 only supports single voltage for all states.
501522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
502522498f8SMatti Vaittinen 			 * though => allow setting all states to support
503522498f8SMatti Vaittinen 			 * enabling power rail on different states.
504522498f8SMatti Vaittinen 			 */
505522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
506522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
507522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
508522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO2_VOLT,
509522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
510522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
511522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
512522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
513522498f8SMatti Vaittinen 		},
514522498f8SMatti Vaittinen 	}, {
515522498f8SMatti Vaittinen 		.desc = {
516522498f8SMatti Vaittinen 			.name = "ldo3",
517522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO3"),
518522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
519522498f8SMatti Vaittinen 			.id = BD71828_LDO3,
520522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
521522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
522522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
523522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
524522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
525522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO3_EN,
526522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
527522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO3_VOLT,
528522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
529522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
530522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
531522498f8SMatti Vaittinen 		},
532522498f8SMatti Vaittinen 		.dvs = {
533522498f8SMatti Vaittinen 			/*
534522498f8SMatti Vaittinen 			 * LDO3 only supports single voltage for all states.
535522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
536522498f8SMatti Vaittinen 			 * though => allow setting all states to support
537522498f8SMatti Vaittinen 			 * enabling power rail on different states.
538522498f8SMatti Vaittinen 			 */
539522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
540522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
541522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
542522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO3_VOLT,
543522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
544522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
545522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
546522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
547522498f8SMatti Vaittinen 		},
548522498f8SMatti Vaittinen 
549522498f8SMatti Vaittinen 	}, {
550522498f8SMatti Vaittinen 		.desc = {
551522498f8SMatti Vaittinen 			.name = "ldo4",
552522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO4"),
553522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
554522498f8SMatti Vaittinen 			.id = BD71828_LDO4,
555522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
556522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
557522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
558522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
559522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
560522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO4_EN,
561522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
562522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO4_VOLT,
563522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
564522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
565522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
566522498f8SMatti Vaittinen 		},
567522498f8SMatti Vaittinen 		.dvs = {
568522498f8SMatti Vaittinen 			/*
569522498f8SMatti Vaittinen 			 * LDO1 only supports single voltage for all states.
570522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
571522498f8SMatti Vaittinen 			 * though => allow setting all states to support
572522498f8SMatti Vaittinen 			 * enabling power rail on different states.
573522498f8SMatti Vaittinen 			 */
574522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
575522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
576522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
577522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO4_VOLT,
578522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
579522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
580522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
581522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
582522498f8SMatti Vaittinen 		},
583522498f8SMatti Vaittinen 	}, {
584522498f8SMatti Vaittinen 		.desc = {
585522498f8SMatti Vaittinen 			.name = "ldo5",
586522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO5"),
587522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
588522498f8SMatti Vaittinen 			.id = BD71828_LDO5,
589522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
590522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
591522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
592522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
593522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
594522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO5_EN,
595522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
596522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO5_VOLT,
597522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
598522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
599522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
600522498f8SMatti Vaittinen 		},
601522498f8SMatti Vaittinen 		/*
602522498f8SMatti Vaittinen 		 * LDO5 is special. It can choose vsel settings to be configured
603522498f8SMatti Vaittinen 		 * from 2 different registers (by GPIO).
604522498f8SMatti Vaittinen 		 *
605522498f8SMatti Vaittinen 		 * This driver supports only configuration where
606522498f8SMatti Vaittinen 		 * BD71828_REG_LDO5_VOLT_L is used.
607522498f8SMatti Vaittinen 		 */
608522498f8SMatti Vaittinen 		.dvs = {
609522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
610522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
611522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
612522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO5_VOLT,
613522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
614522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
615522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
616522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
617522498f8SMatti Vaittinen 		},
618522498f8SMatti Vaittinen 
619522498f8SMatti Vaittinen 	}, {
620522498f8SMatti Vaittinen 		.desc = {
621522498f8SMatti Vaittinen 			.name = "ldo6",
622522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO6"),
623522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
624522498f8SMatti Vaittinen 			.id = BD71828_LDO6,
625522498f8SMatti Vaittinen 			.ops = &bd71828_ldo6_ops,
626522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
627a14a0b5fSMatti Vaittinen 			.fixed_uV = BD71828_LDO_6_VOLTAGE,
628522498f8SMatti Vaittinen 			.n_voltages = 1,
629522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO6_EN,
630522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
631522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
632522498f8SMatti Vaittinen 			/*
633522498f8SMatti Vaittinen 			 * LDO6 only supports enable/disable for all states.
634522498f8SMatti Vaittinen 			 * Voltage for LDO6 is fixed.
635522498f8SMatti Vaittinen 			 */
636522498f8SMatti Vaittinen 			.of_parse_cb = ldo6_parse_dt,
637522498f8SMatti Vaittinen 		},
638522498f8SMatti Vaittinen 	}, {
639522498f8SMatti Vaittinen 		.desc = {
640522498f8SMatti Vaittinen 			/* SNVS LDO in data-sheet */
641522498f8SMatti Vaittinen 			.name = "ldo7",
642522498f8SMatti Vaittinen 			.of_match = of_match_ptr("LDO7"),
643522498f8SMatti Vaittinen 			.regulators_node = of_match_ptr("regulators"),
644522498f8SMatti Vaittinen 			.id = BD71828_LDO_SNVS,
645522498f8SMatti Vaittinen 			.ops = &bd71828_ldo_ops,
646522498f8SMatti Vaittinen 			.type = REGULATOR_VOLTAGE,
647522498f8SMatti Vaittinen 			.linear_ranges = bd71828_ldo_volts,
648522498f8SMatti Vaittinen 			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
649522498f8SMatti Vaittinen 			.n_voltages = BD71828_LDO_VOLTS,
650522498f8SMatti Vaittinen 			.enable_reg = BD71828_REG_LDO7_EN,
651522498f8SMatti Vaittinen 			.enable_mask = BD71828_MASK_RUN_EN,
652522498f8SMatti Vaittinen 			.vsel_reg = BD71828_REG_LDO7_VOLT,
653522498f8SMatti Vaittinen 			.vsel_mask = BD71828_MASK_LDO_VOLT,
654522498f8SMatti Vaittinen 			.owner = THIS_MODULE,
655522498f8SMatti Vaittinen 			.of_parse_cb = buck_set_hw_dvs_levels,
656522498f8SMatti Vaittinen 		},
657522498f8SMatti Vaittinen 		.dvs = {
658522498f8SMatti Vaittinen 			/*
659522498f8SMatti Vaittinen 			 * LDO7 only supports single voltage for all states.
660522498f8SMatti Vaittinen 			 * voltage can be individually enabled for each state
661522498f8SMatti Vaittinen 			 * though => allow setting all states to support
662522498f8SMatti Vaittinen 			 * enabling power rail on different states.
663522498f8SMatti Vaittinen 			 */
664522498f8SMatti Vaittinen 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
665522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_SUSPEND |
666522498f8SMatti Vaittinen 				     ROHM_DVS_LEVEL_LPSR,
667522498f8SMatti Vaittinen 			.run_reg = BD71828_REG_LDO7_VOLT,
668522498f8SMatti Vaittinen 			.idle_reg = BD71828_REG_LDO7_VOLT,
669522498f8SMatti Vaittinen 			.suspend_reg = BD71828_REG_LDO7_VOLT,
670522498f8SMatti Vaittinen 			.lpsr_reg = BD71828_REG_LDO7_VOLT,
671522498f8SMatti Vaittinen 			.run_mask = BD71828_MASK_LDO_VOLT,
672522498f8SMatti Vaittinen 			.idle_on_mask = BD71828_MASK_IDLE_EN,
673522498f8SMatti Vaittinen 			.suspend_on_mask = BD71828_MASK_SUSP_EN,
674522498f8SMatti Vaittinen 			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
675522498f8SMatti Vaittinen 		},
676522498f8SMatti Vaittinen 
677522498f8SMatti Vaittinen 	},
678522498f8SMatti Vaittinen };
679522498f8SMatti Vaittinen 
bd71828_probe(struct platform_device * pdev)680522498f8SMatti Vaittinen static int bd71828_probe(struct platform_device *pdev)
681522498f8SMatti Vaittinen {
682522498f8SMatti Vaittinen 	int i, j, ret;
683522498f8SMatti Vaittinen 	struct regulator_config config = {
684522498f8SMatti Vaittinen 		.dev = pdev->dev.parent,
685522498f8SMatti Vaittinen 	};
686522498f8SMatti Vaittinen 
6873c14dbd4SMatti Vaittinen 	config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
6883c14dbd4SMatti Vaittinen 	if (!config.regmap)
6893c14dbd4SMatti Vaittinen 		return -ENODEV;
690522498f8SMatti Vaittinen 
691522498f8SMatti Vaittinen 	for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) {
692522498f8SMatti Vaittinen 		struct regulator_dev *rdev;
693522498f8SMatti Vaittinen 		const struct bd71828_regulator_data *rd;
694522498f8SMatti Vaittinen 
695522498f8SMatti Vaittinen 		rd = &bd71828_rdata[i];
696522498f8SMatti Vaittinen 		rdev = devm_regulator_register(&pdev->dev,
697522498f8SMatti Vaittinen 					       &rd->desc, &config);
698d4e93e8dSMatti Vaittinen 		if (IS_ERR(rdev))
699d4e93e8dSMatti Vaittinen 			return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
700522498f8SMatti Vaittinen 					     "failed to register %s regulator\n",
701522498f8SMatti Vaittinen 					     rd->desc.name);
702d4e93e8dSMatti Vaittinen 
703522498f8SMatti Vaittinen 		for (j = 0; j < rd->reg_init_amnt; j++) {
7043c14dbd4SMatti Vaittinen 			ret = regmap_update_bits(config.regmap,
705522498f8SMatti Vaittinen 						 rd->reg_inits[j].reg,
706522498f8SMatti Vaittinen 						 rd->reg_inits[j].mask,
707522498f8SMatti Vaittinen 						 rd->reg_inits[j].val);
708d4e93e8dSMatti Vaittinen 			if (ret)
709d4e93e8dSMatti Vaittinen 				return dev_err_probe(&pdev->dev, ret,
710522498f8SMatti Vaittinen 						     "regulator %s init failed\n",
711522498f8SMatti Vaittinen 						     rd->desc.name);
712522498f8SMatti Vaittinen 		}
713522498f8SMatti Vaittinen 	}
714522498f8SMatti Vaittinen 	return 0;
715522498f8SMatti Vaittinen }
716522498f8SMatti Vaittinen 
717522498f8SMatti Vaittinen static struct platform_driver bd71828_regulator = {
718522498f8SMatti Vaittinen 	.driver = {
71967dc71c6SDouglas Anderson 		.name = "bd71828-pmic",
72067dc71c6SDouglas Anderson 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
721522498f8SMatti Vaittinen 	},
722522498f8SMatti Vaittinen 	.probe = bd71828_probe,
723522498f8SMatti Vaittinen };
724522498f8SMatti Vaittinen 
725522498f8SMatti Vaittinen module_platform_driver(bd71828_regulator);
726522498f8SMatti Vaittinen 
727522498f8SMatti Vaittinen MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
728522498f8SMatti Vaittinen MODULE_DESCRIPTION("BD71828 voltage regulator driver");
729522498f8SMatti Vaittinen MODULE_LICENSE("GPL");
730522498f8SMatti Vaittinen MODULE_ALIAS("platform:bd71828-pmic");
731