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

Simon Glass sjg at chromium.org
Fri Nov 6 13:06:59 CET 2015


On 3 November 2015 at 06:09, Thomas Chou <thomas at 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 at 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 at 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 at 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


More information about the U-Boot mailing list