Skip to content

Commit 05ec7dd

Browse files
committed
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (154 commits) mtd: cfi_cmdset_0002: use AMD standard command-set with Winbond flash chips mtd: cfi_cmdset_0002: Fix MODULE_ALIAS and linkage for new 0701 commandset ID mtd: mxc_nand: Remove duplicate NAND_CMD_RESET case value mtd: update gfp/slab.h includes jffs2: Stop triggering block erases from jffs2_write_super() jffs2: Rename jffs2_erase_pending_trigger() to jffs2_dirty_trigger() jffs2: Use jffs2_garbage_collect_trigger() to trigger pending erases jffs2: Require jffs2_garbage_collect_trigger() to be called with lock held jffs2: Wake GC thread when there are blocks to be erased jffs2: Erase pending blocks in GC pass, avoid invalid -EIO return jffs2: Add 'work_done' return value from jffs2_erase_pending_blocks() mtd: mtdchar: Do not corrupt backing device of device node inode mtd/maps/pcmciamtd: Fix printk format for ssize_t in debug messages drivers/mtd: Use kmemdup mtd: cfi_cmdset_0002: Fix argument order in bootloc warning mtd: nand: add Toshiba TC58NVG0 device ID pcmciamtd: add another ID pcmciamtd: coding style cleanups pcmciamtd: fixing obvious errors mtd: chips: add SST39WF160x NOR-flashes ... Trivial conflicts due to dev_node removal in drivers/mtd/maps/pcmciamtd.c
2 parents c316ba3 + 8046112 commit 05ec7dd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

117 files changed

+10156
-1647
lines changed

MAINTAINERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4762,6 +4762,12 @@ S: Maintained
47624762
F: Documentation/rfkill.txt
47634763
F: net/rfkill/
47644764

4765+
RICOH SMARTMEDIA/XD DRIVER
4766+
M: Maxim Levitsky <[email protected]>
4767+
S: Maintained
4768+
F: drivers/mtd/nand/r822.c
4769+
F: drivers/mtd/nand/r822.h
4770+
47654771
RISCOM8 DRIVER
47664772
S: Orphan
47674773
F: Documentation/serial/riscom8.txt

arch/arm/mach-ep93xx/include/mach/ts72xx.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
* febff000 22000000 4K model number register
1010
* febfe000 22400000 4K options register
1111
* febfd000 22800000 4K options register #2
12-
* febfc000 [67]0000000 4K NAND data register
13-
* febfb000 [67]0400000 4K NAND control register
14-
* febfa000 [67]0800000 4K NAND busy register
1512
* febf9000 10800000 4K TS-5620 RTC index register
1613
* febf8000 11700000 4K TS-5620 RTC data register
1714
*/
@@ -41,22 +38,6 @@
4138
#define TS72XX_OPTIONS2_TS9420_BOOT 0x02
4239

4340

44-
#define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000
45-
#define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000
46-
#define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000
47-
#define TS72XX_NAND_DATA_SIZE 0x00001000
48-
49-
#define TS72XX_NAND1_CONTROL_PHYS_BASE 0x60400000
50-
#define TS72XX_NAND2_CONTROL_PHYS_BASE 0x70400000
51-
#define TS72XX_NAND_CONTROL_VIRT_BASE 0xfebfb000
52-
#define TS72XX_NAND_CONTROL_SIZE 0x00001000
53-
54-
#define TS72XX_NAND1_BUSY_PHYS_BASE 0x60800000
55-
#define TS72XX_NAND2_BUSY_PHYS_BASE 0x70800000
56-
#define TS72XX_NAND_BUSY_VIRT_BASE 0xfebfa000
57-
#define TS72XX_NAND_BUSY_SIZE 0x00001000
58-
59-
6041
#define TS72XX_RTC_INDEX_VIRT_BASE 0xfebf9000
6142
#define TS72XX_RTC_INDEX_PHYS_BASE 0x10800000
6243
#define TS72XX_RTC_INDEX_SIZE 0x00001000

arch/arm/mach-ep93xx/ts72xx.c

Lines changed: 131 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010
* your option) any later version.
1111
*/
1212

