[U-Boot] [PATCH v4 1/3] dm: implement a MTD uclass

Simon Glass
2015-11-06T12:06:59Z

On 3 November 2015 at 06:09, Thomas Chou <thomas@wytron.com.tw> wrote:
> 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>
> ---
> v3
> change to MTD uclass.
> v4
> add mtd_info to flash_info in flash.h.
>
> drivers/mtd/Kconfig | 12 ++++++++++++
> drivers/mtd/Makefile | 1 +
> drivers/mtd/mtd-uclass.c | 20 ++++++++++++++++++++
> include/dm/uclass-id.h | 1 +
> include/flash.h | 3 +++
> include/linux/mtd/mtd.h | 3 +++
> include/mtd.h | 23 +++++++++++++++++++++++
> 7 files changed, 63 insertions(+)
> create mode 100644 drivers/mtd/mtd-uclass.c
> create mode 100644 include/mtd.h
>
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index 59278d1..23dff48 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 a623f4c..c23c0c1 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 0000000..8bd3e6b
> --- /dev/null
> +++ b/drivers/mtd/mtd-uclass.c
> @@ -0,0 +1,20 @@
> +/*
> + * 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",
> +};
> diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
> index 886a44c..fcc9784 100644
> --- a/include/dm/uclass-id.h
> +++ b/include/dm/uclass-id.h
> @@ -42,6 +42,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 dc0645e..f53ace7 100644
> --- a/include/flash.h
> +++ b/include/flash.h
> @@ -44,6 +44,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 e3d3fc7..0ab6128 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -18,6 +18,7 @@
>
> #include <asm/div64.h>
> #else
> +#include <dm.h>

I'm not keen on adding this header here. Why is it needed? Can we
instead include <m.h> in the C files that need it?

> #include <linux/compat.h>
> #include <mtd/mtd-abi.h>
> #include <asm/errno.h>
> @@ -272,6 +273,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 0000000..3f8c293
> --- /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);
> +}

That function is a nice idea I think.

> +
> +#endif /* _MTD_H_ */
> --
> 2.5.0
>

Regards,
Simon