Message ID | 95ef8403-5e3c-4219-f45e-e289cf59f1b8@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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); } /* Wait max 100 ms */