diff options
| -rw-r--r-- | arch/arm/include/asm/arch-mxs/sys_proto.h | 2 | ||||
| -rw-r--r-- | board/bluegiga/apx4devkit/apx4devkit.c | 2 | ||||
| -rw-r--r-- | board/denx/m28evk/m28evk.c | 2 | ||||
| -rw-r--r-- | board/freescale/mx28evk/mx28evk.c | 2 | ||||
| -rw-r--r-- | board/schulercontrol/sc_sps_1/sc_sps_1.c | 2 | ||||
| -rw-r--r-- | drivers/mmc/mxsmmc.c | 16 | 
6 files changed, 19 insertions, 7 deletions
| diff --git a/arch/arm/include/asm/arch-mxs/sys_proto.h b/arch/arm/include/asm/arch-mxs/sys_proto.h index 8aaf196df..5bafde567 100644 --- a/arch/arm/include/asm/arch-mxs/sys_proto.h +++ b/arch/arm/include/asm/arch-mxs/sys_proto.h @@ -31,7 +31,7 @@ int mxs_wait_mask_clr(struct mxs_register_32 *reg,  		       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 diff --git a/board/bluegiga/apx4devkit/apx4devkit.c b/board/bluegiga/apx4devkit/apx4devkit.c index 029b9731a..5927693e0 100644 --- a/board/bluegiga/apx4devkit/apx4devkit.c +++ b/board/bluegiga/apx4devkit/apx4devkit.c @@ -69,7 +69,7 @@ int board_init(void)  #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 diff --git a/board/denx/m28evk/m28evk.c b/board/denx/m28evk/m28evk.c index 26f31d62b..d93efafad 100644 --- a/board/denx/m28evk/m28evk.c +++ b/board/denx/m28evk/m28evk.c @@ -93,7 +93,7 @@ int board_mmc_init(bd_t *bis)  	/* 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 diff --git a/board/freescale/mx28evk/mx28evk.c b/board/freescale/mx28evk/mx28evk.c index ad66f293c..de7231bd1 100644 --- a/board/freescale/mx28evk/mx28evk.c +++ b/board/freescale/mx28evk/mx28evk.c @@ -94,7 +94,7 @@ int board_mmc_init(bd_t *bis)  	/* 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 diff --git a/board/schulercontrol/sc_sps_1/sc_sps_1.c b/board/schulercontrol/sc_sps_1/sc_sps_1.c index fac7e30e2..81382379c 100644 --- a/board/schulercontrol/sc_sps_1/sc_sps_1.c +++ b/board/schulercontrol/sc_sps_1/sc_sps_1.c @@ -78,7 +78,7 @@ int dram_init(void)  #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 diff --git a/drivers/mmc/mxsmmc.c b/drivers/mmc/mxsmmc.c index 9d71202ef..023dbd5bc 100644 --- a/drivers/mmc/mxsmmc.c +++ b/drivers/mmc/mxsmmc.c @@ -49,12 +49,23 @@ struct mxsmmc_priv {  	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; @@ -166,7 +177,7 @@ mxsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  	}  	/* 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;  	} @@ -357,7 +368,7 @@ static int mxsmmc_init(struct mmc *mmc)  	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; @@ -395,6 +406,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))  		return ret;  	priv->mmc_is_wp = wp; +	priv->mmc_cd = cd;  	priv->id = id;  	priv->regs = mxs_ssp_regs_by_bus(id); |