mmc: tmio: factor out common parts of the reset routine
Some TMIO variants need specific actions in their reset routine, but they are all based on a generic reset routine. So, the optional 'reset' callback will now only take care of the additional stuff and we will have a generic function around it. Less code, easier to maintain, and much more readable. Code in tmio_mmc.c is untested but in my TC6387XB datasheet the SDIO part is reset independently from the SD part, too. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Link: https://lore.kernel.org/r/20200820132538.24758-5-wsa+renesas@sang-engineering.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
committed by
Ulf Hansson
parent
a8c83064e7
commit
576146ea4e
@@ -635,17 +635,6 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host)
|
|||||||
{
|
{
|
||||||
struct renesas_sdhi *priv = host_to_priv(host);
|
struct renesas_sdhi *priv = host_to_priv(host);
|
||||||
|
|
||||||
/* FIXME - should we set stop clock reg here */
|
|
||||||
sd_ctrl_write16(host, CTL_RESET_SD, 0x0000);
|
|
||||||
usleep_range(10000, 11000);
|
|
||||||
sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
|
|
||||||
usleep_range(10000, 11000);
|
|
||||||
|
|
||||||
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
|
||||||
sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
|
|
||||||
sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
|
|
||||||
}
|
|
||||||
|
|
||||||
renesas_sdhi_reset_scc(host, priv);
|
renesas_sdhi_reset_scc(host, priv);
|
||||||
renesas_sdhi_reset_hs400_mode(host, priv);
|
renesas_sdhi_reset_hs400_mode(host, priv);
|
||||||
|
|
||||||
|
|||||||
@@ -77,18 +77,10 @@ static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
|
|||||||
|
|
||||||
static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
||||||
{
|
{
|
||||||
/* FIXME - should we set stop clock reg here */
|
|
||||||
sd_ctrl_write16(host, CTL_RESET_SD, 0x0000);
|
|
||||||
sd_ctrl_write16(host, CTL_RESET_SDIO, 0x0000);
|
sd_ctrl_write16(host, CTL_RESET_SDIO, 0x0000);
|
||||||
usleep_range(10000, 11000);
|
usleep_range(10000, 11000);
|
||||||
sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
|
|
||||||
sd_ctrl_write16(host, CTL_RESET_SDIO, 0x0001);
|
sd_ctrl_write16(host, CTL_RESET_SDIO, 0x0001);
|
||||||
usleep_range(10000, 11000);
|
usleep_range(10000, 11000);
|
||||||
|
|
||||||
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
|
||||||
sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
|
|
||||||
sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
|||||||
@@ -172,6 +172,9 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
|||||||
sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
|
sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
|
||||||
usleep_range(10000, 11000);
|
usleep_range(10000, 11000);
|
||||||
|
|
||||||
|
if (host->reset)
|
||||||
|
host->reset(host);
|
||||||
|
|
||||||
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
||||||
sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
|
sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
|
||||||
sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
|
sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
|
||||||
@@ -216,7 +219,7 @@ static void tmio_mmc_reset_work(struct work_struct *work)
|
|||||||
|
|
||||||
spin_unlock_irqrestore(&host->lock, flags);
|
spin_unlock_irqrestore(&host->lock, flags);
|
||||||
|
|
||||||
host->reset(host);
|
tmio_mmc_reset(host);
|
||||||
|
|
||||||
/* Ready for new calls */
|
/* Ready for new calls */
|
||||||
host->mrq = NULL;
|
host->mrq = NULL;
|
||||||
@@ -721,7 +724,7 @@ static int tmio_mmc_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
|||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_warn(&host->pdev->dev, "Tuning procedure failed\n");
|
dev_warn(&host->pdev->dev, "Tuning procedure failed\n");
|
||||||
host->reset(host);
|
tmio_mmc_reset(host);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1144,9 +1147,6 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|||||||
mmc->caps & MMC_CAP_NEEDS_POLL ||
|
mmc->caps & MMC_CAP_NEEDS_POLL ||
|
||||||
!mmc_card_is_removable(mmc));
|
!mmc_card_is_removable(mmc));
|
||||||
|
|
||||||
if (!_host->reset)
|
|
||||||
_host->reset = tmio_mmc_reset;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On Gen2+, eMMC with NONREMOVABLE currently fails because native
|
* On Gen2+, eMMC with NONREMOVABLE currently fails because native
|
||||||
* hotplug gets disabled. It seems RuntimePM related yet we need further
|
* hotplug gets disabled. It seems RuntimePM related yet we need further
|
||||||
@@ -1168,7 +1168,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|||||||
_host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
|
_host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
|
||||||
|
|
||||||
_host->set_clock(_host, 0);
|
_host->set_clock(_host, 0);
|
||||||
_host->reset(_host);
|
tmio_mmc_reset(_host);
|
||||||
|
|
||||||
_host->sdcard_irq_mask = sd_ctrl_read16_and_16_as_32(_host, CTL_IRQ_MASK);
|
_host->sdcard_irq_mask = sd_ctrl_read16_and_16_as_32(_host, CTL_IRQ_MASK);
|
||||||
tmio_mmc_disable_mmc_irqs(_host, TMIO_MASK_ALL);
|
tmio_mmc_disable_mmc_irqs(_host, TMIO_MASK_ALL);
|
||||||
@@ -1271,7 +1271,7 @@ int tmio_mmc_host_runtime_resume(struct device *dev)
|
|||||||
struct tmio_mmc_host *host = dev_get_drvdata(dev);
|
struct tmio_mmc_host *host = dev_get_drvdata(dev);
|
||||||
|
|
||||||
tmio_mmc_clk_enable(host);
|
tmio_mmc_clk_enable(host);
|
||||||
host->reset(host);
|
tmio_mmc_reset(host);
|
||||||
|
|
||||||
if (host->clk_cache)
|
if (host->clk_cache)
|
||||||
host->set_clock(host, host->clk_cache);
|
host->set_clock(host, host->clk_cache);
|
||||||
|
|||||||
Reference in New Issue
Block a user