1*c2bd655dSYannickV /*-
2*c2bd655dSYannickV * SPDX-License-Identifier: BSD-2-Clause
3*c2bd655dSYannickV *
4*c2bd655dSYannickV * Copyright (c) 2026 Beckhoff Automation GmbH & Co. KG
5*c2bd655dSYannickV */
6*c2bd655dSYannickV
7*c2bd655dSYannickV #include <sys/param.h>
8*c2bd655dSYannickV #include <sys/systm.h>
9*c2bd655dSYannickV #include <sys/bus.h>
10*c2bd655dSYannickV #include <sys/gpio.h>
11*c2bd655dSYannickV #include <sys/kernel.h>
12*c2bd655dSYannickV #include <sys/module.h>
13*c2bd655dSYannickV
14*c2bd655dSYannickV #include <contrib/dev/acpica/include/acpi.h>
15*c2bd655dSYannickV
16*c2bd655dSYannickV #include <dev/acpica/acpivar.h>
17*c2bd655dSYannickV #include <dev/gpio/gpiobusvar.h>
18*c2bd655dSYannickV
19*c2bd655dSYannickV #include "intelgpio.h"
20*c2bd655dSYannickV
21*c2bd655dSYannickV #include "gpio_if.h"
22*c2bd655dSYannickV #include "opt_acpi.h"
23*c2bd655dSYannickV
24*c2bd655dSYannickV /* Community 0: GPP_A, GPP_R, GPP_B, vGPIO_0 */
25*c2bd655dSYannickV static const struct intelgpio_padgroup tglh_com0_groups[] = {
26*c2bd655dSYannickV { .first_pad = 0, .npads = 25, .gpio_base = 0, .name = "GPP_A" },
27*c2bd655dSYannickV { .first_pad = 25, .npads = 20, .gpio_base = 32, .name = "GPP_R" },
28*c2bd655dSYannickV { .first_pad = 45, .npads = 26, .gpio_base = 64, .name = "GPP_B" },
29*c2bd655dSYannickV { .first_pad = 71, .npads = 8, .gpio_base = 96, .name = "vGPIO_0" },
30*c2bd655dSYannickV };
31*c2bd655dSYannickV
32*c2bd655dSYannickV /* Community 1: GPP_D, GPP_C, GPP_S, GPP_G, vGPIO */
33*c2bd655dSYannickV static const struct intelgpio_padgroup tglh_com1_groups[] = {
34*c2bd655dSYannickV { .first_pad = 79, .npads = 26, .gpio_base = 128, .name = "GPP_D" },
35*c2bd655dSYannickV { .first_pad = 105, .npads = 24, .gpio_base = 160, .name = "GPP_C" },
36*c2bd655dSYannickV { .first_pad = 129, .npads = 8, .gpio_base = 192, .name = "GPP_S" },
37*c2bd655dSYannickV { .first_pad = 137, .npads = 17, .gpio_base = 224, .name = "GPP_G" },
38*c2bd655dSYannickV { .first_pad = 154, .npads = 27, .gpio_base = 256, .name = "vGPIO" },
39*c2bd655dSYannickV };
40*c2bd655dSYannickV
41*c2bd655dSYannickV /* Community 3: GPP_E, GPP_F */
42*c2bd655dSYannickV static const struct intelgpio_padgroup tglh_com3_groups[] = {
43*c2bd655dSYannickV { .first_pad = 181, .npads = 13, .gpio_base = 288, .name = "GPP_E" },
44*c2bd655dSYannickV { .first_pad = 194, .npads = 24, .gpio_base = 320, .name = "GPP_F" },
45*c2bd655dSYannickV };
46*c2bd655dSYannickV
47*c2bd655dSYannickV /* Community 4: GPP_H, GPP_J, GPP_K */
48*c2bd655dSYannickV static const struct intelgpio_padgroup tglh_com4_groups[] = {
49*c2bd655dSYannickV { .first_pad = 218, .npads = 24, .gpio_base = 352, .name = "GPP_H" },
50*c2bd655dSYannickV { .first_pad = 242, .npads = 10, .gpio_base = 384, .name = "GPP_J" },
51*c2bd655dSYannickV { .first_pad = 252, .npads = 15, .gpio_base = 416, .name = "GPP_K" },
52*c2bd655dSYannickV };
53*c2bd655dSYannickV
54*c2bd655dSYannickV /* Community 5: GPP_I, JTAG */
55*c2bd655dSYannickV static const struct intelgpio_padgroup tglh_com5_groups[] = {
56*c2bd655dSYannickV { .first_pad = 267, .npads = 15, .gpio_base = 448, .name = "GPP_I" },
57*c2bd655dSYannickV { .first_pad = 282,
58*c2bd655dSYannickV .npads = 9,
59*c2bd655dSYannickV .gpio_base = INTELGPIO_GPIO_NOMAP,
60*c2bd655dSYannickV .name = "JTAG" },
61*c2bd655dSYannickV };
62*c2bd655dSYannickV
63*c2bd655dSYannickV static const struct intelgpio_community tglh_communities[] = {
64*c2bd655dSYannickV { .ngroups = nitems(tglh_com0_groups), .groups = tglh_com0_groups },
65*c2bd655dSYannickV { .ngroups = nitems(tglh_com1_groups), .groups = tglh_com1_groups },
66*c2bd655dSYannickV { .ngroups = nitems(tglh_com3_groups), .groups = tglh_com3_groups },
67*c2bd655dSYannickV { .ngroups = nitems(tglh_com4_groups), .groups = tglh_com4_groups },
68*c2bd655dSYannickV { .ngroups = nitems(tglh_com5_groups), .groups = tglh_com5_groups },
69*c2bd655dSYannickV };
70*c2bd655dSYannickV
71*c2bd655dSYannickV static char *tglh_hids[] = { "INT34C6", NULL };
72*c2bd655dSYannickV
73*c2bd655dSYannickV static const struct intelgpio_platform tglh_platform = {
74*c2bd655dSYannickV .communities = tglh_communities,
75*c2bd655dSYannickV .ncommunities = nitems(tglh_communities),
76*c2bd655dSYannickV .hids = tglh_hids,
77*c2bd655dSYannickV .desc = "Intel Tiger Lake-H GPIO",
78*c2bd655dSYannickV };
79*c2bd655dSYannickV
80*c2bd655dSYannickV static int
tglh_gpio_probe(device_t dev)81*c2bd655dSYannickV tglh_gpio_probe(device_t dev)
82*c2bd655dSYannickV {
83*c2bd655dSYannickV return (intelgpio_probe(dev, &tglh_platform));
84*c2bd655dSYannickV }
85*c2bd655dSYannickV
86*c2bd655dSYannickV static int
tglh_gpio_attach(device_t dev)87*c2bd655dSYannickV tglh_gpio_attach(device_t dev)
88*c2bd655dSYannickV {
89*c2bd655dSYannickV return (intelgpio_attach(dev, &tglh_platform));
90*c2bd655dSYannickV }
91*c2bd655dSYannickV
92*c2bd655dSYannickV static device_method_t tglh_methods[] = {
93*c2bd655dSYannickV DEVMETHOD(device_probe, tglh_gpio_probe),
94*c2bd655dSYannickV DEVMETHOD(device_attach, tglh_gpio_attach),
95*c2bd655dSYannickV
96*c2bd655dSYannickV DEVMETHOD_END
97*c2bd655dSYannickV };
98*c2bd655dSYannickV
99*c2bd655dSYannickV DEFINE_CLASS_1(gpio, tglh_driver, tglh_methods,
100*c2bd655dSYannickV sizeof(struct intelgpio_softc), intelgpio_driver);
101*c2bd655dSYannickV
102*c2bd655dSYannickV DRIVER_MODULE(tglhgpio, acpi, tglh_driver, NULL, NULL);
103*c2bd655dSYannickV MODULE_DEPEND(tglhgpio, acpi, 1, 1, 1);
104*c2bd655dSYannickV MODULE_DEPEND(tglhgpio, gpiobus, 1, 1, 1);
105*c2bd655dSYannickV MODULE_VERSION(tglhgpio, 1);
106*c2bd655dSYannickV ACPI_PNP_INFO(tglh_hids);
107