Skip to content

Commit 2b533e7

Browse files
committed
Revert "mtd: maps: remove uclinux map driver"
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 c584b8a. Reported-by: Greg Ungerer <gregungerer@westnet.com.au> Closes: https://lore.kernel.org/all/b55ac37f-4523-46d0-8e77-3a17d7235ffe@westnet.com.au/ Acked-by: Arnd Bergmann <arnd@kernel.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
1 parent d03a19b commit 2b533e7

3 files changed

Lines changed: 125 additions & 0 deletions

File tree

drivers/mtd/maps/Kconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,12 @@ config MTD_PCMCIA_ANONYMOUS
277277

278278
If unsure, say N.
279279

280+
config MTD_UCLINUX
281+
bool "Generic uClinux RAM/ROM filesystem support"
282+
depends on (MTD_RAM=y || MTD_ROM=y) && (!MMU || COLDFIRE)
283+
help
284+
Map driver to support image based filesystems for uClinux.
285+
280286
config MTD_PLATRAM
281287
tristate "Map driver for platform device RAM (mtd-ram)"
282288
select MTD_RAM

drivers/mtd/maps/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
3030
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
3131
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
3232
obj-$(CONFIG_MTD_PCI) += pci.o
33+
obj-$(CONFIG_MTD_UCLINUX) += uclinux.o
3334
obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o
3435
obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
3536
obj-$(CONFIG_MTD_VMU) += vmu-flash.o

drivers/mtd/maps/uclinux.c

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/****************************************************************************/
2+
3+
/*
4+
* uclinux.c -- generic memory mapped MTD driver for uclinux
5+
*
6+
* (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com)
7+
*
8+
* License: GPL
9+
*/
10+
11+
/****************************************************************************/
12+
13+
#include <linux/moduleparam.h>
14+
#include <linux/types.h>
15+
#include <linux/init.h>
16+
#include <linux/kernel.h>
17+
#include <linux/fs.h>
18+
#include <linux/mm.h>
19+
#include <linux/major.h>
20+
#include <linux/mtd/mtd.h>
21+
#include <linux/mtd/map.h>
22+
#include <linux/mtd/partitions.h>
23+
#include <asm/io.h>
24+
#include <asm/sections.h>
25+
26+
/****************************************************************************/
27+
28+
#ifdef CONFIG_MTD_ROM
29+
#define MAP_NAME "rom"
30+
#else
31+
#define MAP_NAME "ram"
32+
#endif
33+
34+
static struct map_info uclinux_ram_map = {
35+
.name = MAP_NAME,
36+
.size = 0,
37+
};
38+
39+
static unsigned long physaddr = -1;
40+
module_param(physaddr, ulong, S_IRUGO);
41+
42+
static struct mtd_info *uclinux_ram_mtdinfo;
43+
44+
/****************************************************************************/
45+
46+
static const struct mtd_partition uclinux_romfs[] = {
47+
{ .name = "ROMfs" }
48+
};
49+
50+
#define NUM_PARTITIONS ARRAY_SIZE(uclinux_romfs)
51+
52+
/****************************************************************************/
53+
54+
static int uclinux_point(struct mtd_info *mtd, loff_t from, size_t len,
55+
size_t *retlen, void **virt, resource_size_t *phys)
56+
{
57+
struct map_info *map = mtd->priv;
58+
*virt = map->virt + from;
59+
if (phys)
60+
*phys = map->phys + from;
61+
*retlen = len;
62+
return(0);
63+
}
64+
65+
/****************************************************************************/
66+
67+
static int __init uclinux_mtd_init(void)
68+
{
69+
struct mtd_info *mtd;
70+
struct map_info *mapp;
71+
72+
mapp = &uclinux_ram_map;
73+
74+
if (physaddr == -1)
75+
mapp->phys = (resource_size_t)__bss_stop;
76+
else
77+
mapp->phys = physaddr;
78+
79+
if (!mapp->size)
80+
mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(mapp->phys + 8))));
81+
mapp->bankwidth = 4;
82+
83+
printk("uclinux[mtd]: probe address=0x%x size=0x%x\n",
84+
(int) mapp->phys, (int) mapp->size);
85+
86+
/*
87+
* The filesystem is guaranteed to be in direct mapped memory. It is
88+
* directly following the kernels own bss region. Following the same
89+
* mechanism used by architectures setting up traditional initrds we
90+
* use phys_to_virt to get the virtual address of its start.
91+
*/
92+
mapp->virt = phys_to_virt(mapp->phys);
93+
94+
if (mapp->virt == 0) {
95+
printk("uclinux[mtd]: no virtual mapping?\n");
96+
return(-EIO);
97+
}
98+
99+
simple_map_init(mapp);
100+
101+
mtd = do_map_probe("map_" MAP_NAME, mapp);
102+
if (!mtd) {
103+
printk("uclinux[mtd]: failed to find a mapping?\n");
104+
return(-ENXIO);
105+
}
106+
107+
mtd->owner = THIS_MODULE;
108+
mtd->_point = uclinux_point;
109+
mtd->priv = mapp;
110+
111+
uclinux_ram_mtdinfo = mtd;
112+
mtd_device_register(mtd, uclinux_romfs, NUM_PARTITIONS);
113+
114+
return(0);
115+
}
116+
device_initcall(uclinux_mtd_init);
117+
118+
/****************************************************************************/

0 commit comments

Comments
 (0)