![]() |
![]()
| ![]() |
![]()
NAME
SYNOPSIS
int
int
int
int
DESCRIPTIONfdt_pinctrl(4)
provides an API for manipulating I/O pin configurations on pinmux
controllers and pinmux clients. On the controller side, the standard newbus
probe and attach methods are implemented. As part of handling attach, it
calls the
EXAMPLESstatic int foo_configure_pins(device_t dev, phandle_t cfgxref) { phandle_t cfgnode; uint32_t *pins, *functions; int npins, nfunctions; cfgnode = OF_node_from_xref(cfgxref); pins = NULL; npins = OF_getencprop_alloc_multi(cfgnode, "foo,pins", sizeof(*pins), (void **)&pins); functions = NULL; nfunctions = OF_getencprop_alloc_multi(cfgnode, "foo,functions", sizeof(*functions), (void **)&functions); ... } static int foo_is_gpio(device_t dev, device_t gpiodev, bool *is_gpio) { return (foo_is_pin_func_gpio(is_gpio)); } static int foo_set_flags(device_t dev, device_t gpiodev, uint32_t pin, uint32_t flags) { int rv; rv = foo_is_pin_func_gpio(is_gpio); if (rv != 0) return (rv); foo_set_flags(pin, flags); return (0); } static int foo_get_flags(device_t dev, device_t gpiodev, uint32_t pin, uint32_t *flags) { int rv; rv = foo_is_pin_func_gpio(is_gpio); if (rv != 0) return (rv); foo_get_flags(pin, flags); return (0); } static int foo_attach(device_t dev) { ... fdt_pinctrl_register(dev, "foo,pins"); /* * It is possible to register more than one pinprop handler */ fdt_pinctrl_register(dev, "bar,pins"); fdt_pinctrl_configure_tree(dev); return (0); } static device_method_t foo_methods[] = { ... /* fdt_pinctrl interface */ DEVMETHOD(fdt_pinctrl_configure, foo_configure_pins), DEVMETHOD(fdt_pinctrl_is_gpio, foo_is_gpio), DEVMETHOD(fdt_pinctrl_set_flags, foo_set_flags), DEVMETHOD(fdt_pinctrl_get_flags, foo_get_flags), /* Terminate method list */ DEVMETHOD_END }; DRIVER_MODULE(foo, simplebus, foo_driver, foo_devclass, NULL, NULL); SEE ALSOAUTHORSThis manual page was written by Oleksandr Tymoshenko.
|