add HS200 mode and tune support

Signed-off-by: mingming lee <mingming....@mediatek.com>
---
 drivers/mmc/mtk-sd.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/mmc/mtk-sd.c b/drivers/mmc/mtk-sd.c
index f555357af2..bede4153b3 100644
--- a/drivers/mmc/mtk-sd.c
+++ b/drivers/mmc/mtk-sd.c
@@ -362,6 +362,8 @@ static u32 msdc_cmd_prepare_raw_cmd(struct msdc_host *host,
        case MMC_CMD_WRITE_SINGLE_BLOCK:
        case MMC_CMD_READ_SINGLE_BLOCK:
        case SD_CMD_APP_SEND_SCR:
+       case MMC_CMD_SEND_TUNING_BLOCK:
+       case MMC_CMD_SEND_TUNING_BLOCK_HS200:
                dtype = 1;
                break;
        case SD_CMD_SWITCH_FUNC: /* same as MMC_CMD_SWITCH */
@@ -467,6 +469,14 @@ static int msdc_start_command(struct msdc_host *host, 
struct mmc_cmd *cmd,
        if (!msdc_cmd_is_ready(host))
                return -EIO;
 
+       if ((readl(&host->base->msdc_fifocs) &
+           MSDC_FIFOCS_TXCNT_M) >> MSDC_FIFOCS_TXCNT_S ||
+           (readl(&host->base->msdc_fifocs) &
+           MSDC_FIFOCS_RXCNT_M) >> MSDC_FIFOCS_RXCNT_S) {
+               pr_err("TX/RX FIFO non-empty before start of IO. Reset\n");
+               msdc_reset_hw(host);
+       }
+
        msdc_fifo_clr(host);
 
        host->last_resp_type = cmd->resp_type;
@@ -650,14 +660,22 @@ static int msdc_ops_send_cmd(struct udevice *dev, struct 
mmc_cmd *cmd,
                             struct mmc_data *data)
 {
        struct msdc_host *host = dev_get_priv(dev);
-       int ret;
+       int cmd_ret, data_ret;
 
-       ret = msdc_start_command(host, cmd, data);
-       if (ret)
-               return ret;
+       cmd_ret = msdc_start_command(host, cmd, data);
+       if (cmd_ret &&
+           !(cmd_ret == -EIO &&
+           (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
+           cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)))
+               return cmd_ret;
 
-       if (data)
-               return msdc_start_data(host, data);
+       if (data) {
+               data_ret = msdc_start_data(host, data);
+               if (cmd_ret)
+                       return cmd_ret;
+               else
+                       return data_ret;
+       }
 
        return 0;
 }
-- 
2.18.0
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to