diff options
Diffstat (limited to 'recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch')
-rw-r--r-- | recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch b/recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch new file mode 100644 index 0000000000..ce73a860bc --- /dev/null +++ b/recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch @@ -0,0 +1,270 @@ +From 45a115b858cf82a35e51a7541a3f83c4dd4e08ea Mon Sep 17 00:00:00 2001 +From: Matthieu Crapet <mcrapet@gmail.com> +Date: Sun, 20 Jun 2010 11:31:22 +0200 +Subject: [PATCH 16/18] ts72xx_nand_flash + +This is Hartley Sweeten's patch: +Update the ts72xx platform's nand driver support. + +It's available since 2.6.35-rc1 + +Only one concern here, it's the size of TS72XX_BOOTROM_PART_SIZE, +defined here to SZ_16K but can be SZ_128K for boards with 128mb flash. +--- + arch/arm/mach-ep93xx/ts72xx.c | 186 ++++++++++++++++++++++++++++------------- + drivers/mtd/nand/Kconfig | 2 +- + 2 files changed, 129 insertions(+), 59 deletions(-) + +diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c +index 7fd8f80..475559e 100644 +--- a/arch/arm/mach-ep93xx/ts72xx.c ++++ b/arch/arm/mach-ep93xx/ts72xx.c +@@ -10,6 +10,8 @@ + * your option) any later version. + */ + ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ + #include <linux/kernel.h> + #include <linux/init.h> + #include <linux/platform_device.h> +@@ -19,6 +21,8 @@ + #include <linux/gpio.h> + #include <linux/i2c.h> + #include <linux/i2c-gpio.h> ++#include <linux/mtd/nand.h> ++#include <linux/mtd/partitions.h> + + #include <mach/hardware.h> + #include <mach/ts72xx.h> +@@ -91,90 +95,156 @@ static struct map_desc ts72xx_io_desc[] __initdata = { + //} + }; + +-static struct map_desc ts72xx_nand_io_desc[] __initdata = { +- { +- .virtual = TS72XX_NAND_DATA_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND1_DATA_PHYS_BASE), +- .length = TS72XX_NAND_DATA_SIZE, +- .type = MT_DEVICE, +- }, { +- .virtual = TS72XX_NAND_CONTROL_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND1_CONTROL_PHYS_BASE), +- .length = TS72XX_NAND_CONTROL_SIZE, +- .type = MT_DEVICE, +- }, { +- .virtual = TS72XX_NAND_BUSY_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND1_BUSY_PHYS_BASE), +- .length = TS72XX_NAND_BUSY_SIZE, +- .type = MT_DEVICE, ++static void __init ts72xx_map_io(void) ++{ ++ ep93xx_map_io(); ++ iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc)); ++} ++ ++ ++/************************************************************************* ++ * NAND flash ++ *************************************************************************/ ++#define TS72XX_NAND_CONTROL_ADDR_LINE 22 /* 0xN0400000 */ ++#define TS72XX_NAND_BUSY_ADDR_LINE 23 /* 0xN0800000 */ ++ ++static void ts72xx_nand_hwcontrol(struct mtd_info *mtd, ++ int cmd, unsigned int ctrl) ++{ ++ struct nand_chip *chip = mtd->priv; ++ ++ if (ctrl & NAND_CTRL_CHANGE) { ++ void __iomem *addr = chip->IO_ADDR_R; ++ unsigned char bits; ++ ++ addr += (1 << TS72XX_NAND_CONTROL_ADDR_LINE); ++ ++ bits = __raw_readb(addr) & ~0x07; ++ bits |= (ctrl & NAND_NCE) << 2; /* bit 0 -> bit 2 */ ++ bits |= (ctrl & NAND_CLE); /* bit 1 -> bit 1 */ ++ bits |= (ctrl & NAND_ALE) >> 2; /* bit 2 -> bit 0 */ ++ ++ __raw_writeb(bits, addr); + } +-}; ++ if (cmd != NAND_CMD_NONE) ++ __raw_writeb(cmd, chip->IO_ADDR_W); ++} ++ ++static int ts72xx_nand_device_ready(struct mtd_info *mtd) ++{ ++ struct nand_chip *chip = mtd->priv; ++ void __iomem *addr = chip->IO_ADDR_R; ++ ++ addr += (1 << TS72XX_NAND_BUSY_ADDR_LINE); ++ ++ return !!(__raw_readb(addr) & 0x20); ++} + +-static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = { ++static const char *ts72xx_nand_part_probes[] = { "cmdlinepart", NULL }; ++ ++#define TS72XX_BOOTROM_PART_SIZE (SZ_16K) ++#define TS72XX_REDBOOT_PART_SIZE (SZ_2M + SZ_1M) ++ ++static struct mtd_partition ts72xx_nand_parts[] = { + { +- .virtual = TS72XX_NAND_DATA_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND2_DATA_PHYS_BASE), +- .length = TS72XX_NAND_DATA_SIZE, +- .type = MT_DEVICE, ++ .name = "TS-BOOTROM", ++ .offset = 0, ++ .size = TS72XX_BOOTROM_PART_SIZE, ++ .mask_flags = MTD_WRITEABLE, /* force read-only */ + }, { +- .virtual = TS72XX_NAND_CONTROL_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND2_CONTROL_PHYS_BASE), +- .length = TS72XX_NAND_CONTROL_SIZE, +- .type = MT_DEVICE, ++ .name = "Linux", ++ .offset = MTDPART_OFS_APPEND, ++ .size = 0, /* filled in later */ + }, { +- .virtual = TS72XX_NAND_BUSY_VIRT_BASE, +- .pfn = __phys_to_pfn(TS72XX_NAND2_BUSY_PHYS_BASE), +- .length = TS72XX_NAND_BUSY_SIZE, +- .type = MT_DEVICE, +- } ++ .name = "RedBoot", ++ .offset = MTDPART_OFS_APPEND, ++ .size = MTDPART_SIZ_FULL, ++ .mask_flags = MTD_WRITEABLE, /* force read-only */ ++ }, + }; + +-static void __init ts72xx_map_io(void) ++static void ts72xx_nand_set_parts(uint64_t size, ++ struct platform_nand_chip *chip) + { +- ep93xx_map_io(); +- iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc)); +- +- /* +- * The TS-7200 has NOR flash, the other models have NAND flash. +- */ +- if (!board_is_ts7200()) { +- if (is_ts9420_installed()) { +- iotable_init(ts72xx_alternate_nand_io_desc, +- ARRAY_SIZE(ts72xx_alternate_nand_io_desc)); +- } else { +- iotable_init(ts72xx_nand_io_desc, +- ARRAY_SIZE(ts72xx_nand_io_desc)); +- } ++ /* Factory TS-72xx boards only come with 32MiB or 128MiB NAND options */ ++ if (size == SZ_32M || size == SZ_128M) { ++ /* Set the "Linux" partition size */ ++ ts72xx_nand_parts[1].size = size - TS72XX_REDBOOT_PART_SIZE; ++ chip->partitions = ts72xx_nand_parts; ++ chip->nr_partitions = ARRAY_SIZE(ts72xx_nand_parts); ++ } else { ++ pr_warning("Unknown nand disk size:%lluMiB\n", size >> 20); + } + } + ++static struct platform_nand_data ts72xx_nand_data = { ++ .chip = { ++ .nr_chips = 1, ++ .chip_offset = 0, ++ .chip_delay = 15, ++ .part_probe_types = ts72xx_nand_part_probes, ++ .set_parts = ts72xx_nand_set_parts, ++ }, ++ .ctrl = { ++ .cmd_ctrl = ts72xx_nand_hwcontrol, ++ .dev_ready = ts72xx_nand_device_ready, ++ }, ++}; ++ ++static struct resource ts72xx_nand_resource[] = { ++ { ++ .start = 0, /* filled in later */ ++ .end = 0, /* filled in later */ ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device ts72xx_nand_flash = { ++ .name = "gen_nand", ++ .id = -1, ++ .dev.platform_data = &ts72xx_nand_data, ++ .resource = ts72xx_nand_resource, ++ .num_resources = ARRAY_SIZE(ts72xx_nand_resource), ++}; ++ + /************************************************************************* + * NOR flash (TS-7200 only) + *************************************************************************/ +-static struct physmap_flash_data ts72xx_flash_data = { ++static struct physmap_flash_data ts72xx_nor_data = { + .width = 2, + }; + +-static struct resource ts72xx_flash_resource = { ++static struct resource ts72xx_nor_resource = { + .start = EP93XX_CS6_PHYS_BASE, + .end = EP93XX_CS6_PHYS_BASE + SZ_16M - 1, + .flags = IORESOURCE_MEM, + }; + +-static struct platform_device ts72xx_flash = { +- .name = "physmap-flash", +- .id = 0, +- .dev = { +- .platform_data = &ts72xx_flash_data, +- }, +- .num_resources = 1, +- .resource = &ts72xx_flash_resource, ++static struct platform_device ts72xx_nor_flash = { ++ .name = "physmap-flash", ++ .id = 0, ++ .dev.platform_data = &ts72xx_nor_data, ++ .resource = &ts72xx_nor_resource, ++ .num_resources = 1, + }; + + static void __init ts72xx_register_flash(void) + { +- if (board_is_ts7200()) +- platform_device_register(&ts72xx_flash); ++ if (board_is_ts7200()) { ++ platform_device_register(&ts72xx_nor_flash); ++ } else { ++ resource_size_t start; ++ ++ if (is_ts9420_installed()) ++ start = EP93XX_CS7_PHYS_BASE; ++ else ++ start = EP93XX_CS6_PHYS_BASE; ++ ++ ts72xx_nand_resource[0].start = start; ++ ts72xx_nand_resource[0].end = start + SZ_16M - 1; ++ ++ platform_device_register(&ts72xx_nand_flash); ++ } + } + + /************************************************************************* +diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig +index 42e5ea4..952ae85 100644 +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -96,7 +96,7 @@ config MTD_NAND_OMAP_PREFETCH_DMA + Say y for DMA mode or MPU mode will be used + + config MTD_NAND_TS7250 +- tristate "NAND Flash device on TS-7250 board" ++ tristate "NAND Flash device on TS-7250 board (DEPRECATED)" + depends on MACH_TS72XX + help + Support for NAND flash on Technologic Systems TS-7250 platform. +-- +1.7.1 + |