https://github.com/torvalds/linux
Revision d9ff0eb9ca4b00ce2fbf9ede1e99681f05c0bc91 authored by Youngmin Nam on 08 February 2016, 15:49:28 UTC, committed by Linus Walleij on 15 February 2016, 19:45:50 UTC
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>
1 parent 7864d92
History
Tip revision: d9ff0eb9ca4b00ce2fbf9ede1e99681f05c0bc91 authored by Youngmin Nam on 08 February 2016, 15:49:28 UTC
pinctrl: samsung: fix SMP race condition
Tip revision: d9ff0eb
File Mode Size
.gitignore -rw-r--r-- 151 bytes
Kconfig -rw-r--r-- 2.9 KB
Makefile -rw-r--r-- 2.3 KB
gen_init_cpio.c -rw-r--r-- 12.7 KB
initramfs_data.S -rw-r--r-- 1.3 KB

back to top