13+
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14+
1315
#include <linux/kernel.h>
1416
#include <linux/init.h>
1517
#include <linux/platform_device.h>
1618
#include <linux/io.h>
1719
#include <linux/m48t86.h>
1820
#include <linux/mtd/physmap.h>
21+
#include <linux/mtd/nand.h>
22+
#include <linux/mtd/partitions.h>
1923

2024
#include <mach/hardware.h>
2125
#include <mach/ts72xx.h>
@@ -54,92 +58,162 @@ static struct map_desc ts72xx_io_desc[] __initdata = {
5458
}
5559
};
5660

57-
static struct map_desc ts72xx_nand_io_desc[] __initdata = {
58-
{
59-
.virtual = TS72XX_NAND_DATA_VIRT_BASE,
60-
.pfn = __phys_to_pfn(TS72XX_NAND1_DATA_PHYS_BASE),
61-
.length = TS72XX_NAND_DATA_SIZE,
62-
.type = MT_DEVICE,
63-
}, {
64-
.virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
65-
.pfn = __phys_to_pfn(TS72XX_NAND1_CONTROL_PHYS_BASE),
66-
.length = TS72XX_NAND_CONTROL_SIZE,
67-
.type = MT_DEVICE,
68-
}, {
69-
.virtual = TS72XX_NAND_BUSY_VIRT_BASE,
70-
.pfn = __phys_to_pfn(TS72XX_NAND1_BUSY_PHYS_BASE),
71-
.length = TS72XX_NAND_BUSY_SIZE,
72-
.type = MT_DEVICE,
61+
static void __init ts72xx_map_io(void)
62+
{
63+
ep93xx_map_io();
64+
iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc));
65+
}
66+
67+
68+
/*************************************************************************
69+
* NAND flash
70+
*************************************************************************/
71+
#define TS72XX_NAND_CONTROL_ADDR_LINE 22 /* 0xN0400000 */
72+
#define TS72XX_NAND_BUSY_ADDR_LINE 23 /* 0xN0800000 */
73+
74+
static void ts72xx_nand_hwcontrol(struct mtd_info *mtd,
75+
int cmd, unsigned int ctrl)
76+
{
77+
struct nand_chip *chip = mtd->priv;
78+
79+
if (ctrl & NAND_CTRL_CHANGE) {
80+
void __iomem *addr = chip->IO_ADDR_R;
81+
unsigned char bits;
82+
83+
addr += (1 << TS72XX_NAND_CONTROL_ADDR_LINE);
84+
85+
bits = __raw_readb(addr) & ~0x07;
86+
bits |= (ctrl & NAND_NCE) << 2; /* bit 0 -> bit 2 */
87+
bits |= (ctrl & NAND_CLE); /* bit 1 -> bit 1 */
88+
bits |= (ctrl & NAND_ALE) >> 2; /* bit 2 -> bit 0 */
89+
90+
__raw_writeb(bits, addr);
7391
}
74-
};
7592

76-
static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
93+
if (cmd != NAND_CMD_NONE)
94+
__raw_writeb(cmd, chip->IO_ADDR_W);
95+
}
96+
97+
static int ts72xx_nand_device_ready(struct mtd_info *mtd)
98+
{
99+
struct nand_chip *chip = mtd->priv;
100+
void __iomem *addr = chip->IO_ADDR_R;
101+
102+
addr += (1 << TS72XX_NAND_BUSY_ADDR_LINE);
103+
104+
return !!(__raw_readb(addr) & 0x20);
105+
}
106+
107+
static const char *ts72xx_nand_part_probes[] = { "cmdlinepart", NULL };
108+
109+
#define TS72XX_BOOTROM_PART_SIZE (SZ_16K)
110+
#define TS72XX_REDBOOT_PART_SIZE (SZ_2M + SZ_1M)
111+
112+
static struct mtd_partition ts72xx_nand_parts[] = {
77113
{
78-
.virtual = TS72XX_NAND_DATA_VIRT_BASE,
79-
.pfn = __phys_to_pfn(TS72XX_NAND2_DATA_PHYS_BASE),
80-
.length = TS72XX_NAND_DATA_SIZE,
81-
.type = MT_DEVICE,
114+
.name = "TS-BOOTROM",
115+
.offset = 0,
116+
.size = TS72XX_BOOTROM_PART_SIZE,
117+
.mask_flags = MTD_WRITEABLE, /* force read-only */
82118
}, {
83-
.virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
84-
.pfn = __phys_to_pfn(TS72XX_NAND2_CONTROL_PHYS_BASE),
85-
.length = TS72XX_NAND_CONTROL_SIZE,
86-
.type = MT_DEVICE,
119+
.name = "Linux",
120+
.offset = MTDPART_OFS_APPEND,
121+
.size = 0, /* filled in later */
87122
}, {
88-
.virtual = TS72XX_NAND_BUSY_VIRT_BASE,
89-
.pfn = __phys_to_pfn(TS72XX_NAND2_BUSY_PHYS_BASE),
90-
.length = TS72XX_NAND_BUSY_SIZE,
91-
.type = MT_DEVICE,
92-
}
123+
.name = "RedBoot",
124+
.offset = MTDPART_OFS_APPEND,
125+
.size = MTDPART_SIZ_FULL,
126+
.mask_flags = MTD_WRITEABLE, /* force read-only */
127+
},
93128
};
94129

