summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Chou <thomas@wytron.com.tw>2015-11-07 14:20:31 +0800
committerThomas Chou <thomas@wytron.com.tw>2015-11-12 08:26:58 +0800
commitd85879938d3fc3557f6ff74a60f95e0975a314ce (patch)
tree9610f6a0c88c2005c274a2b6adce644d4088c53f
parentb375219e732f044e7f48b676fa4e36e7c29d81e1 (diff)
dm: implement a MTD uclass
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>
-rw-r--r--drivers/mtd/Kconfig12
-rw-r--r--drivers/mtd/Makefile1
-rw-r--r--drivers/mtd/mtd-uclass.c21
-rw-r--r--include/dm/uclass-id.h1
-rw-r--r--include/flash.h3
-rw-r--r--include/linux/mtd/mtd.h2
-rw-r--r--include/mtd.h23
7 files changed, 63 insertions, 0 deletions
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 59278d1eef..23dff48f08 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -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"
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index a623f4c9fa..c23c0c1fdf 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -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
index 0000000000..7b7c48ec5a
--- /dev/null
+++ b/drivers/mtd/mtd-uclass.c
@@ -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),
+};
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index d0cf4ce6a0..327de3486b 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -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 */
diff --git a/include/flash.h b/include/flash.h
index 5754cf9773..13e03842c8 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -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 */
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index e3d3fc73fd..c2cd3df1fa 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -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
index 0000000000..3f8c293b00
--- /dev/null
+++ b/include/mtd.h
@@ -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_ */