1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright 2020 Michal Meloun <mmel@FreeBSD.org>
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#ifndef _MAX77620_H_
29
30#include <sys/clock.h>
31
32#define	MAX77620_REG_CNFGGLBL1		0x00
33#define	MAX77620_REG_CNFGGLBL2		0x01
34#define	MAX77620_REG_CNFGGLBL3		0x02
35#define	MAX77620_REG_CNFG1_32K		0x03
36#define	MAX77620_REG_CNFGBBC		0x04
37#define	MAX77620_REG_IRQTOP		0x05
38#define	MAX77620_REG_INTLBT		0x06
39#define	MAX77620_REG_IRQSD		0x07
40#define	MAX77620_REG_IRQ_LVL2_L0_7	0x08
41#define	MAX77620_REG_IRQ_LVL2_L8	0x09
42#define	MAX77620_REG_IRQ_LVL2_GPIO	0x0A
43#define	MAX77620_REG_ONOFFIRQ		0x0B
44#define	MAX77620_REG_NVERC		0x0C
45#define	MAX77620_REG_IRQTOPM		0x0D
46#define	MAX77620_REG_INTENLBT		0x0E
47#define	MAX77620_REG_IRQMASKSD		0x0F
48#define	MAX77620_REG_IRQ_MSK_L0_7	0x10
49#define	MAX77620_REG_IRQ_MSK_L8		0x11
50#define	MAX77620_REG_ONOFFIRQM		0x12
51#define	MAX77620_REG_STATLBT		0x13
52#define	MAX77620_REG_STATSD		0x14
53#define	MAX77620_REG_ONOFFSTAT		0x15
54#define	MAX77620_REG_SD0		0x16
55#define	 MAX77620_SD0_VSEL_MASK			0x3F
56
57#define	MAX77620_REG_SD1		0x17
58#define	 MAX77620_SD1_VSEL_MASK			0x7F
59
60#define	MAX77620_REG_SD2		0x18
61#define	MAX77620_REG_SD3		0x19
62#define	MAX77620_REG_SD4		0x1A
63#define	 MAX77620_SDX_VSEL_MASK			0xFF
64
65#define	MAX77620_REG_DVSSD0		0x1B
66#define	MAX77620_REG_DVSSD1		0x1C
67#define	MAX77620_REG_CFG_SD0		0x1D
68#define	MAX77620_REG_CFG_SD1		0x1E
69#define	MAX77620_REG_CFG_SD2		0x1F
70#define	MAX77620_REG_CFG_SD3		0x20
71#define	MAX77620_REG_CFG_SD4		0x21
72#define	 MAX77620_SD_SR_MASK			0xC0
73#define	 MAX77620_SD_SR_SHIFT			6
74#define	 MAX77620_SD_POWER_MODE_MASK		0x30
75#define	 MAX77620_SD_POWER_MODE_SHIFT		4
76#define	 MAX77620_SD_FPWM_MASK			0x04
77#define	 MAX77620_SD_FPWM_SHIFT			2
78#define	 MAX77620_SD_FSRADE_MASK		0x01
79#define	 MAX77620_SD_FSRADE_SHIFT		0
80
81#define	MAX77620_REG_CFG2_SD		0x22
82#define	MAX77620_REG_CFG_LDO0		0x23
83#define	MAX77620_REG_CFG2_LDO0		0x24
84#define	MAX77620_REG_CFG_LDO1		0x25
85#define	MAX77620_REG_CFG2_LDO1		0x26
86#define	MAX77620_REG_CFG_LDO2		0x27
87#define	MAX77620_REG_CFG2_LDO2		0x28
88#define	MAX77620_REG_CFG_LDO3		0x29
89#define	MAX77620_REG_CFG2_LDO3		0x2A
90#define	MAX77620_REG_CFG_LDO4		0x2B
91#define	MAX77620_REG_CFG2_LDO4		0x2C
92#define	MAX77620_REG_CFG_LDO5		0x2D
93#define	MAX77620_REG_CFG2_LDO5		0x2E
94#define	MAX77620_REG_CFG_LDO6		0x2F
95#define	MAX77620_REG_CFG2_LDO6		0x30
96#define	MAX77620_REG_CFG_LDO7		0x31
97#define	MAX77620_REG_CFG2_LDO7		0x32
98#define	MAX77620_REG_CFG_LDO8		0x33
99#define	 MAX77620_LDO_POWER_MODE_MASK		0xC0
100#define	 MAX77620_LDO_POWER_MODE_SHIFT		6
101#define	 MAX77620_LDO_VSEL_MASK			0x3F
102
103#define	MAX77620_REG_CFG2_LDO8		0x34
104#define	 MAX77620_LDO_SLEW_RATE_MASK		0x1
105#define	 MAX77620_LDO_SLEW_RATE_SHIFT		0x0
106
107#define	MAX77620_REG_CFG3_LDO		0x35
108
109#define	MAX77620_REG_GPIO0		0x36
110#define	MAX77620_REG_GPIO1		0x37
111#define	MAX77620_REG_GPIO2		0x38
112#define	MAX77620_REG_GPIO3		0x39
113#define	MAX77620_REG_GPIO4		0x3A
114#define	MAX77620_REG_GPIO5		0x3B
115#define	MAX77620_REG_GPIO6		0x3C
116#define	MAX77620_REG_GPIO7		0x3D
117#define	 MAX77620_REG_GPIO_INT_GET(x)		(((x) >> 5) & 0x3)
118#define	 MAX77620_REG_GPIO_INT(x)		(((x) & 0x3) << 5)
119#define	  MAX77620_REG_GPIO_INT_NONE			0
120#define	  MAX77620_REG_GPIO_INT_FALLING			1
121#define	  MAX77620_REG_GPIO_INT_RISING			2
122#define	  MAX77620_REG_GPIO_INT_BOTH			3
123#define	 MAX77620_REG_GPIO_OUTPUT_VAL_GET(x)	(((x) >> 3) & 0x1)
124#define	 MAX77620_REG_GPIO_OUTPUT_VAL(x)	(((x) & 0x1) << 3)
125#define	 MAX77620_REG_GPIO_INPUT_VAL_GET(x)	(((x) << 2) & 0x1)
126#define	 MAX77620_REG_GPIO_INPUT_VAL		(1 << 2)
127#define	 MAX77620_REG_GPIO_DRV_GET(x)		(((x) >> 0) & 0x1)
128#define	 MAX77620_REG_GPIO_DRV(x)		(((x) & 0x1) << 0)
129#define	  MAX77620_REG_GPIO_DRV_PUSHPULL		1
130#define	  MAX77620_REG_GPIO_DRV_OPENDRAIN		0
131
132#define	MAX77620_REG_PUE_GPIO		0x3E
133#define	MAX77620_REG_PDE_GPIO		0x3F
134#define	MAX77620_REG_AME_GPIO		0x40
135#define	MAX77620_REG_ONOFFCNFG1		0x41
136#define	MAX77620_REG_ONOFFCNFG2		0x42
137
138#define	MAX77620_REG_FPS_CFG0		0x43
139#define	MAX77620_REG_FPS_CFG1		0x44
140#define	MAX77620_REG_FPS_CFG2		0x45
141#define	 MAX77620_FPS_TIME_PERIOD_MASK		0x38
142#define	 MAX77620_FPS_TIME_PERIOD_SHIFT		3
143#define	 MAX77620_FPS_EN_SRC_MASK		0x06
144#define	 MAX77620_FPS_EN_SRC_SHIFT		1
145#define	 MAX77620_FPS_ENFPS_SW_MASK		0x01
146#define	 MAX77620_FPS_ENFPS_SW			0x01
147
148#define	MAX77620_REG_FPS_LDO0		0x46
149#define	MAX77620_REG_FPS_LDO1		0x47
150#define	MAX77620_REG_FPS_LDO2		0x48
151#define	MAX77620_REG_FPS_LDO3		0x49
152#define	MAX77620_REG_FPS_LDO4		0x4A
153#define	MAX77620_REG_FPS_LDO5		0x4B
154#define	MAX77620_REG_FPS_LDO6		0x4C
155#define	MAX77620_REG_FPS_LDO7		0x4D
156#define	MAX77620_REG_FPS_LDO8		0x4E
157#define	MAX77620_REG_FPS_SD0		0x4F
158#define	MAX77620_REG_FPS_SD1		0x50
159#define	MAX77620_REG_FPS_SD2		0x51
160#define	MAX77620_REG_FPS_SD3		0x52
161#define	MAX77620_REG_FPS_SD4		0x53
162#define	MAX77620_REG_FPS_GPIO1		0x54
163#define	MAX77620_REG_FPS_GPIO2		0x55
164#define	MAX77620_REG_FPS_GPIO3		0x56
165#define	MAX77620_REG_FPS_RSO		0x57
166#define	 MAX77620_FPS_SRC_MASK			0xC0
167#define	 MAX77620_FPS_SRC_SHIFT			6
168#define	 MAX77620_FPS_PU_PERIOD_MASK		0x38
169#define	 MAX77620_FPS_PU_PERIOD_SHIFT		3
170#define	 MAX77620_FPS_PD_PERIOD_MASK		0x07
171#define	 MAX77620_FPS_PD_PERIOD_SHIFT		0
172
173#define	MAX77620_REG_CID0		0x58
174#define	MAX77620_REG_CID1		0x59
175#define	MAX77620_REG_CID2		0x5A
176#define	MAX77620_REG_CID3		0x5B
177#define	MAX77620_REG_CID4		0x5C
178#define	MAX77620_REG_CID5		0x5D
179#define	MAX77620_REG_DVSSD4		0x5E
180#define	MAX20024_REG_MAX_ADD		0x70
181
182/* MIsc FPS definitions. */
183#define	MAX77620_FPS_COUNT			3
184#define	MAX77620_FPS_PERIOD_MIN_US		40
185#define	MAX77620_FPS_PERIOD_MAX_US		2560
186
187/* Power modes */
188#define	MAX77620_POWER_MODE_NORMAL		3
189#define	MAX77620_POWER_MODE_LPM			2
190#define	MAX77620_POWER_MODE_GLPM		1
191#define	MAX77620_POWER_MODE_DISABLE		0
192
193
194struct max77620_reg_sc;
195struct max77620_gpio_pin;
196
197struct max77620_softc {
198	device_t			dev;
199	struct sx			lock;
200	int				bus_addr;
201	struct resource			*irq_res;
202	void				*irq_h;
203
204	int 				shutdown_fps[MAX77620_FPS_COUNT];
205	int 				suspend_fps[MAX77620_FPS_COUNT];
206	int 				event_source[MAX77620_FPS_COUNT];
207
208	/* Regulators. */
209	struct max77620_reg_sc		**regs;
210	int				nregs;
211
212	/* GPIO */
213	device_t			gpio_busdev;
214	struct max77620_gpio_pin 	**gpio_pins;
215	int				gpio_npins;
216	struct sx			gpio_lock;
217	uint8_t				gpio_reg_pue;	/* pull-up enables */
218	uint8_t				gpio_reg_pde;	/* pull-down enables */
219	uint8_t				gpio_reg_ame;	/* alternate fnc */
220
221
222};
223
224#define	RD1(sc, reg, val)	max77620_read(sc, reg, val)
225#define	WR1(sc, reg, val)	max77620_write(sc, reg, val)
226#define	RM1(sc, reg, clr, set)	max77620_modify(sc, reg, clr, set)
227
228int max77620_read(struct max77620_softc *sc, uint8_t reg, uint8_t *val);
229int max77620_write(struct max77620_softc *sc, uint8_t reg, uint8_t val);
230int max77620_modify(struct max77620_softc *sc, uint8_t reg, uint8_t clear,
231    uint8_t set);
232int max77620_read_buf(struct max77620_softc *sc, uint8_t reg, uint8_t *buf,
233    size_t size);
234int max77620_write_buf(struct max77620_softc *sc, uint8_t reg, uint8_t *buf,
235    size_t size);
236
237/* Regulators */
238int max77620_regulator_attach(struct max77620_softc *sc, phandle_t node);
239int max77620_regulator_map(device_t dev, phandle_t xref, int ncells,
240    pcell_t *cells, intptr_t *num);
241
242/* RTC */
243int max77620_rtc_create(struct max77620_softc *sc, phandle_t node);
244
245/* GPIO */
246device_t max77620_gpio_get_bus(device_t dev);
247int max77620_gpio_pin_max(device_t dev, int *maxpin);
248int max77620_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
249int max77620_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags);
250int max77620_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
251int max77620_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
252int max77620_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
253int max77620_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
254int max77620_gpio_pin_toggle(device_t dev, uint32_t pin);
255int max77620_gpio_map_gpios(device_t dev, phandle_t pdev, phandle_t gparent,
256    int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags);
257int max77620_gpio_attach(struct max77620_softc *sc, phandle_t node);
258int max77620_pinmux_configure(device_t dev, phandle_t cfgxref);
259
260#endif /* _MAX77620_H_ */
261