diff options
| -rw-r--r-- | drivers/mmc/mmc.c | 21 | ||||
| -rw-r--r-- | include/mmc.h | 2 | 
2 files changed, 20 insertions, 3 deletions
| diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 3d445c0e2..64c8d567d 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -367,18 +367,33 @@ sd_send_op_cond(struct mmc *mmc)  int mmc_send_op_cond(struct mmc *mmc)  { -	int timeout = 1000; +	int timeout = 10000;  	struct mmc_cmd cmd;  	int err;  	/* Some cards seem to need this */  	mmc_go_idle(mmc); + 	/* Asking to the card its capabilities */ + 	cmd.cmdidx = MMC_CMD_SEND_OP_COND; + 	cmd.resp_type = MMC_RSP_R3; + 	cmd.cmdarg = 0; + 	cmd.flags = 0; +  + 	err = mmc_send_cmd(mmc, &cmd, NULL); +  + 	if (err) + 		return err; +  + 	udelay(1000); +   	do {  		cmd.cmdidx = MMC_CMD_SEND_OP_COND;  		cmd.resp_type = MMC_RSP_R3; -		cmd.cmdarg = OCR_HCS | (mmc_host_is_spi(mmc) ? 0 : -					mmc->voltages); +		cmd.cmdarg = (mmc_host_is_spi(mmc) ? 0 : +				(mmc->voltages & +				(cmd.response[0] & OCR_VOLTAGE_MASK)) | +				(cmd.response[0] & OCR_ACCESS_MODE));  		cmd.flags = 0;  		err = mmc_send_cmd(mmc, &cmd, NULL); diff --git a/include/mmc.h b/include/mmc.h index ed084c814..e0a56d9d2 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -96,6 +96,8 @@  #define OCR_BUSY	0x80000000  #define OCR_HCS		0x40000000 +#define OCR_VOLTAGE_MASK	0x007FFF80 +#define OCR_ACCESS_MODE		0x60000000  #define MMC_STATUS_MASK		(~0x0206BF7F)  #define MMC_STATUS_RDY_FOR_DATA (1<<8) |