95-
static void __init ts72xx_map_io(void)
130+
static void ts72xx_nand_set_parts(uint64_t size,
131+
struct platform_nand_chip *chip)
96132
{
97-
ep93xx_map_io();
98-
iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc));
133+
/* Factory TS-72xx boards only come with 32MiB or 128MiB NAND options */
134+
if (size == SZ_32M || size == SZ_128M) {
135+
/* Set the "Linux" partition size */
136+
ts72xx_nand_parts[1].size = size - TS72XX_REDBOOT_PART_SIZE;
99137

100-
/*
101-
* The TS-7200 has NOR flash, the other models have NAND flash.
102-
*/
103-
if (!board_is_ts7200()) {
104-
if (is_ts9420_installed()) {
105-
iotable_init(ts72xx_alternate_nand_io_desc,
106-
ARRAY_SIZE(ts72xx_alternate_nand_io_desc));
107-
} else {
108-
iotable_init(ts72xx_nand_io_desc,
109-
ARRAY_SIZE(ts72xx_nand_io_desc));
110-
}
138+
chip->partitions = ts72xx_nand_parts;
139+
chip->nr_partitions = ARRAY_SIZE(ts72xx_nand_parts);
140+
} else {
141+
pr_warning("Unknown nand disk size:%lluMiB\n", size >> 20);
111142
}
112143
}
113144

