Re: [PATCH] mmc: sdhci-msm: Add sdhci_reset() implementation

From: Georgi Djakov
Date: Mon Nov 28 2016 - 10:52:05 EST


On 11/24/2016 06:06 PM, Ritesh Harjani wrote:
Hi Georgi,

I collected some info on this problem. May be below info might help you.

I think "Reset 0x1" problem is occurring because of below call stack.
SDHCI_RESET_ALL to SDHCI_SOFTWARE_RESET register will anyway trigger the
sdhci_msm_pwr_irq.

But I think the problem is that the above occurs in spinlock context
and because of only one core the IRQ will never be serviced, hence you
were seeing (Reset 0x1) error.


Hi Ritesh,
Thanks for looking into this. So yes, its called in spinlock context and what we need to do is just handle the power irq after writing to reset register.

[..]

To prove above I tried this and the problem goes away. But I still dont
think that the below approach is correct. As it will still trigger a
pwr_irq as well.


diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 62aedf1..01e611c 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -174,6 +174,8 @@ void sdhci_reset(struct sdhci_host *host, u8 mask)
/* Reset-all turns off SD Bus Power */
if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON)
sdhci_runtime_pm_bus_off(host);
+ if (host->ops->voltage_switch)
+ host->ops->voltage_switch(host);
}


Yes, our own reset() function that additionally handles the irq will work.

Thanks,
Georgi