linux-uconsole/drivers/pinctrl
Hans de Goede bbe414a1ab pinctrl: baytrail: Really serialize all register accesses
[ Upstream commit 40ecab5512 ]

Commit 39ce8150a0 ("pinctrl: baytrail: Serialize all register access")
added a spinlock around all register accesses because:

"There is a hardware issue in Intel Baytrail where concurrent GPIO register
 access might result reads of 0xffffffff and writes might get dropped
 completely."

Testing has shown that this does not catch all cases, there are still
2 problems remaining

1) The original fix uses a spinlock per byt_gpio device / struct,
additional testing has shown that this is not sufficient concurent
accesses to 2 different GPIO banks also suffer from the same problem.

This commit fixes this by moving to a single global lock.

2) The original fix did not add a lock around the register accesses in
the suspend/resume handling.

Since pinctrl-baytrail.c is using normal suspend/resume handlers,
interrupts are still enabled during suspend/resume handling. Nothing
should be using the GPIOs when they are being taken down, _but_ the
GPIOs themselves may still cause interrupts, which are likely to
use (read) the triggering GPIO. So we need to protect against
concurrent GPIO register accesses in the suspend/resume handlers too.

This commit fixes this by adding the missing spin_lock / unlock calls.

The 2 fixes together fix the Acer Switch 10 SW5-012 getting completely
confused after a suspend resume. The DSDT for this device has a bug
in its _LID method which reprograms the home and power button trigger-
flags requesting both high and low _level_ interrupts so the IRQs for
these 2 GPIOs continuously fire. This combined with the saving of
registers during suspend, triggers concurrent GPIO register accesses
resulting in saving 0xffffffff as pconf0 value during suspend and then
when restoring this on resume the pinmux settings get all messed up,
resulting in various I2C busses being stuck, the wifi no longer working
and often the tablet simply not coming out of suspend at all.

Cc: stable@vger.kernel.org
Fixes: 39ce8150a0 ("pinctrl: baytrail: Serialize all register access")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-01-04 19:13:45 +01:00
..
actions
aspeed
bcm pinctrl: bcm2835: Use define directive for BCM2835_PINCONF_PARAM_PULL 2019-12-01 09:17:32 +01:00
berlin
cirrus pinctrl: madera: Fix uninitialized variable bug in madera_mux_set_mux 2019-12-01 09:16:15 +01:00
freescale
intel pinctrl: baytrail: Really serialize all register accesses 2020-01-04 19:13:45 +01:00
mediatek pinctrl: mediatek: Update cur_mask in mask/mask ops 2019-07-21 09:03:11 +02:00
meson pinctrl: meson-gxbb: Fix wrong pinning definition for uart_c 2019-10-07 18:57:00 +02:00
mvebu pinctrl: armada-37xx: Fix irq mask access in armada_37xx_irq_set_type() 2019-12-17 20:35:07 +01:00
nomadik
pxa
qcom pinctrl: qcom: ssbi-gpio: fix gpio-hog related boot issues 2019-12-13 08:51:26 +01:00
samsung pinctrl: samsung: Fix device node refcount leaks in S3C64xx wakeup controller init 2019-12-17 20:35:11 +01:00
sh-pfc pinctrl: sh-pfc: sh7734: Fix duplicate TCLK1_B 2019-12-31 16:35:32 +01:00
sirf
spear
sprd pinctrl: sprd: Use define directive for sprd_pinconf_params values 2019-10-01 08:26:07 +02:00
stm32 pinctrl: stm32: fix memory leak issue 2019-12-05 09:21:35 +01:00
sunxi pinctrl: sunxi: Fix a memory leak in 'sunxi_pinctrl_build_state()' 2019-12-01 09:16:24 +01:00
tegra pinctrl: tegra: Fix write barrier placement in pmx_writel 2019-10-07 18:56:52 +02:00
ti
uniphier
vt8500
zte pinctrl: zte: fix leaked of_node references 2019-05-31 06:46:09 -07:00
core.c pinctrl: core: make sure strcmp() doesn't get a null parameter 2019-04-20 09:16:01 +02:00
core.h
devicetree.c pinctrl: devicetree: Avoid taking direct reference to device name string 2019-12-31 16:34:53 +01:00
devicetree.h
Kconfig
Makefile
pinconf-generic.c
pinconf.c
pinconf.h
pinctrl-amd.c pinctrl: amd: fix __iomem annotation in amd_gpio_irq_handler() 2019-12-31 16:35:35 +01:00
pinctrl-amd.h
pinctrl-artpec6.c
pinctrl-as3722.c
pinctrl-at91-pio4.c pinctrl: at91-pio4: fix has_config check in atmel_pctl_dt_subnode_to_map() 2019-11-20 18:46:35 +01:00
pinctrl-at91.c pinctrl: at91: don't use the same irqchip with multiple gpiochips 2019-11-20 18:46:41 +01:00
pinctrl-at91.h
pinctrl-axp209.c
pinctrl-coh901.c
pinctrl-coh901.h
pinctrl-da850-pupd.c
pinctrl-digicolor.c
pinctrl-falcon.c
pinctrl-gemini.c pinctrl: gemini: Fix up TVC clock group 2019-11-24 08:20:58 +01:00
pinctrl-ingenic.c pinctrl: ingenic: Probe driver at subsys_initcall 2019-11-20 18:45:34 +01:00
pinctrl-lantiq.c
pinctrl-lantiq.h
pinctrl-lpc18xx.c pinctrl: lpc18xx: Use define directive for PIN_CONFIG_GPIO_PIN_INT 2019-12-01 09:17:33 +01:00
pinctrl-max77620.c pinctrl: max77620: Use define directive for max77620_pinconf_param values 2019-02-27 10:09:03 +01:00
pinctrl-mcp23s08.c pinctrl: mcp23s08: Fix add_data and irqchip_add_nested call order 2019-07-21 09:03:08 +02:00
pinctrl-ocelot.c
pinctrl-oxnas.c
pinctrl-palmas.c
pinctrl-pic32.c
pinctrl-pic32.h
pinctrl-pistachio.c pinctrl: pistachio: fix leaked of_node references 2019-05-31 06:46:16 -07:00
pinctrl-rk805.c
pinctrl-rockchip.c pinctrl: rockchip: fix leaked of_node references 2019-07-31 07:26:57 +02:00
pinctrl-rza1.c
pinctrl-single.c
pinctrl-st.c
pinctrl-sx150x.c
pinctrl-tb10x.c
pinctrl-u300.c
pinctrl-utils.c
pinctrl-utils.h
pinctrl-xway.c pinctrl: xway: fix gpio-hog related boot issues 2019-12-05 09:20:30 +01:00
pinctrl-zynq.c pinctrl: zynq: Use define directive for PIN_CONFIG_IO_STANDARD 2019-12-01 09:17:33 +01:00
pinmux.c
pinmux.h