xref: /linux/drivers/regulator/mt6363-regulator.c (revision b61104e7a6349bd2c2b3e2fb3260d87f15eda8f4)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Copyright (c) 2024 MediaTek Inc.
4 // Copyright (c) 2025 Collabora Ltd
5 //                    AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
6 
7 #include <linux/bitfield.h>
8 #include <linux/delay.h>
9 #include <linux/devm-helpers.h>
10 #include <linux/err.h>
11 #include <linux/interrupt.h>
12 #include <linux/irq.h>
13 #include <linux/irqdomain.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/of.h>
17 #include <linux/of_device.h>
18 #include <linux/of_irq.h>
19 #include <linux/platform_device.h>
20 #include <linux/regmap.h>
21 #include <linux/spmi.h>
22 
23 #include <linux/regulator/driver.h>
24 #include <linux/regulator/machine.h>
25 #include <linux/regulator/mt6363-regulator.h>
26 #include <linux/regulator/of_regulator.h>
27 
28 #define MT6363_REGULATOR_MODE_NORMAL	0
29 #define MT6363_REGULATOR_MODE_FCCM	1
30 #define MT6363_REGULATOR_MODE_LP	2
31 #define MT6363_REGULATOR_MODE_ULP	3
32 
33 #define EN_SET_OFFSET			0x1
34 #define EN_CLR_OFFSET			0x2
35 #define OP_CFG_OFFSET			0x5
36 
37 #define NORMAL_OP_CFG			0x10
38 #define NORMAL_OP_EN			0x800000
39 
40 #define OC_IRQ_ENABLE_DELAY_MS		10
41 
42 /* Unlock keys for TMA and BUCK_TOP */
43 #define MT6363_TMA_UNLOCK_VALUE		0x9c9c
44 #define MT6363_BUCK_TOP_UNLOCK_VALUE	0x5543
45 
46 enum {
47 	MT6363_ID_VBUCK1,
48 	MT6363_ID_VBUCK2,
49 	MT6363_ID_VBUCK3,
50 	MT6363_ID_VBUCK4,
51 	MT6363_ID_VBUCK5,
52 	MT6363_ID_VBUCK6,
53 	MT6363_ID_VBUCK7,
54 	MT6363_ID_VS1,
55 	MT6363_ID_VS2,
56 	MT6363_ID_VS3,
57 	MT6363_ID_VA12_1,
58 	MT6363_ID_VA12_2,
59 	MT6363_ID_VA15,
60 	MT6363_ID_VAUX18,
61 	MT6363_ID_VCN13,
62 	MT6363_ID_VCN15,
63 	MT6363_ID_VEMC,
64 	MT6363_ID_VIO075,
65 	MT6363_ID_VIO18,
66 	MT6363_ID_VM18,
67 	MT6363_ID_VSRAM_APU,
68 	MT6363_ID_VSRAM_CPUB,
69 	MT6363_ID_VSRAM_CPUM,
70 	MT6363_ID_VSRAM_CPUL,
71 	MT6363_ID_VSRAM_DIGRF,
72 	MT6363_ID_VSRAM_MDFE,
73 	MT6363_ID_VSRAM_MODEM,
74 	MT6363_ID_VRF09,
75 	MT6363_ID_VRF12,
76 	MT6363_ID_VRF13,
77 	MT6363_ID_VRF18,
78 	MT6363_ID_VRFIO18,
79 	MT6363_ID_VTREF18,
80 	MT6363_ID_VUFS12,
81 	MT6363_ID_VUFS18,
82 };
83 
84 /**
85  * struct mt6363_regulator_info - MT6363 regulators information
86  * @desc: Regulator description structure
87  * @lp_mode_reg: Low Power mode register (normal/idle)
88  * @lp_mode_mask: Low Power mode regulator mask
89  * @hw_lp_mode_reg: Hardware voted Low Power mode register (normal/idle)
90  * @hw_lp_mode_mask: Hardware voted Low Power mode regulator mask
91  * @modeset_reg: AUTO/PWM mode register
92  * @modeset_mask: AUTO/PWM regulator mask
93  * @lp_imax_uA: Maximum load current (microamps), for Low Power mode only
94  * @op_en_reg: Operation mode enablement register
95  * @orig_op_en: Backup of a regulator's operation mode enablement register
96  * @orig_op_cfg: Backup of a regulator's operation mode configuration register
97  * @oc_work: Delayed work for enabling overcurrent IRQ
98  * @hwirq: PMIC-Internal HW Interrupt for overcurrent event
99  * @virq: Mapped Interrupt for overcurrent event
100  */
101 struct mt6363_regulator_info {
102 	struct regulator_desc desc;
103 	u16 lp_mode_reg;
104 	u16 lp_mode_mask;
105 	u16 hw_lp_mode_reg;
106 	u16 hw_lp_mode_mask;
107 	u16 modeset_reg;
108 	u16 modeset_mask;
109 	int lp_imax_uA;
110 	u16 op_en_reg;
111 	u32 orig_op_en;
112 	u8 orig_op_cfg;
113 	struct delayed_work oc_work;
114 	u8 hwirq;
115 	int virq;
116 };
117 
118 #define MT6363_BUCK(match, vreg, min, max, step, en_reg, lp_reg,	\
119 		    mset_reg, ocp_intn)					\
120 [MT6363_ID_##vreg] = {							\
121 	.desc = {							\
122 		.name = match,						\
123 		.supply_name = "vsys-"match,				\
124 		.of_match = of_match_ptr(match),			\
125 		.ops = &mt6363_vreg_setclr_ops,				\
126 		.type = REGULATOR_VOLTAGE,				\
127 		.id = MT6363_ID_##vreg,					\
128 		.owner = THIS_MODULE,					\
129 		.n_voltages = (max - min) / step + 1,			\
130 		.min_uV = min,						\
131 		.uV_step = step,					\
132 		.enable_reg = en_reg,					\
133 		.enable_mask = BIT(MT6363_RG_BUCK_##vreg##_EN_BIT),	\
134 		.vsel_reg = MT6363_RG_BUCK_##vreg##_VOSEL_ADDR,		\
135 		.vsel_mask = MT6363_RG_BUCK_##vreg##_VOSEL_MASK,	\
136 		.of_map_mode = mt6363_map_mode,				\
137 	},								\
138 	.lp_mode_reg = lp_reg,						\
139 	.lp_mode_mask = BIT(MT6363_RG_BUCK_##vreg##_LP_BIT),		\
140 	.hw_lp_mode_reg = MT6363_BUCK_##vreg##_HW_LP_MODE,		\
141 	.hw_lp_mode_mask = 0xc,						\
142 	.modeset_reg = mset_reg,					\
143 	.modeset_mask = BIT(MT6363_RG_##vreg##_FCCM_BIT),		\
144 	.lp_imax_uA = 100000,						\
145 	.op_en_reg = MT6363_BUCK_##vreg##_OP_EN_0,			\
146 	.hwirq = ocp_intn,						\
147 }
148 
149 #define MT6363_LDO_LINEAR_OPS(match, vreg, in_sup, vops, min, max,	\
150 			      step, buck_reg, ocp_intn)			\
151 [MT6363_ID_##vreg] = {							\
152 	.desc = {							\
153 		.name = match,						\
154 		.supply_name = in_sup,					\
155 		.of_match = of_match_ptr(match),			\
156 		.ops = &vops,						\
157 		.type = REGULATOR_VOLTAGE,				\
158 		.id = MT6363_ID_##vreg,					\
159 		.owner = THIS_MODULE,					\
160 		.n_voltages = (max - min) / step + 1,			\
161 		.min_uV = min,						\
162 		.uV_step = step,					\
163 		.enable_reg = MT6363_RG_##buck_reg##_EN_ADDR,		\
164 		.enable_mask = BIT(MT6363_RG_LDO_##vreg##_EN_BIT),	\
165 		.vsel_reg = MT6363_RG_LDO_##vreg##_VOSEL_ADDR,		\
166 		.vsel_mask = MT6363_RG_LDO_##vreg##_VOSEL_MASK,		\
167 		.of_map_mode = mt6363_map_mode,				\
168 	},								\
169 	.lp_mode_reg = MT6363_RG_##buck_reg##_LP_ADDR,			\
170 	.lp_mode_mask = BIT(MT6363_RG_LDO_##vreg##_LP_BIT),		\
171 	.hw_lp_mode_reg = MT6363_LDO_##vreg##_HW_LP_MODE,		\
172 	.hw_lp_mode_mask = 0x4,						\
173 	.hwirq = ocp_intn,						\
174 }
175 
176 #define MT6363_LDO_L_SC(match, vreg, inp, min, max, step, buck_reg,	\
177 			ocp_intn)					\
178 	MT6363_LDO_LINEAR_OPS(match, vreg, inp, mt6363_vreg_setclr_ops,	\
179 			      min, max, step, buck_reg, ocp_intn)
180 
181 #define MT6363_LDO_L(match, vreg, inp, min, max, step, buck_reg,	\
182 		     ocp_intn)						\
183 	MT6363_LDO_LINEAR_OPS(match, vreg, inp, mt6363_ldo_linear_ops,	\
184 			      min, max, step, buck_reg, ocp_intn)
185 
186 #define MT6363_LDO_LINEAR_CAL_OPS(match, vreg, in_sup, vops, vrnum,	\
187 				  ocp_intn)				\
188 [MT6363_ID_##vreg] = {							\
189 	.desc = {							\
190 		.name = match,						\
191 		.supply_name = in_sup,					\
192 		.of_match = of_match_ptr(match),			\
193 		.ops = &vops,						\
194 		.type = REGULATOR_VOLTAGE,				\
195 		.id = MT6363_ID_##vreg,					\
196 		.owner = THIS_MODULE,					\
197 		.n_voltages = ARRAY_SIZE(ldo_volt_ranges##vrnum) * 11,	\
198 		.linear_ranges = ldo_volt_ranges##vrnum,		\
199 		.n_linear_ranges = ARRAY_SIZE(ldo_volt_ranges##vrnum),	\
200 		.linear_range_selectors_bitfield = ldos_cal_selectors,	\
201 		.enable_reg = MT6363_RG_LDO_##vreg##_ADDR,		\
202 		.enable_mask = BIT(MT6363_RG_LDO_##vreg##_EN_BIT),	\
203 		.vsel_reg = MT6363_RG_##vreg##_VOCAL_ADDR,		\
204 		.vsel_mask = MT6363_RG_##vreg##_VOCAL_MASK,		\
205 		.vsel_range_reg = MT6363_RG_##vreg##_VOSEL_ADDR,	\
206 		.vsel_range_mask = MT6363_RG_##vreg##_VOSEL_MASK,	\
207 		.of_map_mode = mt6363_map_mode,				\
208 	},								\
209 	.lp_mode_reg = MT6363_RG_LDO_##vreg##_ADDR,			\
210 	.lp_mode_mask = BIT(MT6363_RG_LDO_##vreg##_LP_BIT),		\
211 	.hw_lp_mode_reg = MT6363_LDO_##vreg##_HW_LP_MODE,		\
212 	.hw_lp_mode_mask = 0x4,						\
213 	.lp_imax_uA = 10000,						\
214 	.op_en_reg = MT6363_LDO_##vreg##_OP_EN0,			\
215 	.hwirq = ocp_intn,						\
216 }
217 
218 #define MT6363_LDO_VT(match, vreg, inp, vranges_num, ocp_intn)		\
219 	MT6363_LDO_LINEAR_CAL_OPS(match, vreg, inp, mt6363_ldo_vtable_ops,\
220 				  vranges_num, ocp_intn)
221 
222 static const unsigned int ldos_cal_selectors[] = {
223 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
224 };
225 
226 static const struct linear_range ldo_volt_ranges0[] = {
227 	REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
228 	REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
229 	REGULATOR_LINEAR_RANGE(1500000, 0, 10, 10000),
230 	REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
231 	REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
232 	REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
233 	REGULATOR_LINEAR_RANGE(2500000, 0, 10, 10000),
234 	REGULATOR_LINEAR_RANGE(2600000, 0, 10, 10000),
235 	REGULATOR_LINEAR_RANGE(2700000, 0, 10, 10000),
236 	REGULATOR_LINEAR_RANGE(2800000, 0, 10, 10000),
237 	REGULATOR_LINEAR_RANGE(2900000, 0, 10, 10000),
238 	REGULATOR_LINEAR_RANGE(3000000, 0, 10, 10000),
239 	REGULATOR_LINEAR_RANGE(3100000, 0, 10, 10000),
240 	REGULATOR_LINEAR_RANGE(3300000, 0, 10, 10000),
241 	REGULATOR_LINEAR_RANGE(3400000, 0, 10, 10000),
242 	REGULATOR_LINEAR_RANGE(3500000, 0, 10, 10000)
243 };
244 
245 static const struct linear_range ldo_volt_ranges1[] = {
246 	REGULATOR_LINEAR_RANGE(900000, 0, 10, 10000),
247 	REGULATOR_LINEAR_RANGE(1000000, 0, 10, 10000),
248 	REGULATOR_LINEAR_RANGE(1100000, 0, 10, 10000),
249 	REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
250 	REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
251 	REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
252 	REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
253 	REGULATOR_LINEAR_RANGE(1810000, 0, 10, 10000)
254 };
255 
256 static const struct linear_range ldo_volt_ranges2[] = {
257 	REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
258 	REGULATOR_LINEAR_RANGE(1900000, 0, 10, 10000),
259 	REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
260 	REGULATOR_LINEAR_RANGE(2100000, 0, 10, 10000),
261 	REGULATOR_LINEAR_RANGE(2200000, 0, 10, 10000),
262 	REGULATOR_LINEAR_RANGE(2300000, 0, 10, 10000),
263 	REGULATOR_LINEAR_RANGE(2400000, 0, 10, 10000),
264 	REGULATOR_LINEAR_RANGE(2500000, 0, 10, 10000),
265 	REGULATOR_LINEAR_RANGE(2600000, 0, 10, 10000),
266 	REGULATOR_LINEAR_RANGE(2700000, 0, 10, 10000),
267 	REGULATOR_LINEAR_RANGE(2800000, 0, 10, 10000),
268 	REGULATOR_LINEAR_RANGE(2900000, 0, 10, 10000),
269 	REGULATOR_LINEAR_RANGE(3000000, 0, 10, 10000),
270 	REGULATOR_LINEAR_RANGE(3100000, 0, 10, 10000),
271 	REGULATOR_LINEAR_RANGE(3200000, 0, 10, 10000),
272 	REGULATOR_LINEAR_RANGE(3300000, 0, 10, 10000)
273 };
274 
275 static const struct linear_range ldo_volt_ranges3[] = {
276 	REGULATOR_LINEAR_RANGE(600000, 0, 10, 10000),
277 	REGULATOR_LINEAR_RANGE(700000, 0, 10, 10000),
278 	REGULATOR_LINEAR_RANGE(800000, 0, 10, 10000),
279 	REGULATOR_LINEAR_RANGE(900000, 0, 10, 10000),
280 	REGULATOR_LINEAR_RANGE(1000000, 0, 10, 10000),
281 	REGULATOR_LINEAR_RANGE(1100000, 0, 10, 10000),
282 	REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
283 	REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
284 	REGULATOR_LINEAR_RANGE(1400000, 0, 10, 10000),
285 	REGULATOR_LINEAR_RANGE(1500000, 0, 10, 10000),
286 	REGULATOR_LINEAR_RANGE(1600000, 0, 10, 10000),
287 	REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
288 	REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
289 	REGULATOR_LINEAR_RANGE(1900000, 0, 10, 10000),
290 	REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
291 	REGULATOR_LINEAR_RANGE(2100000, 0, 10, 10000)
292 };
293 
294 static const struct linear_range ldo_volt_ranges4[] = {
295 	REGULATOR_LINEAR_RANGE(550000, 0, 10, 5000),
296 	REGULATOR_LINEAR_RANGE(600000, 0, 10, 5000),
297 	REGULATOR_LINEAR_RANGE(650000, 0, 10, 5000),
298 	REGULATOR_LINEAR_RANGE(700000, 0, 10, 5000),
299 	REGULATOR_LINEAR_RANGE(750000, 0, 10, 5000),
300 	REGULATOR_LINEAR_RANGE(800000, 0, 10, 5000),
301 	REGULATOR_LINEAR_RANGE(900000, 0, 10, 5000),
302 	REGULATOR_LINEAR_RANGE(950000, 0, 10, 5000),
303 	REGULATOR_LINEAR_RANGE(1000000, 0, 10, 5000),
304 	REGULATOR_LINEAR_RANGE(1050000, 0, 10, 5000),
305 	REGULATOR_LINEAR_RANGE(1100000, 0, 10, 5000),
306 	REGULATOR_LINEAR_RANGE(1150000, 0, 10, 5000),
307 	REGULATOR_LINEAR_RANGE(1700000, 0, 10, 5000),
308 	REGULATOR_LINEAR_RANGE(1750000, 0, 10, 5000),
309 	REGULATOR_LINEAR_RANGE(1800000, 0, 10, 5000),
310 	REGULATOR_LINEAR_RANGE(1850000, 0, 10, 5000)
311 };
312 
313 static const struct linear_range ldo_volt_ranges5[] = {
314 	REGULATOR_LINEAR_RANGE(600000, 0, 10, 5000),
315 	REGULATOR_LINEAR_RANGE(650000, 0, 10, 5000),
316 	REGULATOR_LINEAR_RANGE(700000, 0, 10, 5000),
317 	REGULATOR_LINEAR_RANGE(750000, 0, 10, 5000),
318 	REGULATOR_LINEAR_RANGE(800000, 0, 10, 5000)
319 };
320 
321 static int mt6363_vreg_enable_setclr(struct regulator_dev *rdev)
322 {
323 	return regmap_write(rdev->regmap, rdev->desc->enable_reg + EN_SET_OFFSET,
324 			    rdev->desc->enable_mask);
325 }
326 
327 static int mt6363_vreg_disable_setclr(struct regulator_dev *rdev)
328 {
329 	return regmap_write(rdev->regmap, rdev->desc->enable_reg + EN_CLR_OFFSET,
330 			    rdev->desc->enable_mask);
331 }
332 
333 static inline unsigned int mt6363_map_mode(unsigned int mode)
334 {
335 	switch (mode) {
336 	case MT6363_REGULATOR_MODE_NORMAL:
337 		return REGULATOR_MODE_NORMAL;
338 	case MT6363_REGULATOR_MODE_FCCM:
339 		return REGULATOR_MODE_FAST;
340 	case MT6363_REGULATOR_MODE_LP:
341 		return REGULATOR_MODE_IDLE;
342 	case MT6363_REGULATOR_MODE_ULP:
343 		return REGULATOR_MODE_STANDBY;
344 	default:
345 		return REGULATOR_MODE_INVALID;
346 	}
347 }
348 
349 static unsigned int mt6363_regulator_get_mode(struct regulator_dev *rdev)
350 {
351 	struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
352 	unsigned int val;
353 	int ret;
354 
355 	if (info->modeset_reg) {
356 		ret = regmap_read(rdev->regmap, info->modeset_reg, &val);
357 		if (ret) {
358 			dev_err(&rdev->dev, "Failed to get mt6363 mode: %d\n", ret);
359 			return ret;
360 		}
361 
362 		if (val & info->modeset_mask)
363 			return REGULATOR_MODE_FAST;
364 	} else {
365 		val = 0;
366 	}
367 
368 	ret = regmap_read(rdev->regmap, info->hw_lp_mode_reg, &val);
369 	val &= info->hw_lp_mode_mask;
370 
371 	if (ret) {
372 		dev_err(&rdev->dev, "Failed to get lp mode: %d\n", ret);
373 		return ret;
374 	}
375 
376 	if (val)
377 		return REGULATOR_MODE_IDLE;
378 	else
379 		return REGULATOR_MODE_NORMAL;
380 }
381 
382 static int mt6363_buck_unlock(struct regmap *map, bool unlock)
383 {
384 	u16 buf = unlock ? MT6363_BUCK_TOP_UNLOCK_VALUE : 0;
385 
386 	return regmap_bulk_write(map, MT6363_BUCK_TOP_KEY_PROT_LO, &buf, sizeof(buf));
387 }
388 
389 static int mt6363_regulator_set_mode(struct regulator_dev *rdev,
390 				     unsigned int mode)
391 {
392 	struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
393 	struct regmap *regmap = rdev->regmap;
394 	int cur_mode, ret;
395 
396 	if (!info->modeset_reg && mode == REGULATOR_MODE_FAST)
397 		return -EOPNOTSUPP;
398 
399 	switch (mode) {
400 	case REGULATOR_MODE_FAST:
401 		ret = mt6363_buck_unlock(regmap, true);
402 		if (ret)
403 			break;
404 
405 		ret = regmap_set_bits(regmap, info->modeset_reg, info->modeset_mask);
406 
407 		mt6363_buck_unlock(regmap, false);
408 		break;
409 	case REGULATOR_MODE_NORMAL:
410 		cur_mode = mt6363_regulator_get_mode(rdev);
411 		if (cur_mode < 0) {
412 			ret = cur_mode;
413 			break;
414 		}
415 
416 		if (cur_mode == REGULATOR_MODE_FAST) {
417 			ret = mt6363_buck_unlock(regmap, true);
418 			if (ret)
419 				break;
420 
421 			ret = regmap_clear_bits(regmap, info->modeset_reg, info->modeset_mask);
422 
423 			mt6363_buck_unlock(regmap, false);
424 			break;
425 		} else if (cur_mode == REGULATOR_MODE_IDLE) {
426 			ret = regmap_clear_bits(regmap, info->lp_mode_reg, info->lp_mode_mask);
427 			if (ret == 0)
428 				usleep_range(100, 200);
429 		} else {
430 			ret = 0;
431 		}
432 		break;
433 	case REGULATOR_MODE_IDLE:
434 		ret = regmap_set_bits(regmap, info->lp_mode_reg, info->lp_mode_mask);
435 		break;
436 	default:
437 		ret = -EINVAL;
438 	}
439 
440 	if (ret) {
441 		dev_err(&rdev->dev, "Failed to set mode %u: %d\n", mode, ret);
442 		return ret;
443 	}
444 
445 	return 0;
446 }
447 
448 static int mt6363_regulator_set_load(struct regulator_dev *rdev, int load_uA)
449 {
450 	struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
451 	unsigned int opmode_cfg, opmode_en;
452 	int i, ret;
453 
454 	if (!info->lp_imax_uA)
455 		return -EINVAL;
456 
457 	if (load_uA >= info->lp_imax_uA) {
458 		ret = mt6363_regulator_set_mode(rdev, REGULATOR_MODE_NORMAL);
459 		if (ret)
460 			return ret;
461 
462 		opmode_cfg = NORMAL_OP_CFG;
463 		opmode_en = NORMAL_OP_EN;
464 	} else {
465 		opmode_cfg = info->orig_op_cfg;
466 		opmode_en = info->orig_op_en;
467 	}
468 
469 	ret = regmap_write(rdev->regmap, info->op_en_reg + OP_CFG_OFFSET, opmode_cfg);
470 	if (ret)
471 		return ret;
472 
473 	for (i = 0; i < 3; i++) {
474 		ret = regmap_write(rdev->regmap, info->op_en_reg + i,
475 				   (opmode_en >> (i * 8)) & GENMASK(7, 0));
476 		if (ret)
477 			return ret;
478 	}
479 
480 	return 0;
481 }
482 
483 static int mt6363_vemc_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
484 {
485 	const u16 tma_unlock_key = MT6363_TMA_UNLOCK_VALUE;
486 	const struct regulator_desc *rdesc = rdev->desc;
487 	struct regmap *regmap = rdev->regmap;
488 	unsigned int range, val;
489 	int i, ret;
490 	u16 mask;
491 
492 	for (i = 0; i < rdesc->n_linear_ranges; i++) {
493 		const struct linear_range *r = &rdesc->linear_ranges[i];
494 		unsigned int voltages_in_range = linear_range_values_in_range(r);
495 
496 		if (sel < voltages_in_range)
497 			break;
498 		sel -= voltages_in_range;
499 	}
500 
501 	if (i == rdesc->n_linear_ranges)
502 		return -EINVAL;
503 
504 	ret = regmap_read(rdev->regmap, MT6363_TOP_TRAP, &val);
505 	if (ret)
506 		return ret;
507 
508 	if (val > 1)
509 		return -EINVAL;
510 
511 	/* Unlock TMA for writing */
512 	ret = regmap_bulk_write(rdev->regmap, MT6363_TOP_TMA_KEY_L,
513 				&tma_unlock_key, sizeof(tma_unlock_key));
514 	if (ret)
515 		return ret;
516 
517 	/* If HW trapping value is 1, use VEMC_VOSEL_1 instead of VEMC_VOSEL_0 */
518 	if (val == 1) {
519 		mask = MT6363_RG_VEMC_VOSEL_1_MASK;
520 		sel = FIELD_PREP(MT6363_RG_VEMC_VOSEL_1_MASK, sel);
521 	} else {
522 		mask = rdesc->vsel_mask;
523 	}
524 
525 	sel <<= ffs(rdesc->vsel_mask) - 1;
526 	sel += rdesc->linear_ranges[i].min_sel;
527 
528 	range = rdesc->linear_range_selectors_bitfield[i];
529 	range <<= ffs(rdesc->vsel_range_mask) - 1;
530 
531 	/* Write to the vreg calibration register for voltage finetuning */
532 	ret = regmap_update_bits(regmap, rdesc->vsel_range_reg,
533 				 rdesc->vsel_range_mask, range);
534 	if (ret)
535 		goto lock_tma;
536 
537 	/* Function must return the result of this write operation */
538 	ret = regmap_update_bits(regmap, rdesc->vsel_reg, mask, sel);
539 
540 lock_tma:
541 	/* Unconditionally re-lock TMA */
542 	val = 0;
543 	regmap_bulk_write(rdev->regmap, MT6363_TOP_TMA_KEY_L, &val, 2);
544 
545 	return ret;
546 }
547 
548 static int mt6363_vemc_get_voltage_sel(struct regulator_dev *rdev)
549 {
550 	const struct regulator_desc *rdesc = rdev->desc;
551 	unsigned int vosel, trap, calsel;
552 	int vcal, vsel, range, ret;
553 
554 	ret = regmap_read(rdev->regmap, rdesc->vsel_reg, &vosel);
555 	if (ret)
556 		return ret;
557 
558 	ret = regmap_read(rdev->regmap, rdesc->vsel_range_reg, &calsel);
559 	if (ret)
560 		return ret;
561 
562 	calsel &= rdesc->vsel_range_mask;
563 	for (range = 0; range < rdesc->n_linear_ranges; range++)
564 		if (rdesc->linear_range_selectors_bitfield[range] != calsel)
565 			break;
566 
567 	if (range == rdesc->n_linear_ranges)
568 		return -EINVAL;
569 
570 	ret = regmap_read(rdev->regmap, MT6363_TOP_TRAP, &trap);
571 	if (ret)
572 		return ret;
573 
574 	/* If HW trapping value is 1, use VEMC_VOSEL_1 instead of VEMC_VOSEL_0 */
575 	if (trap > 1)
576 		return -EINVAL;
577 	else if (trap == 1)
578 		vsel = FIELD_GET(MT6363_RG_VEMC_VOSEL_1_MASK, vosel);
579 	else
580 		vsel = vosel & rdesc->vsel_mask;
581 
582 	vcal = linear_range_values_in_range_array(rdesc->linear_ranges, range);
583 
584 	return vsel + vcal;
585 }
586 
587 static int mt6363_va15_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
588 {
589 	struct regmap *regmap = rdev->regmap;
590 	int ret;
591 
592 	ret = mt6363_buck_unlock(regmap, true);
593 	if (ret)
594 		return ret;
595 
596 	ret = regulator_set_voltage_sel_pickable_regmap(rdev, sel);
597 	if (ret)
598 		goto va15_unlock;
599 
600 	ret = regmap_update_bits(regmap, MT6363_RG_BUCK_EFUSE_RSV1,
601 				 MT6363_RG_BUCK_EFUSE_RSV1_MASK, sel);
602 	if (ret)
603 		goto va15_unlock;
604 
605 va15_unlock:
606 	mt6363_buck_unlock(rdev->regmap, false);
607 	return ret;
608 }
609 
610 static void mt6363_oc_irq_enable_work(struct work_struct *work)
611 {
612 	struct delayed_work *dwork = to_delayed_work(work);
613 	struct mt6363_regulator_info *info =
614 		container_of(dwork, struct mt6363_regulator_info, oc_work);
615 
616 	enable_irq(info->virq);
617 }
618 
619 static irqreturn_t mt6363_oc_isr(int irq, void *data)
620 {
621 	struct regulator_dev *rdev = (struct regulator_dev *)data;
622 	struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
623 
624 	disable_irq_nosync(info->virq);
625 
626 	if (regulator_is_enabled_regmap(rdev))
627 		regulator_notifier_call_chain(rdev, REGULATOR_EVENT_OVER_CURRENT, NULL);
628 
629 	schedule_delayed_work(&info->oc_work, msecs_to_jiffies(OC_IRQ_ENABLE_DELAY_MS));
630 
631 	return IRQ_HANDLED;
632 }
633 
634 static int mt6363_set_ocp(struct regulator_dev *rdev, int lim, int severity, bool enable)
635 {
636 	struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
637 
638 	/* MT6363 supports only enabling protection and does not support limits */
639 	if (lim || severity != REGULATOR_SEVERITY_PROT || !enable)
640 		return -EOPNOTSUPP;
641 
642 	/* If there is no OCP interrupt, there's nothing to set */
643 	if (info->virq <= 0)
644 		return -EOPNOTSUPP;
645 
646 	return devm_request_threaded_irq(&rdev->dev, info->virq, NULL,
647 					 mt6363_oc_isr, IRQF_ONESHOT,
648 					 info->desc.name, rdev);
649 }
650 
651 static const struct regulator_ops mt6363_vreg_setclr_ops = {
652 	.list_voltage = regulator_list_voltage_linear,
653 	.map_voltage = regulator_map_voltage_linear,
654 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
655 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
656 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
657 	.enable = mt6363_vreg_enable_setclr,
658 	.disable = mt6363_vreg_disable_setclr,
659 	.is_enabled = regulator_is_enabled_regmap,
660 	.set_mode = mt6363_regulator_set_mode,
661 	.get_mode = mt6363_regulator_get_mode,
662 	.set_load = mt6363_regulator_set_load,
663 	.set_over_current_protection = mt6363_set_ocp,
664 };
665 
666 static const struct regulator_ops mt6363_ldo_linear_ops = {
667 	.list_voltage = regulator_list_voltage_linear,
668 	.map_voltage = regulator_map_voltage_linear,
669 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
670 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
671 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
672 	.enable = regulator_enable_regmap,
673 	.disable = regulator_disable_regmap,
674 	.is_enabled = regulator_is_enabled_regmap,
675 	.set_mode = mt6363_regulator_set_mode,
676 	.get_mode = mt6363_regulator_get_mode,
677 	.set_over_current_protection = mt6363_set_ocp,
678 };
679 
680 static const struct regulator_ops mt6363_ldo_vtable_ops = {
681 	.list_voltage = regulator_list_voltage_pickable_linear_range,
682 	.map_voltage = regulator_map_voltage_pickable_linear_range,
683 	.set_voltage_sel = regulator_set_voltage_sel_pickable_regmap,
684 	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
685 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
686 	.enable = regulator_enable_regmap,
687 	.disable = regulator_disable_regmap,
688 	.is_enabled = regulator_is_enabled_regmap,
689 	.set_mode = mt6363_regulator_set_mode,
690 	.get_mode = mt6363_regulator_get_mode,
691 	.set_load = mt6363_regulator_set_load,
692 	.set_over_current_protection = mt6363_set_ocp,
693 };
694 
695 static const struct regulator_ops mt6363_ldo_vemc_ops = {
696 	.list_voltage = regulator_list_voltage_pickable_linear_range,
697 	.map_voltage = regulator_map_voltage_pickable_linear_range,
698 	.set_voltage_sel = mt6363_vemc_set_voltage_sel,
699 	.get_voltage_sel = mt6363_vemc_get_voltage_sel,
700 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
701 	.enable = regulator_enable_regmap,
702 	.disable = regulator_disable_regmap,
703 	.is_enabled = regulator_is_enabled_regmap,
704 	.set_mode = mt6363_regulator_set_mode,
705 	.get_mode = mt6363_regulator_get_mode,
706 	.set_load = mt6363_regulator_set_load,
707 	.set_over_current_protection = mt6363_set_ocp,
708 };
709 
710 static const struct regulator_ops mt6363_ldo_va15_ops = {
711 	.list_voltage = regulator_list_voltage_pickable_linear_range,
712 	.map_voltage = regulator_map_voltage_pickable_linear_range,
713 	.set_voltage_sel = mt6363_va15_set_voltage_sel,
714 	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
715 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
716 	.enable = regulator_enable_regmap,
717 	.disable = regulator_disable_regmap,
718 	.is_enabled = regulator_is_enabled_regmap,
719 	.set_mode = mt6363_regulator_set_mode,
720 	.get_mode = mt6363_regulator_get_mode,
721 	.set_load = mt6363_regulator_set_load,
722 	.set_over_current_protection = mt6363_set_ocp,
723 };
724 
725 /* The array is indexed by id(MT6363_ID_XXX) */
726 static struct mt6363_regulator_info mt6363_regulators[] = {
727 	MT6363_BUCK("vbuck1", VBUCK1, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
728 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 1),
729 	MT6363_BUCK("vbuck2", VBUCK2, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
730 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 2),
731 	MT6363_BUCK("vbuck3", VBUCK3, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
732 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 3),
733 	MT6363_BUCK("vbuck4", VBUCK4, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
734 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 4),
735 	MT6363_BUCK("vbuck5", VBUCK5, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
736 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 5),
737 	MT6363_BUCK("vbuck6", VBUCK6, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
738 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 6),
739 	MT6363_BUCK("vbuck7", VBUCK7, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
740 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 7),
741 	MT6363_BUCK("vs1", VS1, 0, 2200000, 12500, MT6363_RG_BUCK1_EN_ADDR,
742 		    MT6363_RG_BUCK1_LP_ADDR, MT6363_RG_VS1_FCCM_ADDR, 8),
743 	MT6363_BUCK("vs2", VS2, 0, 1600000, 12500, MT6363_RG_BUCK0_EN_ADDR,
744 		    MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 0),
745 	MT6363_BUCK("vs3", VS3, 0, 1193750, 6250, MT6363_RG_BUCK1_EN_ADDR,
746 		    MT6363_RG_BUCK1_LP_ADDR, MT6363_RG_VS3_FCCM_ADDR, 9),
747 	MT6363_LDO_VT("va12-1", VA12_1, "vs2-ldo2", 3, 37),
748 	MT6363_LDO_VT("va12-2", VA12_2, "vs2-ldo2", 3, 38),
749 	MT6363_LDO_LINEAR_CAL_OPS("va15", VA15, "vs1-ldo1", mt6363_ldo_va15_ops, 3, 39),
750 	MT6363_LDO_VT("vaux18", VAUX18, "vsys-ldo1", 2, 31),
751 	MT6363_LDO_VT("vcn13", VCN13, "vs2-ldo2", 1, 17),
752 	MT6363_LDO_VT("vcn15", VCN15, "vs1-ldo2", 3, 16),
753 	MT6363_LDO_LINEAR_CAL_OPS("vemc", VEMC, "vsys-ldo1", mt6363_ldo_vemc_ops, 0, 32),
754 	MT6363_LDO_VT("vio0p75", VIO075, "vs1-ldo1", 5, 36),
755 	MT6363_LDO_VT("vio18", VIO18, "vs1-ldo2", 3, 35),
756 	MT6363_LDO_VT("vm18", VM18, "vs1-ldo1", 4, 40),
757 	MT6363_LDO_L("vsram-apu", VSRAM_APU, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 30),
758 	MT6363_LDO_L("vsram-cpub", VSRAM_CPUB, "vs2-ldo1", 400000, 1193750, 6250, BUCK1, 27),
759 	MT6363_LDO_L("vsram-cpum", VSRAM_CPUM, "vs2-ldo1", 400000, 1193750, 6250, BUCK1, 28),
760 	MT6363_LDO_L("vsram-cpul", VSRAM_CPUL, "vs2-ldo2", 400000, 1193750, 6250, BUCK1, 29),
761 	MT6363_LDO_L_SC("vsram-digrf", VSRAM_DIGRF, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 23),
762 	MT6363_LDO_L_SC("vsram-mdfe", VSRAM_MDFE, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 24),
763 	MT6363_LDO_L_SC("vsram-modem", VSRAM_MODEM, "vs3-ldo2", 400000, 1193750, 6250, BUCK1, 25),
764 	MT6363_LDO_VT("vrf0p9", VRF09, "vs3-ldo2", 1, 18),
765 	MT6363_LDO_VT("vrf12", VRF12, "vs2-ldo1", 3, 19),
766 	MT6363_LDO_VT("vrf13", VRF13, "vs2-ldo1", 1, 20),
767 	MT6363_LDO_VT("vrf18", VRF18, "vs1-ldo1", 3, 21),
768 	MT6363_LDO_VT("vrf-io18", VRFIO18, "vs1-ldo1", 3, 22),
769 	MT6363_LDO_VT("vtref18", VTREF18, "vsys-ldo1", 2, 26),
770 	MT6363_LDO_VT("vufs12", VUFS12, "vs2-ldo1", 4, 33),
771 	MT6363_LDO_VT("vufs18", VUFS18, "vs1-ldo2", 3, 34),
772 };
773 
774 static int mt6363_backup_op_setting(struct regmap *map, struct mt6363_regulator_info *info)
775 {
776 	unsigned int i, val;
777 	int ret;
778 
779 	ret = regmap_read(map, info->op_en_reg + OP_CFG_OFFSET, &val);
780 	if (ret)
781 		return ret;
782 
783 	info->orig_op_cfg = val;
784 
785 	for (i = 0; i < 3; i++) {
786 		ret = regmap_read(map, info->op_en_reg + i, &val);
787 		if (ret)
788 			return ret;
789 
790 		info->orig_op_en |= val << (i * 8);
791 	}
792 
793 	return 0;
794 }
795 
796 static void mt6363_irq_remove(void *data)
797 {
798 	int *virq = data;
799 
800 	irq_dispose_mapping(*virq);
801 }
802 
803 static void mt6363_spmi_remove(void *data)
804 {
805 	struct spmi_device *sdev = data;
806 
807 	spmi_device_remove(sdev);
808 };
809 
810 static struct regmap *mt6363_spmi_register_regmap(struct device *dev)
811 {
812 	struct regmap_config mt6363_regmap_config = {
813 		.reg_bits = 16,
814 		.val_bits = 16,
815 		.max_register = 0x1f90,
816 		.fast_io = true,
817 	};
818 	struct spmi_device *sdev, *sparent;
819 	u32 base;
820 	int ret;
821 
822 	if (!dev->parent)
823 		return ERR_PTR(-ENODEV);
824 
825 	ret = device_property_read_u32(dev, "reg", &base);
826 	if (ret)
827 		return ERR_PTR(ret);
828 
829 	sparent = to_spmi_device(dev->parent);
830 	if (!sparent)
831 		return ERR_PTR(-ENODEV);
832 
833 	sdev = spmi_device_alloc(sparent->ctrl);
834 	if (!sdev)
835 		return ERR_PTR(-ENODEV);
836 
837 	sdev->usid = sparent->usid;
838 	dev_set_name(&sdev->dev, "%d-%02x-regulator", sdev->ctrl->nr, sdev->usid);
839 	ret = device_add(&sdev->dev);
840 	if (ret) {
841 		put_device(&sdev->dev);
842 		return ERR_PTR(ret);
843 	};
844 
845 	ret = devm_add_action_or_reset(dev, mt6363_spmi_remove, sdev);
846 	if (ret)
847 		return ERR_PTR(ret);
848 
849 	mt6363_regmap_config.reg_base = base;
850 
851 	return devm_regmap_init_spmi_ext(sdev, &mt6363_regmap_config);
852 }
853 
854 static int mt6363_regulator_probe(struct platform_device *pdev)
855 {
856 	struct device_node *interrupt_parent;
857 	struct regulator_config config = {};
858 	struct mt6363_regulator_info *info;
859 	struct device *dev = &pdev->dev;
860 	struct regulator_dev *rdev;
861 	struct irq_domain *domain;
862 	struct irq_fwspec fwspec;
863 	struct spmi_device *sdev;
864 	int i, ret;
865 
866 	config.regmap = mt6363_spmi_register_regmap(dev);
867 	if (IS_ERR(config.regmap))
868 		return dev_err_probe(dev, PTR_ERR(config.regmap),
869 				     "Cannot get regmap\n");
870 	config.dev = dev;
871 	sdev = to_spmi_device(dev->parent);
872 
873 	interrupt_parent = of_irq_find_parent(dev->of_node);
874 	if (!interrupt_parent)
875 		return dev_err_probe(dev, -EINVAL, "Cannot find IRQ parent\n");
876 
877 	domain = irq_find_host(interrupt_parent);
878 	of_node_put(interrupt_parent);
879 	fwspec.fwnode = domain->fwnode;
880 
881 	fwspec.param_count = 3;
882 	fwspec.param[0] = sdev->usid;
883 	fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH;
884 
885 	for (i = 0; i < ARRAY_SIZE(mt6363_regulators); i++) {
886 		info = &mt6363_regulators[i];
887 
888 		fwspec.param[1] = info->hwirq;
889 		info->virq = irq_create_fwspec_mapping(&fwspec);
890 		if (!info->virq)
891 			return dev_err_probe(dev, -EINVAL,
892 					     "Failed to map IRQ%d\n", info->hwirq);
893 
894 		ret = devm_add_action_or_reset(dev, mt6363_irq_remove, &info->virq);
895 		if (ret) {
896 			irq_dispose_mapping(info->hwirq);
897 			return ret;
898 		}
899 
900 		config.driver_data = info;
901 		INIT_DELAYED_WORK(&info->oc_work, mt6363_oc_irq_enable_work);
902 
903 		rdev = devm_regulator_register(dev, &info->desc, &config);
904 		if (IS_ERR(rdev))
905 			return dev_err_probe(dev, PTR_ERR(rdev),
906 					     "failed to register %s\n", info->desc.name);
907 
908 		if (info->lp_imax_uA) {
909 			ret = mt6363_backup_op_setting(config.regmap, info);
910 			if (ret) {
911 				dev_warn(dev, "Failed to backup op_setting for %s\n",
912 					 info->desc.name);
913 				info->lp_imax_uA = 0;
914 			}
915 		}
916 	}
917 
918 	return 0;
919 }
920 
921 static const struct of_device_id mt6363_regulator_match[] = {
922 	{ .compatible = "mediatek,mt6363-regulator" },
923 	{ /* sentinel */ }
924 };
925 
926 static struct platform_driver mt6363_regulator_driver = {
927 	.driver = {
928 		.name = "mt6363-regulator",
929 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
930 		.of_match_table = mt6363_regulator_match,
931 	},
932 	.probe = mt6363_regulator_probe,
933 };
934 module_platform_driver(mt6363_regulator_driver);
935 
936 MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>");
937 MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6363 PMIC");
938 MODULE_LICENSE("GPL");
939