Lines Matching +full:pins +full:- +full:bus

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
33 #include <sys/bus.h>
51 * Utility functions for easier handling of OFW GPIO pins.
71 rv = ofw_bus_parse_xref_list_alloc(cnode, prop_name, "#gpio-cells", in gpio_pin_get_by_ofw_propidx()
83 /* Test if GPIO bus already exist. */ in gpio_pin_get_by_ofw_propidx()
133 rv = ofw_bus_find_string_index(node, "gpio-names", name, &idx); in gpio_pin_get_by_ofw_name()
143 ofw_gpiobus_add_fdt_child(device_t bus, const char *drvname, phandle_t child) in ofw_gpiobus_add_fdt_child() argument
154 childdev = ofw_bus_find_child_device_by_phandle(bus, child); in ofw_gpiobus_add_fdt_child()
159 * Set up the GPIO child and OFW bus layer devinfo and add it to bus. in ofw_gpiobus_add_fdt_child()
161 childdev = device_add_child(bus, drvname, DEVICE_UNIT_ANY); in ofw_gpiobus_add_fdt_child()
164 dinfo = ofw_gpiobus_setup_devinfo(bus, childdev, child); in ofw_gpiobus_add_fdt_child()
166 device_delete_child(bus, childdev); in ofw_gpiobus_add_fdt_child()
170 ofw_gpiobus_destroy_devinfo(bus, dinfo); in ofw_gpiobus_add_fdt_child()
171 device_delete_child(bus, childdev); in ofw_gpiobus_add_fdt_child()
175 devi = &dinfo->opd_dinfo; in ofw_gpiobus_add_fdt_child()
176 for (i = 0; i < devi->npins; i++) in ofw_gpiobus_add_fdt_child()
177 GPIOBUS_PIN_SETNAME(bus, devi->pins[i], in ofw_gpiobus_add_fdt_child()
185 struct gpiobus_pin **pins) in ofw_gpiobus_parse_gpios() argument
189 ofw_bus_get_node(consumer), pname, NULL, pins)); in ofw_gpiobus_parse_gpios()
198 if (node != -1) in ofw_gpiobus_register_provider()
208 if (node != -1) in ofw_gpiobus_unregister_provider()
213 ofw_gpiobus_setup_devinfo(device_t bus, device_t child, phandle_t node) in ofw_gpiobus_setup_devinfo() argument
217 struct gpiobus_pin *pins; in ofw_gpiobus_setup_devinfo() local
221 sc = device_get_softc(bus); in ofw_gpiobus_setup_devinfo()
225 if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, node) != 0) { in ofw_gpiobus_setup_devinfo()
230 npins = ofw_gpiobus_parse_gpios_impl(child, node, "gpios", sc, &pins); in ofw_gpiobus_setup_devinfo()
232 ofw_bus_gen_destroy_devinfo(&dinfo->opd_obdinfo); in ofw_gpiobus_setup_devinfo()
237 resource_list_init(&dinfo->opd_dinfo.rl); in ofw_gpiobus_setup_devinfo()
239 devi = &dinfo->opd_dinfo; in ofw_gpiobus_setup_devinfo()
240 devi->npins = (uint32_t)npins; in ofw_gpiobus_setup_devinfo()
242 free(pins, M_DEVBUF); in ofw_gpiobus_setup_devinfo()
243 ofw_gpiobus_destroy_devinfo(bus, dinfo); in ofw_gpiobus_setup_devinfo()
246 for (i = 0; i < devi->npins; i++) in ofw_gpiobus_setup_devinfo()
247 devi->pins[i] = pins[i].pin; in ofw_gpiobus_setup_devinfo()
248 free(pins, M_DEVBUF); in ofw_gpiobus_setup_devinfo()
250 if (ofw_bus_intr_to_rl(bus, node, &dinfo->opd_dinfo.rl, NULL) != 0) { in ofw_gpiobus_setup_devinfo()
251 ofw_gpiobus_destroy_devinfo(bus, dinfo); in ofw_gpiobus_setup_devinfo()
260 ofw_gpiobus_destroy_devinfo(device_t bus, struct ofw_gpiobus_devinfo *dinfo) in ofw_gpiobus_destroy_devinfo() argument
266 sc = device_get_softc(bus); in ofw_gpiobus_destroy_devinfo()
267 devi = &dinfo->opd_dinfo; in ofw_gpiobus_destroy_devinfo()
268 for (i = 0; i < devi->npins; i++) { in ofw_gpiobus_destroy_devinfo()
269 if (devi->pins[i] > sc->sc_npins) in ofw_gpiobus_destroy_devinfo()
271 sc->sc_pins[devi->pins[i]].mapped = 0; in ofw_gpiobus_destroy_devinfo()
274 resource_list_free(&dinfo->opd_dinfo.rl); in ofw_gpiobus_destroy_devinfo()
275 ofw_bus_gen_destroy_devinfo(&dinfo->opd_obdinfo); in ofw_gpiobus_destroy_devinfo()
281 struct gpiobus_softc *bussc, struct gpiobus_pin **pins) in ofw_gpiobus_parse_gpios_impl() argument
289 if (ncells == -1) { in ofw_gpiobus_parse_gpios_impl()
293 return (-1); in ofw_gpiobus_parse_gpios_impl()
296 * The gpio-specifier is controller independent, the first pcell has in ofw_gpiobus_parse_gpios_impl()
298 * Count the number of encoded gpio-specifiers on the first pass. in ofw_gpiobus_parse_gpios_impl()
312 if (ofw_bus_get_node(bussc->sc_dev) != gpio) in ofw_gpiobus_parse_gpios_impl()
315 * Check for gpio-controller property and read the #gpio-cells in ofw_gpiobus_parse_gpios_impl()
318 if (!OF_hasprop(gpio, "gpio-controller") || in ofw_gpiobus_parse_gpios_impl()
319 OF_getencprop(gpio, "#gpio-cells", &gpiocells, in ofw_gpiobus_parse_gpios_impl()
322 "gpio reference is not a gpio-controller.\n"); in ofw_gpiobus_parse_gpios_impl()
324 return (-1); in ofw_gpiobus_parse_gpios_impl()
326 if (ncells - i < gpiocells + 1) { in ofw_gpiobus_parse_gpios_impl()
328 "%s cells doesn't match #gpio-cells.\n", pname); in ofw_gpiobus_parse_gpios_impl()
329 return (-1); in ofw_gpiobus_parse_gpios_impl()
334 if (npins == 0 || pins == NULL) { in ofw_gpiobus_parse_gpios_impl()
341 *pins = malloc(sizeof(struct gpiobus_pin) * npins, M_DEVBUF, in ofw_gpiobus_parse_gpios_impl()
343 if (*pins == NULL) { in ofw_gpiobus_parse_gpios_impl()
345 return (-1); in ofw_gpiobus_parse_gpios_impl()
358 /* Read gpio-cells property for this GPIO controller. */ in ofw_gpiobus_parse_gpios_impl()
359 if (OF_getencprop(gpio, "#gpio-cells", &gpiocells, in ofw_gpiobus_parse_gpios_impl()
362 "gpio does not have the #gpio-cells property.\n"); in ofw_gpiobus_parse_gpios_impl()
366 (*pins)[j].dev = OF_device_from_xref(gpios[i]); in ofw_gpiobus_parse_gpios_impl()
367 if ((*pins)[j].dev == NULL) { in ofw_gpiobus_parse_gpios_impl()
378 if (GPIO_GET_BUS((*pins)[j].dev) == NULL) { in ofw_gpiobus_parse_gpios_impl()
381 device_get_nameunit((*pins)[j].dev)); in ofw_gpiobus_parse_gpios_impl()
384 bussc = device_get_softc(GPIO_GET_BUS((*pins)[j].dev)); in ofw_gpiobus_parse_gpios_impl()
387 if (gpio_map_gpios((*pins)[j].dev, cnode, gpio, gpiocells, in ofw_gpiobus_parse_gpios_impl()
388 &gpios[i + 1], &(*pins)[j].pin, &(*pins)[j].flags) != 0) { in ofw_gpiobus_parse_gpios_impl()
394 if (gpiobus_acquire_pin(bussc->sc_busdev, (*pins)[j].pin) != 0) in ofw_gpiobus_parse_gpios_impl()
405 free(*pins, M_DEVBUF); in ofw_gpiobus_parse_gpios_impl()
406 return (-1); in ofw_gpiobus_parse_gpios_impl()
413 if (ofw_bus_get_node(dev) == -1) in ofw_gpiobus_probe()
415 device_set_desc(dev, "OFW GPIO bus"); in ofw_gpiobus_probe()
439 if (OF_hasprop(child, "gpio-hog")) in ofw_gpiobus_attach()
463 * NULL all the OFW-related parts of the ivars for non-OFW in ofw_gpiobus_add_child()
467 devi->opd_obdinfo.obd_node = -1; in ofw_gpiobus_add_child()
468 devi->opd_obdinfo.obd_name = NULL; in ofw_gpiobus_add_child()
469 devi->opd_obdinfo.obd_compat = NULL; in ofw_gpiobus_add_child()
470 devi->opd_obdinfo.obd_type = NULL; in ofw_gpiobus_add_child()
471 devi->opd_obdinfo.obd_model = NULL; in ofw_gpiobus_add_child()
477 ofw_gpiobus_get_devinfo(device_t bus, device_t dev) in ofw_gpiobus_get_devinfo() argument
483 return (&dinfo->opd_obdinfo); in ofw_gpiobus_get_devinfo()
491 /* Bus interface */