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