pinctrl: samsung: fix SMP race condition
authorYoungmin Nam <ym0914@gmail.com>
Mon, 8 Feb 2016 15:49:28 +0000 (00:49 +0900)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 15 Feb 2016 19:45:50 +0000 (20:45 +0100)
commitd9ff0eb9ca4b00ce2fbf9ede1e99681f05c0bc91
treea0716bd999eba12d87341c334f97b739dc4970a3
parent7864d92621b6897595fa698b27240828592ebd71
pinctrl: samsung: fix SMP race condition

Previously, samsung_gpio_drection_in/output function were not covered
with a spinlock.

For example, samsung_gpio_direction_output function consists of
two functions.
1. samsung_gpio_set
2. samsung_gpio_set_direction

When 2 CPUs try to control the same gpio pin heavily,
(situation like i2c control with gpio emulation)
This situation can cause below problem.

CPU 0                                   | CPU1
                                        |
samsung_gpio_direction_output           |
   samsung_gpio_set(pin A as 1)         | samsung_gpio_direction_output
                                        |    samsung_gpio_set(pin A as 0)
   samsung_gpio_set_direction           |
                                        |    samsung_gpio_set_direction

The initial value of pin A will be set as 0 while we wanted to set pin A as 1.

This patch modifies samsung_gpio_direction_in/output function
to be done in one spinlock to fix race condition.

Additionally, the new samsung_gpio_set_value was added to implement
gpio set callback(samsung_gpio_set) with spinlock using this function.

Cc: stable@vger.kernel.org
Signed-off-by: Youngmin Nam <ym0914@gmail.com>
Acked-by: Tomasz Figa <tomasz.figa@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/samsung/pinctrl-samsung.c