Commit 7501c431 authored by Ulf Hansson's avatar Ulf Hansson
Browse files

mmc: tmio: Keep host active while SDIO IRQ is enabled



The host must be kept active to be able to serve SDIO IRQs, thus let's
prevent it from going inactive while SDIO IRQ is enabled.

Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Acked-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
parent 215ba399
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ struct tmio_mmc_host {
	struct mutex		ios_lock;	/* protect set_ios() context */
	bool			native_hotplug;
	bool			resuming;
	bool			sdio_irq_enabled;
};

int tmio_mmc_host_probe(struct tmio_mmc_host **host,
+15 −4
Original line number Diff line number Diff line
@@ -129,15 +129,22 @@ static void tmio_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
	struct tmio_mmc_host *host = mmc_priv(mmc);

	if (enable) {
	if (enable && !host->sdio_irq_enabled) {
		/* Keep device active while SDIO irq is enabled */
		pm_runtime_get_sync(mmc_dev(mmc));
		host->sdio_irq_enabled = true;

		host->sdio_irq_mask = TMIO_SDIO_MASK_ALL &
					~TMIO_SDIO_STAT_IOIRQ;
		sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
		sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
	} else {
	} else if (!enable && host->sdio_irq_enabled) {
		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, 0x0000);

		host->sdio_irq_enabled = false;
		pm_runtime_put(mmc_dev(mmc));
	}
}

@@ -1074,8 +1081,12 @@ int tmio_mmc_host_probe(struct tmio_mmc_host **host,

	_host->sdcard_irq_mask &= ~irq_mask;

	if (pdata->flags & TMIO_MMC_SDIO_IRQ)
		tmio_mmc_enable_sdio_irq(mmc, 0);
	_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, 0x0000);
	}

	spin_lock_init(&_host->lock);
	mutex_init(&_host->ios_lock);