Re: [PATCH V2 1/3] mmc: esdhc: enable polling to detect card by itself

From: yongd
Date: Wed Nov 07 2012 - 21:46:14 EST


On 2012å11æ06æ 20:52, Shawn Guo wrote:
On Tue, Nov 06, 2012 at 04:49:42PM +0800, yongd wrote:
From your info, we can see that on your platform, those pins (including
power, clk, DATA) necessary for MMC_SEND_STATUS transaction still keep
connected for some time just after the GPIO's level changes due to card
removable. And if we remove the card very slowly, such time duration can be
such long that the MMC_SEND_STATUS query can still succeed.

I was not removing the card as slowly as you think. It's actually
a normal speed. That's why I thought your patch breaks the
card-detection functionality before I found the cause.

So I think we can add a proper delay(maybe 100ms) before the gpio interrupt
triggers the MMC_SEND_STATUS query, and maybe this can probably fix this issue:-)

I do not think it's a proper fixing.
Anyway, u can try such delay like msleep(100) in cd_irq() before calling
tasklet_schedule(&sdhost->card_tasklet). Yes, this is not a proper fix even
it works:-)

<snip>

Anyway, I 100% agree with you that for a ESDHC_CD_GPIO card, we shall query gpio
state to know such card's presence rather than sending MMC_SEND_STATUS rudely.

But just as I mentioned before, I don't think using SDHCI_QUIRK_BROKEN_CARD_DETECTION
as the flag to determine whether and how we can know card's presence before sending
command is a proper way.

I haven't gotten any good idea. Do u have any idea on this?

I guess what we need is to call mmc_gpio_get_cd() trying to know card's
presence before sending MMC_SEND_STATUS command. sdhci-esdhc-imx
driver will surely need some changes to cope with that.

Shawn

Yes, gpio card detection should better use the existing framework offered by slot-gpio.
Then the fake-card-present will be unnecessary. BTW, sdhci-s3c.c also dose not use slot-gpio,
and then it also adds some tricky logic for gpio detection. U can check sdhci_s3c_notify_change(),
which dynamically set/clear SDHCI_QUIRK_BROKEN_CARD_DETECTION. This patch adding
mmc_gpio_get_cd(), bec9d4e5939987053169a9bb48fc58b6a2d3e237, mentioned this 1stly.

But using SDHCI_QUIRK_BROKEN_CARD_DETECTION to do such judging in sdhci_request()
is still not proper. I think this is the root causing such above workarounds.

So I am thinking of adding a new operation like get_card_presence into sdhci_ops,
and then different host drivers can implement differently by themselves, eg, for
sdhci-esdhc-imx.c,

static bool esdhc_get_card_presence(struct sdhci_host *host)
{
bool present = true;

if (detection_type == ESDHC_CD_CONTROLLER)
present = sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT;
else if (detection_type == ESDHC_CD_GPIO) {
if (gpio_get_value(boarddata->cd_gpio))
/* no card, if a valid gpio says so... */
present = false;
}

return present;
}


But this will also cause lots of host drivers corresponding changes. Oh, still inconvenient:-(
Any better ideas?

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/