Lines Matching +full:dev +full:- +full:handle
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
34 #include <contrib/dev/acpica/include/acpi.h>
35 #include <dev/acpica/acpivar.h>
37 #include <dev/gpio/gpiobusvar.h>
38 #include <dev/gpio/acpi_gpiobusvar.h>
55 ACPI_HANDLE dev_handle; /* ACPI handle for bus */
65 if (gpio_res->ConnectionType == ACPI_RESOURCE_GPIO_TYPE_INT) { in acpi_gpiobus_convflags()
66 switch (gpio_res->Polarity) { in acpi_gpiobus_convflags()
68 flags = gpio_res->Triggering == ACPI_LEVEL_SENSITIVE ? in acpi_gpiobus_convflags()
72 flags = gpio_res->Triggering == ACPI_LEVEL_SENSITIVE ? in acpi_gpiobus_convflags()
83 if (gpio_res->Shareable == ACPI_SHARED) in acpi_gpiobus_convflags()
87 if (gpio_res->ConnectionType == ACPI_RESOURCE_GPIO_TYPE_IO) { in acpi_gpiobus_convflags()
88 switch (gpio_res->IoRestriction) { in acpi_gpiobus_convflags()
98 switch (gpio_res->PinConfig) { in acpi_gpiobus_convflags()
113 ACPI_RESOURCE_GPIO *gpio_res = &res->Data.Gpio; in acpi_gpiobus_enumerate_res()
115 struct gpiobus_softc *super_sc = ctx->sc; in acpi_gpiobus_enumerate_res()
116 ACPI_HANDLE handle; in acpi_gpiobus_enumerate_res() local
119 if (res->Type != ACPI_RESOURCE_TYPE_GPIO) in acpi_gpiobus_enumerate_res()
123 gpio_res->ResourceSource.StringPtr, &handle)) || in acpi_gpiobus_enumerate_res()
124 handle != ctx->dev_handle) in acpi_gpiobus_enumerate_res()
127 if (__predict_false(gpio_res->PinTableLength > super_sc->sc_npins)) { in acpi_gpiobus_enumerate_res()
128 device_printf(super_sc->sc_busdev, in acpi_gpiobus_enumerate_res()
130 gpio_res->PinTableLength, super_sc->sc_npins); in acpi_gpiobus_enumerate_res()
135 for (i = 0; i < gpio_res->PinTableLength; i++) { in acpi_gpiobus_enumerate_res()
136 UINT16 pin = gpio_res->PinTable[i]; in acpi_gpiobus_enumerate_res()
138 if (__predict_false(pin >= super_sc->sc_npins)) { in acpi_gpiobus_enumerate_res()
139 device_printf(super_sc->sc_busdev, in acpi_gpiobus_enumerate_res()
141 pin, super_sc->sc_npins - 1); in acpi_gpiobus_enumerate_res()
145 GPIO_PIN_SETFLAGS(super_sc->sc_dev, pin, flags & in acpi_gpiobus_enumerate_res()
161 resource_list_init(&devi->gpiobus.rl); in acpi_gpiobus_setup_devinfo()
163 devi->flags = acpi_gpiobus_convflags(gpio_res); in acpi_gpiobus_setup_devinfo()
165 devi->flags &= ~GPIO_PIN_PULLUP; in acpi_gpiobus_setup_devinfo()
167 devi->gpiobus.npins = 1; in acpi_gpiobus_setup_devinfo()
168 if (gpiobus_alloc_ivars(&devi->gpiobus) != 0) { in acpi_gpiobus_setup_devinfo()
173 for (int i = 0; i < devi->gpiobus.npins; i++) in acpi_gpiobus_setup_devinfo()
174 devi->gpiobus.pins[i] = gpio_res->PinTable[i]; in acpi_gpiobus_setup_devinfo()
182 ACPI_RESOURCE_GPIO *gpio_res = &res->Data.Gpio; in acpi_gpiobus_enumerate_aei()
184 device_t bus = ctx->sc->sc_busdev; in acpi_gpiobus_enumerate_aei()
189 if (res->Type != ACPI_RESOURCE_TYPE_GPIO) in acpi_gpiobus_enumerate_aei()
191 if (gpio_res->ConnectionType != ACPI_RESOURCE_GPIO_TYPE_INT) in acpi_gpiobus_enumerate_aei()
205 for (int i = 0; i < devi->gpiobus.npins; i++) { in acpi_gpiobus_enumerate_aei()
206 if (GPIOBUS_PIN_SETFLAGS(bus, child, 0, devi->flags)) { in acpi_gpiobus_enumerate_aei()
213 devi->dev_handle = ctx->dev_handle; in acpi_gpiobus_enumerate_aei()
219 acpi_gpiobus_enumerate(ACPI_HANDLE handle, UINT32 depth, void *context, in acpi_gpiobus_enumerate() argument
228 if (!ACPI_FAILURE(acpi_GetInteger(handle, "_STA", &sta)) && in acpi_gpiobus_enumerate()
232 if (!acpi_has_hid(handle)) in acpi_gpiobus_enumerate()
236 AcpiWalkResources(handle, "_CRS", acpi_gpiobus_enumerate_res, context); in acpi_gpiobus_enumerate()
251 status = AcpiBufferToResource(info->Connection, info->Length, &res); in acpi_gpiobus_space_handler()
252 if (ACPI_FAILURE(status) || res->Type != ACPI_RESOURCE_TYPE_GPIO) in acpi_gpiobus_space_handler()
255 gpio_res = &res->Data.Gpio; in acpi_gpiobus_space_handler()
257 handler_info)->super_sc.sc_dev; in acpi_gpiobus_space_handler()
262 gpio_res->IoRestriction == ACPI_IO_RESTRICT_INPUT)) in acpi_gpiobus_space_handler()
267 gpio_res->PinTable[address + i], (*value & 1 << i) ? in acpi_gpiobus_space_handler()
273 gpio_res->IoRestriction == ACPI_IO_RESTRICT_OUTPUT)) in acpi_gpiobus_space_handler()
280 gpio_res->PinTable[address + i], &v) != 0) in acpi_gpiobus_space_handler()
298 acpi_gpiobus_probe(device_t dev) in acpi_gpiobus_probe() argument
305 controller = device_get_parent(dev); in acpi_gpiobus_probe()
312 device_set_desc(dev, "GPIO bus (ACPI-hinted)"); in acpi_gpiobus_probe()
317 acpi_gpiobus_attach(device_t dev) in acpi_gpiobus_attach() argument
321 ACPI_HANDLE handle; in acpi_gpiobus_attach() local
325 if ((err = gpiobus_attach(dev)) != 0) in acpi_gpiobus_attach()
328 sc = device_get_softc(dev); in acpi_gpiobus_attach()
329 handle = acpi_get_handle(sc->super_sc.sc_dev); in acpi_gpiobus_attach()
330 if (handle == NULL) { in acpi_gpiobus_attach()
331 gpiobus_detach(dev); in acpi_gpiobus_attach()
335 status = AcpiInstallAddressSpaceHandler(handle, ACPI_ADR_SPACE_GPIO, in acpi_gpiobus_attach()
336 acpi_gpiobus_space_handler, NULL, &sc->handler_info); in acpi_gpiobus_attach()
339 device_printf(dev, in acpi_gpiobus_attach()
341 gpiobus_detach(dev); in acpi_gpiobus_attach()
345 ctx.dev_handle = handle; in acpi_gpiobus_attach()
346 ctx.sc = &sc->super_sc; in acpi_gpiobus_attach()
352 device_printf(dev, "Failed to enumerate GPIO resources\n"); in acpi_gpiobus_attach()
355 status = AcpiWalkResources(handle, "_AEI", acpi_gpiobus_enumerate_aei, in acpi_gpiobus_attach()
359 device_printf(dev, "Failed to enumerate GPIO resources\n"); in acpi_gpiobus_attach()
365 acpi_gpiobus_detach(device_t dev) in acpi_gpiobus_detach() argument
370 super_sc = device_get_softc(dev); in acpi_gpiobus_detach()
372 acpi_get_handle(super_sc->sc_dev), ACPI_ADR_SPACE_GPIO, in acpi_gpiobus_detach()
377 device_printf(dev, in acpi_gpiobus_detach()
380 return (gpiobus_detach(dev)); in acpi_gpiobus_detach()
395 (*out_pin)->flags = devi->flags; in gpio_pin_get_by_acpi_index()
401 acpi_gpiobus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) in acpi_gpiobus_read_ivar() argument
407 *result = (uintptr_t)devi->dev_handle; in acpi_gpiobus_read_ivar()
410 return (gpiobus_read_ivar(dev, child, which, result)); in acpi_gpiobus_read_ivar()