xref: /freebsd/sys/arm/allwinner/axp81x.c (revision eaa797943eeac5614edfdc8f6309f332343c3dd2)
1 /*-
2  * Copyright (c) 2016 Jared McNeill <jmcneill@invisible.ca>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
21  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 /*
30  * X-Powers AXP813/818 PMU for Allwinner SoCs
31  */
32 
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35 
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/eventhandler.h>
39 #include <sys/bus.h>
40 #include <sys/rman.h>
41 #include <sys/kernel.h>
42 #include <sys/reboot.h>
43 #include <sys/gpio.h>
44 #include <sys/module.h>
45 #include <machine/bus.h>
46 
47 #include <dev/iicbus/iicbus.h>
48 #include <dev/iicbus/iiconf.h>
49 
50 #include <dev/gpio/gpiobusvar.h>
51 
52 #include <dev/ofw/ofw_bus.h>
53 #include <dev/ofw/ofw_bus_subr.h>
54 
55 #include <dev/extres/regulator/regulator.h>
56 
57 #include "gpio_if.h"
58 #include "iicbus_if.h"
59 #include "regdev_if.h"
60 
61 MALLOC_DEFINE(M_AXP81X_REG, "AXP81x regulator", "AXP81x power regulator");
62 
63 #define	AXP_ICTYPE		0x03
64 #define	AXP_POWERCTL1		0x10
65 #define	 AXP_POWERCTL1_DCDC2	(1 << 1)
66 #define	AXP_POWERCTL2		0x12
67 #define	 AXP_POWERCTL2_DC1SW	(1 << 7)
68 #define	AXP_VOLTCTL_DCDC2	0x21
69 #define	 AXP_VOLTCTL_STATUS	(1 << 7)
70 #define	 AXP_VOLTCTL_MASK	0x7f
71 #define	AXP_POWERBAT		0x32
72 #define	 AXP_POWERBAT_SHUTDOWN	(1 << 7)
73 #define	AXP_IRQEN1		0x40
74 #define	AXP_IRQEN2		0x41
75 #define	AXP_IRQEN3		0x42
76 #define	AXP_IRQEN4		0x43
77 #define	AXP_IRQEN5		0x44
78 #define	 AXP_IRQEN5_POKSIRQ	(1 << 4)
79 #define	AXP_IRQEN6		0x45
80 #define	AXP_IRQSTAT5		0x4c
81 #define	 AXP_IRQSTAT5_POKSIRQ	(1 << 4)
82 #define	AXP_GPIO0_CTRL		0x90
83 #define	AXP_GPIO1_CTRL		0x92
84 #define	 AXP_GPIO_FUNC		(0x7 << 0)
85 #define	 AXP_GPIO_FUNC_SHIFT	0
86 #define	 AXP_GPIO_FUNC_DRVLO	0
87 #define	 AXP_GPIO_FUNC_DRVHI	1
88 #define	 AXP_GPIO_FUNC_INPUT	2
89 #define	AXP_GPIO_SIGBIT		0x94
90 #define	AXP_GPIO_PD		0x97
91 
92 static const struct {
93 	const char *name;
94 	uint8_t	ctrl_reg;
95 } axp81x_pins[] = {
96 	{ "GPIO0", AXP_GPIO0_CTRL },
97 	{ "GPIO1", AXP_GPIO1_CTRL },
98 };
99 
100 static struct ofw_compat_data compat_data[] = {
101 	{ "x-powers,axp813",			1 },
102 	{ "x-powers,axp818",			1 },
103 	{ NULL,					0 }
104 };
105 
106 static struct resource_spec axp81x_spec[] = {
107 	{ SYS_RES_IRQ,		0,	RF_ACTIVE },
108 	{ -1, 0 }
109 };
110 
111 struct axp81x_regdef {
112 	intptr_t		id;
113 	char			*name;
114 	char			*supply_name;
115 	uint8_t			enable_reg;
116 	uint8_t			enable_mask;
117 	uint8_t			voltage_reg;
118 	int			voltage_min;
119 	int			voltage_max;
120 	int			voltage_step1;
121 	int			voltage_nstep1;
122 	int			voltage_step2;
123 	int			voltage_nstep2;
124 };
125 
126 enum axp81x_reg_id {
127 	AXP81X_REG_ID_DC1SW,
128 	AXP81X_REG_ID_DCDC2,
129 };
130 
131 static struct axp81x_regdef axp81x_regdefs[] = {
132 	{
133 		.id = AXP81X_REG_ID_DC1SW,
134 		.name = "dc1sw",
135 		.enable_reg = AXP_POWERCTL2,
136 		.enable_mask = AXP_POWERCTL2_DC1SW,
137 	},
138 	{
139 		.id = AXP81X_REG_ID_DCDC2,
140 		.name = "dcdc2",
141 		.enable_reg = AXP_POWERCTL1,
142 		.enable_mask = AXP_POWERCTL1_DCDC2,
143 		.voltage_reg = AXP_VOLTCTL_DCDC2,
144 		.voltage_min = 500,
145 		.voltage_max = 1300,
146 		.voltage_step1 = 10,
147 		.voltage_nstep1 = 70,
148 		.voltage_step2 = 20,
149 		.voltage_nstep2 = 5,
150 	},
151 };
152 
153 struct axp81x_softc;
154 
155 struct axp81x_reg_sc {
156 	struct regnode		*regnode;
157 	device_t		base_dev;
158 	struct axp81x_regdef	*def;
159 	phandle_t		xref;
160 	struct regnode_std_param *param;
161 };
162 
163 struct axp81x_softc {
164 	struct resource		*res;
165 	uint16_t		addr;
166 	void			*ih;
167 	device_t		gpiodev;
168 	struct mtx		mtx;
169 	int			busy;
170 
171 	/* Regulators */
172 	struct axp81x_reg_sc	**regs;
173 	int			nregs;
174 };
175 
176 #define	AXP_LOCK(sc)	mtx_lock(&(sc)->mtx)
177 #define	AXP_UNLOCK(sc)	mtx_unlock(&(sc)->mtx)
178 
179 static int
180 axp81x_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size)
181 {
182 	struct axp81x_softc *sc;
183 	struct iic_msg msg[2];
184 
185 	sc = device_get_softc(dev);
186 
187 	msg[0].slave = sc->addr;
188 	msg[0].flags = IIC_M_WR;
189 	msg[0].len = 1;
190 	msg[0].buf = &reg;
191 
192 	msg[1].slave = sc->addr;
193 	msg[1].flags = IIC_M_RD;
194 	msg[1].len = size;
195 	msg[1].buf = data;
196 
197 	return (iicbus_transfer(dev, msg, 2));
198 }
199 
200 static int
201 axp81x_write(device_t dev, uint8_t reg, uint8_t val)
202 {
203 	struct axp81x_softc *sc;
204 	struct iic_msg msg[2];
205 
206 	sc = device_get_softc(dev);
207 
208 	msg[0].slave = sc->addr;
209 	msg[0].flags = IIC_M_WR;
210 	msg[0].len = 1;
211 	msg[0].buf = &reg;
212 
213 	msg[1].slave = sc->addr;
214 	msg[1].flags = IIC_M_WR;
215 	msg[1].len = 1;
216 	msg[1].buf = &val;
217 
218 	return (iicbus_transfer(dev, msg, 2));
219 }
220 
221 static int
222 axp81x_regnode_init(struct regnode *regnode)
223 {
224 	return (0);
225 }
226 
227 static int
228 axp81x_regnode_enable(struct regnode *regnode, bool enable, int *udelay)
229 {
230 	struct axp81x_reg_sc *sc;
231 	uint8_t val;
232 
233 	sc = regnode_get_softc(regnode);
234 
235 	axp81x_read(sc->base_dev, sc->def->enable_reg, &val, 1);
236 	if (enable)
237 		val |= sc->def->enable_mask;
238 	else
239 		val &= ~sc->def->enable_mask;
240 	axp81x_write(sc->base_dev, sc->def->enable_reg, val);
241 
242 	*udelay = 0;
243 
244 	return (0);
245 }
246 
247 static void
248 axp81x_regnode_reg_to_voltage(struct axp81x_reg_sc *sc, uint8_t val, int *uv)
249 {
250 	if (val < sc->def->voltage_nstep1)
251 		*uv = sc->def->voltage_min + val * sc->def->voltage_step1;
252 	else
253 		*uv = sc->def->voltage_min +
254 		    (sc->def->voltage_nstep1 * sc->def->voltage_step1) +
255 		    ((val - sc->def->voltage_nstep1) * sc->def->voltage_step2);
256 	*uv *= 1000;
257 }
258 
259 static int
260 axp81x_regnode_voltage_to_reg(struct axp81x_reg_sc *sc, int min_uvolt,
261     int max_uvolt, uint8_t *val)
262 {
263 	uint8_t nval;
264 	int nstep, uvolt;
265 
266 	nval = 0;
267 	uvolt = sc->def->voltage_min * 1000;
268 
269 	for (nstep = 0; nstep < sc->def->voltage_nstep1 && uvolt < min_uvolt;
270 	     nstep++) {
271 		++nval;
272 		uvolt += (sc->def->voltage_step1 * 1000);
273 	}
274 	for (nstep = 0; nstep < sc->def->voltage_nstep2 && uvolt < min_uvolt;
275 	     nstep++) {
276 		++nval;
277 		uvolt += (sc->def->voltage_step2 * 1000);
278 	}
279 	if (uvolt > max_uvolt)
280 		return (EINVAL);
281 
282 	*val = nval;
283 	return (0);
284 }
285 
286 static int
287 axp81x_regnode_set_voltage(struct regnode *regnode, int min_uvolt,
288     int max_uvolt, int *udelay)
289 {
290 	struct axp81x_reg_sc *sc;
291 	uint8_t val;
292 
293 	sc = regnode_get_softc(regnode);
294 
295 	if (!sc->def->voltage_step1 || !sc->def->voltage_step2)
296 		return (ENXIO);
297 
298 	if (axp81x_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0)
299 		return (ERANGE);
300 
301 	axp81x_write(sc->base_dev, sc->def->voltage_reg, val);
302 
303 	*udelay = 0;
304 
305 	return (0);
306 }
307 
308 static int
309 axp81x_regnode_get_voltage(struct regnode *regnode, int *uvolt)
310 {
311 	struct axp81x_reg_sc *sc;
312 	uint8_t val;
313 
314 	sc = regnode_get_softc(regnode);
315 
316 	if (!sc->def->voltage_step1 || !sc->def->voltage_step2)
317 		return (ENXIO);
318 
319 	axp81x_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
320 	axp81x_regnode_reg_to_voltage(sc, val & AXP_VOLTCTL_MASK, uvolt);
321 
322 	return (0);
323 }
324 
325 static regnode_method_t axp81x_regnode_methods[] = {
326 	/* Regulator interface */
327 	REGNODEMETHOD(regnode_init,		axp81x_regnode_init),
328 	REGNODEMETHOD(regnode_enable,		axp81x_regnode_enable),
329 	REGNODEMETHOD(regnode_set_voltage,	axp81x_regnode_set_voltage),
330 	REGNODEMETHOD(regnode_get_voltage,	axp81x_regnode_get_voltage),
331 	REGNODEMETHOD_END
332 };
333 DEFINE_CLASS_1(axp81x_regnode, axp81x_regnode_class, axp81x_regnode_methods,
334     sizeof(struct axp81x_reg_sc), regnode_class);
335 
336 static void
337 axp81x_shutdown(void *devp, int howto)
338 {
339 	device_t dev;
340 
341 	if ((howto & RB_POWEROFF) == 0)
342 		return;
343 
344 	dev = devp;
345 
346 	if (bootverbose)
347 		device_printf(dev, "Shutdown AXP81x\n");
348 
349 	axp81x_write(dev, AXP_POWERBAT, AXP_POWERBAT_SHUTDOWN);
350 }
351 
352 static void
353 axp81x_intr(void *arg)
354 {
355 	struct axp81x_softc *sc;
356 	device_t dev;
357 	uint8_t val;
358 	int error;
359 
360 	dev = arg;
361 	sc = device_get_softc(dev);
362 
363 	error = axp81x_read(dev, AXP_IRQSTAT5, &val, 1);
364 	if (error != 0)
365 		return;
366 
367 	if (val != 0) {
368 		if ((val & AXP_IRQSTAT5_POKSIRQ) != 0) {
369 			if (bootverbose)
370 				device_printf(dev, "Power button pressed\n");
371 			shutdown_nice(RB_POWEROFF);
372 		}
373 		/* Acknowledge */
374 		axp81x_write(dev, AXP_IRQSTAT5, val);
375 	}
376 }
377 
378 static device_t
379 axp81x_gpio_get_bus(device_t dev)
380 {
381 	struct axp81x_softc *sc;
382 
383 	sc = device_get_softc(dev);
384 
385 	return (sc->gpiodev);
386 }
387 
388 static int
389 axp81x_gpio_pin_max(device_t dev, int *maxpin)
390 {
391 	*maxpin = nitems(axp81x_pins) - 1;
392 
393 	return (0);
394 }
395 
396 static int
397 axp81x_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
398 {
399 	if (pin >= nitems(axp81x_pins))
400 		return (EINVAL);
401 
402 	snprintf(name, GPIOMAXNAME, "%s", axp81x_pins[pin].name);
403 
404 	return (0);
405 }
406 
407 static int
408 axp81x_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
409 {
410 	if (pin >= nitems(axp81x_pins))
411 		return (EINVAL);
412 
413 	*caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
414 
415 	return (0);
416 }
417 
418 static int
419 axp81x_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
420 {
421 	struct axp81x_softc *sc;
422 	uint8_t data, func;
423 	int error;
424 
425 	if (pin >= nitems(axp81x_pins))
426 		return (EINVAL);
427 
428 	sc = device_get_softc(dev);
429 
430 	AXP_LOCK(sc);
431 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
432 	if (error == 0) {
433 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
434 		if (func == AXP_GPIO_FUNC_INPUT)
435 			*flags = GPIO_PIN_INPUT;
436 		else if (func == AXP_GPIO_FUNC_DRVLO ||
437 		    func == AXP_GPIO_FUNC_DRVHI)
438 			*flags = GPIO_PIN_OUTPUT;
439 		else
440 			*flags = 0;
441 	}
442 	AXP_UNLOCK(sc);
443 
444 	return (error);
445 }
446 
447 static int
448 axp81x_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
449 {
450 	struct axp81x_softc *sc;
451 	uint8_t data;
452 	int error;
453 
454 	if (pin >= nitems(axp81x_pins))
455 		return (EINVAL);
456 
457 	sc = device_get_softc(dev);
458 
459 	AXP_LOCK(sc);
460 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
461 	if (error == 0) {
462 		data &= ~AXP_GPIO_FUNC;
463 		if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) != 0) {
464 			if ((flags & GPIO_PIN_OUTPUT) == 0)
465 				data |= AXP_GPIO_FUNC_INPUT;
466 		}
467 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
468 	}
469 	AXP_UNLOCK(sc);
470 
471 	return (error);
472 }
473 
474 static int
475 axp81x_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
476 {
477 	struct axp81x_softc *sc;
478 	uint8_t data, func;
479 	int error;
480 
481 	if (pin >= nitems(axp81x_pins))
482 		return (EINVAL);
483 
484 	sc = device_get_softc(dev);
485 
486 	AXP_LOCK(sc);
487 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
488 	if (error == 0) {
489 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
490 		switch (func) {
491 		case AXP_GPIO_FUNC_DRVLO:
492 			*val = 0;
493 			break;
494 		case AXP_GPIO_FUNC_DRVHI:
495 			*val = 1;
496 			break;
497 		case AXP_GPIO_FUNC_INPUT:
498 			error = axp81x_read(dev, AXP_GPIO_SIGBIT, &data, 1);
499 			if (error == 0)
500 				*val = (data & (1 << pin)) ? 1 : 0;
501 			break;
502 		default:
503 			error = EIO;
504 			break;
505 		}
506 	}
507 	AXP_UNLOCK(sc);
508 
509 	return (error);
510 }
511 
512 static int
513 axp81x_gpio_pin_set(device_t dev, uint32_t pin, unsigned int val)
514 {
515 	struct axp81x_softc *sc;
516 	uint8_t data, func;
517 	int error;
518 
519 	if (pin >= nitems(axp81x_pins))
520 		return (EINVAL);
521 
522 	sc = device_get_softc(dev);
523 
524 	AXP_LOCK(sc);
525 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
526 	if (error == 0) {
527 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
528 		switch (func) {
529 		case AXP_GPIO_FUNC_DRVLO:
530 		case AXP_GPIO_FUNC_DRVHI:
531 			data &= ~AXP_GPIO_FUNC;
532 			data |= (val << AXP_GPIO_FUNC_SHIFT);
533 			break;
534 		default:
535 			error = EIO;
536 			break;
537 		}
538 	}
539 	if (error == 0)
540 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
541 	AXP_UNLOCK(sc);
542 
543 	return (error);
544 }
545 
546 
547 static int
548 axp81x_gpio_pin_toggle(device_t dev, uint32_t pin)
549 {
550 	struct axp81x_softc *sc;
551 	uint8_t data, func;
552 	int error;
553 
554 	if (pin >= nitems(axp81x_pins))
555 		return (EINVAL);
556 
557 	sc = device_get_softc(dev);
558 
559 	AXP_LOCK(sc);
560 	error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1);
561 	if (error == 0) {
562 		func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT;
563 		switch (func) {
564 		case AXP_GPIO_FUNC_DRVLO:
565 			data &= ~AXP_GPIO_FUNC;
566 			data |= (AXP_GPIO_FUNC_DRVHI << AXP_GPIO_FUNC_SHIFT);
567 			break;
568 		case AXP_GPIO_FUNC_DRVHI:
569 			data &= ~AXP_GPIO_FUNC;
570 			data |= (AXP_GPIO_FUNC_DRVLO << AXP_GPIO_FUNC_SHIFT);
571 			break;
572 		default:
573 			error = EIO;
574 			break;
575 		}
576 	}
577 	if (error == 0)
578 		error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data);
579 	AXP_UNLOCK(sc);
580 
581 	return (error);
582 }
583 
584 static int
585 axp81x_gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent,
586     int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags)
587 {
588 	if (gpios[0] >= nitems(axp81x_pins))
589 		return (EINVAL);
590 
591 	*pin = gpios[0];
592 	*flags = gpios[1];
593 
594 	return (0);
595 }
596 
597 static phandle_t
598 axp81x_get_node(device_t dev, device_t bus)
599 {
600 	return (ofw_bus_get_node(dev));
601 }
602 
603 static struct axp81x_reg_sc *
604 axp81x_reg_attach(device_t dev, phandle_t node,
605     struct axp81x_regdef *def)
606 {
607 	struct axp81x_reg_sc *reg_sc;
608 	struct regnode_init_def initdef;
609 	struct regnode *regnode;
610 
611 	memset(&initdef, 0, sizeof(initdef));
612 	regulator_parse_ofw_stdparam(dev, node, &initdef);
613 	if (initdef.std_param.min_uvolt == 0)
614 		initdef.std_param.min_uvolt = def->voltage_min * 1000;
615 	if (initdef.std_param.max_uvolt == 0)
616 		initdef.std_param.max_uvolt = def->voltage_max * 1000;
617 	initdef.id = def->id;
618 	initdef.ofw_node = node;
619 	regnode = regnode_create(dev, &axp81x_regnode_class, &initdef);
620 	if (regnode == NULL) {
621 		device_printf(dev, "cannot create regulator\n");
622 		return (NULL);
623 	}
624 
625 	reg_sc = regnode_get_softc(regnode);
626 	reg_sc->regnode = regnode;
627 	reg_sc->base_dev = dev;
628 	reg_sc->def = def;
629 	reg_sc->xref = OF_xref_from_node(node);
630 	reg_sc->param = regnode_get_stdparam(regnode);
631 
632 	regnode_register(regnode);
633 
634 	return (reg_sc);
635 }
636 
637 static int
638 axp81x_regdev_map(device_t dev, phandle_t xref, int ncells, pcell_t *cells,
639     intptr_t *num)
640 {
641 	struct axp81x_softc *sc;
642 	int i;
643 
644 	sc = device_get_softc(dev);
645 	for (i = 0; i < sc->nregs; i++) {
646 		if (sc->regs[i] == NULL)
647 			continue;
648 		if (sc->regs[i]->xref == xref) {
649 			*num = sc->regs[i]->def->id;
650 			return (0);
651 		}
652 	}
653 
654 	return (ENXIO);
655 }
656 
657 static int
658 axp81x_probe(device_t dev)
659 {
660 	if (!ofw_bus_status_okay(dev))
661 		return (ENXIO);
662 
663 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
664 		return (ENXIO);
665 
666 	device_set_desc(dev, "X-Powers AXP81x Power Management Unit");
667 
668 	return (BUS_PROBE_DEFAULT);
669 }
670 
671 static int
672 axp81x_attach(device_t dev)
673 {
674 	struct axp81x_softc *sc;
675 	struct axp81x_reg_sc *reg;
676 	uint8_t chip_id;
677 	phandle_t rnode, child;
678 	int error, i;
679 
680 	sc = device_get_softc(dev);
681 
682 	sc->addr = iicbus_get_addr(dev);
683 	mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF);
684 
685 	error = bus_alloc_resources(dev, axp81x_spec, &sc->res);
686 	if (error != 0) {
687 		device_printf(dev, "cannot allocate resources for device\n");
688 		return (error);
689 	}
690 
691 	if (bootverbose) {
692 		axp81x_read(dev, AXP_ICTYPE, &chip_id, 1);
693 		device_printf(dev, "chip ID 0x%02x\n", chip_id);
694 	}
695 
696 	sc->nregs = nitems(axp81x_regdefs);
697 	sc->regs = malloc(sizeof(struct axp81x_reg_sc *) * sc->nregs,
698 	    M_AXP81X_REG, M_WAITOK | M_ZERO);
699 
700 	/* Attach known regulators that exist in the DT */
701 	rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators");
702 	if (rnode > 0) {
703 		for (i = 0; i < sc->nregs; i++) {
704 			child = ofw_bus_find_child(rnode,
705 			    axp81x_regdefs[i].name);
706 			if (child == 0)
707 				continue;
708 			reg = axp81x_reg_attach(dev, child, &axp81x_regdefs[i]);
709 			if (reg == NULL) {
710 				device_printf(dev,
711 				    "cannot attach regulator %s\n",
712 				    axp81x_regdefs[i].name);
713 				return (ENXIO);
714 			}
715 			sc->regs[i] = reg;
716 		}
717 	}
718 
719 	/* Enable IRQ on short power key press */
720 	axp81x_write(dev, AXP_IRQEN1, 0);
721 	axp81x_write(dev, AXP_IRQEN2, 0);
722 	axp81x_write(dev, AXP_IRQEN3, 0);
723 	axp81x_write(dev, AXP_IRQEN4, 0);
724 	axp81x_write(dev, AXP_IRQEN5, AXP_IRQEN5_POKSIRQ);
725 	axp81x_write(dev, AXP_IRQEN6, 0);
726 
727 	/* Install interrupt handler */
728 	error = bus_setup_intr(dev, sc->res, INTR_TYPE_MISC | INTR_MPSAFE,
729 	    NULL, axp81x_intr, dev, &sc->ih);
730 	if (error != 0) {
731 		device_printf(dev, "cannot setup interrupt handler\n");
732 		return (error);
733 	}
734 
735 	EVENTHANDLER_REGISTER(shutdown_final, axp81x_shutdown, dev,
736 	    SHUTDOWN_PRI_LAST);
737 
738 	sc->gpiodev = gpiobus_attach_bus(dev);
739 
740 	return (0);
741 }
742 
743 static device_method_t axp81x_methods[] = {
744 	/* Device interface */
745 	DEVMETHOD(device_probe,		axp81x_probe),
746 	DEVMETHOD(device_attach,	axp81x_attach),
747 
748 	/* GPIO interface */
749 	DEVMETHOD(gpio_get_bus,		axp81x_gpio_get_bus),
750 	DEVMETHOD(gpio_pin_max,		axp81x_gpio_pin_max),
751 	DEVMETHOD(gpio_pin_getname,	axp81x_gpio_pin_getname),
752 	DEVMETHOD(gpio_pin_getcaps,	axp81x_gpio_pin_getcaps),
753 	DEVMETHOD(gpio_pin_getflags,	axp81x_gpio_pin_getflags),
754 	DEVMETHOD(gpio_pin_setflags,	axp81x_gpio_pin_setflags),
755 	DEVMETHOD(gpio_pin_get,		axp81x_gpio_pin_get),
756 	DEVMETHOD(gpio_pin_set,		axp81x_gpio_pin_set),
757 	DEVMETHOD(gpio_pin_toggle,	axp81x_gpio_pin_toggle),
758 	DEVMETHOD(gpio_map_gpios,	axp81x_gpio_map_gpios),
759 
760 	/* Regdev interface */
761 	DEVMETHOD(regdev_map,		axp81x_regdev_map),
762 
763 	/* OFW bus interface */
764 	DEVMETHOD(ofw_bus_get_node,	axp81x_get_node),
765 
766 	DEVMETHOD_END
767 };
768 
769 static driver_t axp81x_driver = {
770 	"axp81x_pmu",
771 	axp81x_methods,
772 	sizeof(struct axp81x_softc),
773 };
774 
775 static devclass_t axp81x_devclass;
776 extern devclass_t ofwgpiobus_devclass, gpioc_devclass;
777 extern driver_t ofw_gpiobus_driver, gpioc_driver;
778 
779 EARLY_DRIVER_MODULE(axp81x, iicbus, axp81x_driver, axp81x_devclass, 0, 0,
780     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST);
781 EARLY_DRIVER_MODULE(ofw_gpiobus, axp81x_pmu, ofw_gpiobus_driver,
782     ofwgpiobus_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST);
783 DRIVER_MODULE(gpioc, axp81x_pmu, gpioc_driver, gpioc_devclass, 0, 0);
784 MODULE_VERSION(axp81x, 1);
785 MODULE_DEPEND(axp81x, iicbus, 1, 1, 1);
786