xref: /linux/drivers/regulator/bd9576-regulator.c (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2020 ROHM Semiconductors
3 // ROHM BD9576MUF/BD9573MUF regulator driver
4 
5 #include <linux/err.h>
6 #include <linux/gpio/consumer.h>
7 #include <linux/interrupt.h>
8 #include <linux/jiffies.h>
9 #include <linux/kernel.h>
10 #include <linux/mfd/rohm-bd957x.h>
11 #include <linux/mfd/rohm-generic.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <linux/platform_device.h>
15 #include <linux/regulator/driver.h>
16 #include <linux/regulator/machine.h>
17 #include <linux/regulator/of_regulator.h>
18 #include <linux/slab.h>
19 #include <linux/spinlock.h>
20 #include <linux/workqueue.h>
21 
22 #define BD957X_VOUTS1_VOLT	3300000
23 #define BD957X_VOUTS4_BASE_VOLT	1030000
24 #define BD957X_VOUTS34_NUM_VOLT	32
25 
26 #define BD9576_THERM_IRQ_MASK_TW	BIT(5)
27 #define BD9576_xVD_IRQ_MASK_VOUTL1	BIT(5)
28 #define BD9576_UVD_IRQ_MASK_VOUTS1_OCW	BIT(6)
29 #define BD9576_xVD_IRQ_MASK_VOUT1TO4	0x0F
30 
31 static const unsigned int vout1_volt_table[] = {
32 	5000000, 4900000, 4800000, 4700000, 4600000,
33 	4500000, 4500000, 4500000, 5000000, 5100000,
34 	5200000, 5300000, 5400000, 5500000, 5500000,
35 	5500000
36 };
37 
38 static const unsigned int vout2_volt_table[] = {
39 	1800000, 1780000, 1760000, 1740000, 1720000,
40 	1700000, 1680000, 1660000, 1800000, 1820000,
41 	1840000, 1860000, 1880000, 1900000, 1920000,
42 	1940000
43 };
44 
45 static const unsigned int voutl1_volt_table[] = {
46 	2500000, 2540000, 2580000, 2620000, 2660000,
47 	2700000, 2740000, 2780000, 2500000, 2460000,
48 	2420000, 2380000, 2340000, 2300000, 2260000,
49 	2220000
50 };
51 
52 static const struct linear_range vout1_xvd_ranges[] = {
53 	REGULATOR_LINEAR_RANGE(225000, 0x01, 0x2b, 0),
54 	REGULATOR_LINEAR_RANGE(225000, 0x2c, 0x54, 5000),
55 	REGULATOR_LINEAR_RANGE(425000, 0x55, 0x7f, 0),
56 };
57 
58 static const struct linear_range vout234_xvd_ranges[] = {
59 	REGULATOR_LINEAR_RANGE(17000, 0x01, 0x0f, 0),
60 	REGULATOR_LINEAR_RANGE(17000, 0x10, 0x6d, 1000),
61 	REGULATOR_LINEAR_RANGE(110000, 0x6e, 0x7f, 0),
62 };
63 
64 static const struct linear_range voutL1_xvd_ranges[] = {
65 	REGULATOR_LINEAR_RANGE(34000, 0x01, 0x0f, 0),
66 	REGULATOR_LINEAR_RANGE(34000, 0x10, 0x6d, 2000),
67 	REGULATOR_LINEAR_RANGE(220000, 0x6e, 0x7f, 0),
68 };
69 
70 static struct linear_range voutS1_ocw_ranges_internal[] = {
71 	REGULATOR_LINEAR_RANGE(200000, 0x01, 0x04, 0),
72 	REGULATOR_LINEAR_RANGE(250000, 0x05, 0x18, 50000),
73 	REGULATOR_LINEAR_RANGE(1200000, 0x19, 0x3f, 0),
74 };
75 
76 static struct linear_range voutS1_ocw_ranges[] = {
77 	REGULATOR_LINEAR_RANGE(50000, 0x01, 0x04, 0),
78 	REGULATOR_LINEAR_RANGE(60000, 0x05, 0x18, 10000),
79 	REGULATOR_LINEAR_RANGE(250000, 0x19, 0x3f, 0),
80 };
81 
82 static struct linear_range voutS1_ocp_ranges_internal[] = {
83 	REGULATOR_LINEAR_RANGE(300000, 0x01, 0x06, 0),
84 	REGULATOR_LINEAR_RANGE(350000, 0x7, 0x1b, 50000),
85 	REGULATOR_LINEAR_RANGE(1350000, 0x1c, 0x3f, 0),
86 };
87 
88 static struct linear_range voutS1_ocp_ranges[] = {
89 	REGULATOR_LINEAR_RANGE(70000, 0x01, 0x06, 0),
90 	REGULATOR_LINEAR_RANGE(80000, 0x7, 0x1b, 10000),
91 	REGULATOR_LINEAR_RANGE(280000, 0x1c, 0x3f, 0),
92 };
93 
94 struct bd957x_regulator_data {
95 	struct regulator_desc desc;
96 	int base_voltage;
97 	struct regulator_dev *rdev;
98 	int ovd_notif;
99 	int uvd_notif;
100 	int temp_notif;
101 	int ovd_err;
102 	int uvd_err;
103 	int temp_err;
104 	const struct linear_range *xvd_ranges;
105 	int num_xvd_ranges;
106 	bool oc_supported;
107 	unsigned int ovd_reg;
108 	unsigned int uvd_reg;
109 	unsigned int xvd_mask;
110 	unsigned int ocp_reg;
111 	unsigned int ocp_mask;
112 	unsigned int ocw_reg;
113 	unsigned int ocw_mask;
114 	unsigned int ocw_rfet;
115 };
116 
117 #define BD9576_NUM_REGULATORS 6
118 #define BD9576_NUM_OVD_REGULATORS 5
119 
120 struct bd957x_data {
121 	struct bd957x_regulator_data regulator_data[BD9576_NUM_REGULATORS];
122 	struct regmap *regmap;
123 	struct delayed_work therm_irq_suppress;
124 	struct delayed_work ovd_irq_suppress;
125 	struct delayed_work uvd_irq_suppress;
126 	unsigned int therm_irq;
127 	unsigned int ovd_irq;
128 	unsigned int uvd_irq;
129 	spinlock_t err_lock;
130 	int regulator_global_err;
131 };
132 
133 static int bd957x_vout34_list_voltage(struct regulator_dev *rdev,
134 				      unsigned int selector)
135 {
136 	const struct regulator_desc *desc = rdev->desc;
137 	int multiplier = selector & desc->vsel_mask & 0x7f;
138 	int tune;
139 
140 	/* VOUT3 and 4 has 10mV step */
141 	tune = multiplier * 10000;
142 
143 	if (!(selector & 0x80))
144 		return desc->fixed_uV - tune;
145 
146 	return desc->fixed_uV + tune;
147 }
148 
149 static int bd957x_list_voltage(struct regulator_dev *rdev,
150 			       unsigned int selector)
151 {
152 	const struct regulator_desc *desc = rdev->desc;
153 	int index = selector & desc->vsel_mask & 0x7f;
154 
155 	if (!(selector & 0x80))
156 		index += desc->n_voltages/2;
157 
158 	if (index >= desc->n_voltages)
159 		return -EINVAL;
160 
161 	return desc->volt_table[index];
162 }
163 
164 static void bd9576_fill_ovd_flags(struct bd957x_regulator_data *data,
165 				  bool warn)
166 {
167 	if (warn) {
168 		data->ovd_notif = REGULATOR_EVENT_OVER_VOLTAGE_WARN;
169 		data->ovd_err = REGULATOR_ERROR_OVER_VOLTAGE_WARN;
170 	} else {
171 		data->ovd_notif = REGULATOR_EVENT_REGULATION_OUT;
172 		data->ovd_err = REGULATOR_ERROR_REGULATION_OUT;
173 	}
174 }
175 
176 static void bd9576_fill_ocp_flags(struct bd957x_regulator_data *data,
177 				  bool warn)
178 {
179 	if (warn) {
180 		data->uvd_notif = REGULATOR_EVENT_OVER_CURRENT_WARN;
181 		data->uvd_err = REGULATOR_ERROR_OVER_CURRENT_WARN;
182 	} else {
183 		data->uvd_notif = REGULATOR_EVENT_OVER_CURRENT;
184 		data->uvd_err = REGULATOR_ERROR_OVER_CURRENT;
185 	}
186 }
187 
188 static void bd9576_fill_uvd_flags(struct bd957x_regulator_data *data,
189 				  bool warn)
190 {
191 	if (warn) {
192 		data->uvd_notif = REGULATOR_EVENT_UNDER_VOLTAGE_WARN;
193 		data->uvd_err = REGULATOR_ERROR_UNDER_VOLTAGE_WARN;
194 	} else {
195 		data->uvd_notif = REGULATOR_EVENT_UNDER_VOLTAGE;
196 		data->uvd_err = REGULATOR_ERROR_UNDER_VOLTAGE;
197 	}
198 }
199 
200 static void bd9576_fill_temp_flags(struct bd957x_regulator_data *data,
201 				   bool enable, bool warn)
202 {
203 	if (!enable) {
204 		data->temp_notif = 0;
205 		data->temp_err = 0;
206 	} else if (warn) {
207 		data->temp_notif = REGULATOR_EVENT_OVER_TEMP_WARN;
208 		data->temp_err = REGULATOR_ERROR_OVER_TEMP_WARN;
209 	} else {
210 		data->temp_notif = REGULATOR_EVENT_OVER_TEMP;
211 		data->temp_err = REGULATOR_ERROR_OVER_TEMP;
212 	}
213 }
214 
215 static int bd9576_set_limit(const struct linear_range *r, int num_ranges,
216 			    struct regmap *regmap, int reg, int mask, int lim)
217 {
218 	int ret;
219 	bool found;
220 	int sel = 0;
221 
222 	if (lim) {
223 
224 		ret = linear_range_get_selector_low_array(r, num_ranges,
225 							  lim, &sel, &found);
226 		if (ret)
227 			return ret;
228 
229 		if (!found)
230 			dev_warn(regmap_get_device(regmap),
231 				 "limit %d out of range. Setting lower\n",
232 				 lim);
233 	}
234 
235 	return regmap_update_bits(regmap, reg, mask, sel);
236 }
237 
238 static bool check_ocp_flag_mismatch(struct regulator_dev *rdev, int severity,
239 				    struct bd957x_regulator_data *r)
240 {
241 	if ((severity == REGULATOR_SEVERITY_ERR &&
242 	    r->uvd_notif != REGULATOR_EVENT_OVER_CURRENT) ||
243 	    (severity == REGULATOR_SEVERITY_WARN &&
244 	    r->uvd_notif != REGULATOR_EVENT_OVER_CURRENT_WARN)) {
245 		dev_warn(rdev_get_dev(rdev),
246 			 "Can't support both OCP WARN and ERR\n");
247 		/* Do not overwrite ERR config with WARN */
248 		if (severity == REGULATOR_SEVERITY_WARN)
249 			return true;
250 
251 		bd9576_fill_ocp_flags(r, 0);
252 	}
253 
254 	return false;
255 }
256 
257 static bool check_uvd_flag_mismatch(struct regulator_dev *rdev, int severity,
258 				    struct bd957x_regulator_data *r)
259 {
260 	if ((severity == REGULATOR_SEVERITY_ERR &&
261 	     r->uvd_notif != REGULATOR_EVENT_UNDER_VOLTAGE) ||
262 	     (severity == REGULATOR_SEVERITY_WARN &&
263 	     r->uvd_notif != REGULATOR_EVENT_UNDER_VOLTAGE_WARN)) {
264 		dev_warn(rdev_get_dev(rdev),
265 			 "Can't support both UVD WARN and ERR\n");
266 		if (severity == REGULATOR_SEVERITY_WARN)
267 			return true;
268 
269 		bd9576_fill_uvd_flags(r, 0);
270 	}
271 
272 	return false;
273 }
274 
275 static bool check_ovd_flag_mismatch(struct regulator_dev *rdev, int severity,
276 				    struct bd957x_regulator_data *r)
277 {
278 	if ((severity == REGULATOR_SEVERITY_ERR &&
279 	     r->ovd_notif != REGULATOR_EVENT_REGULATION_OUT) ||
280 	     (severity == REGULATOR_SEVERITY_WARN &&
281 	     r->ovd_notif != REGULATOR_EVENT_OVER_VOLTAGE_WARN)) {
282 		dev_warn(rdev_get_dev(rdev),
283 			 "Can't support both OVD WARN and ERR\n");
284 		if (severity == REGULATOR_SEVERITY_WARN)
285 			return true;
286 
287 		bd9576_fill_ovd_flags(r, 0);
288 	}
289 
290 	return false;
291 }
292 
293 static bool check_temp_flag_mismatch(struct regulator_dev *rdev, int severity,
294 				    struct bd957x_regulator_data *r)
295 {
296 	if ((severity == REGULATOR_SEVERITY_ERR &&
297 	     r->temp_notif != REGULATOR_EVENT_OVER_TEMP) ||
298 	     (severity == REGULATOR_SEVERITY_WARN &&
299 	     r->temp_notif != REGULATOR_EVENT_OVER_TEMP_WARN)) {
300 		dev_warn(rdev_get_dev(rdev),
301 			 "Can't support both thermal WARN and ERR\n");
302 		if (severity == REGULATOR_SEVERITY_WARN)
303 			return true;
304 	}
305 
306 	return false;
307 }
308 
309 static int bd9576_set_ocp(struct regulator_dev *rdev, int lim_uA, int severity,
310 			  bool enable)
311 {
312 	struct bd957x_data *d;
313 	struct bd957x_regulator_data *r;
314 	int reg, mask;
315 	int Vfet, rfet;
316 	const struct linear_range *range;
317 	int num_ranges;
318 
319 	if ((lim_uA && !enable) || (!lim_uA && enable))
320 		return -EINVAL;
321 
322 	r = container_of(rdev->desc, struct bd957x_regulator_data, desc);
323 	if (!r->oc_supported)
324 		return -EINVAL;
325 
326 	d = rdev_get_drvdata(rdev);
327 
328 	if (severity == REGULATOR_SEVERITY_PROT) {
329 		reg = r->ocp_reg;
330 		mask = r->ocp_mask;
331 		if (r->ocw_rfet) {
332 			range = voutS1_ocp_ranges;
333 			num_ranges = ARRAY_SIZE(voutS1_ocp_ranges);
334 			rfet = r->ocw_rfet / 1000;
335 		} else {
336 			range = voutS1_ocp_ranges_internal;
337 			num_ranges = ARRAY_SIZE(voutS1_ocp_ranges_internal);
338 			/* Internal values are already micro-amperes */
339 			rfet = 1000;
340 		}
341 	} else {
342 		reg = r->ocw_reg;
343 		mask = r->ocw_mask;
344 
345 		if (r->ocw_rfet) {
346 			range = voutS1_ocw_ranges;
347 			num_ranges = ARRAY_SIZE(voutS1_ocw_ranges);
348 			rfet = r->ocw_rfet / 1000;
349 		} else {
350 			range = voutS1_ocw_ranges_internal;
351 			num_ranges = ARRAY_SIZE(voutS1_ocw_ranges_internal);
352 			/* Internal values are already micro-amperes */
353 			rfet = 1000;
354 		}
355 
356 		/* We abuse uvd fields for OCW on VoutS1 */
357 		if (r->uvd_notif) {
358 			/*
359 			 * If both warning and error are requested, prioritize
360 			 * ERROR configuration
361 			 */
362 			if (check_ocp_flag_mismatch(rdev, severity, r))
363 				return 0;
364 		} else {
365 			bool warn = severity == REGULATOR_SEVERITY_WARN;
366 
367 			bd9576_fill_ocp_flags(r, warn);
368 		}
369 	}
370 
371 	/*
372 	 * limits are given in uA, rfet is mOhm
373 	 * Divide lim_uA by 1000 to get Vfet in uV.
374 	 * (We expect both Rfet and limit uA to be magnitude of hundreds of
375 	 * milli Amperes & milli Ohms => we should still have decent accuracy)
376 	 */
377 	Vfet = lim_uA/1000 * rfet;
378 
379 	return bd9576_set_limit(range, num_ranges, d->regmap,
380 				reg, mask, Vfet);
381 }
382 
383 static int bd9576_set_uvp(struct regulator_dev *rdev, int lim_uV, int severity,
384 			  bool enable)
385 {
386 	struct bd957x_data *d;
387 	struct bd957x_regulator_data *r;
388 	int mask, reg;
389 
390 	if (severity == REGULATOR_SEVERITY_PROT) {
391 		if (!enable || lim_uV)
392 			return -EINVAL;
393 		return 0;
394 	}
395 
396 	/*
397 	 * BD9576 has enable control as a special value in limit reg. Can't
398 	 * set limit but keep feature disabled or enable W/O given limit.
399 	 */
400 	if ((lim_uV && !enable) || (!lim_uV && enable))
401 		return -EINVAL;
402 
403 	r = container_of(rdev->desc, struct bd957x_regulator_data, desc);
404 	d = rdev_get_drvdata(rdev);
405 
406 	mask = r->xvd_mask;
407 	reg = r->uvd_reg;
408 	/*
409 	 * Check that there is no mismatch for what the detection IRQs are to
410 	 * be used.
411 	 */
412 	if (r->uvd_notif) {
413 		if (check_uvd_flag_mismatch(rdev, severity, r))
414 			return 0;
415 	} else {
416 		bd9576_fill_uvd_flags(r, severity == REGULATOR_SEVERITY_WARN);
417 	}
418 
419 	return bd9576_set_limit(r->xvd_ranges, r->num_xvd_ranges, d->regmap,
420 				reg, mask, lim_uV);
421 }
422 
423 static int bd9576_set_ovp(struct regulator_dev *rdev, int lim_uV, int severity,
424 			  bool enable)
425 {
426 	struct bd957x_data *d;
427 	struct bd957x_regulator_data *r;
428 	int mask, reg;
429 
430 	if (severity == REGULATOR_SEVERITY_PROT) {
431 		if (!enable || lim_uV)
432 			return -EINVAL;
433 		return 0;
434 	}
435 
436 	/*
437 	 * BD9576 has enable control as a special value in limit reg. Can't
438 	 * set limit but keep feature disabled or enable W/O given limit.
439 	 */
440 	if ((lim_uV && !enable) || (!lim_uV && enable))
441 		return -EINVAL;
442 
443 	r = container_of(rdev->desc, struct bd957x_regulator_data, desc);
444 	d = rdev_get_drvdata(rdev);
445 
446 	mask = r->xvd_mask;
447 	reg = r->ovd_reg;
448 	/*
449 	 * Check that there is no mismatch for what the detection IRQs are to
450 	 * be used.
451 	 */
452 	if (r->ovd_notif) {
453 		if (check_ovd_flag_mismatch(rdev, severity, r))
454 			return 0;
455 	} else {
456 		bd9576_fill_ovd_flags(r, severity == REGULATOR_SEVERITY_WARN);
457 	}
458 
459 	return bd9576_set_limit(r->xvd_ranges, r->num_xvd_ranges, d->regmap,
460 				reg, mask, lim_uV);
461 }
462 
463 
464 static int bd9576_set_tw(struct regulator_dev *rdev, int lim, int severity,
465 			  bool enable)
466 {
467 	struct bd957x_data *d;
468 	struct bd957x_regulator_data *r;
469 	int i;
470 
471 	/*
472 	 * BD9576MUF has fixed temperature limits
473 	 * The detection can only be enabled/disabled
474 	 */
475 	if (lim)
476 		return -EINVAL;
477 
478 	/* Protection can't be disabled */
479 	if (severity == REGULATOR_SEVERITY_PROT) {
480 		if (!enable)
481 			return -EINVAL;
482 		else
483 			return 0;
484 	}
485 
486 	r = container_of(rdev->desc, struct bd957x_regulator_data, desc);
487 	d = rdev_get_drvdata(rdev);
488 
489 	/*
490 	 * Check that there is no mismatch for what the detection IRQs are to
491 	 * be used.
492 	 */
493 	if (r->temp_notif)
494 		if (check_temp_flag_mismatch(rdev, severity, r))
495 			return 0;
496 
497 	bd9576_fill_temp_flags(r, enable, severity == REGULATOR_SEVERITY_WARN);
498 
499 	if (enable)
500 		return regmap_update_bits(d->regmap, BD957X_REG_INT_THERM_MASK,
501 					 BD9576_THERM_IRQ_MASK_TW, 0);
502 
503 	/*
504 	 * If any of the regulators is interested in thermal warning we keep IRQ
505 	 * enabled.
506 	 */
507 	for (i = 0; i < BD9576_NUM_REGULATORS; i++)
508 		if (d->regulator_data[i].temp_notif)
509 			return 0;
510 
511 	return regmap_update_bits(d->regmap, BD957X_REG_INT_THERM_MASK,
512 				  BD9576_THERM_IRQ_MASK_TW,
513 				  BD9576_THERM_IRQ_MASK_TW);
514 }
515 
516 static const struct regulator_ops bd9573_vout34_ops = {
517 	.is_enabled = regulator_is_enabled_regmap,
518 	.list_voltage = bd957x_vout34_list_voltage,
519 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
520 };
521 
522 static const struct regulator_ops bd9576_vout34_ops = {
523 	.is_enabled = regulator_is_enabled_regmap,
524 	.list_voltage = bd957x_vout34_list_voltage,
525 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
526 	.set_over_voltage_protection = bd9576_set_ovp,
527 	.set_under_voltage_protection = bd9576_set_uvp,
528 	.set_thermal_protection = bd9576_set_tw,
529 };
530 
531 static const struct regulator_ops bd9573_vouts1_regulator_ops = {
532 	.is_enabled = regulator_is_enabled_regmap,
533 };
534 
535 static const struct regulator_ops bd9576_vouts1_regulator_ops = {
536 	.is_enabled = regulator_is_enabled_regmap,
537 	.set_over_current_protection = bd9576_set_ocp,
538 };
539 
540 static const struct regulator_ops bd9573_ops = {
541 	.is_enabled = regulator_is_enabled_regmap,
542 	.list_voltage = bd957x_list_voltage,
543 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
544 };
545 
546 static const struct regulator_ops bd9576_ops = {
547 	.is_enabled = regulator_is_enabled_regmap,
548 	.list_voltage = bd957x_list_voltage,
549 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
550 	.set_over_voltage_protection = bd9576_set_ovp,
551 	.set_under_voltage_protection = bd9576_set_uvp,
552 	.set_thermal_protection = bd9576_set_tw,
553 };
554 
555 static const struct regulator_ops  *bd9573_ops_arr[] = {
556 	[BD957X_VD50]	= &bd9573_ops,
557 	[BD957X_VD18]	= &bd9573_ops,
558 	[BD957X_VDDDR]	= &bd9573_vout34_ops,
559 	[BD957X_VD10]	= &bd9573_vout34_ops,
560 	[BD957X_VOUTL1]	= &bd9573_ops,
561 	[BD957X_VOUTS1]	= &bd9573_vouts1_regulator_ops,
562 };
563 
564 static const struct regulator_ops  *bd9576_ops_arr[] = {
565 	[BD957X_VD50]	= &bd9576_ops,
566 	[BD957X_VD18]	= &bd9576_ops,
567 	[BD957X_VDDDR]	= &bd9576_vout34_ops,
568 	[BD957X_VD10]	= &bd9576_vout34_ops,
569 	[BD957X_VOUTL1]	= &bd9576_ops,
570 	[BD957X_VOUTS1]	= &bd9576_vouts1_regulator_ops,
571 };
572 
573 static int vouts1_get_fet_res(struct device_node *np,
574 				const struct regulator_desc *desc,
575 				struct regulator_config *cfg)
576 {
577 	struct bd957x_regulator_data *data;
578 	int ret;
579 	u32 uohms;
580 
581 	data = container_of(desc, struct bd957x_regulator_data, desc);
582 
583 	ret = of_property_read_u32(np, "rohm,ocw-fet-ron-micro-ohms", &uohms);
584 	if (ret) {
585 		if (ret != -EINVAL)
586 			return ret;
587 
588 		return 0;
589 	}
590 	data->ocw_rfet = uohms;
591 	return 0;
592 }
593 
594 static struct bd957x_data bd957x_regulators = {
595 	.regulator_data = {
596 		{
597 			.desc = {
598 				.name = "VD50",
599 				.of_match = of_match_ptr("regulator-vd50"),
600 				.regulators_node = of_match_ptr("regulators"),
601 				.id = BD957X_VD50,
602 				.type = REGULATOR_VOLTAGE,
603 				.volt_table = &vout1_volt_table[0],
604 				.n_voltages = ARRAY_SIZE(vout1_volt_table),
605 				.vsel_reg = BD957X_REG_VOUT1_TUNE,
606 				.vsel_mask = BD957X_MASK_VOUT1_TUNE,
607 				.enable_reg = BD957X_REG_POW_TRIGGER1,
608 				.enable_mask = BD957X_REGULATOR_EN_MASK,
609 				.enable_val = BD957X_REGULATOR_DIS_VAL,
610 				.enable_is_inverted = true,
611 				.owner = THIS_MODULE,
612 			},
613 			.xvd_ranges = vout1_xvd_ranges,
614 			.num_xvd_ranges = ARRAY_SIZE(vout1_xvd_ranges),
615 			.ovd_reg = BD9576_REG_VOUT1_OVD,
616 			.uvd_reg = BD9576_REG_VOUT1_UVD,
617 			.xvd_mask = BD9576_MASK_XVD,
618 		},
619 		{
620 			.desc = {
621 				.name = "VD18",
622 				.of_match = of_match_ptr("regulator-vd18"),
623 				.regulators_node = of_match_ptr("regulators"),
624 				.id = BD957X_VD18,
625 				.type = REGULATOR_VOLTAGE,
626 				.volt_table = &vout2_volt_table[0],
627 				.n_voltages = ARRAY_SIZE(vout2_volt_table),
628 				.vsel_reg = BD957X_REG_VOUT2_TUNE,
629 				.vsel_mask = BD957X_MASK_VOUT2_TUNE,
630 				.enable_reg = BD957X_REG_POW_TRIGGER2,
631 				.enable_mask = BD957X_REGULATOR_EN_MASK,
632 				.enable_val = BD957X_REGULATOR_DIS_VAL,
633 				.enable_is_inverted = true,
634 				.owner = THIS_MODULE,
635 			},
636 			.xvd_ranges = vout234_xvd_ranges,
637 			.num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges),
638 			.ovd_reg = BD9576_REG_VOUT2_OVD,
639 			.uvd_reg = BD9576_REG_VOUT2_UVD,
640 			.xvd_mask = BD9576_MASK_XVD,
641 		},
642 		{
643 			.desc = {
644 				.name = "VDDDR",
645 				.of_match = of_match_ptr("regulator-vdddr"),
646 				.regulators_node = of_match_ptr("regulators"),
647 				.id = BD957X_VDDDR,
648 				.type = REGULATOR_VOLTAGE,
649 				.n_voltages = BD957X_VOUTS34_NUM_VOLT,
650 				.vsel_reg = BD957X_REG_VOUT3_TUNE,
651 				.vsel_mask = BD957X_MASK_VOUT3_TUNE,
652 				.enable_reg = BD957X_REG_POW_TRIGGER3,
653 				.enable_mask = BD957X_REGULATOR_EN_MASK,
654 				.enable_val = BD957X_REGULATOR_DIS_VAL,
655 				.enable_is_inverted = true,
656 				.owner = THIS_MODULE,
657 			},
658 			.ovd_reg = BD9576_REG_VOUT3_OVD,
659 			.uvd_reg = BD9576_REG_VOUT3_UVD,
660 			.xvd_mask = BD9576_MASK_XVD,
661 			.xvd_ranges = vout234_xvd_ranges,
662 			.num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges),
663 		},
664 		{
665 			.desc = {
666 				.name = "VD10",
667 				.of_match = of_match_ptr("regulator-vd10"),
668 				.regulators_node = of_match_ptr("regulators"),
669 				.id = BD957X_VD10,
670 				.type = REGULATOR_VOLTAGE,
671 				.fixed_uV = BD957X_VOUTS4_BASE_VOLT,
672 				.n_voltages = BD957X_VOUTS34_NUM_VOLT,
673 				.vsel_reg = BD957X_REG_VOUT4_TUNE,
674 				.vsel_mask = BD957X_MASK_VOUT4_TUNE,
675 				.enable_reg = BD957X_REG_POW_TRIGGER4,
676 				.enable_mask = BD957X_REGULATOR_EN_MASK,
677 				.enable_val = BD957X_REGULATOR_DIS_VAL,
678 				.enable_is_inverted = true,
679 				.owner = THIS_MODULE,
680 			},
681 			.xvd_ranges = vout234_xvd_ranges,
682 			.num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges),
683 			.ovd_reg = BD9576_REG_VOUT4_OVD,
684 			.uvd_reg = BD9576_REG_VOUT4_UVD,
685 			.xvd_mask = BD9576_MASK_XVD,
686 		},
687 		{
688 			.desc = {
689 				.name = "VOUTL1",
690 				.of_match = of_match_ptr("regulator-voutl1"),
691 				.regulators_node = of_match_ptr("regulators"),
692 				.id = BD957X_VOUTL1,
693 				.type = REGULATOR_VOLTAGE,
694 				.volt_table = &voutl1_volt_table[0],
695 				.n_voltages = ARRAY_SIZE(voutl1_volt_table),
696 				.vsel_reg = BD957X_REG_VOUTL1_TUNE,
697 				.vsel_mask = BD957X_MASK_VOUTL1_TUNE,
698 				.enable_reg = BD957X_REG_POW_TRIGGERL1,
699 				.enable_mask = BD957X_REGULATOR_EN_MASK,
700 				.enable_val = BD957X_REGULATOR_DIS_VAL,
701 				.enable_is_inverted = true,
702 				.owner = THIS_MODULE,
703 			},
704 			.xvd_ranges = voutL1_xvd_ranges,
705 			.num_xvd_ranges = ARRAY_SIZE(voutL1_xvd_ranges),
706 			.ovd_reg = BD9576_REG_VOUTL1_OVD,
707 			.uvd_reg = BD9576_REG_VOUTL1_UVD,
708 			.xvd_mask = BD9576_MASK_XVD,
709 		},
710 		{
711 			.desc = {
712 				.name = "VOUTS1",
713 				.of_match = of_match_ptr("regulator-vouts1"),
714 				.regulators_node = of_match_ptr("regulators"),
715 				.id = BD957X_VOUTS1,
716 				.type = REGULATOR_VOLTAGE,
717 				.n_voltages = 1,
718 				.fixed_uV = BD957X_VOUTS1_VOLT,
719 				.enable_reg = BD957X_REG_POW_TRIGGERS1,
720 				.enable_mask = BD957X_REGULATOR_EN_MASK,
721 				.enable_val = BD957X_REGULATOR_DIS_VAL,
722 				.enable_is_inverted = true,
723 				.owner = THIS_MODULE,
724 				.of_parse_cb = vouts1_get_fet_res,
725 			},
726 			.oc_supported = true,
727 			.ocw_reg = BD9576_REG_VOUT1S_OCW,
728 			.ocw_mask = BD9576_MASK_VOUT1S_OCW,
729 			.ocp_reg = BD9576_REG_VOUT1S_OCP,
730 			.ocp_mask = BD9576_MASK_VOUT1S_OCP,
731 		},
732 	},
733 };
734 
735 static int bd9576_renable(struct regulator_irq_data *rid, int reg, int mask)
736 {
737 	int val, ret;
738 	struct bd957x_data *d = (struct bd957x_data *)rid->data;
739 
740 	ret = regmap_read(d->regmap, reg, &val);
741 	if (ret)
742 		return REGULATOR_FAILED_RETRY;
743 
744 	if (rid->opaque && rid->opaque == (val & mask)) {
745 		/*
746 		 * It seems we stil have same status. Ack and return
747 		 * information that we are still out of limits and core
748 		 * should not enable IRQ
749 		 */
750 		regmap_write(d->regmap, reg, mask & val);
751 		return REGULATOR_ERROR_ON;
752 	}
753 	rid->opaque = 0;
754 	/*
755 	 * Status was changed. Either prolem was solved or we have new issues.
756 	 * Let's re-enable IRQs and be prepared to report problems again
757 	 */
758 	return REGULATOR_ERROR_CLEARED;
759 }
760 
761 static int bd9576_uvd_renable(struct regulator_irq_data *rid)
762 {
763 	return bd9576_renable(rid, BD957X_REG_INT_UVD_STAT, UVD_IRQ_VALID_MASK);
764 }
765 
766 static int bd9576_ovd_renable(struct regulator_irq_data *rid)
767 {
768 	return bd9576_renable(rid, BD957X_REG_INT_OVD_STAT, OVD_IRQ_VALID_MASK);
769 }
770 
771 static int bd9576_temp_renable(struct regulator_irq_data *rid)
772 {
773 	return bd9576_renable(rid, BD957X_REG_INT_THERM_STAT,
774 			      BD9576_THERM_IRQ_MASK_TW);
775 }
776 
777 static int bd9576_uvd_handler(int irq, struct regulator_irq_data *rid,
778 			      unsigned long *dev_mask)
779 {
780 	int val, ret, i;
781 	struct bd957x_data *d = (struct bd957x_data *)rid->data;
782 
783 	ret = regmap_read(d->regmap, BD957X_REG_INT_UVD_STAT, &val);
784 	if (ret)
785 		return REGULATOR_FAILED_RETRY;
786 
787 	*dev_mask = 0;
788 
789 	rid->opaque = val & UVD_IRQ_VALID_MASK;
790 
791 	/*
792 	 * Go through the set status bits and report either error or warning
793 	 * to the notifier depending on what was flagged in DT
794 	 */
795 	*dev_mask = val & BD9576_xVD_IRQ_MASK_VOUT1TO4;
796 	/* There is 1 bit gap in register after Vout1 .. Vout4 statuses */
797 	*dev_mask |= ((val & BD9576_xVD_IRQ_MASK_VOUTL1) >> 1);
798 	/*
799 	 * We (ab)use the uvd for OCW notification. DT parsing should
800 	 * have added correct OCW flag to uvd_notif and uvd_err for S1
801 	 */
802 	*dev_mask |= ((val & BD9576_UVD_IRQ_MASK_VOUTS1_OCW) >> 1);
803 
804 	for_each_set_bit(i, dev_mask, 6) {
805 		struct bd957x_regulator_data *rdata;
806 		struct regulator_err_state *stat;
807 
808 		rdata = &d->regulator_data[i];
809 		stat  = &rid->states[i];
810 
811 		stat->notifs	= rdata->uvd_notif;
812 		stat->errors	= rdata->uvd_err;
813 	}
814 
815 	ret = regmap_write(d->regmap, BD957X_REG_INT_UVD_STAT,
816 			   UVD_IRQ_VALID_MASK & val);
817 
818 	return 0;
819 }
820 
821 static int bd9576_ovd_handler(int irq, struct regulator_irq_data *rid,
822 			      unsigned long *dev_mask)
823 {
824 	int val, ret, i;
825 	struct bd957x_data *d = (struct bd957x_data *)rid->data;
826 
827 	ret = regmap_read(d->regmap, BD957X_REG_INT_OVD_STAT, &val);
828 	if (ret)
829 		return REGULATOR_FAILED_RETRY;
830 
831 	rid->opaque = val & OVD_IRQ_VALID_MASK;
832 	*dev_mask = 0;
833 
834 	if (!(val & OVD_IRQ_VALID_MASK))
835 		return 0;
836 
837 	*dev_mask = val & BD9576_xVD_IRQ_MASK_VOUT1TO4;
838 	/* There is 1 bit gap in register after Vout1 .. Vout4 statuses */
839 	*dev_mask |= ((val & BD9576_xVD_IRQ_MASK_VOUTL1) >> 1);
840 
841 	for_each_set_bit(i, dev_mask, 5) {
842 		struct bd957x_regulator_data *rdata;
843 		struct regulator_err_state *stat;
844 
845 		rdata = &d->regulator_data[i];
846 		stat  = &rid->states[i];
847 
848 		stat->notifs	= rdata->ovd_notif;
849 		stat->errors	= rdata->ovd_err;
850 	}
851 
852 	/* Clear the sub-IRQ status */
853 	regmap_write(d->regmap, BD957X_REG_INT_OVD_STAT,
854 		     OVD_IRQ_VALID_MASK & val);
855 
856 	return 0;
857 }
858 
859 #define BD9576_DEV_MASK_ALL_REGULATORS 0x3F
860 
861 static int bd9576_thermal_handler(int irq, struct regulator_irq_data *rid,
862 				  unsigned long *dev_mask)
863 {
864 	int val, ret, i;
865 	struct bd957x_data *d = (struct bd957x_data *)rid->data;
866 
867 	ret = regmap_read(d->regmap, BD957X_REG_INT_THERM_STAT, &val);
868 	if (ret)
869 		return REGULATOR_FAILED_RETRY;
870 
871 	if (!(val & BD9576_THERM_IRQ_MASK_TW)) {
872 		*dev_mask = 0;
873 		return 0;
874 	}
875 
876 	*dev_mask = BD9576_DEV_MASK_ALL_REGULATORS;
877 
878 	for (i = 0; i < BD9576_NUM_REGULATORS; i++) {
879 		struct bd957x_regulator_data *rdata;
880 		struct regulator_err_state *stat;
881 
882 		rdata = &d->regulator_data[i];
883 		stat  = &rid->states[i];
884 
885 		stat->notifs	= rdata->temp_notif;
886 		stat->errors	= rdata->temp_err;
887 	}
888 
889 	/* Clear the sub-IRQ status */
890 	regmap_write(d->regmap, BD957X_REG_INT_THERM_STAT,
891 		     BD9576_THERM_IRQ_MASK_TW);
892 
893 	return 0;
894 }
895 
896 static int bd957x_probe(struct platform_device *pdev)
897 {
898 	int i;
899 	unsigned int num_reg_data;
900 	bool vout_mode, ddr_sel, may_have_irqs = false;
901 	struct regmap *regmap;
902 	struct bd957x_data *ic_data;
903 	struct regulator_config config = { 0 };
904 	/* All regulators are related to UVD and thermal IRQs... */
905 	struct regulator_dev *rdevs[BD9576_NUM_REGULATORS];
906 	/* ...But VoutS1 is not flagged by OVD IRQ */
907 	struct regulator_dev *ovd_devs[BD9576_NUM_OVD_REGULATORS];
908 	static const struct regulator_irq_desc bd9576_notif_uvd = {
909 		.name = "bd9576-uvd",
910 		.irq_off_ms = 1000,
911 		.map_event = bd9576_uvd_handler,
912 		.renable = bd9576_uvd_renable,
913 		.data = &bd957x_regulators,
914 	};
915 	static const struct regulator_irq_desc bd9576_notif_ovd = {
916 		.name = "bd9576-ovd",
917 		.irq_off_ms = 1000,
918 		.map_event = bd9576_ovd_handler,
919 		.renable = bd9576_ovd_renable,
920 		.data = &bd957x_regulators,
921 	};
922 	static const struct regulator_irq_desc bd9576_notif_temp = {
923 		.name = "bd9576-temp",
924 		.irq_off_ms = 1000,
925 		.map_event = bd9576_thermal_handler,
926 		.renable = bd9576_temp_renable,
927 		.data = &bd957x_regulators,
928 	};
929 	enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data;
930 
931 	num_reg_data = ARRAY_SIZE(bd957x_regulators.regulator_data);
932 
933 	ic_data = &bd957x_regulators;
934 
935 	regmap = dev_get_regmap(pdev->dev.parent, NULL);
936 	if (!regmap) {
937 		dev_err(&pdev->dev, "No regmap\n");
938 		return -EINVAL;
939 	}
940 
941 	ic_data->regmap = regmap;
942 	vout_mode = of_property_read_bool(pdev->dev.parent->of_node,
943 					 "rohm,vout1-en-low");
944 	if (vout_mode) {
945 		struct gpio_desc *en;
946 
947 		dev_dbg(&pdev->dev, "GPIO controlled mode\n");
948 
949 		/* VOUT1 enable state judged by VOUT1_EN pin */
950 		/* See if we have GPIO defined */
951 		en = devm_gpiod_get_from_of_node(&pdev->dev,
952 						 pdev->dev.parent->of_node,
953 						 "rohm,vout1-en-gpios", 0,
954 						 GPIOD_OUT_LOW, "vout1-en");
955 		if (!IS_ERR(en)) {
956 			/* VOUT1_OPS gpio ctrl */
957 			/*
958 			 * Regulator core prioritizes the ena_gpio over
959 			 * enable/disable/is_enabled callbacks so no need to
960 			 * clear them. We can still use same ops
961 			 */
962 			config.ena_gpiod = en;
963 		} else {
964 			/*
965 			 * In theory it is possible someone wants to set
966 			 * vout1-en LOW during OTP loading and set VOUT1 to be
967 			 * controlled by GPIO - but control the GPIO from some
968 			 * where else than this driver. For that to work we
969 			 * should unset the is_enabled callback here.
970 			 *
971 			 * I believe such case where rohm,vout1-en-low is set
972 			 * and vout1-en-gpios is not is likely to be a
973 			 * misconfiguration. So let's just err out for now.
974 			 */
975 			dev_err(&pdev->dev,
976 				"Failed to get VOUT1 control GPIO\n");
977 			return PTR_ERR(en);
978 		}
979 	}
980 
981 	/*
982 	 * If more than one PMIC needs to be controlled by same processor then
983 	 * allocate the regulator data array here and use bd9576_regulators as
984 	 * template. At the moment I see no such use-case so I spare some
985 	 * bytes and use bd9576_regulators directly for non-constant configs
986 	 * like DDR voltage selection.
987 	 */
988 	platform_set_drvdata(pdev, ic_data);
989 	ddr_sel =  of_property_read_bool(pdev->dev.parent->of_node,
990 					 "rohm,ddr-sel-low");
991 	if (ddr_sel)
992 		ic_data->regulator_data[2].desc.fixed_uV = 1350000;
993 	else
994 		ic_data->regulator_data[2].desc.fixed_uV = 1500000;
995 
996 	switch (chip) {
997 	case ROHM_CHIP_TYPE_BD9576:
998 		may_have_irqs = true;
999 		dev_dbg(&pdev->dev, "Found BD9576MUF\n");
1000 		break;
1001 	case ROHM_CHIP_TYPE_BD9573:
1002 		dev_dbg(&pdev->dev, "Found BD9573MUF\n");
1003 		break;
1004 	default:
1005 		dev_err(&pdev->dev, "Unsupported chip type\n");
1006 		return -EINVAL;
1007 	}
1008 
1009 	for (i = 0; i < num_reg_data; i++) {
1010 		struct regulator_desc *d;
1011 
1012 		d = &ic_data->regulator_data[i].desc;
1013 
1014 
1015 		if (may_have_irqs) {
1016 			if (d->id >= ARRAY_SIZE(bd9576_ops_arr))
1017 				return -EINVAL;
1018 
1019 			d->ops = bd9576_ops_arr[d->id];
1020 		} else {
1021 			if (d->id >= ARRAY_SIZE(bd9573_ops_arr))
1022 				return -EINVAL;
1023 
1024 			d->ops = bd9573_ops_arr[d->id];
1025 		}
1026 	}
1027 
1028 	config.dev = pdev->dev.parent;
1029 	config.regmap = regmap;
1030 	config.driver_data = ic_data;
1031 
1032 	for (i = 0; i < num_reg_data; i++) {
1033 
1034 		struct bd957x_regulator_data *r = &ic_data->regulator_data[i];
1035 		const struct regulator_desc *desc = &r->desc;
1036 
1037 		r->rdev = devm_regulator_register(&pdev->dev, desc,
1038 							   &config);
1039 		if (IS_ERR(r->rdev)) {
1040 			dev_err(&pdev->dev,
1041 				"failed to register %s regulator\n",
1042 				desc->name);
1043 			return PTR_ERR(r->rdev);
1044 		}
1045 		/*
1046 		 * Clear the VOUT1 GPIO setting - rest of the regulators do not
1047 		 * support GPIO control
1048 		 */
1049 		config.ena_gpiod = NULL;
1050 
1051 		if (!may_have_irqs)
1052 			continue;
1053 
1054 		rdevs[i] = r->rdev;
1055 		if (i < BD957X_VOUTS1)
1056 			ovd_devs[i] = r->rdev;
1057 	}
1058 	if (may_have_irqs) {
1059 		void *ret;
1060 		/*
1061 		 * We can add both the possible error and warning flags here
1062 		 * because the core uses these only for status clearing and
1063 		 * if we use warnings - errors are always clear and the other
1064 		 * way around. We can also add CURRENT flag for all regulators
1065 		 * because it is never set if it is not supported. Same applies
1066 		 * to setting UVD for VoutS1 - it is not accidentally cleared
1067 		 * as it is never set.
1068 		 */
1069 		int uvd_errs = REGULATOR_ERROR_UNDER_VOLTAGE |
1070 			       REGULATOR_ERROR_UNDER_VOLTAGE_WARN |
1071 			       REGULATOR_ERROR_OVER_CURRENT |
1072 			       REGULATOR_ERROR_OVER_CURRENT_WARN;
1073 		int ovd_errs = REGULATOR_ERROR_OVER_VOLTAGE_WARN |
1074 			       REGULATOR_ERROR_REGULATION_OUT;
1075 		int temp_errs = REGULATOR_ERROR_OVER_TEMP |
1076 				REGULATOR_ERROR_OVER_TEMP_WARN;
1077 		int irq;
1078 
1079 		irq = platform_get_irq_byname(pdev, "bd9576-uvd");
1080 
1081 		/* Register notifiers - can fail if IRQ is not given */
1082 		ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_uvd,
1083 						irq, 0, uvd_errs, NULL,
1084 						&rdevs[0],
1085 						BD9576_NUM_REGULATORS);
1086 		if (IS_ERR(ret)) {
1087 			if (PTR_ERR(ret) == -EPROBE_DEFER)
1088 				return -EPROBE_DEFER;
1089 
1090 			dev_warn(&pdev->dev, "UVD disabled %pe\n", ret);
1091 		}
1092 
1093 		irq = platform_get_irq_byname(pdev, "bd9576-ovd");
1094 
1095 		ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_ovd,
1096 						irq, 0, ovd_errs, NULL,
1097 						&ovd_devs[0],
1098 						BD9576_NUM_OVD_REGULATORS);
1099 		if (IS_ERR(ret)) {
1100 			if (PTR_ERR(ret) == -EPROBE_DEFER)
1101 				return -EPROBE_DEFER;
1102 
1103 			dev_warn(&pdev->dev, "OVD disabled %pe\n", ret);
1104 		}
1105 		irq = platform_get_irq_byname(pdev, "bd9576-temp");
1106 
1107 		ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_temp,
1108 						irq, 0, temp_errs, NULL,
1109 						&rdevs[0],
1110 						BD9576_NUM_REGULATORS);
1111 		if (IS_ERR(ret)) {
1112 			if (PTR_ERR(ret) == -EPROBE_DEFER)
1113 				return -EPROBE_DEFER;
1114 
1115 			dev_warn(&pdev->dev, "Thermal warning disabled %pe\n",
1116 				 ret);
1117 		}
1118 	}
1119 	return 0;
1120 }
1121 
1122 static const struct platform_device_id bd957x_pmic_id[] = {
1123 	{ "bd9573-regulator", ROHM_CHIP_TYPE_BD9573 },
1124 	{ "bd9576-regulator", ROHM_CHIP_TYPE_BD9576 },
1125 	{ },
1126 };
1127 MODULE_DEVICE_TABLE(platform, bd957x_pmic_id);
1128 
1129 static struct platform_driver bd957x_regulator = {
1130 	.driver = {
1131 		.name = "bd957x-pmic",
1132 	},
1133 	.probe = bd957x_probe,
1134 	.id_table = bd957x_pmic_id,
1135 };
1136 
1137 module_platform_driver(bd957x_regulator);
1138 
1139 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1140 MODULE_DESCRIPTION("ROHM BD9576/BD9573 voltage regulator driver");
1141 MODULE_LICENSE("GPL");
1142 MODULE_ALIAS("platform:bd957x-pmic");
1143