Linux Audio

Check our new training course

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