All, EXT_CSD is 512byte information (read using CMD8) for the MMC (eMMC) device. And for the latest and upcoming specification, ext_csd are much relevant then past. So please let me know your idea to add and get the same ext_csd as MMC device attribute. This is the same way currently available for csd, cid, src, etc. (# cat /sys/class/mmc_host/mmc1/mmc1\:0001/ext_csd) Regards, Sukumar Ghorai From: Sukumar Ghorai <s-ghorai@xxxxxx> Date: Mon, 26 Jul 2010 10:47:12 +0530 Subject: [PATCH] mmc: add device class attribute for ext_csd ext_csd is getting more informative form eMMC 4.4 onwards and better to have this in device information as currently available for csd, cid, src. Signed-off-by: Sukumar Ghorai <s-ghorai@xxxxxx> --- drivers/mmc/core/bus.c | 1 + drivers/mmc/core/mmc.c | 23 +++++++++++++++++------ include/linux/mmc/card.h | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 49d9dca..57d035e 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -191,6 +191,7 @@ static void mmc_release_card(struct device *dev) if (card->info) kfree(card->info); + kfree(card->raw_ext_csd); kfree(card); } diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 89f7a25..23b1813 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -167,10 +167,6 @@ static int mmc_read_ext_csd(struct mmc_card *card) if (card->csd.mmca_vsn < CSD_SPEC_VER_4) return 0; - /* - * As the ext_csd is so large and mostly unused, we don't store the - * raw block in mmc_card. - */ ext_csd = kmalloc(512, GFP_KERNEL); if (!ext_csd) { printk(KERN_ERR "%s: could not allocate a buffer to " @@ -250,11 +246,25 @@ static int mmc_read_ext_csd(struct mmc_card *card) } out: - kfree(ext_csd); - + card->raw_ext_csd = ext_csd; return err; } +static ssize_t mmc_ext_csd_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ +int i; +struct mmc_card *card = container_of(dev, struct mmc_card, dev); + + for (i = 0; i < 512; i++) + buf += sprintf(buf, "%02x", card->raw_ext_csd[i]); + + buf -= 512; + return 512; +} + +static DEVICE_ATTR(ext_csd, S_IRUGO, mmc_ext_csd_show, NULL); + MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], card->raw_cid[2], card->raw_cid[3]); MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], @@ -270,6 +280,7 @@ MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, &dev_attr_csd.attr, + &dev_attr_ext_csd.attr, &dev_attr_date.attr, &dev_attr_fwrev.attr, &dev_attr_hwrev.attr, diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index d02d2c6..00332ca 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -105,6 +105,7 @@ struct mmc_card { u32 raw_cid[4]; /* raw card CID */ u32 raw_csd[4]; /* raw card CSD */ u32 raw_scr[2]; /* raw card SCR */ + u8 *raw_ext_csd; /* raw card EXT CSD for MMC */ struct mmc_cid cid; /* card identification */ struct mmc_csd csd; /* card specific */ struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */
Attachment:
emmc-dev-attr-ext-esd.patch
Description: emmc-dev-attr-ext-esd.patch