Lines Matching +full:dev +full:- +full:handle

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
36 #include <contrib/dev/acpica/include/acpi.h>
37 #include <dev/acpica/acpivar.h>
39 #include <dev/gpio/gpiobusvar.h>
40 #include <dev/gpio/acpi_gpiobusvar.h>
52 ACPI_HANDLE handle; member
62 device_t dev; member
66 gpio_aei_probe(device_t dev) in gpio_aei_probe() argument
79 if (ctx->type == ACPI_AEI_TYPE_EVT) in gpio_aei_intr()
80 acpi_SetInteger(ctx->handle, NULL, ctx->pin); in gpio_aei_intr()
82 AcpiEvaluateObject(ctx->handle, NULL, NULL, NULL); in gpio_aei_intr()
88 ACPI_RESOURCE_GPIO * gpio_res = &res->Data.Gpio; in gpio_aei_enumerate()
99 if (res->Type != ACPI_RESOURCE_TYPE_GPIO) in gpio_aei_enumerate()
101 if (gpio_res->ConnectionType != ACPI_RESOURCE_GPIO_TYPE_INT) in gpio_aei_enumerate()
108 err = GPIO_PIN_MAX(acpi_get_device(sc->dev_handle), &maxpin); in gpio_aei_enumerate()
112 busdev = GPIO_GET_BUS(acpi_get_device(sc->dev_handle)); in gpio_aei_enumerate()
113 for (int i = 0; i < gpio_res->PinTableLength; i++) { in gpio_aei_enumerate()
115 uint32_t pin = gpio_res->PinTable[i]; in gpio_aei_enumerate()
118 device_printf(sc->dev, in gpio_aei_enumerate()
125 ctx->type = ACPI_AEI_TYPE_UNKNOWN; in gpio_aei_enumerate()
130 if (ACPI_SUCCESS(AcpiGetHandle(sc->dev_handle, objname, in gpio_aei_enumerate()
131 &ctx->handle))) in gpio_aei_enumerate()
132 ctx->type = ACPI_AEI_TYPE_ELX; in gpio_aei_enumerate()
135 if (ctx->type == ACPI_AEI_TYPE_UNKNOWN) { in gpio_aei_enumerate()
136 if (ACPI_SUCCESS(AcpiGetHandle(sc->dev_handle, "_EVT", in gpio_aei_enumerate()
137 &ctx->handle))) in gpio_aei_enumerate()
138 ctx->type = ACPI_AEI_TYPE_EVT; in gpio_aei_enumerate()
140 device_printf(sc->dev, in gpio_aei_enumerate()
149 err = gpio_pin_get_by_bus_pinnum(busdev, pin, &ctx->gpio); in gpio_aei_enumerate()
151 device_printf(sc->dev, "Cannot acquire pin 0x%x\n", in gpio_aei_enumerate()
158 err = gpio_pin_setflags(ctx->gpio, flags & ~GPIO_INTR_MASK); in gpio_aei_enumerate()
160 device_printf(sc->dev, in gpio_aei_enumerate()
163 gpio_pin_release(ctx->gpio); in gpio_aei_enumerate()
168 ctx->intr_rid = 0; in gpio_aei_enumerate()
169 ctx->intr_res = gpio_alloc_intr_resource(sc->dev, in gpio_aei_enumerate()
170 &ctx->intr_rid, RF_ACTIVE, ctx->gpio, in gpio_aei_enumerate()
172 if (ctx->intr_res == NULL) { in gpio_aei_enumerate()
173 device_printf(sc->dev, in gpio_aei_enumerate()
176 gpio_pin_release(ctx->gpio); in gpio_aei_enumerate()
181 err = bus_setup_intr(sc->dev, ctx->intr_res, INTR_TYPE_MISC | in gpio_aei_enumerate()
183 gpio_aei_intr, ctx, &ctx->intr_cookie); in gpio_aei_enumerate()
185 device_printf(sc->dev, in gpio_aei_enumerate()
188 bus_release_resource(sc->dev, ctx->intr_res); in gpio_aei_enumerate()
189 gpio_pin_release(ctx->gpio); in gpio_aei_enumerate()
194 ctx->pin = pin; in gpio_aei_enumerate()
195 SLIST_INSERT_HEAD(&sc->aei_ctx, ctx, next); in gpio_aei_enumerate()
202 gpio_aei_attach(device_t dev) in gpio_aei_attach() argument
204 struct gpio_aei_softc * sc = device_get_softc(dev); in gpio_aei_attach()
205 ACPI_HANDLE handle; in gpio_aei_attach() local
209 device_set_desc(dev, "ACPI Event Information Device"); in gpio_aei_attach()
211 handle = acpi_gpiobus_get_handle(dev); in gpio_aei_attach()
212 status = AcpiGetParent(handle, &sc->dev_handle); in gpio_aei_attach()
214 device_printf(dev, "Cannot get parent of %s\n", in gpio_aei_attach()
215 acpi_name(handle)); in gpio_aei_attach()
219 SLIST_INIT(&sc->aei_ctx); in gpio_aei_attach()
220 sc->dev = dev; in gpio_aei_attach()
222 status = AcpiWalkResources(sc->dev_handle, "_AEI", in gpio_aei_attach()
225 device_printf(dev, "Failed to enumerate AEI resources\n"); in gpio_aei_attach()
233 gpio_aei_detach(device_t dev) in gpio_aei_detach() argument
235 struct gpio_aei_softc * sc = device_get_softc(dev); in gpio_aei_detach()
238 SLIST_FOREACH_SAFE(ctx, &sc->aei_ctx, next, tctx) { in gpio_aei_detach()
239 bus_teardown_intr(dev, ctx->intr_res, ctx->intr_cookie); in gpio_aei_detach()
240 bus_release_resource(dev, ctx->intr_res); in gpio_aei_detach()
241 gpio_pin_release(ctx->gpio); in gpio_aei_detach()