axp209.c revision 309758
1/*-
2 * Copyright (c) 2015-2016 Emmanuel Vadot <manu@freebsd.org>
3 * Copyright (c) 2016 Jared McNeill <jmcneill@invisible.ca>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: stable/11/sys/arm/allwinner/axp209.c 309758 2016-12-09 20:17:07Z manu $");
30
31/*
32* X-Power AXP209/AXP211 PMU for Allwinner SoCs
33*/
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/eventhandler.h>
38#include <sys/kernel.h>
39#include <sys/module.h>
40#include <sys/clock.h>
41#include <sys/time.h>
42#include <sys/bus.h>
43#include <sys/proc.h>
44#include <sys/gpio.h>
45#include <sys/reboot.h>
46#include <sys/resource.h>
47#include <sys/rman.h>
48#include <sys/sysctl.h>
49
50#include <dev/iicbus/iicbus.h>
51#include <dev/iicbus/iiconf.h>
52
53#include <dev/gpio/gpiobusvar.h>
54
55#include <dev/ofw/ofw_bus.h>
56#include <dev/ofw/ofw_bus_subr.h>
57
58#include <dev/extres/regulator/regulator.h>
59
60#include <arm/allwinner/axp209reg.h>
61
62#include "iicbus_if.h"
63#include "gpio_if.h"
64#include "regdev_if.h"
65
66MALLOC_DEFINE(M_AXP2XX_REG, "Axp2XX regulator", "Axp2XX power regulator");
67
68struct axp2xx_regdef {
69	intptr_t		id;
70	char			*name;
71	uint8_t			enable_reg;
72	uint8_t			enable_mask;
73	uint8_t			voltage_reg;
74	uint8_t			voltage_mask;
75	uint8_t			voltage_shift;
76	int			voltage_min;
77	int			voltage_max;
78	int			voltage_step;
79	int			voltage_nstep;
80};
81
82static struct axp2xx_regdef axp209_regdefs[] = {
83	{
84		.id = AXP209_REG_ID_DCDC2,
85		.name = "dcdc2",
86		.enable_reg = AXP209_POWERCTL,
87		.enable_mask = AXP209_POWERCTL_DCDC2,
88		.voltage_reg = AXP209_REG_DCDC2_VOLTAGE,
89		.voltage_mask = 0x3f,
90		.voltage_min = 700,
91		.voltage_max = 2275,
92		.voltage_step = 25,
93		.voltage_nstep = 64,
94	},
95	{
96		.id = AXP209_REG_ID_DCDC3,
97		.name = "dcdc3",
98		.enable_reg = AXP209_POWERCTL,
99		.enable_mask = AXP209_POWERCTL_DCDC3,
100		.voltage_reg = AXP209_REG_DCDC3_VOLTAGE,
101		.voltage_mask = 0x7f,
102		.voltage_min = 700,
103		.voltage_max = 3500,
104		.voltage_step = 25,
105		.voltage_nstep = 128,
106	},
107	{
108		.id = AXP209_REG_ID_LDO2,
109		.name = "ldo2",
110		.enable_reg = AXP209_POWERCTL,
111		.enable_mask = AXP209_POWERCTL_LDO2,
112		.voltage_reg = AXP209_REG_LDO24_VOLTAGE,
113		.voltage_mask = 0xf0,
114		.voltage_shift = 4,
115		.voltage_min = 1800,
116		.voltage_max = 3300,
117		.voltage_step = 100,
118		.voltage_nstep = 16,
119	},
120	{
121		.id = AXP209_REG_ID_LDO3,
122		.name = "ldo3",
123		.enable_reg = AXP209_POWERCTL,
124		.enable_mask = AXP209_POWERCTL_LDO3,
125		.voltage_reg = AXP209_REG_LDO3_VOLTAGE,
126		.voltage_mask = 0x7f,
127		.voltage_min = 700,
128		.voltage_max = 2275,
129		.voltage_step = 25,
130		.voltage_nstep = 128,
131	},
132};
133
134static struct axp2xx_regdef axp221_regdefs[] = {
135	{
136		.id = AXP221_REG_ID_DLDO1,
137		.name = "dldo1",
138		.enable_reg = AXP221_POWERCTL_2,
139		.enable_mask = AXP221_POWERCTL2_DLDO1,
140		.voltage_reg = AXP221_REG_DLDO1_VOLTAGE,
141		.voltage_mask = 0x1f,
142		.voltage_min = 700,
143		.voltage_max = 3300,
144		.voltage_step = 100,
145		.voltage_nstep = 26,
146	},
147	{
148		.id = AXP221_REG_ID_DLDO2,
149		.name = "dldo2",
150		.enable_reg = AXP221_POWERCTL_2,
151		.enable_mask = AXP221_POWERCTL2_DLDO2,
152		.voltage_reg = AXP221_REG_DLDO2_VOLTAGE,
153		.voltage_mask = 0x1f,
154		.voltage_min = 700,
155		.voltage_max = 3300,
156		.voltage_step = 100,
157		.voltage_nstep = 26,
158	},
159	{
160		.id = AXP221_REG_ID_DLDO3,
161		.name = "dldo3",
162		.enable_reg = AXP221_POWERCTL_2,
163		.enable_mask = AXP221_POWERCTL2_DLDO3,
164		.voltage_reg = AXP221_REG_DLDO3_VOLTAGE,
165		.voltage_mask = 0x1f,
166		.voltage_min = 700,
167		.voltage_max = 3300,
168		.voltage_step = 100,
169		.voltage_nstep = 26,
170	},
171	{
172		.id = AXP221_REG_ID_DLDO4,
173		.name = "dldo4",
174		.enable_reg = AXP221_POWERCTL_2,
175		.enable_mask = AXP221_POWERCTL2_DLDO4,
176		.voltage_reg = AXP221_REG_DLDO4_VOLTAGE,
177		.voltage_mask = 0x1f,
178		.voltage_min = 700,
179		.voltage_max = 3300,
180		.voltage_step = 100,
181		.voltage_nstep = 26,
182	},
183	{
184		.id = AXP221_REG_ID_ELDO1,
185		.name = "eldo1",
186		.enable_reg = AXP221_POWERCTL_2,
187		.enable_mask = AXP221_POWERCTL2_ELDO1,
188		.voltage_reg = AXP221_REG_ELDO1_VOLTAGE,
189		.voltage_mask = 0x1f,
190		.voltage_min = 700,
191		.voltage_max = 3300,
192		.voltage_step = 100,
193		.voltage_nstep = 26,
194	},
195	{
196		.id = AXP221_REG_ID_ELDO2,
197		.name = "eldo2",
198		.enable_reg = AXP221_POWERCTL_2,
199		.enable_mask = AXP221_POWERCTL2_ELDO2,
200		.voltage_reg = AXP221_REG_ELDO2_VOLTAGE,
201		.voltage_mask = 0x1f,
202		.voltage_min = 700,
203		.voltage_max = 3300,
204		.voltage_step = 100,
205		.voltage_nstep = 26,
206	},
207	{
208		.id = AXP221_REG_ID_ELDO3,
209		.name = "eldo3",
210		.enable_reg = AXP221_POWERCTL_2,
211		.enable_mask = AXP221_POWERCTL2_ELDO3,
212		.voltage_reg = AXP221_REG_ELDO3_VOLTAGE,
213		.voltage_mask = 0x1f,
214		.voltage_min = 700,
215		.voltage_max = 3300,
216		.voltage_step = 100,
217		.voltage_nstep = 26,
218	},
219	{
220		.id = AXP221_REG_ID_DC5LDO,
221		.name = "dc5ldo",
222		.enable_reg = AXP221_POWERCTL_1,
223		.enable_mask = AXP221_POWERCTL1_DC5LDO,
224		.voltage_reg = AXP221_REG_DC5LDO_VOLTAGE,
225		.voltage_mask = 0x3,
226		.voltage_min = 700,
227		.voltage_max = 1400,
228		.voltage_step = 100,
229		.voltage_nstep = 7,
230	},
231	{
232		.id = AXP221_REG_ID_DCDC1,
233		.name = "dcdc1",
234		.enable_reg = AXP221_POWERCTL_1,
235		.enable_mask = AXP221_POWERCTL1_DCDC1,
236		.voltage_reg = AXP221_REG_DCDC1_VOLTAGE,
237		.voltage_mask = 0x1f,
238		.voltage_min = 1600,
239		.voltage_max = 3400,
240		.voltage_step = 100,
241		.voltage_nstep = 18,
242	},
243	{
244		.id = AXP221_REG_ID_DCDC2,
245		.name = "dcdc2",
246		.enable_reg = AXP221_POWERCTL_1,
247		.enable_mask = AXP221_POWERCTL1_DCDC2,
248		.voltage_reg = AXP221_REG_DCDC2_VOLTAGE,
249		.voltage_mask = 0x3f,
250		.voltage_min = 600,
251		.voltage_max = 1540,
252		.voltage_step = 20,
253		.voltage_nstep = 47,
254	},
255	{
256		.id = AXP221_REG_ID_DCDC3,
257		.name = "dcdc3",
258		.enable_reg = AXP221_POWERCTL_1,
259		.enable_mask = AXP221_POWERCTL1_DCDC3,
260		.voltage_reg = AXP221_REG_DCDC3_VOLTAGE,
261		.voltage_mask = 0x3f,
262		.voltage_min = 600,
263		.voltage_max = 1860,
264		.voltage_step = 20,
265		.voltage_nstep = 63,
266	},
267	{
268		.id = AXP221_REG_ID_DCDC4,
269		.name = "dcdc4",
270		.enable_reg = AXP221_POWERCTL_1,
271		.enable_mask = AXP221_POWERCTL1_DCDC4,
272		.voltage_reg = AXP221_REG_DCDC4_VOLTAGE,
273		.voltage_mask = 0x3f,
274		.voltage_min = 600,
275		.voltage_max = 1540,
276		.voltage_step = 20,
277		.voltage_nstep = 47,
278	},
279	{
280		.id = AXP221_REG_ID_DCDC5,
281		.name = "dcdc5",
282		.enable_reg = AXP221_POWERCTL_1,
283		.enable_mask = AXP221_POWERCTL1_DCDC5,
284		.voltage_reg = AXP221_REG_DCDC5_VOLTAGE,
285		.voltage_mask = 0x1f,
286		.voltage_min = 1000,
287		.voltage_max = 2550,
288		.voltage_step = 50,
289		.voltage_nstep = 31,
290	},
291	{
292		.id = AXP221_REG_ID_ALDO1,
293		.name = "aldo1",
294		.enable_reg = AXP221_POWERCTL_1,
295		.enable_mask = AXP221_POWERCTL1_ALDO1,
296		.voltage_reg = AXP221_REG_ALDO1_VOLTAGE,
297		.voltage_mask = 0x1f,
298		.voltage_min = 700,
299		.voltage_max = 3300,
300		.voltage_step = 100,
301		.voltage_nstep = 26,
302	},
303	{
304		.id = AXP221_REG_ID_ALDO2,
305		.name = "aldo2",
306		.enable_reg = AXP221_POWERCTL_1,
307		.enable_mask = AXP221_POWERCTL1_ALDO2,
308		.voltage_reg = AXP221_REG_ALDO2_VOLTAGE,
309		.voltage_mask = 0x1f,
310		.voltage_min = 700,
311		.voltage_max = 3300,
312		.voltage_step = 100,
313		.voltage_nstep = 26,
314	},
315	{
316		.id = AXP221_REG_ID_ALDO3,
317		.name = "aldo3",
318		.enable_reg = AXP221_POWERCTL_3,
319		.enable_mask = AXP221_POWERCTL3_ALDO3,
320		.voltage_reg = AXP221_REG_ALDO3_VOLTAGE,
321		.voltage_mask = 0x1f,
322		.voltage_min = 700,
323		.voltage_max = 3300,
324		.voltage_step = 100,
325		.voltage_nstep = 26,
326	},
327	{
328		.id = AXP221_REG_ID_DC1SW,
329		.name = "dc1sw",
330		.enable_reg = AXP221_POWERCTL_2,
331		.enable_mask = AXP221_POWERCTL2_DC1SW,
332	},
333};
334
335struct axp2xx_reg_sc {
336	struct regnode		*regnode;
337	device_t		base_dev;
338	struct axp2xx_regdef	*def;
339	phandle_t		xref;
340	struct regnode_std_param *param;
341};
342
343struct axp2xx_pins {
344	const char	*name;
345	uint8_t		ctrl_reg;
346	uint8_t		status_reg;
347	uint8_t		status_mask;
348	uint8_t		status_shift;
349};
350
351/* GPIO3 is different, don't expose it for now */
352static const struct axp2xx_pins axp209_pins[] = {
353	{
354		.name = "GPIO0",
355		.ctrl_reg = AXP2XX_GPIO0_CTRL,
356		.status_reg = AXP2XX_GPIO_STATUS,
357		.status_mask = 0x10,
358		.status_shift = 4,
359	},
360	{
361		.name = "GPIO1",
362		.ctrl_reg = AXP2XX_GPIO1_CTRL,
363		.status_reg = AXP2XX_GPIO_STATUS,
364		.status_mask = 0x20,
365		.status_shift = 5,
366	},
367	{
368		.name = "GPIO2",
369		.ctrl_reg = AXP209_GPIO2_CTRL,
370		.status_reg = AXP2XX_GPIO_STATUS,
371		.status_mask = 0x40,
372		.status_shift = 6,
373	},
374};
375
376static const struct axp2xx_pins axp221_pins[] = {
377	{
378		.name = "GPIO0",
379		.ctrl_reg = AXP2XX_GPIO0_CTRL,
380		.status_reg = AXP2XX_GPIO_STATUS,
381		.status_mask = 0x1,
382		.status_shift = 0x0,
383	},
384	{
385		.name = "GPIO1",
386		.ctrl_reg = AXP2XX_GPIO0_CTRL,
387		.status_reg = AXP2XX_GPIO_STATUS,
388		.status_mask = 0x2,
389		.status_shift = 0x1,
390	},
391};
392
393struct axp2xx_sensors {
394	int		id;
395	const char	*name;
396	const char	*desc;
397	const char	*format;
398	uint8_t		enable_reg;
399	uint8_t		enable_mask;
400	uint8_t		value_reg;
401	uint8_t		value_size;
402	uint8_t		h_value_mask;
403	uint8_t		h_value_shift;
404	uint8_t		l_value_mask;
405	uint8_t		l_value_shift;
406	int		value_step;
407	int		value_convert;
408};
409
410static const struct axp2xx_sensors axp209_sensors[] = {
411	{
412		.id = AXP209_ACVOLT,
413		.name = "acvolt",
414		.desc = "AC Voltage (microvolt)",
415		.format = "I",
416		.enable_reg = AXP2XX_ADC_ENABLE1,
417		.enable_mask = AXP209_ADC1_ACVOLT,
418		.value_reg = AXP209_ACIN_VOLTAGE,
419		.value_size = 2,
420		.h_value_mask = 0xff,
421		.h_value_shift = 4,
422		.l_value_mask = 0xf,
423		.l_value_shift = 0,
424		.value_step = AXP209_VOLT_STEP,
425	},
426	{
427		.id = AXP209_ACCURRENT,
428		.name = "accurrent",
429		.desc = "AC Current (microAmpere)",
430		.format = "I",
431		.enable_reg = AXP2XX_ADC_ENABLE1,
432		.enable_mask = AXP209_ADC1_ACCURRENT,
433		.value_reg = AXP209_ACIN_CURRENT,
434		.value_size = 2,
435		.h_value_mask = 0xff,
436		.h_value_shift = 4,
437		.l_value_mask = 0xf,
438		.l_value_shift = 0,
439		.value_step = AXP209_ACCURRENT_STEP,
440	},
441	{
442		.id = AXP209_VBUSVOLT,
443		.name = "vbusvolt",
444		.desc = "VBUS Voltage (microVolt)",
445		.format = "I",
446		.enable_reg = AXP2XX_ADC_ENABLE1,
447		.enable_mask = AXP209_ADC1_VBUSVOLT,
448		.value_reg = AXP209_VBUS_VOLTAGE,
449		.value_size = 2,
450		.h_value_mask = 0xff,
451		.h_value_shift = 4,
452		.l_value_mask = 0xf,
453		.l_value_shift = 0,
454		.value_step = AXP209_VOLT_STEP,
455	},
456	{
457		.id = AXP209_VBUSCURRENT,
458		.name = "vbuscurrent",
459		.desc = "VBUS Current (microAmpere)",
460		.format = "I",
461		.enable_reg = AXP2XX_ADC_ENABLE1,
462		.enable_mask = AXP209_ADC1_VBUSCURRENT,
463		.value_reg = AXP209_VBUS_CURRENT,
464		.value_size = 2,
465		.h_value_mask = 0xff,
466		.h_value_shift = 4,
467		.l_value_mask = 0xf,
468		.l_value_shift = 0,
469		.value_step = AXP209_VBUSCURRENT_STEP,
470	},
471	{
472		.id = AXP2XX_BATVOLT,
473		.name = "batvolt",
474		.desc = "Battery Voltage (microVolt)",
475		.format = "I",
476		.enable_reg = AXP2XX_ADC_ENABLE1,
477		.enable_mask = AXP2XX_ADC1_BATVOLT,
478		.value_reg = AXP2XX_BAT_VOLTAGE,
479		.value_size = 2,
480		.h_value_mask = 0xff,
481		.h_value_shift = 4,
482		.l_value_mask = 0xf,
483		.l_value_shift = 0,
484		.value_step = AXP2XX_BATVOLT_STEP,
485	},
486	{
487		.id = AXP2XX_BATCHARGECURRENT,
488		.name = "batchargecurrent",
489		.desc = "Battery Charging Current (microAmpere)",
490		.format = "I",
491		.enable_reg = AXP2XX_ADC_ENABLE1,
492		.enable_mask = AXP2XX_ADC1_BATCURRENT,
493		.value_reg = AXP2XX_BAT_CHARGE_CURRENT,
494		.value_size = 2,
495		.h_value_mask = 0xff,
496		.h_value_shift = 5,
497		.l_value_mask = 0x1f,
498		.l_value_shift = 0,
499		.value_step = AXP2XX_BATCURRENT_STEP,
500	},
501	{
502		.id = AXP2XX_BATDISCHARGECURRENT,
503		.name = "batdischargecurrent",
504		.desc = "Battery Discharging Current (microAmpere)",
505		.format = "I",
506		.enable_reg = AXP2XX_ADC_ENABLE1,
507		.enable_mask = AXP2XX_ADC1_BATCURRENT,
508		.value_reg = AXP2XX_BAT_DISCHARGE_CURRENT,
509		.value_size = 2,
510		.h_value_mask = 0xff,
511		.h_value_shift = 5,
512		.l_value_mask = 0x1f,
513		.l_value_shift = 0,
514		.value_step = AXP2XX_BATCURRENT_STEP,
515	},
516	{
517		.id = AXP2XX_TEMP,
518		.name = "temp",
519		.desc = "Internal Temperature",
520		.format = "IK",
521		.enable_reg = AXP209_ADC_ENABLE2,
522		.enable_mask = AXP209_ADC2_TEMP,
523		.value_reg = AXP209_TEMPMON,
524		.value_size = 2,
525		.h_value_mask = 0xff,
526		.h_value_shift = 4,
527		.l_value_mask = 0xf,
528		.l_value_shift = 0,
529		.value_step = 1,
530		.value_convert = -(AXP209_TEMPMON_MIN - AXP209_0C_TO_K),
531	},
532};
533
534static const struct axp2xx_sensors axp221_sensors[] = {
535	{
536		.id = AXP2XX_BATVOLT,
537		.name = "batvolt",
538		.desc = "Battery Voltage (microVolt)",
539		.format = "I",
540		.enable_reg = AXP2XX_ADC_ENABLE1,
541		.enable_mask = AXP2XX_ADC1_BATVOLT,
542		.value_reg = AXP2XX_BAT_VOLTAGE,
543		.value_size = 2,
544		.h_value_mask = 0xff,
545		.h_value_shift = 4,
546		.l_value_mask = 0xf,
547		.l_value_shift = 0,
548		.value_step = AXP2XX_BATVOLT_STEP,
549	},
550	{
551		.id = AXP2XX_BATCHARGECURRENT,
552		.name = "batchargecurrent",
553		.desc = "Battery Charging Current (microAmpere)",
554		.format = "I",
555		.enable_reg = AXP2XX_ADC_ENABLE1,
556		.enable_mask = AXP2XX_ADC1_BATCURRENT,
557		.value_reg = AXP2XX_BAT_CHARGE_CURRENT,
558		.value_size = 2,
559		.h_value_mask = 0xff,
560		.h_value_shift = 5,
561		.l_value_mask = 0x1f,
562		.l_value_shift = 0,
563		.value_step = AXP2XX_BATCURRENT_STEP,
564	},
565	{
566		.id = AXP2XX_BATDISCHARGECURRENT,
567		.name = "batdischargecurrent",
568		.desc = "Battery Discharging Current (microAmpere)",
569		.format = "I",
570		.enable_reg = AXP2XX_ADC_ENABLE1,
571		.enable_mask = AXP2XX_ADC1_BATCURRENT,
572		.value_reg = AXP2XX_BAT_DISCHARGE_CURRENT,
573		.value_size = 2,
574		.h_value_mask = 0xff,
575		.h_value_shift = 5,
576		.l_value_mask = 0x1f,
577		.l_value_shift = 0,
578		.value_step = AXP2XX_BATCURRENT_STEP,
579	},
580	{
581		.id = AXP2XX_TEMP,
582		.name = "temp",
583		.desc = "Internal Temperature",
584		.format = "IK",
585		.enable_reg = AXP2XX_ADC_ENABLE1,
586		.enable_mask = AXP221_ADC1_TEMP,
587		.value_reg = AXP221_TEMPMON,
588		.value_size = 2,
589		.h_value_mask = 0xff,
590		.h_value_shift = 4,
591		.l_value_mask = 0xf,
592		.l_value_shift = 0,
593		.value_step = 1,
594		.value_convert = -(AXP221_TEMPMON_MIN - AXP209_0C_TO_K),
595	},
596};
597
598enum AXP2XX_TYPE {
599	AXP209 = 1,
600	AXP221,
601};
602
603struct axp2xx_softc {
604	device_t		dev;
605	uint32_t		addr;
606	struct resource *	res[1];
607	void *			intrcookie;
608	struct intr_config_hook	intr_hook;
609	struct mtx		mtx;
610	uint8_t			type;
611
612	/* GPIO */
613	device_t		gpiodev;
614	int			npins;
615	const struct axp2xx_pins	*pins;
616
617	/* Sensors */
618	const struct axp2xx_sensors	*sensors;
619	int				nsensors;
620
621	/* Regulators */
622	struct axp2xx_reg_sc	**regs;
623	int			nregs;
624	struct axp2xx_regdef	*regdefs;
625};
626
627static struct ofw_compat_data compat_data[] = {
628	{ "x-powers,axp209",		AXP209 },
629	{ "x-powers,axp221",		AXP221 },
630	{ NULL,				0 }
631};
632
633static struct resource_spec axp_res_spec[] = {
634	{ SYS_RES_IRQ,		0,	RF_ACTIVE },
635	{ -1,			0,	0 }
636};
637
638#define	AXP_LOCK(sc)	mtx_lock(&(sc)->mtx)
639#define	AXP_UNLOCK(sc)	mtx_unlock(&(sc)->mtx)
640
641static int
642axp2xx_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size)
643{
644	struct axp2xx_softc *sc = device_get_softc(dev);
645	struct iic_msg msg[2];
646
647	msg[0].slave = sc->addr;
648	msg[0].flags = IIC_M_WR;
649	msg[0].len = 1;
650	msg[0].buf = &reg;
651
652	msg[1].slave = sc->addr;
653	msg[1].flags = IIC_M_RD;
654	msg[1].len = size;
655	msg[1].buf = data;
656
657	return (iicbus_transfer(dev, msg, 2));
658}
659
660static int
661axp2xx_write(device_t dev, uint8_t reg, uint8_t data)
662{
663	uint8_t buffer[2];
664	struct axp2xx_softc *sc = device_get_softc(dev);
665	struct iic_msg msg[2];
666	int nmsgs = 0;
667
668	if (sc->type == AXP209) {
669		buffer[0] = reg;
670		buffer[1] = data;
671
672		msg[0].slave = sc->addr;
673		msg[0].flags = IIC_M_WR;
674		msg[0].len = 2;
675		msg[0].buf = buffer;
676
677		nmsgs = 1;
678	}
679	else if (sc->type == AXP221) {
680		msg[0].slave = sc->addr;
681		msg[0].flags = IIC_M_WR;
682		msg[0].len = 1;
683		msg[0].buf = &reg;
684
685		msg[1].slave = sc->addr;
686		msg[1].flags = IIC_M_WR;
687		msg[1].len = 1;
688		msg[1].buf = &data;
689		nmsgs = 2;
690	}
691	else
692		return (EINVAL);
693
694	return (iicbus_transfer(dev, msg, nmsgs));
695}
696
697static int
698axp2xx_regnode_init(struct regnode *regnode)
699{
700	return (0);
701}
702
703static int
704axp2xx_regnode_enable(struct regnode *regnode, bool enable, int *udelay)
705{
706	struct axp2xx_reg_sc *sc;
707	uint8_t val;
708
709	sc = regnode_get_softc(regnode);
710
711	axp2xx_read(sc->base_dev, sc->def->enable_reg, &val, 1);
712	if (enable)
713		val |= sc->def->enable_mask;
714	else
715		val &= ~sc->def->enable_mask;
716	axp2xx_write(sc->base_dev, sc->def->enable_reg, val);
717
718	*udelay = 0;
719
720	return (0);
721}
722
723static void
724axp2xx_regnode_reg_to_voltage(struct axp2xx_reg_sc *sc, uint8_t val, int *uv)
725{
726	if (val < sc->def->voltage_nstep)
727		*uv = sc->def->voltage_min + val * sc->def->voltage_step;
728	else
729		*uv = sc->def->voltage_min +
730		       (sc->def->voltage_nstep * sc->def->voltage_step);
731	*uv *= 1000;
732}
733
734static int
735axp2xx_regnode_voltage_to_reg(struct axp2xx_reg_sc *sc, int min_uvolt,
736    int max_uvolt, uint8_t *val)
737{
738	uint8_t nval;
739	int nstep, uvolt;
740
741	nval = 0;
742	uvolt = sc->def->voltage_min * 1000;
743
744	for (nstep = 0; nstep < sc->def->voltage_nstep && uvolt < min_uvolt;
745	     nstep++) {
746		++nval;
747		uvolt += (sc->def->voltage_step * 1000);
748	}
749	if (uvolt > max_uvolt)
750		return (EINVAL);
751
752	*val = nval;
753	return (0);
754}
755
756static int
757axp2xx_regnode_set_voltage(struct regnode *regnode, int min_uvolt,
758    int max_uvolt, int *udelay)
759{
760	struct axp2xx_reg_sc *sc;
761	uint8_t val;
762
763	sc = regnode_get_softc(regnode);
764
765	if (!sc->def->voltage_step)
766		return (ENXIO);
767
768	if (axp2xx_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0)
769		return (ERANGE);
770
771	axp2xx_write(sc->base_dev, sc->def->voltage_reg, val);
772
773	*udelay = 0;
774
775	return (0);
776}
777
778static int
779axp2xx_regnode_get_voltage(struct regnode *regnode, int *uvolt)
780{
781	struct axp2xx_reg_sc *sc;
782	uint8_t val;
783
784	sc = regnode_get_softc(regnode);
785
786	if (!sc->def->voltage_step)
787		return (ENXIO);
788
789	axp2xx_read(sc->base_dev, sc->def->voltage_reg, &val, 1);
790	axp2xx_regnode_reg_to_voltage(sc, val & sc->def->voltage_mask, uvolt);
791
792	return (0);
793}
794
795static regnode_method_t axp2xx_regnode_methods[] = {
796	/* Regulator interface */
797	REGNODEMETHOD(regnode_init,		axp2xx_regnode_init),
798	REGNODEMETHOD(regnode_enable,		axp2xx_regnode_enable),
799	REGNODEMETHOD(regnode_set_voltage,	axp2xx_regnode_set_voltage),
800	REGNODEMETHOD(regnode_get_voltage,	axp2xx_regnode_get_voltage),
801	REGNODEMETHOD_END
802};
803DEFINE_CLASS_1(axp2xx_regnode, axp2xx_regnode_class, axp2xx_regnode_methods,
804    sizeof(struct axp2xx_reg_sc), regnode_class);
805
806static int
807axp2xx_sysctl(SYSCTL_HANDLER_ARGS)
808{
809	struct axp2xx_softc *sc;
810	device_t dev = arg1;
811	enum axp2xx_sensor sensor = arg2;
812	uint8_t data[2];
813	int val, error, i, found;
814
815	sc = device_get_softc(dev);
816
817	for (found = 0, i = 0; i < sc->nsensors; i++) {
818		if (sc->sensors[i].id == sensor) {
819			found = 1;
820			break;
821		}
822	}
823
824	if (found == 0)
825		return (ENOENT);
826
827	error = axp2xx_read(dev, sc->sensors[i].value_reg, data, 2);
828	if (error != 0)
829		return (error);
830
831	val = ((data[0] & sc->sensors[i].h_value_mask) <<
832	    sc->sensors[i].h_value_shift);
833	val |= ((data[1] & sc->sensors[i].l_value_mask) <<
834	    sc->sensors[i].l_value_shift);
835	val *= sc->sensors[i].value_step;
836	val += sc->sensors[i].value_convert;
837
838	return sysctl_handle_opaque(oidp, &val, sizeof(val), req);
839}
840
841static void
842axp2xx_shutdown(void *devp, int howto)
843{
844	device_t dev;
845
846	if (!(howto & RB_POWEROFF))
847		return;
848	dev = (device_t)devp;
849
850	if (bootverbose)
851		device_printf(dev, "Shutdown AXP2xx\n");
852
853	axp2xx_write(dev, AXP2XX_SHUTBAT, AXP2XX_SHUTBAT_SHUTDOWN);
854}
855
856static void
857axp2xx_intr(void *arg)
858{
859	struct axp2xx_softc *sc;
860	uint8_t reg;
861
862	sc = arg;
863
864	axp2xx_read(sc->dev, AXP2XX_IRQ1_STATUS, &reg, 1);
865	if (reg) {
866		if (reg & AXP2XX_IRQ1_AC_OVERVOLT)
867			devctl_notify("PMU", "AC", "overvoltage", NULL);
868		if (reg & AXP2XX_IRQ1_VBUS_OVERVOLT)
869			devctl_notify("PMU", "USB", "overvoltage", NULL);
870		if (reg & AXP2XX_IRQ1_VBUS_LOW)
871			devctl_notify("PMU", "USB", "undervoltage", NULL);
872		if (reg & AXP2XX_IRQ1_AC_CONN)
873			devctl_notify("PMU", "AC", "plugged", NULL);
874		if (reg & AXP2XX_IRQ1_AC_DISCONN)
875			devctl_notify("PMU", "AC", "unplugged", NULL);
876		if (reg & AXP2XX_IRQ1_VBUS_CONN)
877			devctl_notify("PMU", "USB", "plugged", NULL);
878		if (reg & AXP2XX_IRQ1_VBUS_DISCONN)
879			devctl_notify("PMU", "USB", "unplugged", NULL);
880		axp2xx_write(sc->dev, AXP2XX_IRQ1_STATUS, AXP2XX_IRQ_ACK);
881	}
882
883	axp2xx_read(sc->dev, AXP2XX_IRQ2_STATUS, &reg, 1);
884	if (reg) {
885		if (reg & AXP2XX_IRQ2_BATT_CHARGED)
886			devctl_notify("PMU", "Battery", "charged", NULL);
887		if (reg & AXP2XX_IRQ2_BATT_CHARGING)
888			devctl_notify("PMU", "Battery", "charging", NULL);
889		if (reg & AXP2XX_IRQ2_BATT_CONN)
890			devctl_notify("PMU", "Battery", "connected", NULL);
891		if (reg & AXP2XX_IRQ2_BATT_DISCONN)
892			devctl_notify("PMU", "Battery", "disconnected", NULL);
893		if (reg & AXP2XX_IRQ2_BATT_TEMP_LOW)
894			devctl_notify("PMU", "Battery", "low temp", NULL);
895		if (reg & AXP2XX_IRQ2_BATT_TEMP_OVER)
896			devctl_notify("PMU", "Battery", "high temp", NULL);
897		axp2xx_write(sc->dev, AXP2XX_IRQ2_STATUS, AXP2XX_IRQ_ACK);
898	}
899
900	axp2xx_read(sc->dev, AXP2XX_IRQ3_STATUS, &reg, 1);
901	if (reg) {
902		if (reg & AXP2XX_IRQ3_PEK_SHORT)
903			shutdown_nice(RB_POWEROFF);
904		axp2xx_write(sc->dev, AXP2XX_IRQ3_STATUS, AXP2XX_IRQ_ACK);
905	}
906
907	axp2xx_read(sc->dev, AXP2XX_IRQ4_STATUS, &reg, 1);
908	if (reg) {
909		axp2xx_write(sc->dev, AXP2XX_IRQ4_STATUS, AXP2XX_IRQ_ACK);
910	}
911
912	axp2xx_read(sc->dev, AXP2XX_IRQ5_STATUS, &reg, 1);
913	if (reg) {
914		axp2xx_write(sc->dev, AXP2XX_IRQ5_STATUS, AXP2XX_IRQ_ACK);
915	}
916}
917
918static device_t
919axp2xx_gpio_get_bus(device_t dev)
920{
921	struct axp2xx_softc *sc;
922
923	sc = device_get_softc(dev);
924
925	return (sc->gpiodev);
926}
927
928static int
929axp2xx_gpio_pin_max(device_t dev, int *maxpin)
930{
931	struct axp2xx_softc *sc;
932
933	sc = device_get_softc(dev);
934
935	*maxpin = sc->npins - 1;
936
937	return (0);
938}
939
940static int
941axp2xx_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
942{
943	struct axp2xx_softc *sc;
944
945	sc = device_get_softc(dev);
946
947	if (pin >= sc->npins)
948		return (EINVAL);
949
950	snprintf(name, GPIOMAXNAME, "%s", axp209_pins[pin].name);
951
952	return (0);
953}
954
955static int
956axp2xx_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
957{
958	struct axp2xx_softc *sc;
959
960	sc = device_get_softc(dev);
961
962	if (pin >= sc->npins)
963		return (EINVAL);
964
965	*caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
966
967	return (0);
968}
969
970static int
971axp2xx_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
972{
973	struct axp2xx_softc *sc;
974	uint8_t data, func;
975	int error;
976
977	sc = device_get_softc(dev);
978
979	if (pin >= sc->npins)
980		return (EINVAL);
981
982	AXP_LOCK(sc);
983	error = axp2xx_read(dev, sc->pins[pin].ctrl_reg, &data, 1);
984	if (error == 0) {
985		func = data & AXP2XX_GPIO_FUNC_MASK;
986		if (func == AXP2XX_GPIO_FUNC_INPUT)
987			*flags = GPIO_PIN_INPUT;
988		else if (func == AXP2XX_GPIO_FUNC_DRVLO ||
989		    func == AXP2XX_GPIO_FUNC_DRVHI)
990			*flags = GPIO_PIN_OUTPUT;
991		else
992			*flags = 0;
993	}
994	AXP_UNLOCK(sc);
995
996	return (error);
997}
998
999static int
1000axp2xx_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
1001{
1002	struct axp2xx_softc *sc;
1003	uint8_t data;
1004	int error;
1005
1006	sc = device_get_softc(dev);
1007
1008	if (pin >= sc->npins)
1009		return (EINVAL);
1010
1011	AXP_LOCK(sc);
1012	error = axp2xx_read(dev, sc->pins[pin].ctrl_reg, &data, 1);
1013	if (error == 0) {
1014		data &= ~AXP2XX_GPIO_FUNC_MASK;
1015		if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) != 0) {
1016			if ((flags & GPIO_PIN_OUTPUT) == 0)
1017				data |= AXP2XX_GPIO_FUNC_INPUT;
1018		}
1019		error = axp2xx_write(dev, sc->pins[pin].ctrl_reg, data);
1020	}
1021	AXP_UNLOCK(sc);
1022
1023	return (error);
1024}
1025
1026static int
1027axp2xx_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
1028{
1029	struct axp2xx_softc *sc;
1030	uint8_t data, func;
1031	int error;
1032
1033	sc = device_get_softc(dev);
1034
1035	if (pin >= sc->npins)
1036		return (EINVAL);
1037
1038	AXP_LOCK(sc);
1039	error = axp2xx_read(dev, sc->pins[pin].ctrl_reg, &data, 1);
1040	if (error == 0) {
1041		func = data & AXP2XX_GPIO_FUNC_MASK;
1042		switch (func) {
1043		case AXP2XX_GPIO_FUNC_DRVLO:
1044			*val = 0;
1045			break;
1046		case AXP2XX_GPIO_FUNC_DRVHI:
1047			*val = 1;
1048			break;
1049		case AXP2XX_GPIO_FUNC_INPUT:
1050			error = axp2xx_read(dev, sc->pins[pin].status_reg,
1051			    &data, 1);
1052			if (error == 0) {
1053				*val = (data & sc->pins[pin].status_mask);
1054				*val >>= sc->pins[pin].status_shift;
1055			}
1056			break;
1057		default:
1058			error = EIO;
1059			break;
1060		}
1061	}
1062	AXP_UNLOCK(sc);
1063
1064	return (error);
1065}
1066
1067static int
1068axp2xx_gpio_pin_set(device_t dev, uint32_t pin, unsigned int val)
1069{
1070	struct axp2xx_softc *sc;
1071	uint8_t data, func;
1072	int error;
1073
1074	sc = device_get_softc(dev);
1075
1076	if (pin >= sc->npins)
1077		return (EINVAL);
1078
1079	AXP_LOCK(sc);
1080	error = axp2xx_read(dev, sc->pins[pin].ctrl_reg, &data, 1);
1081	if (error == 0) {
1082		func = data & AXP2XX_GPIO_FUNC_MASK;
1083		switch (func) {
1084		case AXP2XX_GPIO_FUNC_DRVLO:
1085		case AXP2XX_GPIO_FUNC_DRVHI:
1086			/* GPIO2 can't be set to 1 */
1087			if (pin == 2 && val == 1) {
1088				error = EINVAL;
1089				break;
1090			}
1091			data &= ~AXP2XX_GPIO_FUNC_MASK;
1092			data |= val;
1093			break;
1094		default:
1095			error = EIO;
1096			break;
1097		}
1098	}
1099	if (error == 0)
1100		error = axp2xx_write(dev, sc->pins[pin].ctrl_reg, data);
1101	AXP_UNLOCK(sc);
1102
1103	return (error);
1104}
1105
1106
1107static int
1108axp2xx_gpio_pin_toggle(device_t dev, uint32_t pin)
1109{
1110	struct axp2xx_softc *sc;
1111	uint8_t data, func;
1112	int error;
1113
1114	sc = device_get_softc(dev);
1115
1116	if (pin >= sc->npins)
1117		return (EINVAL);
1118
1119	AXP_LOCK(sc);
1120	error = axp2xx_read(dev, sc->pins[pin].ctrl_reg, &data, 1);
1121	if (error == 0) {
1122		func = data & AXP2XX_GPIO_FUNC_MASK;
1123		switch (func) {
1124		case AXP2XX_GPIO_FUNC_DRVLO:
1125			/* Pin 2 can't be set to 1*/
1126			if (pin == 2) {
1127				error = EINVAL;
1128				break;
1129			}
1130			data &= ~AXP2XX_GPIO_FUNC_MASK;
1131			data |= AXP2XX_GPIO_FUNC_DRVHI;
1132			break;
1133		case AXP2XX_GPIO_FUNC_DRVHI:
1134			data &= ~AXP2XX_GPIO_FUNC_MASK;
1135			data |= AXP2XX_GPIO_FUNC_DRVLO;
1136			break;
1137		default:
1138			error = EIO;
1139			break;
1140		}
1141	}
1142	if (error == 0)
1143		error = axp2xx_write(dev, sc->pins[pin].ctrl_reg, data);
1144	AXP_UNLOCK(sc);
1145
1146	return (error);
1147}
1148
1149static int
1150axp2xx_gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent,
1151    int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags)
1152{
1153	struct axp2xx_softc *sc;
1154
1155	sc = device_get_softc(bus);
1156
1157	if (gpios[0] >= sc->npins)
1158		return (EINVAL);
1159
1160	*pin = gpios[0];
1161	*flags = gpios[1];
1162
1163	return (0);
1164}
1165
1166static phandle_t
1167axp2xx_get_node(device_t dev, device_t bus)
1168{
1169	return (ofw_bus_get_node(dev));
1170}
1171
1172static struct axp2xx_reg_sc *
1173axp2xx_reg_attach(device_t dev, phandle_t node,
1174    struct axp2xx_regdef *def)
1175{
1176	struct axp2xx_reg_sc *reg_sc;
1177	struct regnode_init_def initdef;
1178	struct regnode *regnode;
1179
1180	memset(&initdef, 0, sizeof(initdef));
1181	if (regulator_parse_ofw_stdparam(dev, node, &initdef) != 0) {
1182		device_printf(dev, "cannot create regulator\n");
1183		return (NULL);
1184	}
1185	if (initdef.std_param.min_uvolt == 0)
1186		initdef.std_param.min_uvolt = def->voltage_min * 1000;
1187	if (initdef.std_param.max_uvolt == 0)
1188		initdef.std_param.max_uvolt = def->voltage_max * 1000;
1189	initdef.id = def->id;
1190	initdef.ofw_node = node;
1191	regnode = regnode_create(dev, &axp2xx_regnode_class, &initdef);
1192	if (regnode == NULL) {
1193		device_printf(dev, "cannot create regulator\n");
1194		return (NULL);
1195	}
1196
1197	reg_sc = regnode_get_softc(regnode);
1198	reg_sc->regnode = regnode;
1199	reg_sc->base_dev = dev;
1200	reg_sc->def = def;
1201	reg_sc->xref = OF_xref_from_node(node);
1202	reg_sc->param = regnode_get_stdparam(regnode);
1203
1204	regnode_register(regnode);
1205
1206	return (reg_sc);
1207}
1208
1209static int
1210axp2xx_regdev_map(device_t dev, phandle_t xref, int ncells, pcell_t *cells,
1211    intptr_t *num)
1212{
1213	struct axp2xx_softc *sc;
1214	int i;
1215
1216	sc = device_get_softc(dev);
1217	for (i = 0; i < sc->nregs; i++) {
1218		if (sc->regs[i] == NULL)
1219			continue;
1220		if (sc->regs[i]->xref == xref) {
1221			*num = sc->regs[i]->def->id;
1222			return (0);
1223		}
1224	}
1225
1226	return (ENXIO);
1227}
1228
1229static void
1230axp2xx_start(void *pdev)
1231{
1232	device_t dev;
1233	struct axp2xx_softc *sc;
1234	const char *pwr_name[] = {"Battery", "AC", "USB", "AC and USB"};
1235	int i;
1236	uint8_t reg, data;
1237	uint8_t pwr_src;
1238
1239	dev = pdev;
1240
1241	sc = device_get_softc(dev);
1242	sc->addr = iicbus_get_addr(dev);
1243	sc->dev = dev;
1244
1245	if (bootverbose) {
1246		/*
1247		 * Read the Power State register.
1248		 * Shift the AC presence into bit 0.
1249		 * Shift the Battery presence into bit 1.
1250		 */
1251		axp2xx_read(dev, AXP2XX_PSR, &data, 1);
1252		pwr_src = ((data & AXP2XX_PSR_ACIN) >> AXP2XX_PSR_ACIN_SHIFT) |
1253		    ((data & AXP2XX_PSR_VBUS) >> (AXP2XX_PSR_VBUS_SHIFT - 1));
1254
1255		device_printf(dev, "Powered by %s\n",
1256		    pwr_name[pwr_src]);
1257	}
1258
1259	/* Only enable interrupts that we are interested in */
1260	axp2xx_write(dev, AXP2XX_IRQ1_ENABLE,
1261	    AXP2XX_IRQ1_AC_OVERVOLT |
1262	    AXP2XX_IRQ1_AC_DISCONN |
1263	    AXP2XX_IRQ1_AC_CONN |
1264	    AXP2XX_IRQ1_VBUS_OVERVOLT |
1265	    AXP2XX_IRQ1_VBUS_DISCONN |
1266	    AXP2XX_IRQ1_VBUS_CONN);
1267	axp2xx_write(dev, AXP2XX_IRQ2_ENABLE,
1268	    AXP2XX_IRQ2_BATT_CONN |
1269	    AXP2XX_IRQ2_BATT_DISCONN |
1270	    AXP2XX_IRQ2_BATT_CHARGE_ACCT_ON |
1271	    AXP2XX_IRQ2_BATT_CHARGE_ACCT_OFF |
1272	    AXP2XX_IRQ2_BATT_CHARGING |
1273	    AXP2XX_IRQ2_BATT_CHARGED |
1274	    AXP2XX_IRQ2_BATT_TEMP_OVER |
1275	    AXP2XX_IRQ2_BATT_TEMP_LOW);
1276	axp2xx_write(dev, AXP2XX_IRQ3_ENABLE,
1277	    AXP2XX_IRQ3_PEK_SHORT | AXP2XX_IRQ3_PEK_LONG);
1278	axp2xx_write(dev, AXP2XX_IRQ4_ENABLE, AXP2XX_IRQ4_APS_LOW_2);
1279	axp2xx_write(dev, AXP2XX_IRQ5_ENABLE, 0x0);
1280
1281	EVENTHANDLER_REGISTER(shutdown_final, axp2xx_shutdown, dev,
1282	    SHUTDOWN_PRI_LAST);
1283
1284	/* Enable ADC sensors */
1285	for (i = 0; i < sc->nsensors; i++) {
1286		if (axp2xx_read(dev, sc->sensors[i].enable_reg, &reg, 1) == -1) {
1287			device_printf(dev, "Cannot enable sensor '%s'\n",
1288			    sc->sensors[i].name);
1289			continue;
1290		}
1291		reg |= sc->sensors[i].enable_mask;
1292		if (axp2xx_write(dev, sc->sensors[i].enable_reg, reg) == -1) {
1293			device_printf(dev, "Cannot enable sensor '%s'\n",
1294			    sc->sensors[i].name);
1295			continue;
1296		}
1297		SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
1298		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
1299		    OID_AUTO, sc->sensors[i].name,
1300		    CTLTYPE_INT | CTLFLAG_RD,
1301		    dev, sc->sensors[i].id, axp2xx_sysctl,
1302		    sc->sensors[i].format,
1303		    sc->sensors[i].desc);
1304	}
1305
1306	if ((bus_setup_intr(dev, sc->res[0], INTR_TYPE_MISC | INTR_MPSAFE,
1307	      NULL, axp2xx_intr, sc, &sc->intrcookie)))
1308		device_printf(dev, "unable to register interrupt handler\n");
1309
1310	config_intrhook_disestablish(&sc->intr_hook);
1311}
1312
1313static int
1314axp2xx_probe(device_t dev)
1315{
1316
1317	if (!ofw_bus_status_okay(dev))
1318		return (ENXIO);
1319
1320	switch (ofw_bus_search_compatible(dev, compat_data)->ocd_data)
1321	{
1322	case AXP209:
1323		device_set_desc(dev, "X-Powers AXP209 Power Management Unit");
1324		break;
1325	case AXP221:
1326		device_set_desc(dev, "X-Powers AXP221 Power Management Unit");
1327		break;
1328	default:
1329		return (ENXIO);
1330	}
1331
1332	return (BUS_PROBE_DEFAULT);
1333}
1334
1335static int
1336axp2xx_attach(device_t dev)
1337{
1338	struct axp2xx_softc *sc;
1339	struct axp2xx_reg_sc *reg;
1340	struct axp2xx_regdef *regdefs;
1341	phandle_t rnode, child;
1342	int i;
1343
1344	sc = device_get_softc(dev);
1345	mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF);
1346
1347	if (bus_alloc_resources(dev, axp_res_spec, sc->res) != 0) {
1348		device_printf(dev, "can't allocate device resources\n");
1349		return (ENXIO);
1350	}
1351
1352	sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
1353	switch (sc->type) {
1354	case AXP209:
1355		sc->pins = axp209_pins;
1356		sc->npins = nitems(axp209_pins);
1357		sc->gpiodev = gpiobus_attach_bus(dev);
1358
1359		sc->sensors = axp209_sensors;
1360		sc->nsensors = nitems(axp209_sensors);
1361
1362		regdefs = axp209_regdefs;
1363		sc->nregs = nitems(axp209_regdefs);
1364		break;
1365	case AXP221:
1366		sc->pins = axp221_pins;
1367		sc->npins = nitems(axp221_pins);
1368		sc->gpiodev = gpiobus_attach_bus(dev);
1369
1370		sc->sensors = axp221_sensors;
1371		sc->nsensors = nitems(axp221_sensors);
1372
1373		regdefs = axp221_regdefs;
1374		sc->nregs = nitems(axp221_regdefs);
1375		break;
1376	}
1377
1378	sc->regs = malloc(sizeof(struct axp2xx_reg_sc *) * sc->nregs,
1379	    M_AXP2XX_REG, M_WAITOK | M_ZERO);
1380
1381	sc->intr_hook.ich_func = axp2xx_start;
1382	sc->intr_hook.ich_arg = dev;
1383
1384	if (config_intrhook_establish(&sc->intr_hook) != 0)
1385		return (ENOMEM);
1386
1387	/* Attach known regulators that exist in the DT */
1388	rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators");
1389	if (rnode > 0) {
1390		for (i = 0; i < sc->nregs; i++) {
1391			child = ofw_bus_find_child(rnode,
1392			    regdefs[i].name);
1393			if (child == 0)
1394				continue;
1395			reg = axp2xx_reg_attach(dev, child, &regdefs[i]);
1396			if (reg == NULL) {
1397				device_printf(dev,
1398				    "cannot attach regulator %s\n",
1399				    regdefs[i].name);
1400				continue;
1401			}
1402			sc->regs[i] = reg;
1403			if (bootverbose)
1404				device_printf(dev, "Regulator %s attached\n",
1405				    regdefs[i].name);
1406		}
1407	}
1408
1409	return (0);
1410}
1411
1412static device_method_t axp2xx_methods[] = {
1413	DEVMETHOD(device_probe,		axp2xx_probe),
1414	DEVMETHOD(device_attach,	axp2xx_attach),
1415
1416	/* GPIO interface */
1417	DEVMETHOD(gpio_get_bus,		axp2xx_gpio_get_bus),
1418	DEVMETHOD(gpio_pin_max,		axp2xx_gpio_pin_max),
1419	DEVMETHOD(gpio_pin_getname,	axp2xx_gpio_pin_getname),
1420	DEVMETHOD(gpio_pin_getcaps,	axp2xx_gpio_pin_getcaps),
1421	DEVMETHOD(gpio_pin_getflags,	axp2xx_gpio_pin_getflags),
1422	DEVMETHOD(gpio_pin_setflags,	axp2xx_gpio_pin_setflags),
1423	DEVMETHOD(gpio_pin_get,		axp2xx_gpio_pin_get),
1424	DEVMETHOD(gpio_pin_set,		axp2xx_gpio_pin_set),
1425	DEVMETHOD(gpio_pin_toggle,	axp2xx_gpio_pin_toggle),
1426	DEVMETHOD(gpio_map_gpios,	axp2xx_gpio_map_gpios),
1427
1428	/* Regdev interface */
1429	DEVMETHOD(regdev_map,		axp2xx_regdev_map),
1430
1431	/* OFW bus interface */
1432	DEVMETHOD(ofw_bus_get_node,	axp2xx_get_node),
1433
1434	DEVMETHOD_END
1435};
1436
1437static driver_t axp2xx_driver = {
1438	"axp2xx_pmu",
1439	axp2xx_methods,
1440	sizeof(struct axp2xx_softc),
1441};
1442
1443static devclass_t axp2xx_devclass;
1444extern devclass_t ofwgpiobus_devclass, gpioc_devclass;
1445extern driver_t ofw_gpiobus_driver, gpioc_driver;
1446
1447EARLY_DRIVER_MODULE(axp2xx, iicbus, axp2xx_driver, axp2xx_devclass,
1448  0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
1449EARLY_DRIVER_MODULE(ofw_gpiobus, axp2xx_pmu, ofw_gpiobus_driver,
1450    ofwgpiobus_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
1451DRIVER_MODULE(gpioc, axp2xx_pmu, gpioc_driver, gpioc_devclass,
1452    0, 0);
1453MODULE_VERSION(axp2xx, 1);
1454MODULE_DEPEND(axp2xx, iicbus, 1, 1, 1);
1455