Hi all, Based on this discussion: https://lore.kernel.org/linux-gpio/CACRpkdb3q4-9O3dHS6QDWnZZ5JJjXWXS9KPvwXVaowLMRhcejA@xxxxxxxxxxxxxx/T/#t I propose this RFC series. The first patch adds a check if can_sleep is true when pinctrl_gpio_direction() is called. It does this only once per pin controller (a new field is added to keep track if this has been checked or not). If the gpio driver set can_sleep to false, then it makes no sense that pinctrl_gpio_direction() is called since it takes two different mutexes. This way you get at least a warning that something is wrong, rather than only if CONFIG_DEBUG_ATOMIC_SLEEP is set. However, if there are gpio drivers that call pinctrl_gpio_direction() always from non-atomic contexts (so never via gpiod_get/set_value() etc.) then I'm not sure if this check is possible here. The second and third patches convert the bcm2835 and sunxi pinctrl drivers to set the direction in those drivers directly, rather than by calling pinctrl_gpio_direction_input/output. Both set can_sleep to false, so going through a code path that uses mutexes is not a good idea. This series has been tested with the cec-gpio driver on a Raspberry Pi 4b and with an A10 Cubieboard. Both pincontroller drivers set can_sleep to false, but call pinctrl_gpio_direction_input/output(). Those last two patches look sane to me. Regards, Hans Hans Verkuil (3): pinctrl/core: check that can_sleep is true in pinctrl_gpio_direction() pinctrl-bcm2835: don't call pinctrl_gpio_direction() pinctrl-sunxi: don't call pinctrl_gpio_direction() drivers/pinctrl/bcm/pinctrl-bcm2835.c | 12 +++++++++--- drivers/pinctrl/core.c | 11 +++++++++++ drivers/pinctrl/core.h | 4 ++++ drivers/pinctrl/sunxi/pinctrl-sunxi.c | 8 ++++++-- 4 files changed, 30 insertions(+), 5 deletions(-) -- 2.33.0