xref: /freebsd/sys/arm64/rockchip/rk_gpio.c (revision 2e3f49888ec8851bafb22011533217487764fdb0)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2018 Emmanuel Vadot <manu@FreeBSD.org>
5  * Copyright (c) 2021 Soren Schmidt <sos@deepcore.dk>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  */
29 
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/bus.h>
33 
34 #include <sys/kernel.h>
35 #include <sys/module.h>
36 #include <sys/proc.h>
37 #include <sys/rman.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/gpio.h>
41 
42 #include <machine/bus.h>
43 #include <machine/resource.h>
44 #include <machine/intr.h>
45 
46 #include <dev/gpio/gpiobusvar.h>
47 #include <dev/ofw/ofw_bus.h>
48 #include <dev/ofw/ofw_bus_subr.h>
49 #include <dev/clk/clk.h>
50 
51 #include "gpio_if.h"
52 #include "pic_if.h"
53 
54 #include "fdt_pinctrl_if.h"
55 
56 enum gpio_regs {
57 	RK_GPIO_SWPORTA_DR = 1,	/* Data register */
58 	RK_GPIO_SWPORTA_DDR,	/* Data direction register */
59 	RK_GPIO_INTEN,		/* Interrupt enable register */
60 	RK_GPIO_INTMASK,	/* Interrupt mask register */
61 	RK_GPIO_INTTYPE_LEVEL,	/* Interrupt level register */
62 	RK_GPIO_INTTYPE_BOTH,	/* Both rise and falling edge */
63 	RK_GPIO_INT_POLARITY,	/* Interrupt polarity register */
64 	RK_GPIO_INT_STATUS,	/* Interrupt status register */
65 	RK_GPIO_INT_RAWSTATUS,	/* Raw Interrupt status register */
66 	RK_GPIO_DEBOUNCE,	/* Debounce enable register */
67 	RK_GPIO_PORTA_EOI,	/* Clear interrupt register */
68 	RK_GPIO_EXT_PORTA,	/* External port register */
69 	RK_GPIO_REGNUM
70 };
71 
72 #define	RK_GPIO_LS_SYNC		0x60	/* Level sensitive syncronization enable register */
73 
74 #define	RK_GPIO_DEFAULT_CAPS	(GPIO_PIN_INPUT | GPIO_PIN_OUTPUT |	\
75     GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN | GPIO_INTR_EDGE_BOTH | \
76     GPIO_INTR_EDGE_RISING | GPIO_INTR_EDGE_FALLING | \
77     GPIO_INTR_LEVEL_HIGH | GPIO_INTR_LEVEL_LOW)
78 
79 #define	GPIO_FLAGS_PINCTRL	GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN
80 #define	RK_GPIO_MAX_PINS	32
81 
82 struct pin_cached {
83 	uint8_t		is_gpio;
84 	uint32_t	flags;
85 };
86 
87 struct rk_pin_irqsrc {
88 	struct intr_irqsrc	isrc;
89 	uint32_t		irq;
90 	uint32_t		mode;
91 };
92 
93 struct rk_gpio_softc {
94 	device_t		sc_dev;
95 	device_t		sc_busdev;
96 	struct mtx		sc_mtx;
97 	struct resource		*sc_res[2];
98 	bus_space_tag_t		sc_bst;
99 	bus_space_handle_t	sc_bsh;
100 	clk_t			clk;
101 	device_t		pinctrl;
102 	uint32_t		swporta;
103 	uint32_t		swporta_ddr;
104 	uint32_t		version;
105 	struct pin_cached	pin_cached[RK_GPIO_MAX_PINS];
106 	uint8_t			regs[RK_GPIO_REGNUM];
107 	void			*ihandle;
108 	struct rk_pin_irqsrc	isrcs[RK_GPIO_MAX_PINS];
109 };
110 
111 static struct ofw_compat_data compat_data[] = {
112 	{"rockchip,gpio-bank", 1},
113 	{NULL,             0}
114 };
115 
116 static struct resource_spec rk_gpio_spec[] = {
117 	{ SYS_RES_MEMORY,	0,	RF_ACTIVE },
118 	{ SYS_RES_IRQ,		0,	RF_ACTIVE },
119 	{ -1, 0 }
120 };
121 
122 #define	RK_GPIO_VERSION		0x78
123 #define	RK_GPIO_TYPE_V1		0x00000000
124 #define	RK_GPIO_TYPE_V2		0x01000c2b
125 #define	RK_GPIO_ISRC(sc, irq)	(&(sc->isrcs[irq].isrc))
126 
127 static int rk_gpio_detach(device_t dev);
128 
129 #define	RK_GPIO_LOCK(_sc)		mtx_lock_spin(&(_sc)->sc_mtx)
130 #define	RK_GPIO_UNLOCK(_sc)		mtx_unlock_spin(&(_sc)->sc_mtx)
131 #define	RK_GPIO_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
132 
133 #define	RK_GPIO_WRITE(_sc, _off, _val)		\
134     bus_space_write_4(_sc->sc_bst, _sc->sc_bsh, _off, _val)
135 #define	RK_GPIO_READ(_sc, _off)		\
136     bus_space_read_4(_sc->sc_bst, _sc->sc_bsh, _off)
137 
138 static int
139 rk_gpio_read_bit(struct rk_gpio_softc *sc, int reg, int bit)
140 {
141 	int offset = sc->regs[reg];
142 	uint32_t value;
143 
144 	if (sc->version == RK_GPIO_TYPE_V1) {
145 		value = RK_GPIO_READ(sc, offset);
146 		value >>= bit;
147 	} else {
148 		value = RK_GPIO_READ(sc, bit > 15 ? offset + 4 : offset);
149 		value >>= (bit % 16);
150 	}
151 	return (value & 1);
152 }
153 
154 static void
155 rk_gpio_write_bit(struct rk_gpio_softc *sc, int reg, int bit, int data)
156 {
157 	int offset = sc->regs[reg];
158 	uint32_t value;
159 
160 	if (sc->version == RK_GPIO_TYPE_V1) {
161 		value = RK_GPIO_READ(sc, offset);
162 		if (data)
163 			value |= (1 << bit);
164 		else
165 			value &= ~(1 << bit);
166 		RK_GPIO_WRITE(sc, offset, value);
167 	} else {
168 		if (data)
169 			value = (1 << (bit % 16));
170 		else
171 			value = 0;
172 		value |= (1 << ((bit % 16) + 16));
173 		RK_GPIO_WRITE(sc, bit > 15 ? offset + 4 : offset, value);
174 	}
175 }
176 
177 static uint32_t
178 rk_gpio_read_4(struct rk_gpio_softc *sc, int reg)
179 {
180 	int offset = sc->regs[reg];
181 	uint32_t value;
182 
183 	if (sc->version == RK_GPIO_TYPE_V1)
184 		value = RK_GPIO_READ(sc, offset);
185 	else
186 		value = (RK_GPIO_READ(sc, offset) & 0xffff) |
187 		    (RK_GPIO_READ(sc, offset + 4) << 16);
188 	return (value);
189 }
190 
191 static void
192 rk_gpio_write_4(struct rk_gpio_softc *sc, int reg, uint32_t value)
193 {
194 	int offset = sc->regs[reg];
195 
196 	if (sc->version == RK_GPIO_TYPE_V1)
197 		RK_GPIO_WRITE(sc, offset, value);
198 	else {
199 		RK_GPIO_WRITE(sc, offset, (value & 0xffff) | 0xffff0000);
200 		RK_GPIO_WRITE(sc, offset + 4, (value >> 16) | 0xffff0000);
201 	}
202 }
203 
204 static int
205 rk_gpio_intr(void *arg)
206 {
207 	struct rk_gpio_softc *sc = (struct rk_gpio_softc *)arg;;
208 	struct trapframe *tf = curthread->td_intr_frame;
209 	uint32_t status;
210 
211 	RK_GPIO_LOCK(sc);
212 	status = rk_gpio_read_4(sc, RK_GPIO_INT_STATUS);
213 	rk_gpio_write_4(sc, RK_GPIO_PORTA_EOI, status);
214 	RK_GPIO_UNLOCK(sc);
215 
216 	while (status) {
217 		int pin = ffs(status) - 1;
218 
219 		status &= ~(1 << pin);
220 		if (intr_isrc_dispatch(RK_GPIO_ISRC(sc, pin), tf)) {
221 			device_printf(sc->sc_dev, "Interrupt pin=%d unhandled\n",
222 			    pin);
223 			continue;
224 		}
225 
226 		if ((sc->version == RK_GPIO_TYPE_V1) &&
227 		    (sc->isrcs[pin].mode & GPIO_INTR_EDGE_BOTH)) {
228 			RK_GPIO_LOCK(sc);
229 			if (rk_gpio_read_bit(sc, RK_GPIO_EXT_PORTA, pin))
230 				rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY,
231 				    (1 << pin), 0);
232 			else
233 				rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY,
234 				    (1 << pin), 1);
235 			RK_GPIO_UNLOCK(sc);
236 		}
237 	}
238 	return (FILTER_HANDLED);
239 }
240 
241 static int
242 rk_gpio_probe(device_t dev)
243 {
244 
245 	if (!ofw_bus_status_okay(dev))
246 		return (ENXIO);
247 
248 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
249 		return (ENXIO);
250 
251 	device_set_desc(dev, "RockChip GPIO Bank controller");
252 	return (BUS_PROBE_DEFAULT);
253 }
254 
255 static int
256 rk_gpio_attach(device_t dev)
257 {
258 	struct rk_gpio_softc *sc;
259 	phandle_t parent_node, node;
260 	int err, i;
261 
262 	sc = device_get_softc(dev);
263 	sc->sc_dev = dev;
264 	sc->pinctrl = device_get_parent(dev);
265 	parent_node = ofw_bus_get_node(sc->pinctrl);
266 
267 	node = ofw_bus_get_node(sc->sc_dev);
268 	if (!OF_hasprop(node, "gpio-controller"))
269 		return (ENXIO);
270 
271 	mtx_init(&sc->sc_mtx, "rk gpio", "gpio", MTX_SPIN);
272 
273 	if (bus_alloc_resources(dev, rk_gpio_spec, sc->sc_res)) {
274 		device_printf(dev, "could not allocate resources\n");
275 		bus_release_resources(dev, rk_gpio_spec, sc->sc_res);
276 		mtx_destroy(&sc->sc_mtx);
277 		return (ENXIO);
278 	}
279 
280 	sc->sc_bst = rman_get_bustag(sc->sc_res[0]);
281 	sc->sc_bsh = rman_get_bushandle(sc->sc_res[0]);
282 
283 	if (clk_get_by_ofw_index(dev, 0, 0, &sc->clk) != 0) {
284 		device_printf(dev, "Cannot get clock\n");
285 		rk_gpio_detach(dev);
286 		return (ENXIO);
287 	}
288 	err = clk_enable(sc->clk);
289 	if (err != 0) {
290 		device_printf(dev, "Could not enable clock %s\n",
291 		    clk_get_name(sc->clk));
292 		rk_gpio_detach(dev);
293 		return (ENXIO);
294 	}
295 
296 	if ((err = bus_setup_intr(dev, sc->sc_res[1],
297 	    INTR_TYPE_MISC | INTR_MPSAFE, rk_gpio_intr, NULL,
298 	    sc, &sc->ihandle))) {
299 		device_printf(dev, "Can not setup IRQ\n");
300 		rk_gpio_detach(dev);
301 		return (ENXIO);
302 	}
303 
304 	/*
305 	 * RK3568 has GPIO_VER_ID register, however both
306 	 * RK3328 and RK3399 doesn't have. So choose the
307 	 * version based on parent's compat string.
308 	 */
309 	if (ofw_bus_node_is_compatible(parent_node, "rockchip,rk3568-pinctrl"))
310 		sc->version = RK_GPIO_TYPE_V2;
311 	else
312 		sc->version = RK_GPIO_TYPE_V1;
313 
314 	switch (sc->version) {
315 	case RK_GPIO_TYPE_V1:
316 		sc->regs[RK_GPIO_SWPORTA_DR] = 0x00;
317 		sc->regs[RK_GPIO_SWPORTA_DDR] = 0x04;
318 		sc->regs[RK_GPIO_INTEN] = 0x30;
319 		sc->regs[RK_GPIO_INTMASK] = 0x34;
320 		sc->regs[RK_GPIO_INTTYPE_LEVEL] = 0x38;
321 		sc->regs[RK_GPIO_INT_POLARITY] = 0x3c;
322 		sc->regs[RK_GPIO_INT_STATUS] = 0x40;
323 		sc->regs[RK_GPIO_INT_RAWSTATUS] = 0x44;
324 		sc->regs[RK_GPIO_DEBOUNCE] = 0x48;
325 		sc->regs[RK_GPIO_PORTA_EOI] = 0x4c;
326 		sc->regs[RK_GPIO_EXT_PORTA] = 0x50;
327 		break;
328 	case RK_GPIO_TYPE_V2:
329 		sc->regs[RK_GPIO_SWPORTA_DR] = 0x00;
330 		sc->regs[RK_GPIO_SWPORTA_DDR] = 0x08;
331 		sc->regs[RK_GPIO_INTEN] = 0x10;
332 		sc->regs[RK_GPIO_INTMASK] = 0x18;
333 		sc->regs[RK_GPIO_INTTYPE_LEVEL] = 0x20;
334 		sc->regs[RK_GPIO_INTTYPE_BOTH] = 0x30;
335 		sc->regs[RK_GPIO_INT_POLARITY] = 0x28;
336 		sc->regs[RK_GPIO_INT_STATUS] = 0x50;
337 		sc->regs[RK_GPIO_INT_RAWSTATUS] = 0x58;
338 		sc->regs[RK_GPIO_DEBOUNCE] = 0x38;
339 		sc->regs[RK_GPIO_PORTA_EOI] = 0x60;
340 		sc->regs[RK_GPIO_EXT_PORTA] = 0x70;
341 		break;
342 	default:
343 		device_printf(dev, "Unknown gpio version %08x\n", sc->version);
344 		rk_gpio_detach(dev);
345 		return (ENXIO);
346 	}
347 
348 	for (i = 0; i < RK_GPIO_MAX_PINS; i++) {
349 		sc->isrcs[i].irq = i;
350 		sc->isrcs[i].mode = GPIO_INTR_CONFORM;
351 		if ((err = intr_isrc_register(RK_GPIO_ISRC(sc, i),
352 		    dev, 0, "%s", device_get_nameunit(dev)))) {
353 			device_printf(dev, "Can not register isrc %d\n", err);
354 			rk_gpio_detach(dev);
355 			return (ENXIO);
356 		}
357 	}
358 
359 	if (intr_pic_register(dev, OF_xref_from_node(node)) == NULL) {
360 		device_printf(dev, "Can not register pic\n");
361 		rk_gpio_detach(dev);
362 		return (ENXIO);
363 	}
364 
365 	sc->sc_busdev = gpiobus_attach_bus(dev);
366 	if (sc->sc_busdev == NULL) {
367 		rk_gpio_detach(dev);
368 		return (ENXIO);
369 	}
370 
371 	/* Set the cached value to unknown */
372 	for (i = 0; i < RK_GPIO_MAX_PINS; i++)
373 		sc->pin_cached[i].is_gpio = 2;
374 
375 	RK_GPIO_LOCK(sc);
376 	sc->swporta = rk_gpio_read_4(sc, RK_GPIO_SWPORTA_DR);
377 	sc->swporta_ddr = rk_gpio_read_4(sc, RK_GPIO_SWPORTA_DDR);
378 	RK_GPIO_UNLOCK(sc);
379 
380 	return (0);
381 }
382 
383 static int
384 rk_gpio_detach(device_t dev)
385 {
386 	struct rk_gpio_softc *sc;
387 
388 	sc = device_get_softc(dev);
389 
390 	if (sc->sc_busdev)
391 		gpiobus_detach_bus(dev);
392 	bus_release_resources(dev, rk_gpio_spec, sc->sc_res);
393 	mtx_destroy(&sc->sc_mtx);
394 	clk_disable(sc->clk);
395 
396 	return(0);
397 }
398 
399 static device_t
400 rk_gpio_get_bus(device_t dev)
401 {
402 	struct rk_gpio_softc *sc;
403 
404 	sc = device_get_softc(dev);
405 
406 	return (sc->sc_busdev);
407 }
408 
409 static int
410 rk_gpio_pin_max(device_t dev, int *maxpin)
411 {
412 
413 	/* Each bank have always 32 pins */
414 	/* XXX not true*/
415 	*maxpin = 31;
416 	return (0);
417 }
418 
419 static int
420 rk_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
421 {
422 	struct rk_gpio_softc *sc;
423 	uint32_t bank;
424 
425 	sc = device_get_softc(dev);
426 
427 	if (pin >= 32)
428 		return (EINVAL);
429 
430 	bank = pin / 8;
431 	pin = pin - (bank * 8);
432 	RK_GPIO_LOCK(sc);
433 	snprintf(name, GPIOMAXNAME, "P%c%d", bank + 'A', pin);
434 	RK_GPIO_UNLOCK(sc);
435 
436 	return (0);
437 }
438 
439 static int
440 rk_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
441 {
442 	struct rk_gpio_softc *sc;
443 	int rv;
444 
445 	sc = device_get_softc(dev);
446 
447 	if (__predict_false(sc->pin_cached[pin].is_gpio != 1)) {
448 		rv = FDT_PINCTRL_IS_GPIO(sc->pinctrl, dev, pin, (bool *)&sc->pin_cached[pin].is_gpio);
449 		if (rv != 0)
450 			return (rv);
451 		if (sc->pin_cached[pin].is_gpio == 0)
452 			return (EINVAL);
453 	}
454 	*flags = 0;
455 	rv = FDT_PINCTRL_GET_FLAGS(sc->pinctrl, dev, pin, flags);
456 	if (rv != 0)
457 		return (rv);
458 	sc->pin_cached[pin].flags = *flags;
459 
460 	if (sc->swporta_ddr & (1 << pin))
461 		*flags |= GPIO_PIN_OUTPUT;
462 	else
463 		*flags |= GPIO_PIN_INPUT;
464 
465 	return (0);
466 }
467 
468 static int
469 rk_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
470 {
471 
472 	if (pin >= RK_GPIO_MAX_PINS)
473 		return EINVAL;
474 
475 	*caps = RK_GPIO_DEFAULT_CAPS;
476 	return (0);
477 }
478 
479 static int
480 rk_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
481 {
482 	struct rk_gpio_softc *sc;
483 	int rv;
484 
485 	sc = device_get_softc(dev);
486 
487 	if (pin >= RK_GPIO_MAX_PINS)
488 		return (EINVAL);
489 
490 	if (__predict_false(sc->pin_cached[pin].is_gpio != 1)) {
491 		rv = FDT_PINCTRL_IS_GPIO(sc->pinctrl, dev, pin, (bool *)&sc->pin_cached[pin].is_gpio);
492 		if (rv != 0)
493 			return (rv);
494 		if (sc->pin_cached[pin].is_gpio == 0)
495 			return (EINVAL);
496 	}
497 
498 	if (__predict_false((flags & GPIO_PIN_INPUT) && ((flags & GPIO_FLAGS_PINCTRL) != sc->pin_cached[pin].flags))) {
499 		rv = FDT_PINCTRL_SET_FLAGS(sc->pinctrl, dev, pin, flags);
500 		sc->pin_cached[pin].flags = flags & GPIO_FLAGS_PINCTRL;
501 		if (rv != 0)
502 			return (rv);
503 	}
504 
505 	RK_GPIO_LOCK(sc);
506 	if (flags & GPIO_PIN_INPUT)
507 		sc->swporta_ddr &= ~(1 << pin);
508 	else if (flags & GPIO_PIN_OUTPUT)
509 		sc->swporta_ddr |= (1 << pin);
510 
511 	rk_gpio_write_4(sc, RK_GPIO_SWPORTA_DDR, sc->swporta_ddr);
512 	RK_GPIO_UNLOCK(sc);
513 
514 	return (0);
515 }
516 
517 static int
518 rk_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
519 {
520 	struct rk_gpio_softc *sc;
521 
522 	sc = device_get_softc(dev);
523 
524 	if (pin >= RK_GPIO_MAX_PINS)
525 		return (EINVAL);
526 
527 	RK_GPIO_LOCK(sc);
528 	*val = rk_gpio_read_bit(sc, RK_GPIO_EXT_PORTA, pin);
529 	RK_GPIO_UNLOCK(sc);
530 
531 	return (0);
532 }
533 
534 static int
535 rk_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
536 {
537 	struct rk_gpio_softc *sc;
538 
539 	sc = device_get_softc(dev);
540 
541 	if (pin >= RK_GPIO_MAX_PINS)
542 		return (EINVAL);
543 
544 	RK_GPIO_LOCK(sc);
545 	if (value)
546 		sc->swporta |= (1 << pin);
547 	else
548 		sc->swporta &= ~(1 << pin);
549 	rk_gpio_write_4(sc, RK_GPIO_SWPORTA_DR, sc->swporta);
550 	RK_GPIO_UNLOCK(sc);
551 
552 	return (0);
553 }
554 
555 static int
556 rk_gpio_pin_toggle(device_t dev, uint32_t pin)
557 {
558 	struct rk_gpio_softc *sc;
559 
560 	sc = device_get_softc(dev);
561 
562 	if (pin >= RK_GPIO_MAX_PINS)
563 		return (EINVAL);
564 
565 	RK_GPIO_LOCK(sc);
566 	if (sc->swporta & (1 << pin))
567 		sc->swporta &= ~(1 << pin);
568 	else
569 		sc->swporta |= (1 << pin);
570 	rk_gpio_write_4(sc, RK_GPIO_SWPORTA_DR, sc->swporta);
571 	RK_GPIO_UNLOCK(sc);
572 
573 	return (0);
574 }
575 
576 static int
577 rk_gpio_pin_access_32(device_t dev, uint32_t first_pin, uint32_t clear_pins,
578     uint32_t change_pins, uint32_t *orig_pins)
579 {
580 	struct rk_gpio_softc *sc;
581 	uint32_t reg;
582 
583 	sc = device_get_softc(dev);
584 
585 	RK_GPIO_LOCK(sc);
586 	reg = rk_gpio_read_4(sc, RK_GPIO_SWPORTA_DR);
587 	if (orig_pins)
588 		*orig_pins = reg;
589 	sc->swporta = reg;
590 
591 	if ((clear_pins | change_pins) != 0) {
592 		reg = (reg & ~clear_pins) ^ change_pins;
593 		rk_gpio_write_4(sc, RK_GPIO_SWPORTA_DR, reg);
594 	}
595 	RK_GPIO_UNLOCK(sc);
596 
597 	return (0);
598 }
599 
600 static int
601 rk_gpio_pin_config_32(device_t dev, uint32_t first_pin, uint32_t num_pins,
602     uint32_t *pin_flags)
603 {
604 	struct rk_gpio_softc *sc;
605 	uint32_t reg, set, mask, flags;
606 	int i;
607 
608 	sc = device_get_softc(dev);
609 
610 	if (first_pin != 0 || num_pins > 32)
611 		return (EINVAL);
612 
613 	set = 0;
614 	mask = 0;
615 	for (i = 0; i < num_pins; i++) {
616 		mask = (mask << 1) | 1;
617 		flags = pin_flags[i];
618 		if (flags & GPIO_PIN_INPUT) {
619 			set &= ~(1 << i);
620 		} else if (flags & GPIO_PIN_OUTPUT) {
621 			set |= (1 << i);
622 		}
623 	}
624 
625 	RK_GPIO_LOCK(sc);
626 	reg = rk_gpio_read_4(sc, RK_GPIO_SWPORTA_DDR);
627 	reg &= ~mask;
628 	reg |= set;
629 	rk_gpio_write_4(sc, RK_GPIO_SWPORTA_DDR, reg);
630 	sc->swporta_ddr = reg;
631 	RK_GPIO_UNLOCK(sc);
632 
633 	return (0);
634 }
635 
636 static int
637 rk_gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent, int gcells,
638     pcell_t *gpios, uint32_t *pin, uint32_t *flags)
639 {
640 
641 	/* The gpios are mapped as <pin flags> */
642 	*pin = gpios[0];
643 	*flags = gpios[1];
644 	return (0);
645 }
646 
647 static phandle_t
648 rk_gpio_get_node(device_t bus, device_t dev)
649 {
650 
651 	/* We only have one child, the GPIO bus, which needs our own node. */
652 	return (ofw_bus_get_node(bus));
653 }
654 
655 static int
656 rk_pic_map_intr(device_t dev, struct intr_map_data *data,
657     struct intr_irqsrc **isrcp)
658 {
659 	struct rk_gpio_softc *sc = device_get_softc(dev);
660 	struct intr_map_data_gpio *gdata;
661 	uint32_t irq;
662 
663 	if (data->type != INTR_MAP_DATA_GPIO) {
664 		device_printf(dev, "Wrong type\n");
665 		return (ENOTSUP);
666 	}
667 	gdata = (struct intr_map_data_gpio *)data;
668 	irq = gdata->gpio_pin_num;
669 	if (irq >= RK_GPIO_MAX_PINS) {
670 		device_printf(dev, "Invalid interrupt %u\n", irq);
671 		return (EINVAL);
672 	}
673 	*isrcp = RK_GPIO_ISRC(sc, irq);
674 	return (0);
675 }
676 
677 static int
678 rk_pic_setup_intr(device_t dev, struct intr_irqsrc *isrc,
679     struct resource *res, struct intr_map_data *data)
680 {
681 	struct rk_gpio_softc *sc = device_get_softc(dev);
682 	struct rk_pin_irqsrc *rkisrc = (struct rk_pin_irqsrc *)isrc;
683 	struct intr_map_data_gpio *gdata;
684 	uint32_t mode;
685 	uint8_t pin;
686 
687 	if (!data) {
688 		device_printf(dev, "No map data\n");
689 		return (ENOTSUP);
690 	}
691 	gdata = (struct intr_map_data_gpio *)data;
692 	mode = gdata->gpio_intr_mode;
693 	pin = gdata->gpio_pin_num;
694 
695 	if (rkisrc->irq != gdata->gpio_pin_num) {
696 		device_printf(dev, "Interrupts don't match\n");
697 		return (EINVAL);
698 	}
699 
700 	if (isrc->isrc_handlers != 0) {
701 		device_printf(dev, "Handler already attached\n");
702 		return (rkisrc->mode == mode ? 0 : EINVAL);
703 	}
704 	rkisrc->mode = mode;
705 
706 	RK_GPIO_LOCK(sc);
707 
708 	switch (mode & GPIO_INTR_MASK) {
709 	case GPIO_INTR_EDGE_RISING:
710 		rk_gpio_write_bit(sc, RK_GPIO_SWPORTA_DDR, pin, 0);
711 		rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_LEVEL, pin, 1);
712 		rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY, pin, 1);
713 		break;
714 	case GPIO_INTR_EDGE_FALLING:
715 		rk_gpio_write_bit(sc, RK_GPIO_SWPORTA_DDR, pin, 0);
716 		rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_LEVEL, pin, 1);
717 		rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY, pin, 0);
718 		break;
719 	case GPIO_INTR_EDGE_BOTH:
720 		rk_gpio_write_bit(sc, RK_GPIO_SWPORTA_DDR, pin, 0);
721 		rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_LEVEL, pin, 1);
722 		if (sc->version == RK_GPIO_TYPE_V1) {
723 			if (rk_gpio_read_bit(sc, RK_GPIO_EXT_PORTA, pin))
724 				rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY,
725 				    pin, 0);
726 			else
727 				rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY,
728 				    pin, 1);
729 		} else
730 			rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_BOTH, pin, 1);
731 		break;
732 	case GPIO_INTR_LEVEL_HIGH:
733 		rk_gpio_write_bit(sc, RK_GPIO_SWPORTA_DDR, pin, 0);
734 		rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_LEVEL, pin, 0);
735 		rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY, pin, 1);
736 		break;
737 	case GPIO_INTR_LEVEL_LOW:
738 		rk_gpio_write_bit(sc, RK_GPIO_SWPORTA_DDR, pin, 0);
739 		rk_gpio_write_bit(sc, RK_GPIO_INTTYPE_LEVEL, pin, 0);
740 		rk_gpio_write_bit(sc, RK_GPIO_INT_POLARITY, pin, 0);
741 		break;
742 	default:
743 		rk_gpio_write_bit(sc, RK_GPIO_INTMASK, pin, 1);
744 		rk_gpio_write_bit(sc, RK_GPIO_INTEN, pin, 0);
745 		RK_GPIO_UNLOCK(sc);
746 		return (EINVAL);
747 	}
748 	rk_gpio_write_bit(sc, RK_GPIO_DEBOUNCE, pin, 1);
749 	rk_gpio_write_bit(sc, RK_GPIO_INTMASK, pin, 0);
750 	rk_gpio_write_bit(sc, RK_GPIO_INTEN, pin, 1);
751 	RK_GPIO_UNLOCK(sc);
752 
753 	return (0);
754 }
755 
756 static int
757 rk_pic_teardown_intr(device_t dev, struct intr_irqsrc *isrc,
758     struct resource *res, struct intr_map_data *data)
759 {
760 	struct rk_gpio_softc *sc = device_get_softc(dev);
761 	struct rk_pin_irqsrc *irqsrc;
762 
763 	irqsrc = (struct rk_pin_irqsrc *)isrc;
764 
765 	if (isrc->isrc_handlers == 0) {
766 		irqsrc->mode = GPIO_INTR_CONFORM;
767 		RK_GPIO_LOCK(sc);
768 		rk_gpio_write_bit(sc, RK_GPIO_INTEN, irqsrc->irq, 0);
769 		rk_gpio_write_bit(sc, RK_GPIO_INTMASK, irqsrc->irq, 0);
770 		rk_gpio_write_bit(sc, RK_GPIO_DEBOUNCE, irqsrc->irq, 0);
771 		RK_GPIO_UNLOCK(sc);
772 	}
773 	return (0);
774 }
775 
776 static device_method_t rk_gpio_methods[] = {
777 	/* Device interface */
778 	DEVMETHOD(device_probe,		rk_gpio_probe),
779 	DEVMETHOD(device_attach,	rk_gpio_attach),
780 	DEVMETHOD(device_detach,	rk_gpio_detach),
781 
782 	/* GPIO protocol */
783 	DEVMETHOD(gpio_get_bus,		rk_gpio_get_bus),
784 	DEVMETHOD(gpio_pin_max,		rk_gpio_pin_max),
785 	DEVMETHOD(gpio_pin_getname,	rk_gpio_pin_getname),
786 	DEVMETHOD(gpio_pin_getflags,	rk_gpio_pin_getflags),
787 	DEVMETHOD(gpio_pin_getcaps,	rk_gpio_pin_getcaps),
788 	DEVMETHOD(gpio_pin_setflags,	rk_gpio_pin_setflags),
789 	DEVMETHOD(gpio_pin_get,		rk_gpio_pin_get),
790 	DEVMETHOD(gpio_pin_set,		rk_gpio_pin_set),
791 	DEVMETHOD(gpio_pin_toggle,	rk_gpio_pin_toggle),
792 	DEVMETHOD(gpio_pin_access_32,	rk_gpio_pin_access_32),
793 	DEVMETHOD(gpio_pin_config_32,	rk_gpio_pin_config_32),
794 	DEVMETHOD(gpio_map_gpios,	rk_gpio_map_gpios),
795 
796 	/* Interrupt controller interface */
797 	DEVMETHOD(pic_map_intr,		rk_pic_map_intr),
798 	DEVMETHOD(pic_setup_intr,	rk_pic_setup_intr),
799 	DEVMETHOD(pic_teardown_intr,	rk_pic_teardown_intr),
800 
801 	/* ofw_bus interface */
802 	DEVMETHOD(ofw_bus_get_node,	rk_gpio_get_node),
803 
804 	DEVMETHOD_END
805 };
806 
807 static driver_t rk_gpio_driver = {
808 	"gpio",
809 	rk_gpio_methods,
810 	sizeof(struct rk_gpio_softc),
811 };
812 
813 /*
814  * GPIO driver is always a child of rk_pinctrl driver and should be probed
815  * and attached within rk_pinctrl_attach function. Due to this, bus pass order
816  * must be same as bus pass order of rk_pinctrl driver.
817  */
818 EARLY_DRIVER_MODULE(rk_gpio, simplebus, rk_gpio_driver, 0, 0,
819     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
820