summaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/sdhci-pci-core.c
diff options
context:
space:
mode:
authorAndrea Merello <andrea.merello@gmail.com>2019-04-05 10:34:58 +0200
committerUlf Hansson <ulf.hansson@linaro.org>2019-04-15 11:55:54 +0200
commit002ee28e8b322d4d4b7b83234b5d0f4ebd428eda (patch)
tree0cc6e3bd7033d232b51f3d6667427c02f0ea0a92 /drivers/mmc/host/sdhci-pci-core.c
parentb65be6355183f6cb82518d02a4067239f6175558 (diff)
downloadlinux-stable-002ee28e8b322d4d4b7b83234b5d0f4ebd428eda.tar.gz
linux-stable-002ee28e8b322d4d4b7b83234b5d0f4ebd428eda.tar.bz2
linux-stable-002ee28e8b322d4d4b7b83234b5d0f4ebd428eda.zip
mmc: core: make pwrseq_emmc (partially) support sleepy GPIO controllers
pwrseq_emmc.c implements a HW reset procedure for eMMC chip by driving a GPIO line. It registers the .reset() cb on mmc_pwrseq_ops and it registers a system restart notification handler; both of them perform reset by unconditionally calling gpiod_set_value(). If the eMMC reset line is tied to a GPIO controller whose driver can sleep (i.e. I2C GPIO controller), then the kernel would spit warnings when trying to reset the eMMC chip by means of .reset() mmc_pwrseq_ops cb (that is exactly what I'm seeing during boot). Furthermore, on system reset we would gets to the system restart notification handler with disabled interrupts - local_irq_disable() is called in machine_restart() at least on ARM/ARM64 - and we would be in trouble when the GPIO driver tries to sleep (which indeed doesn't happen here, likely because in my case the machine specific code doesn't call do_kernel_restart(), I guess..). This patch fixes the .reset() cb to make use of gpiod_set_value_cansleep(), so that the eMMC gets reset on boot without complaints, while, since there isn't that much we can do, we avoid register the restart handler if the GPIO controller has a sleepy driver (and we spit a dev_notice() message to let people know).. This had been tested on a downstream 4.9 kernel with backported commit 83f37ee7ba33 ("mmc: pwrseq: Add reset callback to the struct mmc_pwrseq_ops") and commit ae60fb031cf2 ("mmc: core: Don't do eMMC HW reset when resuming the eMMC card"), because I couldn't boot my board otherwise. Maybe worth to RFT. Signed-off-by: Andrea Merello <andrea.merello@gmail.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/host/sdhci-pci-core.c')
0 files changed, 0 insertions, 0 deletions