[PATCH V2 3/3] mmc: dw_mmc: Dont cut off vqmmc and vmmc
From: Ulf Hansson <hidden>
Date: 2014-08-27 11:17:34
Also in:
linux-mmc, linux-samsung-soc
Hi Doug, [snip]
quoted
quoted
quoted
I think you shall be able use MMC_CAP_NEEDS_POLL, to handle this broken card detect mechanism. We even have a DT binding for that, "broken-cd".I don't think this is possible, but let me explain why I think so and you can correct me. The voltage domain of the "card detect" pin on the SoC is vqmmc, right? That means that you won't be able to read the pin without turning on vqmmc. Even if you could read the pin without turning on vqmmc, the pullup on this line is connected to vqmmc too. ...so if vqmmc is off then there's no pulup and you can't use card detect. Are you suggesting that we should flip the voltage of vqmmc (and thus vmmc to prevent damaging the card) during polling? That seems ugly.I am not sure I follow to understand the problem. All I am saying is: From your ->set_ios() when you get MMC_POWER_UP, enable vcc and vccq. From your ->set_ios() when you get MMC_POWER_OFF, disable vccq and vcc. The rest is taken care of from mmc core, when trying to initialize the card.We must not be on the same page, so I'll put all my assumptions in super detail and we can see what's different... So if I have "MMC_CAP_NEEDS_POLL" set, the MMC core will poll things, right? ...and you are suggesting that I could solve my vqmmc vs. card detect problem by using MMC_CAP_NEEDS_POLL, right?
Yes.
Let's think about the case when no card is inserted. When no card is inserted the core will call set_ios() with MMC_POWER_OFF, right? ...and we want that to turn off vmmc. ...and if we turn off vmmc, we should turn off vqmmc.
Correct. At MMC_POWER_OFF, all host drivers shall turn off all the possible powers that goes to the card. I am just telling this to make sure, we don't think this is a dw_mmc specific thing.
Now we've got vmmc off and vqmmc off and on this board we can't read the card detect line, right?
Got it. :-)
Now, we've got MMC_CAP_NEEDS_POLL, so dw_mmc will periodically be called to check the card detect line, but with vmmc and vqmmc off. It will be unable to return a sensible value without actually turning on vmmc and vqmmc.
Currently MMC_CAP_NEEDS_POLL mean the mmc rescan work will reschedule itself with HZ interval. This to check for card insert/removal. Now, mmc_rescan() will, if present, invoke host's ->get_cd() callback to check whether it's worth to continue initialization sequence or if it should re-schedule itself again. If your host driver can distinguish whether a card is inserted, which in this the are when vccq is turned off, your ->get_cd() callback need to return 0. That will allow mmc_rescan() to continue it's initialization sequence and do mmc_power_up().
...so with that context, I'll ask my questoin again: Are you suggesting that we should flip the voltage of vqmmc (and thus vmmc to prevent damaging the card) during polling? That seems ugly.
Nope. Kind regards Uffe