return 0;
 }
 
+static void renesas_sdhi_reset(struct tmio_mmc_host *host)
+{
+       struct renesas_sdhi *priv = host_to_priv(host);
+
+       renesas_sdhi_reset_scc(host, priv);
+       renesas_sdhi_reset_hs400_mode(host, priv);
+
+       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
+                       sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+
+       sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
+                      ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
+                      sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
+
+       if (host->pdata->flags & TMIO_MMC_MIN_RCAR2)
+               sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK,
+                                            TMIO_MASK_INIT_RCAR2);
+}
+
 #define SH_MOBILE_SDHI_MIN_TAP_ROW 3
 
 static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
 static int renesas_sdhi_execute_tuning(struct tmio_mmc_host *host, u32 opcode)
 {
        struct renesas_sdhi *priv = host_to_priv(host);
-       int i;
+       int i, ret;
 
        priv->tap_num = renesas_sdhi_init_tuning(host);
        if (!priv->tap_num)
                        set_bit(i, priv->smpcmp);
        }
 
-       return renesas_sdhi_select_tuning(host);
+       ret = renesas_sdhi_select_tuning(host);
+       if (ret < 0)
+               renesas_sdhi_reset(host);
+       return ret;
 }
 
 static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_4tap)
        return renesas_sdhi_manual_correction(host, use_4tap);
 }
 
-static void renesas_sdhi_reset(struct tmio_mmc_host *host)
-{
-       struct renesas_sdhi *priv = host_to_priv(host);
-
-       renesas_sdhi_reset_scc(host, priv);
-       renesas_sdhi_reset_hs400_mode(host, priv);
-
-       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
-                       sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
-
-       sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
-                      ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
-                      sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
-
-       if (host->pdata->flags & TMIO_MMC_MIN_RCAR2)
-               sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK,
-                                            TMIO_MASK_INIT_RCAR2);
-}
-
 static int renesas_sdhi_wait_idle(struct tmio_mmc_host *host, u32 bit)
 {
        int timeout = 1000;