dm: implement a MTD uclass
authorThomas Chou <thomas@wytron.com.tw>
Sat, 7 Nov 2015 06:20:31 +0000 (14:20 +0800)
committerThomas Chou <thomas@wytron.com.tw>
Thu, 12 Nov 2015 00:26:58 +0000 (08:26 +0800)
Implement a Memory Technology Device (MTD) uclass. It should
include most flash drivers in the future. Though no uclass ops
are defined yet, the MTD ops could be used.

The NAND flash driver is based on MTD. The CFI flash and SPI
flash support MTD, too. It should make sense to convert them
to MTD uclass.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
drivers/mtd/Kconfig
drivers/mtd/Makefile
drivers/mtd/mtd-uclass.c [new file with mode: 0644]
include/dm/uclass-id.h
include/flash.h
include/linux/mtd/mtd.h
include/mtd.h [new file with mode: 0644]

index 59278d1eef6b5a6156e43d3e02f06a295be3c0bb..23dff48f081eb99ca109ebac49330dbebed4f8e6 100644 (file)
@@ -1,3 +1,15 @@
+menu "MTD Support"
+
+config MTD
+       bool "Enable Driver Model for MTD drivers"
+       depends on DM
+       help
+         Enable driver model for Memory Technology Devices (MTD), such as
+         flash, RAM and similar chips, often used for solid state file
+         systems on embedded devices.
+
+endmenu
+
 source "drivers/mtd/nand/Kconfig"
 
 source "drivers/mtd/spi/Kconfig"
index a623f4c9fa3fc904cd7a877877d9fb591e31ed23..c23c0c1fdf8ac843d6a6332bf51e84af8b5f3811 100644 (file)
@@ -8,6 +8,7 @@
 ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)))
 obj-y += mtdcore.o mtd_uboot.o
 endif
+obj-$(CONFIG_MTD) += mtd-uclass.o
 obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
 obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
 obj-$(CONFIG_HAS_DATAFLASH) += at45.o
diff --git a/drivers/mtd/mtd-uclass.c b/drivers/mtd/mtd-uclass.c
new file mode 100644 (file)
index 0000000..7b7c48e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <mtd.h>
+
+/*
+ * Implement a MTD uclass which should include most flash drivers.
+ * The uclass private is pointed to mtd_info.
+ */
+
+UCLASS_DRIVER(mtd) = {
+       .id             = UCLASS_MTD,
+       .name           = "mtd",
+       .per_device_auto_alloc_size = sizeof(struct mtd_info),
+};
index d0cf4ce6a0d20e1af896db81d675a89daa1c7742..327de3486b5511c5a6b43156ff04694dd1bd7151 100644 (file)
@@ -43,6 +43,7 @@ enum uclass_id {
        UCLASS_MISC,            /* Miscellaneous device */
        UCLASS_MMC,             /* SD / MMC card or chip */
        UCLASS_MOD_EXP,         /* RSA Mod Exp device */
+       UCLASS_MTD,             /* Memory Technology Device (MTD) device */
        UCLASS_PCH,             /* x86 platform controller hub */
        UCLASS_PCI,             /* PCI bus */
        UCLASS_PCI_GENERIC,     /* Generic PCI bus device */
index 5754cf97737c1b5658327c3f521408cacec78b9e..13e03842c84b2c0733af57a4c9ad23dce709fe6c 100644 (file)
@@ -41,6 +41,9 @@ typedef struct {
        ulong   addr_unlock2;           /* unlock address 2 for AMD flash roms  */
        const char *name;               /* human-readable name                  */
 #endif
+#ifdef CONFIG_MTD
+       struct mtd_info *mtd;
+#endif
 } flash_info_t;
 
 extern flash_info_t flash_info[]; /* info for FLASH chips      */
index e3d3fc73fd62cbf2900086ec18114e59c1dc0d28..c2cd3df1fa54d0904fa81b19685039c5ea4fe920 100644 (file)
@@ -272,6 +272,8 @@ struct mtd_info {
        struct module *owner;
 #ifndef __UBOOT__
        struct device dev;
+#else
+       struct udevice *dev;
 #endif
        int usecount;
 };
diff --git a/include/mtd.h b/include/mtd.h
new file mode 100644 (file)
index 0000000..3f8c293
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _MTD_H_
+#define _MTD_H_
+
+#include <linux/mtd/mtd.h>
+
+/*
+ * Get mtd_info structure of the dev, which is stored as uclass private.
+ *
+ * @dev: The MTD device
+ * @return: pointer to mtd_info, NULL on error
+ */
+static inline struct mtd_info *mtd_get_info(struct udevice *dev)
+{
+       return dev_get_uclass_priv(dev);
+}
+
+#endif /* _MTD_H_ */