Commit 81e888da authored by Shinobu Uehara's avatar Shinobu Uehara Committed by Ulf Hansson

mmc: tmio: check ILL_FUNC instead of CBSY

Some controllers need to check SD bus status when writing data.
Then, it checks ILL_FUNC bit on SD_INFO2 register,
and this method is controlled via TMIO_MMC_HAS_IDLE_WAIT flags.
Same method is required on tmio_mmc_data_irq() which will
be called after writing data.

Current driver is checking CBSY bit for this purpose,
but, some controllers doesn't have CBSY bit.
This patch checks ILL_FUNC bit instead of CBSY bit
if it has TMIO_MMC_HAS_IDLE_WAIT flags

[Kuninori Morimoto: tidyuped for upstreaming]
Tested-by: default avatarNguyen Xuan Nui <nx-nui@jinso.co.jp>
Tested-by: default avatarHiep Cao Minh <cm-hiep@jinso.co.jp>
Signed-off-by: default avatarShinobu Uehara <shinobu.uehara.xc@renesas.com>
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 6b98757e
...@@ -490,6 +490,9 @@ static void tmio_mmc_data_irq(struct tmio_mmc_host *host) ...@@ -490,6 +490,9 @@ static void tmio_mmc_data_irq(struct tmio_mmc_host *host)
goto out; goto out;
if (host->chan_tx && (data->flags & MMC_DATA_WRITE) && !host->force_pio) { if (host->chan_tx && (data->flags & MMC_DATA_WRITE) && !host->force_pio) {
u32 status = sd_ctrl_read32(host, CTL_STATUS);
bool done = false;
/* /*
* Has all data been written out yet? Testing on SuperH showed, * Has all data been written out yet? Testing on SuperH showed,
* that in most cases the first interrupt comes already with the * that in most cases the first interrupt comes already with the
...@@ -498,7 +501,15 @@ static void tmio_mmc_data_irq(struct tmio_mmc_host *host) ...@@ -498,7 +501,15 @@ static void tmio_mmc_data_irq(struct tmio_mmc_host *host)
* DATAEND interrupt with the BUSY bit set, in this cases * DATAEND interrupt with the BUSY bit set, in this cases
* waiting for one more interrupt fixes the problem. * waiting for one more interrupt fixes the problem.
*/ */
if (!(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_CMD_BUSY)) { if (host->pdata->flags & TMIO_MMC_HAS_IDLE_WAIT) {
if (status & TMIO_STAT_ILL_FUNC)
done = true;
} else {
if (!(status & TMIO_STAT_CMD_BUSY))
done = true;
}
if (done) {
tmio_mmc_disable_mmc_irqs(host, TMIO_STAT_DATAEND); tmio_mmc_disable_mmc_irqs(host, TMIO_STAT_DATAEND);
tasklet_schedule(&host->dma_complete); tasklet_schedule(&host->dma_complete);
} }
......
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