|
@@ -49,12 +49,23 @@ struct mxsmmc_priv {
|
|
struct mxs_ssp_regs *regs;
|
|
struct mxs_ssp_regs *regs;
|
|
uint32_t buswidth;
|
|
uint32_t buswidth;
|
|
int (*mmc_is_wp)(int);
|
|
int (*mmc_is_wp)(int);
|
|
|
|
+ int (*mmc_cd)(int);
|
|
struct mxs_dma_desc *desc;
|
|
struct mxs_dma_desc *desc;
|
|
};
|
|
};
|
|
|
|
|
|
#define MXSMMC_MAX_TIMEOUT 10000
|
|
#define MXSMMC_MAX_TIMEOUT 10000
|
|
#define MXSMMC_SMALL_TRANSFER 512
|
|
#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)
|
|
static int mxsmmc_send_cmd_pio(struct mxsmmc_priv *priv, struct mmc_data *data)
|
|
{
|
|
{
|
|
struct mxs_ssp_regs *ssp_regs = priv->regs;
|
|
struct mxs_ssp_regs *ssp_regs = priv->regs;
|
|
@@ -166,7 +177,7 @@ mxsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
|
}
|
|
}
|
|
|
|
|
|
/* See if card is present */
|
|
/* 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);
|
|
printf("MMC%d: No card detected!\n", mmc->block_dev.dev);
|
|
return NO_CARD_ERR;
|
|
return NO_CARD_ERR;
|
|
}
|
|
}
|
|
@@ -357,7 +368,7 @@ static int mxsmmc_init(struct mmc *mmc)
|
|
return 0;
|
|
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 mmc *mmc = NULL;
|
|
struct mxsmmc_priv *priv = NULL;
|
|
struct mxsmmc_priv *priv = NULL;
|
|
@@ -395,6 +406,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
priv->mmc_is_wp = wp;
|
|
priv->mmc_is_wp = wp;
|
|
|
|
+ priv->mmc_cd = cd;
|
|
priv->id = id;
|
|
priv->id = id;
|
|
priv->regs = mxs_ssp_regs_by_bus(id);
|
|
priv->regs = mxs_ssp_regs_by_bus(id);
|
|
|
|
|