Merge tag 'kvmarm-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmar...
[linux-2.6-microblaze.git] / drivers / regulator / mt6359-regulator.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Copyright (c) 2021 MediaTek Inc.
4
5 #include <linux/platform_device.h>
6 #include <linux/mfd/mt6359/registers.h>
7 #include <linux/mfd/mt6359p/registers.h>
8 #include <linux/mfd/mt6397/core.h>
9 #include <linux/module.h>
10 #include <linux/of_device.h>
11 #include <linux/regmap.h>
12 #include <linux/regulator/driver.h>
13 #include <linux/regulator/machine.h>
14 #include <linux/regulator/mt6359-regulator.h>
15 #include <linux/regulator/of_regulator.h>
16
17 #define MT6359_BUCK_MODE_AUTO           0
18 #define MT6359_BUCK_MODE_FORCE_PWM      1
19 #define MT6359_BUCK_MODE_NORMAL         0
20 #define MT6359_BUCK_MODE_LP             2
21
22 /*
23  * MT6359 regulators' information
24  *
25  * @desc: standard fields of regulator description.
26  * @status_reg: for query status of regulators.
27  * @qi: Mask for query enable signal status of regulators.
28  * @modeset_reg: for operating AUTO/PWM mode register.
29  * @modeset_mask: MASK for operating modeset register.
30  * @modeset_shift: SHIFT for operating modeset register.
31  */
32 struct mt6359_regulator_info {
33         struct regulator_desc desc;
34         u32 status_reg;
35         u32 qi;
36         u32 modeset_reg;
37         u32 modeset_mask;
38         u32 modeset_shift;
39         u32 lp_mode_reg;
40         u32 lp_mode_mask;
41         u32 lp_mode_shift;
42 };
43
44 #define MT6359_BUCK(match, _name, min, max, step,               \
45         _enable_reg, _status_reg,                               \
46         _vsel_reg, _vsel_mask,                                  \
47         _lp_mode_reg, _lp_mode_shift,                           \
48         _modeset_reg, _modeset_shift)                           \
49 [MT6359_ID_##_name] = {                                         \
50         .desc = {                                               \
51                 .name = #_name,                                 \
52                 .of_match = of_match_ptr(match),                \
53                 .regulators_node = of_match_ptr("regulators"),  \
54                 .ops = &mt6359_volt_linear_ops,                 \
55                 .type = REGULATOR_VOLTAGE,                      \
56                 .id = MT6359_ID_##_name,                        \
57                 .owner = THIS_MODULE,                           \
58                 .uV_step = (step),                              \
59                 .n_voltages = ((max) - (min)) / (step) + 1,     \
60                 .min_uV = (min),                                \
61                 .vsel_reg = _vsel_reg,                          \
62                 .vsel_mask = _vsel_mask,                        \
63                 .enable_reg = _enable_reg,                      \
64                 .enable_mask = BIT(0),                          \
65                 .of_map_mode = mt6359_map_mode,                 \
66         },                                                      \
67         .status_reg = _status_reg,                              \
68         .qi = BIT(0),                                           \
69         .lp_mode_reg = _lp_mode_reg,                            \
70         .lp_mode_mask = BIT(_lp_mode_shift),                    \
71         .lp_mode_shift = _lp_mode_shift,                        \
72         .modeset_reg = _modeset_reg,                            \
73         .modeset_mask = BIT(_modeset_shift),                    \
74         .modeset_shift = _modeset_shift                         \
75 }
76
77 #define MT6359_LDO_LINEAR(match, _name, min, max, step,         \
78         _enable_reg, _status_reg, _vsel_reg, _vsel_mask)        \
79 [MT6359_ID_##_name] = {                                         \
80         .desc = {                                               \
81                 .name = #_name,                                 \
82                 .of_match = of_match_ptr(match),                \
83                 .regulators_node = of_match_ptr("regulators"),  \
84                 .ops = &mt6359_volt_linear_ops,                 \
85                 .type = REGULATOR_VOLTAGE,                      \
86                 .id = MT6359_ID_##_name,                        \
87                 .owner = THIS_MODULE,                           \
88                 .uV_step = (step),                              \
89                 .n_voltages = ((max) - (min)) / (step) + 1,     \
90                 .min_uV = (min),                                \
91                 .vsel_reg = _vsel_reg,                          \
92                 .vsel_mask = _vsel_mask,                        \
93                 .enable_reg = _enable_reg,                      \
94                 .enable_mask = BIT(0),                          \
95         },                                                      \
96         .status_reg = _status_reg,                              \
97         .qi = BIT(0),                                           \
98 }
99
100 #define MT6359_LDO(match, _name, _volt_table,                   \
101         _enable_reg, _enable_mask, _status_reg,                 \
102         _vsel_reg, _vsel_mask, _en_delay)                       \
103 [MT6359_ID_##_name] = {                                         \
104         .desc = {                                               \
105                 .name = #_name,                                 \
106                 .of_match = of_match_ptr(match),                \
107                 .regulators_node = of_match_ptr("regulators"),  \
108                 .ops = &mt6359_volt_table_ops,                  \
109                 .type = REGULATOR_VOLTAGE,                      \
110                 .id = MT6359_ID_##_name,                        \
111                 .owner = THIS_MODULE,                           \
112                 .n_voltages = ARRAY_SIZE(_volt_table),          \
113                 .volt_table = _volt_table,                      \
114                 .vsel_reg = _vsel_reg,                          \
115                 .vsel_mask = _vsel_mask,                        \
116                 .enable_reg = _enable_reg,                      \
117                 .enable_mask = BIT(_enable_mask),               \
118                 .enable_time = _en_delay,                       \
119         },                                                      \
120         .status_reg = _status_reg,                              \
121         .qi = BIT(0),                                           \
122 }
123
124 #define MT6359_REG_FIXED(match, _name, _enable_reg,     \
125         _status_reg, _fixed_volt)                       \
126 [MT6359_ID_##_name] = {                                 \
127         .desc = {                                       \
128                 .name = #_name,                         \
129                 .of_match = of_match_ptr(match),        \
130                 .regulators_node = of_match_ptr("regulators"),  \
131                 .ops = &mt6359_volt_fixed_ops,          \
132                 .type = REGULATOR_VOLTAGE,              \
133                 .id = MT6359_ID_##_name,                \
134                 .owner = THIS_MODULE,                   \
135                 .n_voltages = 1,                        \
136                 .enable_reg = _enable_reg,              \
137                 .enable_mask = BIT(0),                  \
138                 .fixed_uV = (_fixed_volt),              \
139         },                                              \
140         .status_reg = _status_reg,                      \
141         .qi = BIT(0),                                   \
142 }
143
144 #define MT6359P_LDO1(match, _name, _ops, _volt_table,   \
145         _enable_reg, _enable_mask, _status_reg,         \
146         _vsel_reg, _vsel_mask)                          \
147 [MT6359_ID_##_name] = {                                 \
148         .desc = {                                       \
149                 .name = #_name,                         \
150                 .of_match = of_match_ptr(match),        \
151                 .regulators_node = of_match_ptr("regulators"),  \
152                 .ops = &_ops,                           \
153                 .type = REGULATOR_VOLTAGE,              \
154                 .id = MT6359_ID_##_name,                \
155                 .owner = THIS_MODULE,                   \
156                 .n_voltages = ARRAY_SIZE(_volt_table),  \
157                 .volt_table = _volt_table,              \
158                 .vsel_reg = _vsel_reg,                  \
159                 .vsel_mask = _vsel_mask,                \
160                 .enable_reg = _enable_reg,              \
161                 .enable_mask = BIT(_enable_mask),       \
162         },                                              \
163         .status_reg = _status_reg,                      \
164         .qi = BIT(0),                                   \
165 }
166
167 static const unsigned int vsim1_voltages[] = {
168         0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000,
169 };
170
171 static const unsigned int vibr_voltages[] = {
172         1200000, 1300000, 1500000, 0, 1800000, 2000000, 0, 0, 2700000, 2800000,
173         0, 3000000, 0, 3300000,
174 };
175
176 static const unsigned int vrf12_voltages[] = {
177         0, 0, 1100000, 1200000, 1300000,
178 };
179
180 static const unsigned int volt18_voltages[] = {
181         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000,
182 };
183
184 static const unsigned int vcn13_voltages[] = {
185         900000, 1000000, 0, 1200000, 1300000,
186 };
187
188 static const unsigned int vcn33_voltages[] = {
189         0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 0, 0, 0, 3300000, 3400000, 3500000,
190 };
191
192 static const unsigned int vefuse_voltages[] = {
193         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000, 2000000,
194 };
195
196 static const unsigned int vxo22_voltages[] = {
197         1800000, 0, 0, 0, 2200000,
198 };
199
200 static const unsigned int vrfck_voltages[] = {
201         0, 0, 1500000, 0, 0, 0, 0, 1600000, 0, 0, 0, 0, 1700000,
202 };
203
204 static const unsigned int vrfck_voltages_1[] = {
205         1240000, 1600000,
206 };
207
208 static const unsigned int vio28_voltages[] = {
209         0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 2900000, 3000000, 3100000, 3300000,
210 };
211
212 static const unsigned int vemc_voltages[] = {
213         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2900000, 3000000, 0, 3300000,
214 };
215
216 static const unsigned int vemc_voltages_1[] = {
217         0, 0, 0, 0, 0, 0, 0, 0, 2500000, 2800000, 2900000, 3000000, 3100000,
218         3300000,
219 };
220
221 static const unsigned int va12_voltages[] = {
222         0, 0, 0, 0, 0, 0, 1200000, 1300000,
223 };
224
225 static const unsigned int va09_voltages[] = {
226         0, 0, 800000, 900000, 0, 0, 1200000,
227 };
228
229 static const unsigned int vrf18_voltages[] = {
230         0, 0, 0, 0, 0, 1700000, 1800000, 1810000,
231 };
232
233 static const unsigned int vbbck_voltages[] = {
234         0, 0, 0, 0, 1100000, 0, 0, 0, 1150000, 0, 0, 0, 1200000,
235 };
236
237 static const unsigned int vsim2_voltages[] = {
238         0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000,
239 };
240
241 static inline unsigned int mt6359_map_mode(unsigned int mode)
242 {
243         switch (mode) {
244         case MT6359_BUCK_MODE_NORMAL:
245                 return REGULATOR_MODE_NORMAL;
246         case MT6359_BUCK_MODE_FORCE_PWM:
247                 return REGULATOR_MODE_FAST;
248         case MT6359_BUCK_MODE_LP:
249                 return REGULATOR_MODE_IDLE;
250         default:
251                 return REGULATOR_MODE_INVALID;
252         }
253 }
254
255 static int mt6359_get_status(struct regulator_dev *rdev)
256 {
257         int ret;
258         u32 regval;
259         struct mt6359_regulator_info *info = rdev_get_drvdata(rdev);
260
261         ret = regmap_read(rdev->regmap, info->status_reg, &regval);
262         if (ret != 0) {
263                 dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret);
264                 return ret;
265         }
266
267         if (regval & info->qi)
268                 return REGULATOR_STATUS_ON;
269         else
270                 return REGULATOR_STATUS_OFF;
271 }
272
273 static unsigned int mt6359_regulator_get_mode(struct regulator_dev *rdev)
274 {
275         struct mt6359_regulator_info *info = rdev_get_drvdata(rdev);
276         int ret, regval;
277
278         ret = regmap_read(rdev->regmap, info->modeset_reg, &regval);
279         if (ret != 0) {
280                 dev_err(&rdev->dev,
281                         "Failed to get mt6359 buck mode: %d\n", ret);
282                 return ret;
283         }
284
285         if ((regval & info->modeset_mask) >> info->modeset_shift ==
286                 MT6359_BUCK_MODE_FORCE_PWM)
287                 return REGULATOR_MODE_FAST;
288
289         ret = regmap_read(rdev->regmap, info->lp_mode_reg, &regval);
290         if (ret != 0) {
291                 dev_err(&rdev->dev,
292                         "Failed to get mt6359 buck lp mode: %d\n", ret);
293                 return ret;
294         }
295
296         if (regval & info->lp_mode_mask)
297                 return REGULATOR_MODE_IDLE;
298         else
299                 return REGULATOR_MODE_NORMAL;
300 }
301
302 static int mt6359_regulator_set_mode(struct regulator_dev *rdev,
303                                      unsigned int mode)
304 {
305         struct mt6359_regulator_info *info = rdev_get_drvdata(rdev);
306         int ret = 0, val;
307         int curr_mode;
308
309         curr_mode = mt6359_regulator_get_mode(rdev);
310         switch (mode) {
311         case REGULATOR_MODE_FAST:
312                 val = MT6359_BUCK_MODE_FORCE_PWM;
313                 val <<= info->modeset_shift;
314                 ret = regmap_update_bits(rdev->regmap,
315                                          info->modeset_reg,
316                                          info->modeset_mask,
317                                          val);
318                 break;
319         case REGULATOR_MODE_NORMAL:
320                 if (curr_mode == REGULATOR_MODE_FAST) {
321                         val = MT6359_BUCK_MODE_AUTO;
322                         val <<= info->modeset_shift;
323                         ret = regmap_update_bits(rdev->regmap,
324                                                  info->modeset_reg,
325                                                  info->modeset_mask,
326                                                  val);
327                 } else if (curr_mode == REGULATOR_MODE_IDLE) {
328                         val = MT6359_BUCK_MODE_NORMAL;
329                         val <<= info->lp_mode_shift;
330                         ret = regmap_update_bits(rdev->regmap,
331                                                  info->lp_mode_reg,
332                                                  info->lp_mode_mask,
333                                                  val);
334                         udelay(100);
335                 }
336                 break;
337         case REGULATOR_MODE_IDLE:
338                 val = MT6359_BUCK_MODE_LP >> 1;
339                 val <<= info->lp_mode_shift;
340                 ret = regmap_update_bits(rdev->regmap,
341                                          info->lp_mode_reg,
342                                          info->lp_mode_mask,
343                                          val);
344                 break;
345         default:
346                 return -EINVAL;
347         }
348
349         if (ret != 0) {
350                 dev_err(&rdev->dev,
351                         "Failed to set mt6359 buck mode: %d\n", ret);
352         }
353
354         return ret;
355 }
356
357 static int mt6359p_vemc_set_voltage_sel(struct regulator_dev *rdev,
358                                         u32 sel)
359 {
360         struct mt6359_regulator_info *info = rdev_get_drvdata(rdev);
361         int ret;
362         u32 val = 0;
363
364         sel <<= ffs(info->desc.vsel_mask) - 1;
365         ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, TMA_KEY);
366         if (ret)
367                 return ret;
368
369         ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val);
370         if (ret)
371                 return ret;
372
373         switch (val) {
374         case 0:
375                 /* If HW trapping is 0, use VEMC_VOSEL_0 */
376                 ret = regmap_update_bits(rdev->regmap,
377                                          info->desc.vsel_reg,
378                                          info->desc.vsel_mask, sel);
379                 break;
380         case 1:
381                 /* If HW trapping is 1, use VEMC_VOSEL_1 */
382                 ret = regmap_update_bits(rdev->regmap,
383                                          info->desc.vsel_reg + 0x2,
384                                          info->desc.vsel_mask, sel);
385                 break;
386         default:
387                 return -EINVAL;
388         }
389
390         if (ret)
391                 return ret;
392
393         ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, 0);
394         return ret;
395 }
396
397 static int mt6359p_vemc_get_voltage_sel(struct regulator_dev *rdev)
398 {
399         struct mt6359_regulator_info *info = rdev_get_drvdata(rdev);
400         int ret;
401         u32 val = 0;
402
403         ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val);
404         if (ret)
405                 return ret;
406         switch (val) {
407         case 0:
408                 /* If HW trapping is 0, use VEMC_VOSEL_0 */
409                 ret = regmap_read(rdev->regmap,
410                                   info->desc.vsel_reg, &val);
411                 break;
412         case 1:
413                 /* If HW trapping is 1, use VEMC_VOSEL_1 */
414                 ret = regmap_read(rdev->regmap,
415                                   info->desc.vsel_reg + 0x2, &val);
416                 break;
417         default:
418                 return -EINVAL;
419         }
420         if (ret)
421                 return ret;
422
423         val &= info->desc.vsel_mask;
424         val >>= ffs(info->desc.vsel_mask) - 1;
425
426         return val;
427 }
428
429 static const struct regulator_ops mt6359_volt_linear_ops = {
430         .list_voltage = regulator_list_voltage_linear,
431         .map_voltage = regulator_map_voltage_linear,
432         .set_voltage_sel = regulator_set_voltage_sel_regmap,
433         .get_voltage_sel = regulator_get_voltage_sel_regmap,
434         .set_voltage_time_sel = regulator_set_voltage_time_sel,
435         .enable = regulator_enable_regmap,
436         .disable = regulator_disable_regmap,
437         .is_enabled = regulator_is_enabled_regmap,
438         .get_status = mt6359_get_status,
439         .set_mode = mt6359_regulator_set_mode,
440         .get_mode = mt6359_regulator_get_mode,
441 };
442
443 static const struct regulator_ops mt6359_volt_table_ops = {
444         .list_voltage = regulator_list_voltage_table,
445         .map_voltage = regulator_map_voltage_iterate,
446         .set_voltage_sel = regulator_set_voltage_sel_regmap,
447         .get_voltage_sel = regulator_get_voltage_sel_regmap,
448         .set_voltage_time_sel = regulator_set_voltage_time_sel,
449         .enable = regulator_enable_regmap,
450         .disable = regulator_disable_regmap,
451         .is_enabled = regulator_is_enabled_regmap,
452         .get_status = mt6359_get_status,
453 };
454
455 static const struct regulator_ops mt6359_volt_fixed_ops = {
456         .enable = regulator_enable_regmap,
457         .disable = regulator_disable_regmap,
458         .is_enabled = regulator_is_enabled_regmap,
459         .get_status = mt6359_get_status,
460 };
461
462 static const struct regulator_ops mt6359p_vemc_ops = {
463         .list_voltage = regulator_list_voltage_table,
464         .map_voltage = regulator_map_voltage_iterate,
465         .set_voltage_sel = mt6359p_vemc_set_voltage_sel,
466         .get_voltage_sel = mt6359p_vemc_get_voltage_sel,
467         .set_voltage_time_sel = regulator_set_voltage_time_sel,
468         .enable = regulator_enable_regmap,
469         .disable = regulator_disable_regmap,
470         .is_enabled = regulator_is_enabled_regmap,
471         .get_status = mt6359_get_status,
472 };
473
474 /* The array is indexed by id(MT6359_ID_XXX) */
475 static struct mt6359_regulator_info mt6359_regulators[] = {
476         MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500,
477                     MT6359_RG_BUCK_VS1_EN_ADDR,
478                     MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR,
479                     MT6359_RG_BUCK_VS1_VOSEL_MASK <<
480                     MT6359_RG_BUCK_VS1_VOSEL_SHIFT,
481                     MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT,
482                     MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT),
483         MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250,
484                     MT6359_RG_BUCK_VGPU11_EN_ADDR,
485                     MT6359_DA_VGPU11_EN_ADDR, MT6359_RG_BUCK_VGPU11_VOSEL_ADDR,
486                     MT6359_RG_BUCK_VGPU11_VOSEL_MASK <<
487                     MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT,
488                     MT6359_RG_BUCK_VGPU11_LP_ADDR,
489                     MT6359_RG_BUCK_VGPU11_LP_SHIFT,
490                     MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT),
491         MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250,
492                     MT6359_RG_BUCK_VMODEM_EN_ADDR,
493                     MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR,
494                     MT6359_RG_BUCK_VMODEM_VOSEL_MASK <<
495                     MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT,
496                     MT6359_RG_BUCK_VMODEM_LP_ADDR,
497                     MT6359_RG_BUCK_VMODEM_LP_SHIFT,
498                     MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT),
499         MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250,
500                     MT6359_RG_BUCK_VPU_EN_ADDR,
501                     MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR,
502                     MT6359_RG_BUCK_VPU_VOSEL_MASK <<
503                     MT6359_RG_BUCK_VPU_VOSEL_SHIFT,
504                     MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT,
505                     MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT),
506         MT6359_BUCK("buck_vcore", VCORE, 400000, 1193750, 6250,
507                     MT6359_RG_BUCK_VCORE_EN_ADDR,
508                     MT6359_DA_VCORE_EN_ADDR, MT6359_RG_BUCK_VCORE_VOSEL_ADDR,
509                     MT6359_RG_BUCK_VCORE_VOSEL_MASK <<
510                     MT6359_RG_BUCK_VCORE_VOSEL_SHIFT,
511                     MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT,
512                     MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT),
513         MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500,
514                     MT6359_RG_BUCK_VS2_EN_ADDR,
515                     MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR,
516                     MT6359_RG_BUCK_VS2_VOSEL_MASK <<
517                     MT6359_RG_BUCK_VS2_VOSEL_SHIFT,
518                     MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT,
519                     MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT),
520         MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000,
521                     MT6359_RG_BUCK_VPA_EN_ADDR,
522                     MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR,
523                     MT6359_RG_BUCK_VPA_VOSEL_MASK <<
524                     MT6359_RG_BUCK_VPA_VOSEL_SHIFT,
525                     MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT,
526                     MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT),
527         MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250,
528                     MT6359_RG_BUCK_VPROC2_EN_ADDR,
529                     MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR,
530                     MT6359_RG_BUCK_VPROC2_VOSEL_MASK <<
531                     MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT,
532                     MT6359_RG_BUCK_VPROC2_LP_ADDR,
533                     MT6359_RG_BUCK_VPROC2_LP_SHIFT,
534                     MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT),
535         MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250,
536                     MT6359_RG_BUCK_VPROC1_EN_ADDR,
537                     MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR,
538                     MT6359_RG_BUCK_VPROC1_VOSEL_MASK <<
539                     MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT,
540                     MT6359_RG_BUCK_VPROC1_LP_ADDR,
541                     MT6359_RG_BUCK_VPROC1_LP_SHIFT,
542                     MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT),
543         MT6359_BUCK("buck_vcore_sshub", VCORE_SSHUB, 400000, 1193750, 6250,
544                     MT6359_RG_BUCK_VCORE_SSHUB_EN_ADDR,
545                     MT6359_DA_VCORE_EN_ADDR,
546                     MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_ADDR,
547                     MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_MASK <<
548                     MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_SHIFT,
549                     MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT,
550                     MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT),
551         MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359_RG_LDO_VAUD18_EN_ADDR,
552                          MT6359_DA_VAUD18_B_EN_ADDR, 1800000),
553         MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages,
554                    MT6359_RG_LDO_VSIM1_EN_ADDR, MT6359_RG_LDO_VSIM1_EN_SHIFT,
555                    MT6359_DA_VSIM1_B_EN_ADDR, MT6359_RG_VSIM1_VOSEL_ADDR,
556                    MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT,
557                    480),
558         MT6359_LDO("ldo_vibr", VIBR, vibr_voltages,
559                    MT6359_RG_LDO_VIBR_EN_ADDR, MT6359_RG_LDO_VIBR_EN_SHIFT,
560                    MT6359_DA_VIBR_B_EN_ADDR, MT6359_RG_VIBR_VOSEL_ADDR,
561                    MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT,
562                    240),
563         MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages,
564                    MT6359_RG_LDO_VRF12_EN_ADDR, MT6359_RG_LDO_VRF12_EN_SHIFT,
565                    MT6359_DA_VRF12_B_EN_ADDR, MT6359_RG_VRF12_VOSEL_ADDR,
566                    MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT,
567                    120),
568         MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359_RG_LDO_VUSB_EN_0_ADDR,
569                          MT6359_DA_VUSB_B_EN_ADDR, 3000000),
570         MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250,
571                           MT6359_RG_LDO_VSRAM_PROC2_EN_ADDR,
572                           MT6359_DA_VSRAM_PROC2_B_EN_ADDR,
573                           MT6359_RG_LDO_VSRAM_PROC2_VOSEL_ADDR,
574                           MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK <<
575                           MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT),
576         MT6359_LDO("ldo_vio18", VIO18, volt18_voltages,
577                    MT6359_RG_LDO_VIO18_EN_ADDR, MT6359_RG_LDO_VIO18_EN_SHIFT,
578                    MT6359_DA_VIO18_B_EN_ADDR, MT6359_RG_VIO18_VOSEL_ADDR,
579                    MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT,
580                    960),
581         MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages,
582                    MT6359_RG_LDO_VCAMIO_EN_ADDR, MT6359_RG_LDO_VCAMIO_EN_SHIFT,
583                    MT6359_DA_VCAMIO_B_EN_ADDR, MT6359_RG_VCAMIO_VOSEL_ADDR,
584                    MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT,
585                    1290),
586         MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359_RG_LDO_VCN18_EN_ADDR,
587                          MT6359_DA_VCN18_B_EN_ADDR, 1800000),
588         MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359_RG_LDO_VFE28_EN_ADDR,
589                          MT6359_DA_VFE28_B_EN_ADDR, 2800000),
590         MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages,
591                    MT6359_RG_LDO_VCN13_EN_ADDR, MT6359_RG_LDO_VCN13_EN_SHIFT,
592                    MT6359_DA_VCN13_B_EN_ADDR, MT6359_RG_VCN13_VOSEL_ADDR,
593                    MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT,
594                    240),
595         MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages,
596                    MT6359_RG_LDO_VCN33_1_EN_0_ADDR,
597                    MT6359_RG_LDO_VCN33_1_EN_0_SHIFT,
598                    MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR,
599                    MT6359_RG_VCN33_1_VOSEL_MASK <<
600                    MT6359_RG_VCN33_1_VOSEL_SHIFT, 240),
601         MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages,
602                    MT6359_RG_LDO_VCN33_1_EN_1_ADDR,
603                    MT6359_RG_LDO_VCN33_1_EN_1_SHIFT,
604                    MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR,
605                    MT6359_RG_VCN33_1_VOSEL_MASK <<
606                    MT6359_RG_VCN33_1_VOSEL_SHIFT, 240),
607         MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359_RG_LDO_VAUX18_EN_ADDR,
608                          MT6359_DA_VAUX18_B_EN_ADDR, 1800000),
609         MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750,
610                           6250,
611                           MT6359_RG_LDO_VSRAM_OTHERS_EN_ADDR,
612                           MT6359_DA_VSRAM_OTHERS_B_EN_ADDR,
613                           MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR,
614                           MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK <<
615                           MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT),
616         MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages,
617                    MT6359_RG_LDO_VEFUSE_EN_ADDR, MT6359_RG_LDO_VEFUSE_EN_SHIFT,
618                    MT6359_DA_VEFUSE_B_EN_ADDR, MT6359_RG_VEFUSE_VOSEL_ADDR,
619                    MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT,
620                    240),
621         MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages,
622                    MT6359_RG_LDO_VXO22_EN_ADDR, MT6359_RG_LDO_VXO22_EN_SHIFT,
623                    MT6359_DA_VXO22_B_EN_ADDR, MT6359_RG_VXO22_VOSEL_ADDR,
624                    MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT,
625                    120),
626         MT6359_LDO("ldo_vrfck", VRFCK, vrfck_voltages,
627                    MT6359_RG_LDO_VRFCK_EN_ADDR, MT6359_RG_LDO_VRFCK_EN_SHIFT,
628                    MT6359_DA_VRFCK_B_EN_ADDR, MT6359_RG_VRFCK_VOSEL_ADDR,
629                    MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT,
630                    480),
631         MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359_RG_LDO_VBIF28_EN_ADDR,
632                          MT6359_DA_VBIF28_B_EN_ADDR, 2800000),
633         MT6359_LDO("ldo_vio28", VIO28, vio28_voltages,
634                    MT6359_RG_LDO_VIO28_EN_ADDR, MT6359_RG_LDO_VIO28_EN_SHIFT,
635                    MT6359_DA_VIO28_B_EN_ADDR, MT6359_RG_VIO28_VOSEL_ADDR,
636                    MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT,
637                    240),
638         MT6359_LDO("ldo_vemc", VEMC, vemc_voltages,
639                    MT6359_RG_LDO_VEMC_EN_ADDR, MT6359_RG_LDO_VEMC_EN_SHIFT,
640                    MT6359_DA_VEMC_B_EN_ADDR, MT6359_RG_VEMC_VOSEL_ADDR,
641                    MT6359_RG_VEMC_VOSEL_MASK << MT6359_RG_VEMC_VOSEL_SHIFT,
642                    240),
643         MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages,
644                    MT6359_RG_LDO_VCN33_2_EN_0_ADDR,
645                    MT6359_RG_LDO_VCN33_2_EN_0_SHIFT,
646                    MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR,
647                    MT6359_RG_VCN33_2_VOSEL_MASK <<
648                    MT6359_RG_VCN33_2_VOSEL_SHIFT, 240),
649         MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages,
650                    MT6359_RG_LDO_VCN33_2_EN_1_ADDR,
651                    MT6359_RG_LDO_VCN33_2_EN_1_SHIFT,
652                    MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR,
653                    MT6359_RG_VCN33_2_VOSEL_MASK <<
654                    MT6359_RG_VCN33_2_VOSEL_SHIFT, 240),
655         MT6359_LDO("ldo_va12", VA12, va12_voltages,
656                    MT6359_RG_LDO_VA12_EN_ADDR, MT6359_RG_LDO_VA12_EN_SHIFT,
657                    MT6359_DA_VA12_B_EN_ADDR, MT6359_RG_VA12_VOSEL_ADDR,
658                    MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT,
659                    240),
660         MT6359_LDO("ldo_va09", VA09, va09_voltages,
661                    MT6359_RG_LDO_VA09_EN_ADDR, MT6359_RG_LDO_VA09_EN_SHIFT,
662                    MT6359_DA_VA09_B_EN_ADDR, MT6359_RG_VA09_VOSEL_ADDR,
663                    MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT,
664                    240),
665         MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages,
666                    MT6359_RG_LDO_VRF18_EN_ADDR, MT6359_RG_LDO_VRF18_EN_SHIFT,
667                    MT6359_DA_VRF18_B_EN_ADDR, MT6359_RG_VRF18_VOSEL_ADDR,
668                    MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT,
669                    120),
670         MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1100000, 6250,
671                           MT6359_RG_LDO_VSRAM_MD_EN_ADDR,
672                           MT6359_DA_VSRAM_MD_B_EN_ADDR,
673                           MT6359_RG_LDO_VSRAM_MD_VOSEL_ADDR,
674                           MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK <<
675                           MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT),
676         MT6359_LDO("ldo_vufs", VUFS, volt18_voltages,
677                    MT6359_RG_LDO_VUFS_EN_ADDR, MT6359_RG_LDO_VUFS_EN_SHIFT,
678                    MT6359_DA_VUFS_B_EN_ADDR, MT6359_RG_VUFS_VOSEL_ADDR,
679                    MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT,
680                    1920),
681         MT6359_LDO("ldo_vm18", VM18, volt18_voltages,
682                    MT6359_RG_LDO_VM18_EN_ADDR, MT6359_RG_LDO_VM18_EN_SHIFT,
683                    MT6359_DA_VM18_B_EN_ADDR, MT6359_RG_VM18_VOSEL_ADDR,
684                    MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT,
685                    1920),
686         MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages,
687                    MT6359_RG_LDO_VBBCK_EN_ADDR, MT6359_RG_LDO_VBBCK_EN_SHIFT,
688                    MT6359_DA_VBBCK_B_EN_ADDR, MT6359_RG_VBBCK_VOSEL_ADDR,
689                    MT6359_RG_VBBCK_VOSEL_MASK << MT6359_RG_VBBCK_VOSEL_SHIFT,
690                    240),
691         MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250,
692                           MT6359_RG_LDO_VSRAM_PROC1_EN_ADDR,
693                           MT6359_DA_VSRAM_PROC1_B_EN_ADDR,
694                           MT6359_RG_LDO_VSRAM_PROC1_VOSEL_ADDR,
695                           MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK <<
696                           MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT),
697         MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages,
698                    MT6359_RG_LDO_VSIM2_EN_ADDR, MT6359_RG_LDO_VSIM2_EN_SHIFT,
699                    MT6359_DA_VSIM2_B_EN_ADDR, MT6359_RG_VSIM2_VOSEL_ADDR,
700                    MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT,
701                    480),
702         MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB,
703                           500000, 1293750, 6250,
704                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR,
705                           MT6359_DA_VSRAM_OTHERS_B_EN_ADDR,
706                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR,
707                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK <<
708                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT),
709 };
710
711 static struct mt6359_regulator_info mt6359p_regulators[] = {
712         MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500,
713                     MT6359_RG_BUCK_VS1_EN_ADDR,
714                     MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR,
715                     MT6359_RG_BUCK_VS1_VOSEL_MASK <<
716                     MT6359_RG_BUCK_VS1_VOSEL_SHIFT,
717                     MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT,
718                     MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT),
719         MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250,
720                     MT6359_RG_BUCK_VGPU11_EN_ADDR,
721                     MT6359_DA_VGPU11_EN_ADDR, MT6359P_RG_BUCK_VGPU11_VOSEL_ADDR,
722                     MT6359_RG_BUCK_VGPU11_VOSEL_MASK <<
723                     MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT,
724                     MT6359_RG_BUCK_VGPU11_LP_ADDR,
725                     MT6359_RG_BUCK_VGPU11_LP_SHIFT,
726                     MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT),
727         MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250,
728                     MT6359_RG_BUCK_VMODEM_EN_ADDR,
729                     MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR,
730                     MT6359_RG_BUCK_VMODEM_VOSEL_MASK <<
731                     MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT,
732                     MT6359_RG_BUCK_VMODEM_LP_ADDR,
733                     MT6359_RG_BUCK_VMODEM_LP_SHIFT,
734                     MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT),
735         MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250,
736                     MT6359_RG_BUCK_VPU_EN_ADDR,
737                     MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR,
738                     MT6359_RG_BUCK_VPU_VOSEL_MASK <<
739                     MT6359_RG_BUCK_VPU_VOSEL_SHIFT,
740                     MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT,
741                     MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT),
742         MT6359_BUCK("buck_vcore", VCORE, 506250, 1300000, 6250,
743                     MT6359_RG_BUCK_VCORE_EN_ADDR,
744                     MT6359_DA_VCORE_EN_ADDR, MT6359P_RG_BUCK_VCORE_VOSEL_ADDR,
745                     MT6359_RG_BUCK_VCORE_VOSEL_MASK <<
746                     MT6359_RG_BUCK_VCORE_VOSEL_SHIFT,
747                     MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT,
748                     MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT),
749         MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500,
750                     MT6359_RG_BUCK_VS2_EN_ADDR,
751                     MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR,
752                     MT6359_RG_BUCK_VS2_VOSEL_MASK <<
753                     MT6359_RG_BUCK_VS2_VOSEL_SHIFT,
754                     MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT,
755                     MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT),
756         MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000,
757                     MT6359_RG_BUCK_VPA_EN_ADDR,
758                     MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR,
759                     MT6359_RG_BUCK_VPA_VOSEL_MASK <<
760                     MT6359_RG_BUCK_VPA_VOSEL_SHIFT,
761                     MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT,
762                     MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT),
763         MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250,
764                     MT6359_RG_BUCK_VPROC2_EN_ADDR,
765                     MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR,
766                     MT6359_RG_BUCK_VPROC2_VOSEL_MASK <<
767                     MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT,
768                     MT6359_RG_BUCK_VPROC2_LP_ADDR,
769                     MT6359_RG_BUCK_VPROC2_LP_SHIFT,
770                     MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT),
771         MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250,
772                     MT6359_RG_BUCK_VPROC1_EN_ADDR,
773                     MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR,
774                     MT6359_RG_BUCK_VPROC1_VOSEL_MASK <<
775                     MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT,
776                     MT6359_RG_BUCK_VPROC1_LP_ADDR,
777                     MT6359_RG_BUCK_VPROC1_LP_SHIFT,
778                     MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT),
779         MT6359_BUCK("buck_vgpu11_sshub", VGPU11_SSHUB, 400000, 1193750, 6250,
780                     MT6359P_RG_BUCK_VGPU11_SSHUB_EN_ADDR,
781                     MT6359_DA_VGPU11_EN_ADDR,
782                     MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_ADDR,
783                     MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_MASK <<
784                     MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_SHIFT,
785                     MT6359_RG_BUCK_VGPU11_LP_ADDR,
786                     MT6359_RG_BUCK_VGPU11_LP_SHIFT,
787                     MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT),
788         MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359P_RG_LDO_VAUD18_EN_ADDR,
789                          MT6359P_DA_VAUD18_B_EN_ADDR, 1800000),
790         MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages,
791                    MT6359P_RG_LDO_VSIM1_EN_ADDR, MT6359P_RG_LDO_VSIM1_EN_SHIFT,
792                    MT6359P_DA_VSIM1_B_EN_ADDR, MT6359P_RG_VSIM1_VOSEL_ADDR,
793                    MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT,
794                    480),
795         MT6359_LDO("ldo_vibr", VIBR, vibr_voltages,
796                    MT6359P_RG_LDO_VIBR_EN_ADDR, MT6359P_RG_LDO_VIBR_EN_SHIFT,
797                    MT6359P_DA_VIBR_B_EN_ADDR, MT6359P_RG_VIBR_VOSEL_ADDR,
798                    MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT,
799                    240),
800         MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages,
801                    MT6359P_RG_LDO_VRF12_EN_ADDR, MT6359P_RG_LDO_VRF12_EN_SHIFT,
802                    MT6359P_DA_VRF12_B_EN_ADDR, MT6359P_RG_VRF12_VOSEL_ADDR,
803                    MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT,
804                    480),
805         MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359P_RG_LDO_VUSB_EN_0_ADDR,
806                          MT6359P_DA_VUSB_B_EN_ADDR, 3000000),
807         MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250,
808                           MT6359P_RG_LDO_VSRAM_PROC2_EN_ADDR,
809                           MT6359P_DA_VSRAM_PROC2_B_EN_ADDR,
810                           MT6359P_RG_LDO_VSRAM_PROC2_VOSEL_ADDR,
811                           MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK <<
812                           MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT),
813         MT6359_LDO("ldo_vio18", VIO18, volt18_voltages,
814                    MT6359P_RG_LDO_VIO18_EN_ADDR, MT6359P_RG_LDO_VIO18_EN_SHIFT,
815                    MT6359P_DA_VIO18_B_EN_ADDR, MT6359P_RG_VIO18_VOSEL_ADDR,
816                    MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT,
817                    960),
818         MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages,
819                    MT6359P_RG_LDO_VCAMIO_EN_ADDR,
820                    MT6359P_RG_LDO_VCAMIO_EN_SHIFT,
821                    MT6359P_DA_VCAMIO_B_EN_ADDR, MT6359P_RG_VCAMIO_VOSEL_ADDR,
822                    MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT,
823                    1290),
824         MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359P_RG_LDO_VCN18_EN_ADDR,
825                          MT6359P_DA_VCN18_B_EN_ADDR, 1800000),
826         MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359P_RG_LDO_VFE28_EN_ADDR,
827                          MT6359P_DA_VFE28_B_EN_ADDR, 2800000),
828         MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages,
829                    MT6359P_RG_LDO_VCN13_EN_ADDR, MT6359P_RG_LDO_VCN13_EN_SHIFT,
830                    MT6359P_DA_VCN13_B_EN_ADDR, MT6359P_RG_VCN13_VOSEL_ADDR,
831                    MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT,
832                    240),
833         MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages,
834                    MT6359P_RG_LDO_VCN33_1_EN_0_ADDR,
835                    MT6359_RG_LDO_VCN33_1_EN_0_SHIFT,
836                    MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR,
837                    MT6359_RG_VCN33_1_VOSEL_MASK <<
838                    MT6359_RG_VCN33_1_VOSEL_SHIFT, 240),
839         MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages,
840                    MT6359P_RG_LDO_VCN33_1_EN_1_ADDR,
841                    MT6359P_RG_LDO_VCN33_1_EN_1_SHIFT,
842                    MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR,
843                    MT6359_RG_VCN33_1_VOSEL_MASK <<
844                    MT6359_RG_VCN33_1_VOSEL_SHIFT, 240),
845         MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359P_RG_LDO_VAUX18_EN_ADDR,
846                          MT6359P_DA_VAUX18_B_EN_ADDR, 1800000),
847         MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750,
848                           6250,
849                           MT6359P_RG_LDO_VSRAM_OTHERS_EN_ADDR,
850                           MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR,
851                           MT6359P_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR,
852                           MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK <<
853                           MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT),
854         MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages,
855                    MT6359P_RG_LDO_VEFUSE_EN_ADDR,
856                    MT6359P_RG_LDO_VEFUSE_EN_SHIFT,
857                    MT6359P_DA_VEFUSE_B_EN_ADDR, MT6359P_RG_VEFUSE_VOSEL_ADDR,
858                    MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT,
859                    240),
860         MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages,
861                    MT6359P_RG_LDO_VXO22_EN_ADDR, MT6359P_RG_LDO_VXO22_EN_SHIFT,
862                    MT6359P_DA_VXO22_B_EN_ADDR, MT6359P_RG_VXO22_VOSEL_ADDR,
863                    MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT,
864                    480),
865         MT6359_LDO("ldo_vrfck_1", VRFCK, vrfck_voltages_1,
866                    MT6359P_RG_LDO_VRFCK_EN_ADDR, MT6359P_RG_LDO_VRFCK_EN_SHIFT,
867                    MT6359P_DA_VRFCK_B_EN_ADDR, MT6359P_RG_VRFCK_VOSEL_ADDR,
868                    MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT,
869                    480),
870         MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359P_RG_LDO_VBIF28_EN_ADDR,
871                          MT6359P_DA_VBIF28_B_EN_ADDR, 2800000),
872         MT6359_LDO("ldo_vio28", VIO28, vio28_voltages,
873                    MT6359P_RG_LDO_VIO28_EN_ADDR, MT6359P_RG_LDO_VIO28_EN_SHIFT,
874                    MT6359P_DA_VIO28_B_EN_ADDR, MT6359P_RG_VIO28_VOSEL_ADDR,
875                    MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT,
876                    1920),
877         MT6359P_LDO1("ldo_vemc_1", VEMC, mt6359p_vemc_ops, vemc_voltages_1,
878                      MT6359P_RG_LDO_VEMC_EN_ADDR, MT6359P_RG_LDO_VEMC_EN_SHIFT,
879                      MT6359P_DA_VEMC_B_EN_ADDR,
880                      MT6359P_RG_LDO_VEMC_VOSEL_0_ADDR,
881                      MT6359P_RG_LDO_VEMC_VOSEL_0_MASK <<
882                      MT6359P_RG_LDO_VEMC_VOSEL_0_SHIFT),
883         MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages,
884                    MT6359P_RG_LDO_VCN33_2_EN_0_ADDR,
885                    MT6359P_RG_LDO_VCN33_2_EN_0_SHIFT,
886                    MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR,
887                    MT6359_RG_VCN33_2_VOSEL_MASK <<
888                    MT6359_RG_VCN33_2_VOSEL_SHIFT, 240),
889         MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages,
890                    MT6359P_RG_LDO_VCN33_2_EN_1_ADDR,
891                    MT6359_RG_LDO_VCN33_2_EN_1_SHIFT,
892                    MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR,
893                    MT6359_RG_VCN33_2_VOSEL_MASK <<
894                    MT6359_RG_VCN33_2_VOSEL_SHIFT, 240),
895         MT6359_LDO("ldo_va12", VA12, va12_voltages,
896                    MT6359P_RG_LDO_VA12_EN_ADDR, MT6359P_RG_LDO_VA12_EN_SHIFT,
897                    MT6359P_DA_VA12_B_EN_ADDR, MT6359P_RG_VA12_VOSEL_ADDR,
898                    MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT,
899                    960),
900         MT6359_LDO("ldo_va09", VA09, va09_voltages,
901                    MT6359P_RG_LDO_VA09_EN_ADDR, MT6359P_RG_LDO_VA09_EN_SHIFT,
902                    MT6359P_DA_VA09_B_EN_ADDR, MT6359P_RG_VA09_VOSEL_ADDR,
903                    MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT,
904                    960),
905         MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages,
906                    MT6359P_RG_LDO_VRF18_EN_ADDR, MT6359P_RG_LDO_VRF18_EN_SHIFT,
907                    MT6359P_DA_VRF18_B_EN_ADDR, MT6359P_RG_VRF18_VOSEL_ADDR,
908                    MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT,
909                    240),
910         MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1293750, 6250,
911                           MT6359P_RG_LDO_VSRAM_MD_EN_ADDR,
912                           MT6359P_DA_VSRAM_MD_B_EN_ADDR,
913                           MT6359P_RG_LDO_VSRAM_MD_VOSEL_ADDR,
914                           MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK <<
915                           MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT),
916         MT6359_LDO("ldo_vufs", VUFS, volt18_voltages,
917                    MT6359P_RG_LDO_VUFS_EN_ADDR, MT6359P_RG_LDO_VUFS_EN_SHIFT,
918                    MT6359P_DA_VUFS_B_EN_ADDR, MT6359P_RG_VUFS_VOSEL_ADDR,
919                    MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT,
920                    1920),
921         MT6359_LDO("ldo_vm18", VM18, volt18_voltages,
922                    MT6359P_RG_LDO_VM18_EN_ADDR, MT6359P_RG_LDO_VM18_EN_SHIFT,
923                    MT6359P_DA_VM18_B_EN_ADDR, MT6359P_RG_VM18_VOSEL_ADDR,
924                    MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT,
925                    1920),
926         MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages,
927                    MT6359P_RG_LDO_VBBCK_EN_ADDR, MT6359P_RG_LDO_VBBCK_EN_SHIFT,
928                    MT6359P_DA_VBBCK_B_EN_ADDR, MT6359P_RG_VBBCK_VOSEL_ADDR,
929                    MT6359P_RG_VBBCK_VOSEL_MASK << MT6359P_RG_VBBCK_VOSEL_SHIFT,
930                    480),
931         MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250,
932                           MT6359P_RG_LDO_VSRAM_PROC1_EN_ADDR,
933                           MT6359P_DA_VSRAM_PROC1_B_EN_ADDR,
934                           MT6359P_RG_LDO_VSRAM_PROC1_VOSEL_ADDR,
935                           MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK <<
936                           MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT),
937         MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages,
938                    MT6359P_RG_LDO_VSIM2_EN_ADDR, MT6359P_RG_LDO_VSIM2_EN_SHIFT,
939                    MT6359P_DA_VSIM2_B_EN_ADDR, MT6359P_RG_VSIM2_VOSEL_ADDR,
940                    MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT,
941                    480),
942         MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB,
943                           500000, 1293750, 6250,
944                           MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR,
945                           MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR,
946                           MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR,
947                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK <<
948                           MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT),
949 };
950
951 static int mt6359_regulator_probe(struct platform_device *pdev)
952 {
953         struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
954         struct regulator_config config = {};
955         struct regulator_dev *rdev;
956         struct mt6359_regulator_info *mt6359_info;
957         int i, hw_ver;
958
959         regmap_read(mt6397->regmap, MT6359P_HWCID, &hw_ver);
960         if (hw_ver >= MT6359P_CHIP_VER)
961                 mt6359_info = mt6359p_regulators;
962         else
963                 mt6359_info = mt6359_regulators;
964
965         config.dev = mt6397->dev;
966         config.regmap = mt6397->regmap;
967         for (i = 0; i < MT6359_MAX_REGULATOR; i++, mt6359_info++) {
968                 config.driver_data = mt6359_info;
969                 rdev = devm_regulator_register(&pdev->dev, &mt6359_info->desc, &config);
970                 if (IS_ERR(rdev)) {
971                         dev_err(&pdev->dev, "failed to register %s\n", mt6359_info->desc.name);
972                         return PTR_ERR(rdev);
973                 }
974         }
975
976         return 0;
977 }
978
979 static const struct platform_device_id mt6359_platform_ids[] = {
980         {"mt6359-regulator", 0},
981         { /* sentinel */ },
982 };
983 MODULE_DEVICE_TABLE(platform, mt6359_platform_ids);
984
985 static struct platform_driver mt6359_regulator_driver = {
986         .driver = {
987                 .name = "mt6359-regulator",
988         },
989         .probe = mt6359_regulator_probe,
990         .id_table = mt6359_platform_ids,
991 };
992
993 module_platform_driver(mt6359_regulator_driver);
994
995 MODULE_AUTHOR("Wen Su <wen.su@mediatek.com>");
996 MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6359 PMIC");
997 MODULE_LICENSE("GPL");