1*8c7a3ccfSYannickV /*-
2*8c7a3ccfSYannickV * SPDX-License-Identifier: BSD-2-Clause
3*8c7a3ccfSYannickV *
4*8c7a3ccfSYannickV * Copyright (c) 2026 Beckhoff Automation GmbH & Co. KG
5*8c7a3ccfSYannickV */
6*8c7a3ccfSYannickV
7*8c7a3ccfSYannickV #include <sys/param.h>
8*8c7a3ccfSYannickV #include <sys/systm.h>
9*8c7a3ccfSYannickV #include <sys/bus.h>
10*8c7a3ccfSYannickV #include <sys/gpio.h>
11*8c7a3ccfSYannickV #include <sys/kernel.h>
12*8c7a3ccfSYannickV #include <sys/module.h>
13*8c7a3ccfSYannickV
14*8c7a3ccfSYannickV #include <contrib/dev/acpica/include/acpi.h>
15*8c7a3ccfSYannickV
16*8c7a3ccfSYannickV #include <dev/acpica/acpivar.h>
17*8c7a3ccfSYannickV #include <dev/gpio/gpiobusvar.h>
18*8c7a3ccfSYannickV
19*8c7a3ccfSYannickV #include "intelgpio.h"
20*8c7a3ccfSYannickV
21*8c7a3ccfSYannickV #include "gpio_if.h"
22*8c7a3ccfSYannickV #include "opt_acpi.h"
23*8c7a3ccfSYannickV
24*8c7a3ccfSYannickV static const struct intelgpio_padgroup adln_com0_groups[] = {
25*8c7a3ccfSYannickV { .first_pad = 0, .npads = 26, .gpio_base = 0, .name = "GPP_B" },
26*8c7a3ccfSYannickV { .first_pad = 26, .npads = 16, .gpio_base = 32, .name = "GPP_T" },
27*8c7a3ccfSYannickV { .first_pad = 42, .npads = 25, .gpio_base = 64, .name = "GPP_A" },
28*8c7a3ccfSYannickV };
29*8c7a3ccfSYannickV
30*8c7a3ccfSYannickV static const struct intelgpio_padgroup adln_com1_groups[] = {
31*8c7a3ccfSYannickV { .first_pad = 67, .npads = 8, .gpio_base = 96, .name = "GPP_S" },
32*8c7a3ccfSYannickV { .first_pad = 75, .npads = 20, .gpio_base = 128, .name = "GPP_I" },
33*8c7a3ccfSYannickV { .first_pad = 95, .npads = 24, .gpio_base = 160, .name = "GPP_H" },
34*8c7a3ccfSYannickV { .first_pad = 119, .npads = 21, .gpio_base = 192, .name = "GPP_D" },
35*8c7a3ccfSYannickV { .first_pad = 140, .npads = 29, .gpio_base = 224, .name = "vGPIO" },
36*8c7a3ccfSYannickV };
37*8c7a3ccfSYannickV
38*8c7a3ccfSYannickV static const struct intelgpio_padgroup adln_com4_groups[] = {
39*8c7a3ccfSYannickV { .first_pad = 169, .npads = 24, .gpio_base = 256, .name = "GPP_C" },
40*8c7a3ccfSYannickV { .first_pad = 193, .npads = 25, .gpio_base = 288, .name = "GPP_F" },
41*8c7a3ccfSYannickV { .first_pad = 218,
42*8c7a3ccfSYannickV .npads = 6,
43*8c7a3ccfSYannickV .gpio_base = INTELGPIO_GPIO_NOMAP,
44*8c7a3ccfSYannickV .name = "HVCMOS" },
45*8c7a3ccfSYannickV { .first_pad = 224, .npads = 25, .gpio_base = 320, .name = "GPP_E" },
46*8c7a3ccfSYannickV };
47*8c7a3ccfSYannickV
48*8c7a3ccfSYannickV static const struct intelgpio_padgroup adln_com5_groups[] = {
49*8c7a3ccfSYannickV { .first_pad = 249, .npads = 8, .gpio_base = 352, .name = "GPP_R" },
50*8c7a3ccfSYannickV };
51*8c7a3ccfSYannickV
52*8c7a3ccfSYannickV static const struct intelgpio_community adln_communities[] = {
53*8c7a3ccfSYannickV { .ngroups = nitems(adln_com0_groups), .groups = adln_com0_groups },
54*8c7a3ccfSYannickV { .ngroups = nitems(adln_com1_groups), .groups = adln_com1_groups },
55*8c7a3ccfSYannickV { .ngroups = nitems(adln_com4_groups), .groups = adln_com4_groups },
56*8c7a3ccfSYannickV { .ngroups = nitems(adln_com5_groups), .groups = adln_com5_groups },
57*8c7a3ccfSYannickV };
58*8c7a3ccfSYannickV
59*8c7a3ccfSYannickV static char *adln_hids[] = { "INTC1056", "INTC1057", "INTC1085", NULL };
60*8c7a3ccfSYannickV
61*8c7a3ccfSYannickV static const struct intelgpio_platform adln_platform = {
62*8c7a3ccfSYannickV .communities = adln_communities,
63*8c7a3ccfSYannickV .ncommunities = nitems(adln_communities),
64*8c7a3ccfSYannickV .hids = adln_hids,
65*8c7a3ccfSYannickV .desc = "Intel Alder Lake-N GPIO",
66*8c7a3ccfSYannickV };
67*8c7a3ccfSYannickV
68*8c7a3ccfSYannickV static int
adln_probe(device_t dev)69*8c7a3ccfSYannickV adln_probe(device_t dev)
70*8c7a3ccfSYannickV {
71*8c7a3ccfSYannickV return (intelgpio_probe(dev, &adln_platform));
72*8c7a3ccfSYannickV }
73*8c7a3ccfSYannickV
74*8c7a3ccfSYannickV static int
adln_attach(device_t dev)75*8c7a3ccfSYannickV adln_attach(device_t dev)
76*8c7a3ccfSYannickV {
77*8c7a3ccfSYannickV return (intelgpio_attach(dev, &adln_platform));
78*8c7a3ccfSYannickV }
79*8c7a3ccfSYannickV
80*8c7a3ccfSYannickV static device_method_t adln_methods[] = {
81*8c7a3ccfSYannickV DEVMETHOD(device_probe, adln_probe),
82*8c7a3ccfSYannickV DEVMETHOD(device_attach, adln_attach),
83*8c7a3ccfSYannickV
84*8c7a3ccfSYannickV DEVMETHOD_END
85*8c7a3ccfSYannickV };
86*8c7a3ccfSYannickV
87*8c7a3ccfSYannickV DEFINE_CLASS_1(gpio, adln_driver, adln_methods,
88*8c7a3ccfSYannickV sizeof(struct intelgpio_softc), intelgpio_driver);
89*8c7a3ccfSYannickV
90*8c7a3ccfSYannickV DRIVER_MODULE(adlngpio, acpi, adln_driver, NULL, NULL);
91*8c7a3ccfSYannickV MODULE_DEPEND(adlngpio, acpi, 1, 1, 1);
92*8c7a3ccfSYannickV MODULE_DEPEND(adlngpio, gpiobus, 1, 1, 1);
93*8c7a3ccfSYannickV MODULE_VERSION(adlngpio, 1);
94*8c7a3ccfSYannickV ACPI_PNP_INFO(adln_hids);
95