Commit 497d1f96 authored by Masahiro Yamada's avatar Masahiro Yamada Committed by Ulf Hansson

mmc: tmio: support IP-builtin card detection logic

A card detect GPIO is set up only for platforms with "cd-gpios"
DT property or TMIO_MMC_USE_GPIO_CD flag.  However, the driver
core always uses mmc_gpio_get_cd, which just fails with -ENOSYS
if ctx->cd_gpio is unset.

The bit 5 of the status register provides the current signal level
of the CD line.  Allow to use it if the GPIO is unused.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Tested-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
parent 788778b0
...@@ -1066,6 +1066,14 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc) ...@@ -1066,6 +1066,14 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc)
TMIO_STAT_WRPROTECT); TMIO_STAT_WRPROTECT);
} }
static int tmio_mmc_get_cd(struct mmc_host *mmc)
{
struct tmio_mmc_host *host = mmc_priv(mmc);
return !!(sd_ctrl_read16_and_16_as_32(host, CTL_STATUS) &
TMIO_STAT_SIGSTATE);
}
static int tmio_multi_io_quirk(struct mmc_card *card, static int tmio_multi_io_quirk(struct mmc_card *card,
unsigned int direction, int blk_size) unsigned int direction, int blk_size)
{ {
...@@ -1081,7 +1089,7 @@ static const struct mmc_host_ops tmio_mmc_ops = { ...@@ -1081,7 +1089,7 @@ static const struct mmc_host_ops tmio_mmc_ops = {
.request = tmio_mmc_request, .request = tmio_mmc_request,
.set_ios = tmio_mmc_set_ios, .set_ios = tmio_mmc_set_ios,
.get_ro = tmio_mmc_get_ro, .get_ro = tmio_mmc_get_ro,
.get_cd = mmc_gpio_get_cd, .get_cd = tmio_mmc_get_cd,
.enable_sdio_irq = tmio_mmc_enable_sdio_irq, .enable_sdio_irq = tmio_mmc_enable_sdio_irq,
.multi_io_quirk = tmio_multi_io_quirk, .multi_io_quirk = tmio_multi_io_quirk,
.hw_reset = tmio_mmc_hw_reset, .hw_reset = tmio_mmc_hw_reset,
...@@ -1234,6 +1242,9 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host) ...@@ -1234,6 +1242,9 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
if (mmc_can_gpio_ro(mmc)) if (mmc_can_gpio_ro(mmc))
_host->ops.get_ro = mmc_gpio_get_ro; _host->ops.get_ro = mmc_gpio_get_ro;
if (mmc_can_gpio_cd(mmc))
_host->ops.get_cd = mmc_gpio_get_cd;
_host->native_hotplug = !(mmc_can_gpio_cd(mmc) || _host->native_hotplug = !(mmc_can_gpio_cd(mmc) ||
mmc->caps & MMC_CAP_NEEDS_POLL || mmc->caps & MMC_CAP_NEEDS_POLL ||
!mmc_card_is_removable(mmc)); !mmc_card_is_removable(mmc));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment