Browse Source

mmc: fix cid and csd byte order

MMC over SPI sends the CID and CSD registers as data, not responses,
which means that the host driver won't do the necessary byte flipping
for us.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Pierre Ossman 17 years ago
parent
commit
78e480731a
1 changed files with 20 additions and 2 deletions
  1. 20 2
      drivers/mmc/core/mmc_ops.c

+ 20 - 2
drivers/mmc/core/mmc_ops.c

@@ -267,15 +267,26 @@ mmc_send_cxd_data(struct mmc_card *card, struct mmc_host *host,
 
 
 int mmc_send_csd(struct mmc_card *card, u32 *csd)
 int mmc_send_csd(struct mmc_card *card, u32 *csd)
 {
 {
+	int ret, i;
+
 	if (!mmc_host_is_spi(card->host))
 	if (!mmc_host_is_spi(card->host))
 		return mmc_send_cxd_native(card->host, card->rca << 16,
 		return mmc_send_cxd_native(card->host, card->rca << 16,
 				csd, MMC_SEND_CSD);
 				csd, MMC_SEND_CSD);
 
 
-	return mmc_send_cxd_data(card, card->host, MMC_SEND_CSD, csd, 16);
+	ret = mmc_send_cxd_data(card, card->host, MMC_SEND_CSD, csd, 16);
+	if (ret)
+		return ret;
+
+	for (i = 0;i < 4;i++)
+		csd[i] = be32_to_cpu(csd[i]);
+
+	return 0;
 }
 }
 
 
 int mmc_send_cid(struct mmc_host *host, u32 *cid)
 int mmc_send_cid(struct mmc_host *host, u32 *cid)
 {
 {
+	int ret, i;
+
 	if (!mmc_host_is_spi(host)) {
 	if (!mmc_host_is_spi(host)) {
 		if (!host->card)
 		if (!host->card)
 			return -EINVAL;
 			return -EINVAL;
@@ -283,7 +294,14 @@ int mmc_send_cid(struct mmc_host *host, u32 *cid)
 				cid, MMC_SEND_CID);
 				cid, MMC_SEND_CID);
 	}
 	}
 
 
-	return mmc_send_cxd_data(NULL, host, MMC_SEND_CID, cid, 16);
+	ret = mmc_send_cxd_data(NULL, host, MMC_SEND_CID, cid, 16);
+	if (ret)
+		return ret;
+
+	for (i = 0;i < 4;i++)
+		cid[i] = be32_to_cpu(cid[i]);
+
+	return 0;
 }
 }
 
 
 int mmc_send_ext_csd(struct mmc_card *card, u8 *ext_csd)
 int mmc_send_ext_csd(struct mmc_card *card, u8 *ext_csd)