1
0
Fork 0
alistair23-linux/drivers/pinctrl
Youngmin Nam d9ff0eb9ca 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>
2016-02-15 20:45:50 +01:00
..
bcm GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
berlin pinctrl: berlin: guard sub-directory with CONFIG_PINCTRL_BERLIN 2015-12-01 10:39:26 +01:00
freescale pinctrl: freescale: add ZERO_OFFSET_VALID flag for vf610 pinctrl 2015-12-10 18:01:50 +01:00
intel pinctrl: intel: use gpiochip data pointer 2016-01-05 14:14:49 +01:00
mediatek pinctrl: mediatek: fix direction control issue 2016-02-05 14:55:20 +01:00
meson pinctrl: meson: use gpiochip data pointer 2016-01-05 14:14:50 +01:00
mvebu pinctrl: mvebu: fix num_settings in mpp group assignment 2016-02-13 23:51:45 +01:00
nomadik pinctrl: nomadik: hide unused functions 2016-01-28 11:36:00 +01:00
pxa pinctrl: pxa: export pxa2xx_pinctrl_init() 2016-01-27 13:32:42 +01:00
qcom GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
samsung pinctrl: samsung: fix SMP race condition 2016-02-15 20:45:50 +01:00
sh-pfc GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
sirf GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
spear GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
sunxi pinctrl: sunxi: H3 requires irq_read_needs_mux 2016-02-11 14:29:13 +01:00
uniphier pinctrl: uniphier: rework UniPhier pinctrl entries in Kconfig 2015-12-01 10:36:28 +01:00
vt8500 pinctrl: vt8500-wmt: use gpiochip data pointer 2016-01-05 14:15:08 +01:00
Kconfig Linux 4.4-rc5 2015-12-17 14:57:46 +01:00
Makefile pinctrl: activate pxa architecture 2015-12-10 16:14:03 +01:00
core.c drivers/pinctrl: Add the concept of an "init" state 2015-10-27 11:24:23 +01:00
core.h pinctrl: Don't just pretend to protect pinctrl_maps, do it for real 2015-05-06 16:24:28 +02:00
devicetree.c pinctrl: simplify of_pinctrl_get() 2015-07-16 09:39:03 +02:00
devicetree.h pinctrl: core device tree mapping table parsing support 2012-04-18 13:53:10 +02:00
pinconf-generic.c pinctrl: update document for pinconf_generic_parse_dt_config 2015-12-01 11:11:05 +01:00
pinconf.c pinctrl: pinconf: remove needless loop 2015-10-31 22:13:07 +01:00
pinconf.h pinctrl: pinconf-generic: Allow driver to specify DT params 2015-01-11 22:32:19 +01:00
pinctrl-adi2-bf54x.c pinctrl: pinctrl-adi: combine multiple groups of one function together 2014-02-25 10:49:13 +01:00
pinctrl-adi2-bf60x.c added tabs instead of spaces 2015-07-16 09:39:01 +02:00
pinctrl-adi2.c GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
pinctrl-adi2.h pinctrl: pinctrl-adi: combine multiple groups of one function together 2014-02-25 10:49:13 +01:00
pinctrl-amd.c pinctrl: amd: use gpiochip data pointer 2016-01-05 14:14:52 +01:00
pinctrl-amd.h Fix inconsistent spinlock of AMD GPIO driver which can be 2015-04-07 11:36:49 +02:00
pinctrl-as3722.c pinctrl: as3722: use gpiochip data pointer 2016-01-05 14:14:53 +01:00
pinctrl-at91-pio4.c GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
pinctrl-at91.c GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
pinctrl-at91.h pinctrl: at91: use own header 2014-10-29 09:28:35 +01:00
pinctrl-coh901.c pinctrl: u300: use gpiochip data pointer 2016-01-05 14:14:54 +01:00
pinctrl-coh901.h
pinctrl-digicolor.c pinctrl: digicolor: use gpiochip data pointer 2016-01-05 14:14:55 +01:00
pinctrl-falcon.c staging: drivers: pinctrl: Fixed checkpatch.pl warnings 2015-01-21 11:02:26 +01:00
pinctrl-lantiq.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-lantiq.h pinctrl/lantiq: introduce new dedicated devicetree bindings 2015-11-30 13:12:07 +01:00
pinctrl-lpc18xx.c This is the bulk of pin control changes for the v4.3 development 2015-09-04 10:22:09 -07:00
pinctrl-palmas.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-pistachio.c pinctrl: pistachio: use gpiochip data pointer 2016-01-05 14:14:55 +01:00
pinctrl-rockchip.c GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
pinctrl-single.c pinctrl: Delete unnecessary checks 2015-11-17 11:49:50 +01:00
pinctrl-st.c pinctrl: st: use gpiochip data pointer 2016-01-05 14:14:57 +01:00
pinctrl-tb10x.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-tegra-xusb.c pinctrl-tegra: add missing of_node_put 2015-12-22 13:44:00 +01:00
pinctrl-tegra.c pinctrl-tegra: add missing of_node_put 2015-12-22 13:44:00 +01:00
pinctrl-tegra.h pinctrl: tegra: use signed bitfields for optional fields 2015-03-19 09:20:17 +01:00
pinctrl-tegra20.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra30.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra114.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra124.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra210.c pinctrl: tegra: add a driver for Tegra210 2015-03-09 18:10:59 +01:00
pinctrl-tz1090-pdc.c pinctrl: tz1090-pdc: Remove unneded semicolons 2015-10-02 04:06:46 -07:00
pinctrl-tz1090.c pinctrl: tz1090: Remove unneded semicolons 2015-10-02 04:06:46 -07:00
pinctrl-u300.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-utils.c pinctrl: utils: include export.h to avoid warnings 2013-08-28 15:50:33 +02:00
pinctrl-utils.h pinctrl: add utility functions for add map/configs 2013-08-14 21:00:41 +02:00
pinctrl-xway.c GPIO bulk updates for the v4.5 kernel cycle: 2016-01-17 12:32:01 -08:00
pinctrl-zynq.c pinctrl: zynq: fix UTF-8 errors 2015-10-31 22:12:59 +01:00
pinmux.c pinctrl: join lines that can be a single line within 80 columns 2015-09-14 09:13:43 +02:00
pinmux.h pinctrl: ifdef CONFIG_DEBUG_FS cleanup 2012-04-18 13:53:12 +02:00