uint32_t mask,
                       unsigned int timeout);
 
-int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int));
+int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int), int (*cd)(int));
 
 #ifdef CONFIG_SPL_BUILD
 
 
 #ifdef CONFIG_CMD_MMC
 int board_mmc_init(bd_t *bis)
 {
-       return mxsmmc_initialize(bis, 0, NULL);
+       return mxsmmc_initialize(bis, 0, NULL, NULL);
 }
 #endif
 
 
        /* Turn on the power to the card. */
        gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0);
 
-       return mxsmmc_initialize(bis, 0, m28_mmc_wp);
+       return mxsmmc_initialize(bis, 0, m28_mmc_wp, NULL);
 }
 #endif
 
 
        /* Configure MMC0 Power Enable */
        gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0);
 
-       return mxsmmc_initialize(bis, 0, mx28evk_mmc_wp);
+       return mxsmmc_initialize(bis, 0, mx28evk_mmc_wp, NULL);
 }
 #endif
 
 
 #ifdef CONFIG_CMD_MMC
 int board_mmc_init(bd_t *bis)
 {
-       return mxsmmc_initialize(bis, 0, NULL);
+       return mxsmmc_initialize(bis, 0, NULL, NULL);
 }
 #endif
 
 
        struct mxs_ssp_regs     *regs;
        uint32_t                buswidth;
        int                     (*mmc_is_wp)(int);
+       int                     (*mmc_cd)(int);
        struct mxs_dma_desc     *desc;
 };
 
 #define        MXSMMC_MAX_TIMEOUT      10000
 #define MXSMMC_SMALL_TRANSFER  512
 
+static int mxsmmc_cd(struct mxsmmc_priv *priv)
+{
+       struct mxs_ssp_regs *ssp_regs = priv->regs;
+
+       if (priv->mmc_cd)
+               return priv->mmc_cd(priv->id);
+
+       return !(readl(&ssp_regs->hw_ssp_status) & SSP_STATUS_CARD_DETECT);
+}
+
 static int mxsmmc_send_cmd_pio(struct mxsmmc_priv *priv, struct mmc_data *data)
 {
        struct mxs_ssp_regs *ssp_regs = priv->regs;
        }
 
        /* See if card is present */
-       if (readl(&ssp_regs->hw_ssp_status) & SSP_STATUS_CARD_DETECT) {
+       if (!mxsmmc_cd(priv)) {
                printf("MMC%d: No card detected!\n", mmc->block_dev.dev);
                return NO_CARD_ERR;
        }
        return 0;
 }
 
-int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))
+int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int), int (*cd)(int))
 {
        struct mmc *mmc = NULL;
        struct mxsmmc_priv *priv = NULL;
                return ret;
 
        priv->mmc_is_wp = wp;
+       priv->mmc_cd = cd;
        priv->id = id;
        priv->regs = mxs_ssp_regs_by_bus(id);