
Hey,
I'm wondering if there is documentation or a good example on how to configure pin muxing in combination with the gpio_request functions. Our current implementation is incomplete as it doesn't handle the muxing, but before randomly copying code I would like to know what the "upstream" way of doing things like this is, so maybe someone can advise.
The goal is to define N pins as "revision pins" (basically pull up/down resistors for board revisions) in the dts and based upon this definition read the pins and calculate a value. Our current implementation just has a pin list like this:
board-rev-gpios = < &gpio0 1 GPIO_ACTIVE_HIGH &gpio0 2 GPIO_ACTIVE_HIGH &gpio0 3 GPIO_ACTIVE_HIGH
;
and uses gpio_request_list_by_name() to access those by name, this works as long as no muxing is required.
My current understanding of the full solution would be to define not only the gpios, but also a pinctrl, sth like this:
DTS: board_rev { pinctrl-names = "gpio"; pinctrl-0 = <&pinctrl_board_rev>; gpios = < &gpio0 1 GPIO_ACTIVE_HIGH &gpio0 2 GPIO_ACTIVE_HIGH &gpio0 3 GPIO_ACTIVE_HIGH >; };
pinctrl_board_rev: i2c1grp { fsl,pins = < MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO0 0x400001c3 MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO2 0x400001c3 MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO3 0x400001c3 >; };
Code: /* get board_rev node as board_rev, prepare arrays, ... */ gpio_request_list_by_name(board_rev, "gpios", gpios, ARRAY_SIZE(gpios), GPIOD_IS_IN); pinctrl_select_state(board_rev, "gpio");
Would this be the correct way to use the muxing functionality?
Best regards, Olli