[PATCH] mci: Fix version handling
Sascha Hauer
s.hauer at pengutronix.de
Fri Feb 14 10:31:03 EST 2014
Currently the version defines reflect the digits in the version
number. MMC_VERSION_4_41 is defined as 0x441 and MMC_VERSION_4_5
is defined as 0x405. This results in MMC_VERSION_4_5 < MMC_VERSION_4_41
becoming true which was surely not intended. Fix this by
redefining the versions as 0x<major><minor><micro>. This makes the
string generation more complicated but makes versions comparable
again.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/mci/mci-core.c | 28 +++++++++++++++++++---------
include/mci.h | 18 +++++++++---------
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index cf38a88..a18b555 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -939,6 +939,21 @@ out:
return err;
}
+static char *mci_version_string(struct mci *mci)
+{
+ static char version[sizeof("x.xx")];
+ unsigned major, minor, micro;
+
+ major = (mci->version >> 8) & 0xf;
+ minor = (mci->version >> 4) & 0xf;
+ micro = mci->version & 0xf;
+
+ sprintf(version, "%u.%u", major,
+ micro ? (minor << 4) | micro : minor);
+
+ return version;
+}
+
static int mci_startup_sd(struct mci *mci)
{
struct mci_cmd cmd;
@@ -1140,8 +1155,8 @@ static int mci_startup(struct mci *mci)
return err;
mci_correct_version_from_ext_csd(mci);
- printf("detected %s card version %d.%d\n", IS_SD(mci) ? "SD" : "MMC",
- (mci->version >> 8) & 0xf, mci->version & 0xff);
+ dev_info(&mci->dev, "detected %s card version %s\n", IS_SD(mci) ? "SD" : "MMC",
+ mci_version_string(mci));
mci_extract_card_capacity_from_csd(mci);
if (IS_SD(mci))
@@ -1477,13 +1492,8 @@ static void mci_info(struct device_d *dev)
mci_print_caps(host->host_caps);
printf("Card information:\n");
- if (mci->version < SD_VERSION_SD) {
- printf(" Attached is a MultiMediaCard (Version: %u.%u)\n",
- (mci->version >> 4) & 0xf, mci->version & 0xf);
- } else {
- printf(" Attached is an SD Card (Version: %u.%u)\n",
- (mci->version >> 8) & 0xf, mci->version & 0xff);
- }
+ printf(" Attached is a %s card\n", IS_SD(mci) ? "SD" : "MMC");
+ printf(" Version: %s\n", mci_version_string(mci));
printf(" Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20));
if (mci->high_capacity)
diff --git a/include/mci.h b/include/mci.h
index 40a712b..cd3e2c2 100644
--- a/include/mci.h
+++ b/include/mci.h
@@ -33,21 +33,21 @@
#define SD_VERSION_SD 0x20000
#define SD_VERSION_2 (SD_VERSION_SD | 0x200)
#define SD_VERSION_1_0 (SD_VERSION_SD | 0x100)
-#define SD_VERSION_1_10 (SD_VERSION_SD | 0x10a)
+#define SD_VERSION_1_10 (SD_VERSION_SD | 0x1a0)
/* Firmware revisions for MMC cards */
#define MMC_VERSION_MMC 0x10000
#define MMC_VERSION_UNKNOWN (MMC_VERSION_MMC)
-#define MMC_VERSION_1_2 (MMC_VERSION_MMC | 0x102)
-#define MMC_VERSION_1_4 (MMC_VERSION_MMC | 0x104)
-#define MMC_VERSION_2_2 (MMC_VERSION_MMC | 0x202)
+#define MMC_VERSION_1_2 (MMC_VERSION_MMC | 0x120)
+#define MMC_VERSION_1_4 (MMC_VERSION_MMC | 0x140)
+#define MMC_VERSION_2_2 (MMC_VERSION_MMC | 0x220)
#define MMC_VERSION_3 (MMC_VERSION_MMC | 0x300)
#define MMC_VERSION_4 (MMC_VERSION_MMC | 0x400)
-#define MMC_VERSION_4_1 (MMC_VERSION_MMC | 0x401)
-#define MMC_VERSION_4_2 (MMC_VERSION_MMC | 0x402)
-#define MMC_VERSION_4_3 (MMC_VERSION_MMC | 0x403)
-#define MMC_VERSION_4_41 (MMC_VERSION_MMC | 0x429)
-#define MMC_VERSION_4_5 (MMC_VERSION_MMC | 0x405)
+#define MMC_VERSION_4_1 (MMC_VERSION_MMC | 0x410)
+#define MMC_VERSION_4_2 (MMC_VERSION_MMC | 0x420)
+#define MMC_VERSION_4_3 (MMC_VERSION_MMC | 0x430)
+#define MMC_VERSION_4_41 (MMC_VERSION_MMC | 0x441)
+#define MMC_VERSION_4_5 (MMC_VERSION_MMC | 0x450)
#define MMC_CAP_SPI (1 << 0)
#define MMC_CAP_4_BIT_DATA (1 << 1)
--
1.8.5.3
More information about the barebox
mailing list