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>
 {
        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_hs400_mode(host, priv);
 
 
 
 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);
        usleep_range(10000, 11000);
-       sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
        sd_ctrl_write16(host, CTL_RESET_SDIO, 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);
-       }
 }
 
 #ifdef CONFIG_PM_SLEEP
 
        sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
        usleep_range(10000, 11000);
 
+       if (host->reset)
+               host->reset(host);
+
        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);
 
        spin_unlock_irqrestore(&host->lock, flags);
 
-       host->reset(host);
+       tmio_mmc_reset(host);
 
        /* Ready for new calls */
        host->mrq = NULL;
 
        if (ret < 0) {
                dev_warn(&host->pdev->dev, "Tuning procedure failed\n");
-               host->reset(host);
+               tmio_mmc_reset(host);
        }
 
        return ret;
                                  mmc->caps & MMC_CAP_NEEDS_POLL ||
                                  !mmc_card_is_removable(mmc));
 
-       if (!_host->reset)
-               _host->reset = tmio_mmc_reset;
-
        /*
         * On Gen2+, eMMC with NONREMOVABLE currently fails because native
         * hotplug gets disabled. It seems RuntimePM related yet we need further
                _host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
 
        _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);
        tmio_mmc_disable_mmc_irqs(_host, TMIO_MASK_ALL);
        struct tmio_mmc_host *host = dev_get_drvdata(dev);
 
        tmio_mmc_clk_enable(host);
-       host->reset(host);
+       tmio_mmc_reset(host);
 
        if (host->clk_cache)
                host->set_clock(host, host->clk_cache);