diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 3d445c0e2695598cccf0c6a9a8db8270a3e55bfc..64c8d567de1004e4c3158f2728faf5f5d3ee04b7 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 ed084c8147bd9918ca14d27e81867b9670151d75..e0a56d9d23b76501f1d378ce79ec9f2702762cfa 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)