| Main index | Section 9 | Options |
#include <dev/fdt/fdt_pinctrl.h>
fdt_pinctrl_configure() is used by client device client to request a pin configuration described by the pinctrl-N property with index index.
fdt_pinctrl_configure_by_name() is used by client device client to request the pin configuration with name name.
fdt_pinctrl_register() registers a pinctrl driver so that it can be used by other devices which call fdt_pinctrl_configure() or fdt_pinctrl_configure_by_name(). It also registers each child node of the pinctrl driver's node which contains a property with the name given in pinprop. If pinprop is NULL, every descendant node is registered. It is possible for the driver to register itself as a pinmux controller for more than one pin property type by calling fdt_pinctrl_register() multiple types.
fdt_pinctrl_configure_tree() walks through enabled devices in the device tree. If the pinctrl-0 property contains references to child nodes of the specified pinctrl device, their pins are configured.
static 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);
| fdt_pinctrl (9) | June 23, 2018 |
| Main index | Section 9 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
| “ | Do you laugh when the waiter drops a tray full of dishes? Unix weenies do. They're the first ones to laugh at hapless users, trying to figure out an error message that doesn't have anything to do with what they just typed. | ” |
| — The Unix Haters' handbook | ||