mirror of https://gitee.com/openkylin/linux.git
mmc: dw_mmc: enable controller interrupt before calling mmc_start_host
As mmc_start_host is getting called before enabling the dw_mmc controller interrupt, there is a problem of missing the SDMMC_INT_CMD_DONE for the very first command sent by the sdio_reset. This problem occurs only when we disable MMC debugging i.e, MMC_DEBUG=n. This patch enables the dw_mmc controller interrupt before mmc_start_host. Signed-off-by: Yuvaraj CD <yuvaraj.cd@samsung.com> Reviewed-by: Girish K S <girish.shivananjappa@linaro.org> Acked-by: Will Newton <will.newton@imgtec.com> Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
parent
63ef5d8c28
commit
2da1d7f294
|
@ -2228,6 +2228,21 @@ int dw_mci_probe(struct dw_mci *host)
|
||||||
else
|
else
|
||||||
host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1;
|
host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable interrupts for command done, data over, data empty, card det,
|
||||||
|
* receive ready and error such as transmit, receive timeout, crc error
|
||||||
|
*/
|
||||||
|
mci_writel(host, RINTSTS, 0xFFFFFFFF);
|
||||||
|
mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER |
|
||||||
|
SDMMC_INT_TXDR | SDMMC_INT_RXDR |
|
||||||
|
DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
|
||||||
|
mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci interrupt */
|
||||||
|
|
||||||
|
dev_info(host->dev, "DW MMC controller at irq %d, "
|
||||||
|
"%d bit host data width, "
|
||||||
|
"%u deep fifo\n",
|
||||||
|
host->irq, width, fifo_size);
|
||||||
|
|
||||||
/* We need at least one slot to succeed */
|
/* We need at least one slot to succeed */
|
||||||
for (i = 0; i < host->num_slots; i++) {
|
for (i = 0; i < host->num_slots; i++) {
|
||||||
ret = dw_mci_init_slot(host, i);
|
ret = dw_mci_init_slot(host, i);
|
||||||
|
@ -2257,20 +2272,6 @@ int dw_mci_probe(struct dw_mci *host)
|
||||||
else
|
else
|
||||||
host->data_offset = DATA_240A_OFFSET;
|
host->data_offset = DATA_240A_OFFSET;
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable interrupts for command done, data over, data empty, card det,
|
|
||||||
* receive ready and error such as transmit, receive timeout, crc error
|
|
||||||
*/
|
|
||||||
mci_writel(host, RINTSTS, 0xFFFFFFFF);
|
|
||||||
mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER |
|
|
||||||
SDMMC_INT_TXDR | SDMMC_INT_RXDR |
|
|
||||||
DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
|
|
||||||
mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci interrupt */
|
|
||||||
|
|
||||||
dev_info(host->dev, "DW MMC controller at irq %d, "
|
|
||||||
"%d bit host data width, "
|
|
||||||
"%u deep fifo\n",
|
|
||||||
host->irq, width, fifo_size);
|
|
||||||
if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO)
|
if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO)
|
||||||
dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n");
|
dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue