xref: /freebsd/sys/dev/gpio/intel/intelgpio.h (revision 5349a46babc03453b0e6679bf867272e7ef7ea22)
1*5349a46bSYannickV /*-
2*5349a46bSYannickV  * SPDX-License-Identifier: BSD-2-Clause
3*5349a46bSYannickV  *
4*5349a46bSYannickV  * Copyright (c) 2026 Beckhoff Automation GmbH & Co. KG
5*5349a46bSYannickV  */
6*5349a46bSYannickV 
7*5349a46bSYannickV #ifndef _DEV_GPIO_INTEL_INTELGPIO_H_
8*5349a46bSYannickV #define _DEV_GPIO_INTEL_INTELGPIO_H_
9*5349a46bSYannickV 
10*5349a46bSYannickV #include <sys/param.h>
11*5349a46bSYannickV #include <sys/bus.h>
12*5349a46bSYannickV #include <sys/gpio.h>
13*5349a46bSYannickV #include <sys/kernel.h>
14*5349a46bSYannickV 
15*5349a46bSYannickV #include <contrib/dev/acpica/include/acpi.h>
16*5349a46bSYannickV 
17*5349a46bSYannickV #define INTELGPIO_PADBAR_REG	      0x00c
18*5349a46bSYannickV #define INTELGPIO_PAD_SIZE	      16
19*5349a46bSYannickV 
20*5349a46bSYannickV #define INTELGPIO_PADCFG0_GPIOTXSTATE (1 << 0)
21*5349a46bSYannickV #define INTELGPIO_PADCFG0_GPIORXSTATE (1 << 1)
22*5349a46bSYannickV #define INTELGPIO_PADCFG0_GPIOTXDIS   (1 << 8)
23*5349a46bSYannickV #define INTELGPIO_PADCFG0_GPIORXDIS   (1 << 9)
24*5349a46bSYannickV #define INTELGPIO_PADCFG0_PMODE_MASK  (0x7 << 10)
25*5349a46bSYannickV #define INTELGPIO_PADCFG0_PMODE_GPIO  0
26*5349a46bSYannickV 
27*5349a46bSYannickV #define INTELGPIO_GPIO_NOMAP	      (-1)
28*5349a46bSYannickV #define INTELGPIO_MAX_COMMUNITIES     8
29*5349a46bSYannickV 
30*5349a46bSYannickV struct intelgpio_padgroup {
31*5349a46bSYannickV 	int first_pad;
32*5349a46bSYannickV 	int npads;
33*5349a46bSYannickV 	int gpio_base;
34*5349a46bSYannickV 	const char *name;
35*5349a46bSYannickV };
36*5349a46bSYannickV 
37*5349a46bSYannickV struct intelgpio_community {
38*5349a46bSYannickV 	int ngroups;
39*5349a46bSYannickV 	const struct intelgpio_padgroup *groups;
40*5349a46bSYannickV };
41*5349a46bSYannickV 
42*5349a46bSYannickV struct intelgpio_platform {
43*5349a46bSYannickV 	const struct intelgpio_community *communities;
44*5349a46bSYannickV 	int ncommunities;
45*5349a46bSYannickV 	char **hids;
46*5349a46bSYannickV 	const char *desc;
47*5349a46bSYannickV };
48*5349a46bSYannickV 
49*5349a46bSYannickV struct intelgpio_softc {
50*5349a46bSYannickV 	device_t sc_dev;
51*5349a46bSYannickV 	device_t sc_busdev;
52*5349a46bSYannickV 	struct mtx sc_mtx;
53*5349a46bSYannickV 	const struct intelgpio_platform *sc_plat;
54*5349a46bSYannickV 
55*5349a46bSYannickV 	struct resource *sc_mem_res[INTELGPIO_MAX_COMMUNITIES];
56*5349a46bSYannickV 	uint32_t sc_padbar[INTELGPIO_MAX_COMMUNITIES];
57*5349a46bSYannickV };
58*5349a46bSYannickV 
59*5349a46bSYannickV DECLARE_CLASS(intelgpio_driver);
60*5349a46bSYannickV 
61*5349a46bSYannickV int intelgpio_probe(device_t dev, const struct intelgpio_platform *plat);
62*5349a46bSYannickV int intelgpio_attach(device_t dev, const struct intelgpio_platform *plat);
63*5349a46bSYannickV 
64*5349a46bSYannickV #endif /* _DEV_GPIO_INTEL_INTELGPIO_H_ */
65