aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-2.6.34/ts72xx/0016-ts72xx_nand_flash.patch
diff options
context:
space:
mode:
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.patch270
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
+