|
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.
|