mirror of https://github.com/torvalds/linux.git
The hierarchical parts of MSM pinctrl/GPIO is only
used when the device tree has a "wakeup-parent" as
a phandle, but the .irq_eoi is anyway assigned leading
to semantic problems on elder Qualcomm chipsets.
When the drivers/mfd/qcom-pm8xxx.c driver calls
chained_irq_exit() that call will in turn call chip->irq_eoi()
which is set to irq_chip_eoi_parent() by default on a
hierachical IRQ chip, and the parent is pinctrl-msm.c
so that will in turn unconditionally call
irq_chip_eoi_parent() again, but its parent is invalid
so we get the following crash:
Unnable to handle kernel NULL pointer dereference at
virtual address 00000010
pgd = (ptrval)
[00000010] *pgd=00000000
Internal error: Oops: 5 [#1] PREEMPT SMP ARM
(...)
PC is at irq_chip_eoi_parent+0x4/0x10
LR is at pm8xxx_irq_handler+0x1b4/0x2d8
If we solve this crash by avoiding to call up to
irq_chip_eoi_parent(), the machine will hang and get
reset by the watchdog, because of semantic issues,
probably inside irq_chip.
As a solution, just assign the .irq_eoi conditionally if
we are actually using a wakeup parent.
Cc: David Heidelberg <david@ixit.cz>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Lina Iyer <ilina@codeaurora.org>
Cc: Stephen Boyd <swboyd@chromium.org>
Cc: stable@vger.kernel.org
Fixes:
|
||
|---|---|---|
| .. | ||
| actions | ||
| aspeed | ||
| bcm | ||
| berlin | ||
| cirrus | ||
| freescale | ||
| intel | ||
| mediatek | ||
| meson | ||
| mvebu | ||
| nomadik | ||
| nuvoton | ||
| pxa | ||
| qcom | ||
| samsung | ||
| sh-pfc | ||
| sirf | ||
| spear | ||
| sprd | ||
| stm32 | ||
| sunxi | ||
| tegra | ||
| ti | ||
| uniphier | ||
| vt8500 | ||
| zte | ||
| Kconfig | ||
| Makefile | ||
| core.c | ||
| core.h | ||
| devicetree.c | ||
| devicetree.h | ||
| pinconf-generic.c | ||
| pinconf.c | ||
| pinconf.h | ||
| pinctrl-amd.c | ||
| pinctrl-amd.h | ||
| pinctrl-artpec6.c | ||
| pinctrl-as3722.c | ||
| pinctrl-at91-pio4.c | ||
| pinctrl-at91.c | ||
| pinctrl-at91.h | ||
| pinctrl-axp209.c | ||
| pinctrl-bm1880.c | ||
| pinctrl-coh901.c | ||
| pinctrl-coh901.h | ||
| pinctrl-da850-pupd.c | ||
| pinctrl-digicolor.c | ||
| pinctrl-equilibrium.c | ||
| pinctrl-equilibrium.h | ||
| pinctrl-falcon.c | ||
| pinctrl-gemini.c | ||
| pinctrl-ingenic.c | ||
| pinctrl-lantiq.c | ||
| pinctrl-lantiq.h | ||
| pinctrl-lpc18xx.c | ||
| pinctrl-max77620.c | ||
| pinctrl-mcp23s08.c | ||
| pinctrl-ocelot.c | ||
| pinctrl-oxnas.c | ||
| pinctrl-palmas.c | ||
| pinctrl-pic32.c | ||
| pinctrl-pic32.h | ||
| pinctrl-pistachio.c | ||
| pinctrl-rk805.c | ||
| pinctrl-rockchip.c | ||
| pinctrl-rza1.c | ||
| pinctrl-rza2.c | ||
| pinctrl-rzn1.c | ||
| pinctrl-single.c | ||
| pinctrl-st.c | ||
| pinctrl-stmfx.c | ||
| pinctrl-sx150x.c | ||
| pinctrl-tb10x.c | ||
| pinctrl-u300.c | ||
| pinctrl-utils.c | ||
| pinctrl-utils.h | ||
| pinctrl-xway.c | ||
| pinctrl-zynq.c | ||
| pinmux.c | ||
| pinmux.h | ||