linux_dsm_epyc7002/drivers/mmc/host
Stephen Warren d4d1144908 mmc: don't request CD IRQ until mmc_start_host()
As soon as the CD IRQ is requested, it can trigger, since it's an
externally controlled event. If it does, delayed_work host->detect will
be scheduled.

Many host controller probe()s are roughly structured as:

*_probe() {
    host = sdhci_pltfm_init();
    mmc_of_parse(host->mmc);
    rc = sdhci_add_host(host);
    if (rc) {
        sdhci_pltfm_free();
        return rc;
    }

In 3.17, CD IRQs can are enabled quite early via *_probe() ->
mmc_of_parse() -> mmc_gpio_request_cd() -> mmc_gpiod_request_cd_irq().

Note that in linux-next, mmc_of_parse() calls mmc_gpio*d*_request_cd()
rather than mmc_gpio_request_cd(), and mmc_gpio*d*_request_cd() doesn't
call mmc_gpiod_request_cd_irq(). However, this issue still exists if
mmc_gpio_request_cd() is called directly before mmc_start_host().

sdhci_add_host() may fail part way through (e.g. due to deferred
probe for a vmmc regulator), and sdhci_pltfm_free() does nothing to
unrequest the CD IRQ nor cancel the delayed_work. sdhci_pltfm_free() is
coded to assume that if sdhci_add_host() failed, then the delayed_work
cannot (or should not) have been triggered.

This can lead to the following with CONFIG_DEBUG_OBJECTS_* enabled, when
kfree(host) is eventually called inside sdhci_pltfm_free():

WARNING: CPU: 2 PID: 6 at lib/debugobjects.c:263 debug_print_object+0x8c/0xb4()
ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x18

The object being complained about is host->detect.

There's no need to request the CD IRQ so early; mmc_start_host() already
requests it. For most SDHCI hosts at least, the typical call path that
does this is: *_probe() -> sdhci_add_host() -> mmc_add_host() ->
mmc_start_host(). Therefore, remove the call to mmc_gpiod_request_cd_irq()
from mmc_gpio_request_cd(). This also matches mmc_gpio*d*_request_cd(),
which already doesn't call mmc_gpiod_request_cd_irq().

However, some host controller drivers call mmc_gpio_request_cd() after
mmc_start_host() has already been called, and assume that this will also
call mmc_gpiod_request_cd_irq(). Update those drivers to explicitly call
mmc_gpiod_request_cd_irq() themselves. Ideally, these drivers should be
modified to move their call to mmc_gpio_request_cd() before their call
to mmc_add_host(). However that's too large a change for stable.

This solves the problem (eliminates the kernel error message above),
since it guarantees that the IRQ can't trigger before mmc_start_host()
is called.

The critical point here is that once sdhci_add_host() calls
mmc_add_host() -> mmc_start_host(), sdhci_add_host() is coded not to
fail. In other words, if there's a chance that mmc_start_host() may have
been called, and CD IRQs triggered, and the delayed_work scheduled,
sdhci_add_host() won't fail, and so cleanup is no longer via
sdhci_pltfm_free() (which doesn't free the IRQ or cancel the work queue)
but instead must be via sdhci_remove_host(), which calls mmc_remove_host()
-> mmc_stop_host(), which does free the IRQ and cancel the work queue.

CC: Russell King <linux@arm.linux.org.uk>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexandre Courbot <acourbot@nvidia.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: <stable@vger.kernel.org> # v3.15+
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2014-09-23 09:01:36 +02:00
..
android-goldfish.c mmc: remove unnecessary platform_set_drvdata() 2013-05-26 14:23:23 -04:00
atmel-mci-regs.h
atmel-mci.c mmc: atmel-mci: add 0x600 IP version 2014-09-09 13:59:08 +02:00
au1xmmc.c mmc: au1xmmc: fix error return code in au1xmmc_probe() 2014-09-09 13:59:01 +02:00
bfin_sdh.c mmc: bfin_sdh: Move away from using deprecated APIs 2013-10-30 20:26:36 -04:00
cb710-mmc.c mmc: cb710: Move away from using deprecated APIs 2013-10-30 20:26:37 -04:00
cb710-mmc.h mmc: host: use platform_{get,set}_drvdata() 2013-06-27 11:13:02 -04:00
davinci_mmc.c mmc: davinci: Remove redundant of_match_ptr 2014-02-25 15:42:55 -05:00
dw_mmc-exynos.c mmc: dw_mmc: exynos: Staticize dw_mci_exynos_pmops 2014-05-12 18:04:30 -04:00
dw_mmc-k3.c mmc: dw_mmc: fix possible build error 2014-03-03 14:00:56 -05:00
dw_mmc-pci.c mmc: dw_mmc-pci: Remove superflous #else condition on CONFIG_PM_SLEEP 2014-09-09 13:59:05 +02:00
dw_mmc-pltfm.c mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
dw_mmc-pltfm.h
dw_mmc-rockchip.c mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
dw_mmc.c mmc: dw_mmc: Remove unused function for !CONFIG_OF 2014-09-19 00:03:37 +02:00
dw_mmc.h mmc: dw_mmc: Support voltage changes 2014-09-09 13:59:18 +02:00
jz4740_mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
Kconfig mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
Makefile mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
mmc_spi.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
mmci_qcom_dml.c mmc: mmci: Add qcom dml support to the driver. 2014-09-09 13:58:46 +02:00
mmci_qcom_dml.h mmc: mmci: Add qcom dml support to the driver. 2014-09-09 13:58:46 +02:00
mmci.c mmc: mmci: rename sdio flag in vendor data to st_sdio 2014-09-10 09:43:30 +02:00
mmci.h mmc: mmci: Add Qcom specific rx_fifocnt logic. 2014-07-09 11:25:57 +02:00
moxart-mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
msm_sdcc.c mmc: msm_sdcc: Move away from using deprecated APIs 2013-10-30 20:26:41 -04:00
msm_sdcc.h
mvsdio.c mmc: mvsdio: avoid compiler warning 2014-06-12 10:50:27 +02:00
mvsdio.h
mxcmmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
mxs-mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
of_mmc_spi.c mmc: mmc_spi: Support CD/RO GPIOs 2013-08-24 23:45:22 -04:00
omap_hsmmc.c mmc: use .multi_io_quirk on omap_hsmmc 2014-09-09 14:10:42 +02:00
omap.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
pxamci.c mmc: pxamci: prepare and unprepare the clocks 2014-09-09 13:59:24 +02:00
pxamci.h
rtsx_pci_sdmmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
rtsx_usb_sdmmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
s3cmci.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
s3cmci.h mmc: s3cmci: port DMA code to dmaengine API 2014-07-09 11:26:13 +02:00
sdhci-acpi.c mmc: sdhci-acpi: add probe_slot method for emmc/sd/sdio 2014-09-09 13:59:24 +02:00
sdhci-bcm2835.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-bcm-kona.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-cns3xxx.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-dove.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-esdhc-imx.c mmc: sdhci-esdhc-imx: set the correct max timeout value for uSDHC 2014-09-09 13:59:21 +02:00
sdhci-esdhc.h mmc: sdhci: convert sdhci_set_clock() into a library function 2014-05-22 07:26:32 -04:00
sdhci-msm.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-of-arasan.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-of-esdhc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-of-hlwd.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-pci-data.c
sdhci-pci-o2micro.c mmc: sdhci-pci-o2micro: Add SeaBird SeaEagle SD3 support 2014-05-22 08:40:44 -04:00
sdhci-pci-o2micro.h mmc: sdhci-pci-o2micro: Add SeaBird SeaEagle SD3 support 2014-05-22 08:40:44 -04:00
sdhci-pci.c mmc: sdhci-pci: disable preset register for Baytrail and Merrifield 2014-09-09 13:59:26 +02:00
sdhci-pci.h mmc: sdhci: Add PCI IDs for Intel Braswell 2014-09-09 13:59:17 +02:00
sdhci-pltfm.c mmc: sdhci-pltfm: Do not use parent as the host's device 2014-09-09 13:58:58 +02:00
sdhci-pltfm.h mmc: sdhci-pltfm: export pltfm suspend/resume api 2014-01-13 12:48:06 -05:00
sdhci-pxav2.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-pxav3.c mmc: sdhci-pxav3: fix error handling of sdhci_add_host 2014-09-10 15:54:04 +02:00
sdhci-s3c-regs.h mmc: sdhci-s3c: remove platform dependencies 2013-04-19 13:51:23 +02:00
sdhci-s3c.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-sirf.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
sdhci-spear.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-st.c mmc: sdhci-st: Intial support for ST SDHCI controller 2014-07-10 09:11:18 +02:00
sdhci-tegra.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci.c mmc: sdhci: check 1.2v IO capability for SDHC host 2014-09-09 13:59:25 +02:00
sdhci.h mmc: sdhci: add platform set_timeout hook 2014-09-09 13:59:21 +02:00
sdricoh_cs.c mmc: sdricoh_cs: Move away from using deprecated APIs 2013-10-30 20:28:32 -04:00
sh_mmcif.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sh_mobile_sdhi.c mmc: use .multi_io_quirk on sh_mobile 2014-09-09 14:15:42 +02:00
sunxi-mmc.c mmc: sunxi: Declare ERASE capability 2014-09-09 13:59:17 +02:00
tifm_sd.c mmc: tifm_sd: Move away from using deprecated APIs 2013-10-30 20:28:23 -04:00
tmio_mmc_dma.c mmc: tmio: remove Renesas specific #ifdef 2014-09-09 13:59:15 +02:00
tmio_mmc_pio.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
tmio_mmc.c mmc: tmio_mmc: Fixup system PM suspend lock-up 2014-09-09 13:59:12 +02:00
tmio_mmc.h mmc: tmio: Remove library functions for system PM 2014-09-09 13:59:12 +02:00
usdhi6rol0.c mmc: usdhi6rol0: fix compiler warnings 2014-06-12 10:38:50 +02:00
ushc.c mmc: ushc: Fix incorrect parameter in sizeof 2014-02-25 15:42:20 -05:00
via-sdmmc.c mmc: via-sdmmc: Move away from using deprecated APIs 2013-10-30 20:28:36 -04:00
vub300.c mmc: vub300: Move away from using deprecated APIs 2013-10-30 20:26:43 -04:00
wbsd.c mmc: wbsd: Silence compiler warning 2013-11-08 14:32:03 -05:00
wbsd.h
wmt-sdmmc.c mmc: wmt-sdmmc: Remove deprecated IRQF_DISABLED 2014-07-09 11:26:08 +02:00