• Youngmin Nam's avatar
    pinctrl: samsung: fix SMP race condition · d9ff0eb9
    Youngmin Nam authored
    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: default avatarYoungmin Nam <ym0914@gmail.com>
    Acked-by: default avatarTomasz Figa <tomasz.figa@gmail.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    d9ff0eb9
pinctrl-samsung.c 34.3 KB