RE: [RFT PATCH] mmc: tmio: make sure SDIO gets reinitialized after resume

Yoshihiro Shimoda
2017-05-23T12:15:05Z

Hi Wolfram-san,

> From: Wolfram Sang
> Sent: Friday, May 19, 2017 9:31 PM
>
> To achieve that, we set the registers in the generic HW reset routine
> which gets called at both, init and resume. We also make sure to move
> SDIO initialization before reset gets called in probe().
>
> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> ---
>
> This patch addresses a report I got from Shimoda-san. I can't really test it
> because the SDIO cards I have all require MMC_PM_KEEP_POWER to suspend and
> that we don't support. So, I send this out to ask for testing. At least it
> didn't cause regressions for the setup I used. To make testing easier, this
> is *not* put on top of Simon's SDHI DMA rework patches, so it should apply
> on current upstream and development branches.

Thank you for the patch!
Hayakawa-san tested this patch on both H3/Salvator-X and E2/ALT.

So,
Tested-by: Masaharu Hayakawa <masaharu.hayakawa.ry@renesas.com>

Best regards,
Yoshihiro Shimoda

> drivers/mmc/host/tmio_mmc_pio.c | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c
> index a2d92f10501bdd..5e87fcaa99d430 100644
> --- a/drivers/mmc/host/tmio_mmc_pio.c
> +++ b/drivers/mmc/host/tmio_mmc_pio.c
> @@ -229,6 +229,12 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host)
> if (host->pdata->flags & TMIO_MMC_HAVE_HIGH_REG)
> sd_ctrl_write16(host, CTL_RESET_SDIO, 0x0001);
> msleep(10);
> +
> + 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);
> + }
> +
> }
>
> static void tmio_mmc_reset_work(struct work_struct *work)
> @@ -1221,6 +1227,10 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
> if (_host->native_hotplug)
> pm_runtime_get_noresume(&pdev->dev);
>
> + _host->sdio_irq_enabled = false;
> + if (pdata->flags & TMIO_MMC_SDIO_IRQ)
> + _host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
> +
> tmio_mmc_clk_stop(_host);
> tmio_mmc_reset(_host);
>
> @@ -1237,13 +1247,6 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
>
> _host->sdcard_irq_mask &= ~irq_mask;
>
> - _host->sdio_irq_enabled = false;
> - if (pdata->flags & TMIO_MMC_SDIO_IRQ) {
> - _host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
> - sd_ctrl_write16(_host, CTL_SDIO_IRQ_MASK, _host->sdio_irq_mask);
> - sd_ctrl_write16(_host, CTL_TRANSACTION_CTL, 0x0001);
> - }
> -
> spin_lock_init(&_host->lock);
> mutex_init(&_host->ios_lock);
>
> --
> 2.11.0