fdt_pinctrl(9)
π NAME π
fdt_pinctrl(9) β helper functions for FDT pinmux controller drivers, straight out of the Kernel Developerβs Manual π
β¨ SYNOPSIS β¨
#include <dev/fdt/fdt_pinctrl.h>
int
fdt_pinctrl_configure(device_t client, u_int index);
int
fdt_pinctrl_configure_by_name(device_t client, const char * name);
int
fdt_pinctrl_register(device_t pinctrl, const char *pinprop);
int
fdt_pinctrl_configure_tree(device_t pinctrl);
π DESCRIPTION π
Okay bestie, so fdt_pinctrl(4) provides an API for manipulating I/O pin configurations on pinmux controllers and pinmux clients. Main character energy for pinmux stuff, honestly.
On the controller side, the standard newbus probe and attach methods are implemented. As part of handling attach, it calls the fdt_pinctrl_register() function to register itself as a pinmux controller. Then fdt_pinctrl_configure_tree() is used to walk the device tree and configure pins specified by the pinctrl-0 property for all active devices. The driver also implements the fdt_pinctrl_configure() method, which allows client devices to change their pin configurations after startup. If a client device requires a pin configuration change at some point of its lifecycle, it uses the fdt_pinctrl_configure() or fdt_pinctrl_configure_by_name() functions. Slay. π
fdt_pinctrl_configure()β used by client device client to request a pin configuration described by thepinctrl-Nproperty with index index.fdt_pinctrl_configure_by_name()β used by client device client to request the pin configuration with name name. Name-based requests, we love to see it. πfdt_pinctrl_register()β registers a pinctrl driver so that it can be used by other devices which callfdt_pinctrl_configure()orfdt_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 isNULL, every descendant node is registered. Important little detail:NULLmeans every descendant node gets registered. It is possible for the driver to register itself as a pinmux controller for more than one pin property type by callingfdt_pinctrl_register()multiple types. (Yes,multiple typesis literally the pageβs wording β we preserve it, no cap.) π«Άfdt_pinctrl_configure_tree()β walks through enabled devices in the device tree. If thepinctrl-0property contains references to child nodes of the specified pinctrl device, their pins are configured. Tree-walking pin config realness. π
π§ EXAMPLES π§
Bestie, hereβs the example code exactly as the page gives it. Do not come for the code formatting, itβs iconic and it stays. π
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);
π SEE ALSO π
fdt_pinctrl(4)β go read the other one too, bestie π¦
πΈ AUTHORS πΈ
This manual page was written by Oleksandr Tymoshenko. We stan a documentation icon π
π
Cute sign-off: this page is from Debian, dated June 23, 2018, and itβs fdt_pinctrl(9). Bye bestie, go configure some pins! π«Άβ¨
π¦ where this page comes from
- freebsd 14.5: base 14.5
- freebsd 15.1: base 15.1
- nixpkgs unstable: source
- Copyright (c) 2018 Oleksandr Tymoshenko
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms