[PATCH] Revert "mtd: maps: remove uclinux map driver"
Greg Ungerer
gerg at linux-m68k.org
Fri Jul 3 05:00:03 PDT 2026
Hi Miquel,
On 3/7/26 21:35, Miquel Raynal wrote:
> The uclinux MTD map driver is still actively used on ColdFire (m68k)
> platforms. The ColdFire startup code in arch/m68k/coldfire/head.S copies
> an attached filesystem blob to _bss_stop, and the uclinux driver picks
> it up from there. Most ColdFire defconfigs enable CONFIG_MTD_UCLINUX, as
> the driver seems to serve as a replacement for CONFIG_BLK_DEV_INITRD on
> these non-MMU targets.
>
> The driver was removed as part of a series cleaning up AMD Élan specific
> drivers, but unlike the other three drivers in that series, this driver
> seemed to not be as Élan specific (nor unused) as initially thought.
>
> This reverts commit c584b8a7ad01a334a89732f3c5791ba14e58642b.
>
> Reported-by: Greg Ungerer <gregungerer at westnet.com.au>
> Closes: https://lore.kernel.org/all/b55ac37f-4523-46d0-8e77-3a17d7235ffe@westnet.com.au/
> Acked-by: Arnd Bergmann <arnd at kernel.org>
> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
Looks good to me too.
Thanks for taking care of this.
Regards
Greg
> ---
> drivers/mtd/maps/Kconfig | 6 +++
> drivers/mtd/maps/Makefile | 1 +
> drivers/mtd/maps/uclinux.c | 118 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 125 insertions(+)
>
> diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
> index dce5e67ce3c2..f447902d707e 100644
> --- a/drivers/mtd/maps/Kconfig
> +++ b/drivers/mtd/maps/Kconfig
> @@ -277,6 +277,12 @@ config MTD_PCMCIA_ANONYMOUS
>
> If unsure, say N.
>
> +config MTD_UCLINUX
> + bool "Generic uClinux RAM/ROM filesystem support"
> + depends on (MTD_RAM=y || MTD_ROM=y) && (!MMU || COLDFIRE)
> + help
> + Map driver to support image based filesystems for uClinux.
> +
> config MTD_PLATRAM
> tristate "Map driver for platform device RAM (mtd-ram)"
> select MTD_RAM
> diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
> index fbed278157f6..01745eca1f73 100644
> --- a/drivers/mtd/maps/Makefile
> +++ b/drivers/mtd/maps/Makefile
> @@ -30,6 +30,7 @@ obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
> obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
> obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
> obj-$(CONFIG_MTD_PCI) += pci.o
> +obj-$(CONFIG_MTD_UCLINUX) += uclinux.o
> obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o
> obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
> obj-$(CONFIG_MTD_VMU) += vmu-flash.o
> diff --git a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c
> new file mode 100644
> index 000000000000..de4c46318abb
> --- /dev/null
> +++ b/drivers/mtd/maps/uclinux.c
> @@ -0,0 +1,118 @@
> +/****************************************************************************/
> +
> +/*
> + * uclinux.c -- generic memory mapped MTD driver for uclinux
> + *
> + * (C) Copyright 2002, Greg Ungerer (gerg at snapgear.com)
> + *
> + * License: GPL
> + */
> +
> +/****************************************************************************/
> +
> +#include <linux/moduleparam.h>
> +#include <linux/types.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/fs.h>
> +#include <linux/mm.h>
> +#include <linux/major.h>
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/map.h>
> +#include <linux/mtd/partitions.h>
> +#include <asm/io.h>
> +#include <asm/sections.h>
> +
> +/****************************************************************************/
> +
> +#ifdef CONFIG_MTD_ROM
> +#define MAP_NAME "rom"
> +#else
> +#define MAP_NAME "ram"
> +#endif
> +
> +static struct map_info uclinux_ram_map = {
> + .name = MAP_NAME,
> + .size = 0,
> +};
> +
> +static unsigned long physaddr = -1;
> +module_param(physaddr, ulong, S_IRUGO);
> +
> +static struct mtd_info *uclinux_ram_mtdinfo;
> +
> +/****************************************************************************/
> +
> +static const struct mtd_partition uclinux_romfs[] = {
> + { .name = "ROMfs" }
> +};
> +
> +#define NUM_PARTITIONS ARRAY_SIZE(uclinux_romfs)
> +
> +/****************************************************************************/
> +
> +static int uclinux_point(struct mtd_info *mtd, loff_t from, size_t len,
> + size_t *retlen, void **virt, resource_size_t *phys)
> +{
> + struct map_info *map = mtd->priv;
> + *virt = map->virt + from;
> + if (phys)
> + *phys = map->phys + from;
> + *retlen = len;
> + return(0);
> +}
> +
> +/****************************************************************************/
> +
> +static int __init uclinux_mtd_init(void)
> +{
> + struct mtd_info *mtd;
> + struct map_info *mapp;
> +
> + mapp = &uclinux_ram_map;
> +
> + if (physaddr == -1)
> + mapp->phys = (resource_size_t)__bss_stop;
> + else
> + mapp->phys = physaddr;
> +
> + if (!mapp->size)
> + mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(mapp->phys + 8))));
> + mapp->bankwidth = 4;
> +
> + printk("uclinux[mtd]: probe address=0x%x size=0x%x\n",
> + (int) mapp->phys, (int) mapp->size);
> +
> + /*
> + * The filesystem is guaranteed to be in direct mapped memory. It is
> + * directly following the kernels own bss region. Following the same
> + * mechanism used by architectures setting up traditional initrds we
> + * use phys_to_virt to get the virtual address of its start.
> + */
> + mapp->virt = phys_to_virt(mapp->phys);
> +
> + if (mapp->virt == 0) {
> + printk("uclinux[mtd]: no virtual mapping?\n");
> + return(-EIO);
> + }
> +
> + simple_map_init(mapp);
> +
> + mtd = do_map_probe("map_" MAP_NAME, mapp);
> + if (!mtd) {
> + printk("uclinux[mtd]: failed to find a mapping?\n");
> + return(-ENXIO);
> + }
> +
> + mtd->owner = THIS_MODULE;
> + mtd->_point = uclinux_point;
> + mtd->priv = mapp;
> +
> + uclinux_ram_mtdinfo = mtd;
> + mtd_device_register(mtd, uclinux_romfs, NUM_PARTITIONS);
> +
> + return(0);
> +}
> +device_initcall(uclinux_mtd_init);
> +
> +/****************************************************************************/
>
> ---
> base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482
> change-id: 20260703-perso-revert-uclinux-map-8efed661809d
>
> Best regards,
More information about the linux-mtd
mailing list