OSDN Git Service

pinctrl-bcm2835.c: fix race condition when setting gpio dir
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Thu, 20 Apr 2023 12:47:05 +0000 (14:47 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 21 Apr 2023 09:00:34 +0000 (11:00 +0200)
commitb7badd752de05312fdb1aeb388480f706d0c087f
treea640b8f2ce0e84937ea799b775bb3da9c7290f11
parentb19a1d8f1dbd2410eaa2f4a5f7680197e2647c94
pinctrl-bcm2835.c: fix race condition when setting gpio dir

In the past setting the pin direction called pinctrl_gpio_direction()
which uses a mutex to serialize this. That was changed to set the
direction directly in the pin controller driver, but that lost the
serialization mechanism. Since the direction of multiple pins are in
the same register you can have a race condition, something that was
in fact observed with the cec-gpio driver.

Add a new spinlock to serialize writing to the FSEL registers.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Fixes: 1a4541b68e25 ("pinctrl-bcm2835: don't call pinctrl_gpio_direction()")
Link: https://lore.kernel.org/r/4302b66b-ca20-0f19-d2aa-ee8661118863@xs4all.nl
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/bcm/pinctrl-bcm2835.c