145+
static struct platform_nand_data ts72xx_nand_data = {
146+
.chip = {
147+
.nr_chips = 1,
148+
.chip_offset = 0,
149+
.chip_delay = 15,
150+
.part_probe_types = ts72xx_nand_part_probes,
151+
.set_parts = ts72xx_nand_set_parts,
152+
},
153+
.ctrl = {
154+
.cmd_ctrl = ts72xx_nand_hwcontrol,
155+
.dev_ready = ts72xx_nand_device_ready,
156+
},
157+
};
158+
159+
static struct resource ts72xx_nand_resource[] = {
160+
{
161+
.start = 0, /* filled in later */
162+
.end = 0, /* filled in later */
163+
.flags = IORESOURCE_MEM,
164+
},
165+
};
166+
167+
static struct platform_device ts72xx_nand_flash = {
168+
.name = "gen_nand",
169+
.id = -1,
170+
.dev.platform_data = &ts72xx_nand_data,
171+
.resource = ts72xx_nand_resource,
172+
.num_resources = ARRAY_SIZE(ts72xx_nand_resource),
173+
};
174+
175+
114176
/*************************************************************************
115177
* NOR flash (TS-7200 only)
116178
*************************************************************************/
117-
static struct physmap_flash_data ts72xx_flash_data = {
179+
static struct physmap_flash_data ts72xx_nor_data = {
118180
.width = 2,
119181
};
120182

121-
static struct resource ts72xx_flash_resource = {
183+
static struct resource ts72xx_nor_resource = {
122184
.start = EP93XX_CS6_PHYS_BASE,
123185
.end = EP93XX_CS6_PHYS_BASE + SZ_16M - 1,
124186
.flags = IORESOURCE_MEM,
125187
};
126188

127-
static struct platform_device ts72xx_flash = {
128-
.name = "physmap-flash",
129-
.id = 0,
130-
.dev = {
131-
.platform_data = &ts72xx_flash_data,
132-
},
133-
.num_resources = 1,
134-
.resource = &ts72xx_flash_resource,
189+
static struct platform_device ts72xx_nor_flash = {
190+
.name = "physmap-flash",
191+
.id = 0,
192+
.dev.platform_data = &ts72xx_nor_data,
193+
.resource = &ts72xx_nor_resource,
194+
.num_resources = 1,
135195
};
136196

137197
static void __init ts72xx_register_flash(void)
138198
{
139-
if (board_is_ts7200())
140-
platform_device_register(&ts72xx_flash);
199+
if (board_is_ts7200()) {
200+
platform_device_register(&ts72xx_nor_flash);
201+
} else {
202+
resource_size_t start;
203+
204+
if (is_ts9420_installed())
205+
start = EP93XX_CS7_PHYS_BASE;
206+
else
207+
start = EP93XX_CS6_PHYS_BASE;
208+
209+
ts72xx_nand_resource[0].start = start;
210+
ts72xx_nand_resource[0].end = start + SZ_16M - 1;
211+
212+
platform_device_register(&ts72xx_nand_flash);
213+
}
141214
}
142215

216+
143217
static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
144218
{
145219
__raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);

arch/arm/mach-kirkwood/common.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,15 @@ void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts,
305305
platform_device_register(&kirkwood_nand_flash);
306306
}
307307

308+
void __init kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
309+
int (*dev_ready)(struct mtd_info *))
310+
{
311+
kirkwood_clk_ctrl |= CGC_RUNIT;
312+
kirkwood_nand_data.parts = parts;
313+
kirkwood_nand_data.nr_parts = nr_parts;
314+
kirkwood_nand_data.dev_ready = dev_ready;
315+
platform_device_register(&kirkwood_nand_flash);
316+
}
308317

309318
/*****************************************************************************
310319
* SoC RTC

arch/arm/mach-kirkwood/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct mv643xx_eth_platform_data;
1616
struct mv_sata_platform_data;
1717
struct mvsdio_platform_data;
1818
struct mtd_partition;
19+
struct mtd_info;
1920

2021
/*
2122
* Basic Kirkwood init functions used early by machine-setup.
@@ -41,6 +42,7 @@ void kirkwood_i2c_init(void);
4142
void kirkwood_uart0_init(void);
4243
void kirkwood_uart1_init(void);
4344
void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay);
45+
void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *));
4446

4547
extern int kirkwood_tclk;
4648
extern struct sys_timer kirkwood_timer;

arch/arm/plat-orion/include/plat/orion_nand.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
struct orion_nand_data {
1616
struct mtd_partition *parts;
17+
int (*dev_ready)(struct mtd_info *mtd);
1718
u32 nr_parts;
1819
u8 ale; /* address line number connected to ALE */
1920
u8 cle; /* address line number connected to CLE */

drivers/mtd/Kconfig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,19 @@ config SSFDC
304304
This enables read only access to SmartMedia formatted NAND
305305
flash. You can mount it with FAT file system.
306306

307+
308+
config SM_FTL
309+
tristate "SmartMedia/xD new translation layer"
310+
depends on EXPERIMENTAL && BLOCK
311+
select MTD_BLKDEVS
312+
select MTD_NAND_ECC
313+
help
314+
This enables new and very EXPERMENTAL support for SmartMedia/xD
315+
FTL (Flash translation layer).
316+
Write support isn't yet well tested, therefore this code IS likely to
317+
eat your card, so please don't use it together with valuable data.
318+
Use readonly driver (CONFIG_SSFDC) instead.
319+
307320
config MTD_OOPS
308321
tristate "Log panic/oops to an MTD buffer"
309322
depends on MTD

drivers/mtd/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ obj-$(CONFIG_NFTL) += nftl.o
2424
obj-$(CONFIG_INFTL) += inftl.o
2525
obj-$(CONFIG_RFD_FTL) += rfd_ftl.o
2626
obj-$(CONFIG_SSFDC) += ssfdc.o
27+
obj-$(CONFIG_SM_FTL) += sm_ftl.o
2728
obj-$(CONFIG_MTD_OOPS) += mtdoops.o
2829

2930
nftl-objs := nftlcore.o nftlmount.o

0 commit comments

Comments
 (0)