* [PATCH 1/2] Update ts72xx to use generic platform nand driver
@ 2009-10-06 22:19 H Hartley Sweeten
2009-10-07 8:16 ` Alexander Clouter
2009-10-11 11:30 ` Artem Bityutskiy
0 siblings, 2 replies; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-06 22:19 UTC (permalink / raw)
To: linux-arm-kernel
Update the ts72xx platform's nand driver support.
This changes the ts72xx platform from using a custom nand driver
(ts7250.c) to the generic platform nand driver (plat_nand.c).
Tested on TS-7250 with 32MB NAND.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Matthieu Crapet <mcrapet@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: <linux-arm-kernel@lists.infradead.org>
Cc: <linux-mtd@lists.infradead.org>
---
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 259f782..bbb757b 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -16,6 +16,8 @@
#include <linux/io.h>
#include <linux/m48t86.h>
#include <linux/mtd/physmap.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
#include <mach/hardware.h>
#include <mach/ts72xx.h>
@@ -54,92 +56,185 @@ static struct map_desc ts72xx_io_desc[] __initdata = {
}
};
-static struct map_desc ts72xx_nand_io_desc[] __initdata = {
+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 = (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((__raw_readb(addr) & ~0x7) | 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 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_part_info32[] = {
{
- .virtual = TS72XX_NAND_DATA_VIRT_BASE,
- .pfn = __phys_to_pfn(TS72XX_NAND1_DATA_PHYS_BASE),
- .length = TS72XX_NAND_DATA_SIZE,
- .type = MT_DEVICE,
+ .name = "TS-BOOTROM",
+ .offset = 0,
+ .size = TS72XX_BOOTROM_PART_SIZE,
}, {
- .virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
- .pfn = __phys_to_pfn(TS72XX_NAND1_CONTROL_PHYS_BASE),
- .length = TS72XX_NAND_CONTROL_SIZE,
- .type = MT_DEVICE,
+ .name = "Linux",
+ .offset = MTDPART_OFS_APPEND,
+ .size = SZ_32M - TS72XX_REDBOOT_PART_SIZE,
}, {
- .virtual = TS72XX_NAND_BUSY_VIRT_BASE,
- .pfn = __phys_to_pfn(TS72XX_NAND1_BUSY_PHYS_BASE),
- .length = TS72XX_NAND_BUSY_SIZE,
- .type = MT_DEVICE,
- }
+ .name = "RedBoot",
+ .offset = MTDPART_OFS_APPEND,
+ .size = MTDPART_SIZ_FULL,
+ },
};
-static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
+static struct mtd_partition ts72xx_part_info128[] = {
{
- .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,
}, {
- .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 = SZ_128M - TS72XX_REDBOOT_PART_SIZE,
}, {
- .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,
+ },
};
-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));
- }
+ switch (size) {
+ case SZ_32M:
+ chip->partitions = ts72xx_part_info32;
+ chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info32);
+ break;
+ case SZ_128M:
+ chip->partitions = ts72xx_part_info128;
+ chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info128);
+ break;
+ default:
+ pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
+ break;
}
}
+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 ts7250_nand_resource[] = {
+ {
+ .start = EP93XX_CS6_PHYS_BASE,
+ .end = EP93XX_CS6_PHYS_BASE + SZ_16M - 1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+static struct resource ts9420_nand_resource[] = {
+ {
+ .start = EP93XX_CS7_PHYS_BASE,
+ .end = EP93XX_CS7_PHYS_BASE + SZ_16M - 1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+static struct platform_device ts72xx_nand_flash = {
+ .name = "gen_nand",
+ .id = -1,
+ .dev.platform_data = &ts72xx_nand_data,
+};
+
+
/*************************************************************************
* 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 = {
+static struct platform_device ts72xx_nor_flash = {
.name = "physmap-flash",
.id = 0,
.dev = {
- .platform_data = &ts72xx_flash_data,
+ .platform_data = &ts72xx_nor_data,
},
.num_resources = 1,
- .resource = &ts72xx_flash_resource,
+ .resource = &ts72xx_nor_resource,
};
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 {
+ if (is_ts9420_installed()) {
+ ts72xx_nand_flash.resource = ts9420_nand_resource;
+ ts72xx_nand_flash.num_resources =
+ ARRAY_SIZE(ts9420_nand_resource);
+ } else {
+ ts72xx_nand_flash.resource = ts7250_nand_resource;
+ ts72xx_nand_flash.num_resources =
+ ARRAY_SIZE(ts7250_nand_resource);
+ }
+ platform_device_register(&ts72xx_nand_flash);
+ }
}
+
static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
{
__raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-06 22:19 [PATCH 1/2] Update ts72xx to use generic platform nand driver H Hartley Sweeten
@ 2009-10-07 8:16 ` Alexander Clouter
2009-10-07 17:09 ` H Hartley Sweeten
2009-10-11 11:30 ` Artem Bityutskiy
1 sibling, 1 reply; 14+ messages in thread
From: Alexander Clouter @ 2009-10-07 8:16 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
In gmane.linux.drivers.mtd H Hartley Sweeten <hartleys@visionengravers.com> wrote:
>
> Update the ts72xx platform's nand driver support.
>
> This changes the ts72xx platform from using a custom nand driver
> (ts7250.c) to the generic platform nand driver (plat_nand.c).
>
> Tested on TS-7250 with 32MB NAND.
>
> [snipped]
>
> +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_part_info32[] = {
> {
> - .virtual = TS72XX_NAND_DATA_VIRT_BASE,
> - .pfn = __phys_to_pfn(TS72XX_NAND1_DATA_PHYS_BASE),
> - .length = TS72XX_NAND_DATA_SIZE,
> - .type = MT_DEVICE,
> + .name = "TS-BOOTROM",
> + .offset = 0,
> + .size = TS72XX_BOOTROM_PART_SIZE,
> }, {
> - .virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
> - .pfn = __phys_to_pfn(TS72XX_NAND1_CONTROL_PHYS_BASE),
> - .length = TS72XX_NAND_CONTROL_SIZE,
> - .type = MT_DEVICE,
> + .name = "Linux",
> + .offset = MTDPART_OFS_APPEND,
> + .size = SZ_32M - TS72XX_REDBOOT_PART_SIZE,
> }, {
> - .virtual = TS72XX_NAND_BUSY_VIRT_BASE,
> - .pfn = __phys_to_pfn(TS72XX_NAND1_BUSY_PHYS_BASE),
> - .length = TS72XX_NAND_BUSY_SIZE,
> - .type = MT_DEVICE,
> - }
> + .name = "RedBoot",
> + .offset = MTDPART_OFS_APPEND,
> + .size = MTDPART_SIZ_FULL,
> + },
> };
>
> -static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
> +static struct mtd_partition ts72xx_part_info128[] = {
> {
> - .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,
> }, {
> - .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 = SZ_128M - TS72XX_REDBOOT_PART_SIZE,
> }, {
> - .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,
> + },
> };
>
These struct's are almost identical so could you not...
> -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));
> - }
> + switch (size) {
> + case SZ_32M:
> + chip->partitions = ts72xx_part_info32;
> + chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info32);
> + break;
> + case SZ_128M:
> + chip->partitions = ts72xx_part_info128;
> + chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info128);
> + break;
> + default:
> + pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
> + break;
> }
> }
>
-----------
static struct mtd_partition ts72xx_part_info[] = {
{
/* gut feeling for *Joe Public* is to go MTD_WRITABLE */
.name = "TS-BOOTROM",
.offset = 0,
.size = TS72XX_BOOTROM_PART_SIZE,
}, {
.name = "Linux",
.offset = MTDPART_OFS_APPEND,
/* to be filled in later */
.size = 0,
}, {
/* mask MTD_WRITABLE here too? */
.name = "Redboot",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
static void ts72xx_nand_set_parts(....)
{
....
/* or I guess you could just bailout... */
if (size != SZ_32M && size != SZ_128M)
pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
chip->partitions = ts72xx_part_info;
chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info);
ts72xx_part_info[1].size = size - TS72XX_REDBOOT_PART_SIZE;
}
---------
Cheers
--
Alexander Clouter
.sigmonster says: Life's too short to dance with ugly women.
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-07 8:16 ` Alexander Clouter
@ 2009-10-07 17:09 ` H Hartley Sweeten
2009-10-07 17:31 ` H Hartley Sweeten
0 siblings, 1 reply; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-07 17:09 UTC (permalink / raw)
To: linux-arm-kernel
On Wednesday, October 07, 2009 1:16 AM, Alexander Clouter wrote:
> Hi,
[snip]
> These struct's are almost identical so could you not...
[snip]
> -----------
> static struct mtd_partition ts72xx_part_info[] = {
> {
> /* gut feeling for *Joe Public* is to go MTD_WRITABLE */
> .name = "TS-BOOTROM",
> .offset = 0,
> .size = TS72XX_BOOTROM_PART_SIZE,
> }, {
> .name = "Linux",
> .offset = MTDPART_OFS_APPEND,
> /* to be filled in later */
> .size = 0,
> }, {
> /* mask MTD_WRITABLE here too? */
> .name = "Redboot",
> .offset = MTDPART_OFS_APPEND,
> .size = MTDPART_SIZ_FULL,
> }
> };
>
> static void ts72xx_nand_set_parts(....)
> {
> ....
>
> /* or I guess you could just bailout... */
> if (size != SZ_32M && size != SZ_128M)
> pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
>
> chip->partitions = ts72xx_part_info;
> chip->nr_partitions = ARRAY_SIZE(ts72xx_part_info);
>
> ts72xx_part_info[1].size = size - TS72XX_REDBOOT_PART_SIZE;
> }
Thanks for pointing that out. I like your change and will modify the patch.
I didn't think about making the "TS-BOOTROM" and "RedBoot" partitions read-only.
Probably a good idea, I'll add that also.
Updated patch coming soon.
Regards,
Hartley
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-07 17:09 ` H Hartley Sweeten
@ 2009-10-07 17:31 ` H Hartley Sweeten
0 siblings, 0 replies; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-07 17:31 UTC (permalink / raw)
To: linux-arm-kernel
Update the ts72xx platform's nand driver support.
This changes the ts72xx platform from using a custom nand driver
(ts7250.c) to the generic platform nand driver (plat_nand.c).
Tested on TS-7250 with 32MB NAND.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Matthieu Crapet <mcrapet@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Alexander Clouter <alex@digriz.org.uk>
Cc: <linux-arm-kernel@lists.infradead.org>
Cc: <linux-mtd@lists.infradead.org>
---
V2 - mark the TS-BOOTROM and RedBoot partitions read-only (Alexander Clouter)
combined the nand mtd_partition structs (Alexander Clouter)
combined the nand resource structs similarly
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 259f782..95805cc 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -16,6 +16,8 @@
#include <linux/io.h>
#include <linux/m48t86.h>
#include <linux/mtd/physmap.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
#include <mach/hardware.h>
#include <mach/ts72xx.h>
@@ -54,92 +56,163 @@ 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 = (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((__raw_readb(addr) & ~0x7) | bits, addr);
}
-};
-static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
+ 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 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));
+ /* Factory TS-72xx board only come with 32MB or 128MB NAND options */
+ if (size == SZ_32M || size == SZ_128M) {
+ /* Set the "Linux" partition size */
+ ts72xx_nand_parts[1].size = size - TS72XX_REDBOOT_PART_SIZE;
- /*
- * 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));
- }
+ chip->partitions = ts72xx_nand_parts;
+ chip->nr_partitions = ARRAY_SIZE(ts72xx_nand_parts);
+ } else {
+ pr_warning("ts72xx: Unknown nand disk size:%lluMB\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 = {
+static struct platform_device ts72xx_nor_flash = {
.name = "physmap-flash",
.id = 0,
.dev = {
- .platform_data = &ts72xx_flash_data,
+ .platform_data = &ts72xx_nor_data,
},
.num_resources = 1,
- .resource = &ts72xx_flash_resource,
+ .resource = &ts72xx_nor_resource,
};
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);
+ }
}
+
static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
{
__raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-06 22:19 [PATCH 1/2] Update ts72xx to use generic platform nand driver H Hartley Sweeten
2009-10-07 8:16 ` Alexander Clouter
@ 2009-10-11 11:30 ` Artem Bityutskiy
2009-10-11 21:11 ` H Hartley Sweeten
2009-10-11 21:19 ` H Hartley Sweeten
1 sibling, 2 replies; 14+ messages in thread
From: Artem Bityutskiy @ 2009-10-11 11:30 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, 2009-10-06 at 18:19 -0400, H Hartley Sweeten wrote:
> Update the ts72xx platform's nand driver support.
>
> This changes the ts72xx platform from using a custom nand driver
> (ts7250.c) to the generic platform nand driver (plat_nand.c).
>
> Tested on TS-7250 with 32MB NAND.
>
> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
> Tested-by: Matthieu Crapet <mcrapet@gmail.com>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: <linux-arm-kernel@lists.infradead.org>
> Cc: <linux-mtd@lists.infradead.org>
Patches do not apply cleanly to current mtd tree. Please, refresh
and resend.
--
Best Regards,
Artem Bityutskiy (????? ????????)
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-11 11:30 ` Artem Bityutskiy
@ 2009-10-11 21:11 ` H Hartley Sweeten
2009-10-11 21:19 ` H Hartley Sweeten
1 sibling, 0 replies; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-11 21:11 UTC (permalink / raw)
To: linux-arm-kernel
On Sunday, October 11, 2009 4:30 AM, Artem Bityutskiy wrote:
> On Tue, 2009-10-06 at 18:19 -0400, H Hartley Sweeten wrote:
>> Update the ts72xx platform's nand driver support.
>>
>> This changes the ts72xx platform from using a custom nand driver
>> (ts7250.c) to the generic platform nand driver (plat_nand.c).
>>
>> Tested on TS-7250 with 32MB NAND.
>>
>> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
>> Tested-by: Matthieu Crapet <mcrapet@gmail.com>
>> Cc: David Woodhouse <dwmw2@infradead.org>
>> Cc: <linux-arm-kernel@lists.infradead.org>
>> Cc: <linux-mtd@lists.infradead.org>
>
> Patches do not apply cleanly to current mtd tree. Please, refresh
> and resend.
Strange. The original file in the mtd tree is identical to the one
in the 2.6.32-rc3 tree. What was the problem with the patch?
I will rebase it on the mtd tree anyway and repost with a diffstat.
Regards,
Hartley
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-11 11:30 ` Artem Bityutskiy
2009-10-11 21:11 ` H Hartley Sweeten
@ 2009-10-11 21:19 ` H Hartley Sweeten
2009-10-14 8:42 ` Artem Bityutskiy
1 sibling, 1 reply; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-11 21:19 UTC (permalink / raw)
To: linux-arm-kernel
Update the ts72xx platform's nand driver support.
This changes the ts72xx platform from using a custom nand driver
(ts7250.c) to the generic platform nand driver (plat_nand.c).
Tested on TS-7250 with 32MB NAND.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Matthieu Crapet <mcrapet@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Cc: <linux-arm-kernel@lists.infradead.org>
Cc: <linux-mtd@lists.infradead.org>
---
V2 - rebased to current mtd tree (Artem Bityutskiy)
arch/arm/mach-ep93xx/ts72xx.c | 177 +++++++++++++++++++++++++++++------------
1 files changed, 125 insertions(+), 52 deletions(-)
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 259f782..95805cc 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -16,6 +16,8 @@
#include <linux/io.h>
#include <linux/m48t86.h>
#include <linux/mtd/physmap.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
#include <mach/hardware.h>
#include <mach/ts72xx.h>
@@ -54,92 +56,163 @@ 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 = (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((__raw_readb(addr) & ~0x7) | bits, addr);
}
-};
-static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
+ 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 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));
+ /* Factory TS-72xx board only come with 32MB or 128MB NAND options */
+ if (size == SZ_32M || size == SZ_128M) {
+ /* Set the "Linux" partition size */
+ ts72xx_nand_parts[1].size = size - TS72XX_REDBOOT_PART_SIZE;
- /*
- * 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));
- }
+ chip->partitions = ts72xx_nand_parts;
+ chip->nr_partitions = ARRAY_SIZE(ts72xx_nand_parts);
+ } else {
+ pr_warning("ts72xx: Unknown nand disk size:%lluMB\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 = {
+static struct platform_device ts72xx_nor_flash = {
.name = "physmap-flash",
.id = 0,
.dev = {
- .platform_data = &ts72xx_flash_data,
+ .platform_data = &ts72xx_nor_data,
},
.num_resources = 1,
- .resource = &ts72xx_flash_resource,
+ .resource = &ts72xx_nor_resource,
};
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);
+ }
}
+
static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
{
__raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-11 21:19 ` H Hartley Sweeten
@ 2009-10-14 8:42 ` Artem Bityutskiy
2009-10-14 17:05 ` H Hartley Sweeten
0 siblings, 1 reply; 14+ messages in thread
From: Artem Bityutskiy @ 2009-10-14 8:42 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, 2009-10-11 at 17:19 -0400, H Hartley Sweeten wrote:
> Update the ts72xx platform's nand driver support.
>
> This changes the ts72xx platform from using a custom nand driver
> (ts7250.c) to the generic platform nand driver (plat_nand.c).
>
> Tested on TS-7250 with 32MB NAND.
>
> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
> Tested-by: Matthieu Crapet <mcrapet@gmail.com>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: Artem Bityutskiy <dedekind1@gmail.com>
> Cc: <linux-arm-kernel@lists.infradead.org>
> Cc: <linux-mtd@lists.infradead.org>
>
> ---
>
> V2 - rebased to current mtd tree (Artem Bityutskiy)
>
> arch/arm/mach-ep93xx/ts72xx.c | 177 +++++++++++++++++++++++++++++------------
> 1 files changed, 125 insertions(+), 52 deletions(-)
Ok, I've tried this patch on both mtd-2.6 and linux-2.6 git trees, and
it does not apply cleanly.
[dedekind at eru mtd-2.6]$ git am ../l2-mtd-2.6.git/sweeten1
Applying: RE: [PATCH 1/2] Update ts72xx to use generic platform nand driver
error: patch failed: arch/arm/mach-ep93xx/ts72xx.c:54
error: arch/arm/mach-ep93xx/ts72xx.c: patch does not apply
Patch failed at 0001 RE: [PATCH 1/2] Update ts72xx to use generic platform nand driver
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
[dedekind at eru mtd-2.6]$ patch -p1 < .git/rebase-apply/patch
patching file arch/arm/mach-ep93xx/ts72xx.c
Hunk #2 succeeded at 56 with fuzz 1.
Ok, I can do things manually:
[dedekind at eru mtd-2.6]$ git update-index arch/arm/mach-ep93xx/ts72xx.c
[dedekind at eru mtd-2.6]$ git am --resolved
Applying: RE: [PATCH 1/2] Update ts72xx to use generic platform nand driver
But then the second patch does not apply anyway:
[dedekind at eru mtd-2.6]$ git am ../l2-mtd-2.6.git/sweeten2
Applying: RE: [PATCH 2/2] Remove now-defunct ts7250 nand driver
error: patch failed: drivers/mtd/nand/ts7250.c:1
error: drivers/mtd/nand/ts7250.c: patch does not apply
Patch failed at 0001 RE: [PATCH 2/2] Remove now-defunct ts7250 nand driver
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
[dedekind at eru mtd-2.6]$ patch -p1 < .git/rebase-apply/patch
patching file arch/arm/mach-ep93xx/include/mach/ts72xx.h
patching file drivers/mtd/nand/Kconfig
patching file drivers/mtd/nand/Makefile
patching file drivers/mtd/nand/ts7250.c
Reversed (or previously applied) patch detected! Assume -R? [n] ^C
This is where I'm in the mtd-2.6.git tree, for reference.
[dedekind at eru mtd-2.6]$ git show
commit e4af3bf6334341435740fce9ff236ba814686b99
Author: Claudio Scordino <claudio@evidence.eu.com>
Date: Wed Oct 7 14:27:07 2009 +0200
mtd: atmel_nand: unused variable removed
Unused variable "eccpos" removed from atmel_nand driver.
Signed-off-by: Claudio Scordino <claudio@evidence.eu.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
diff --git a/drivers/mtd/nand/atmel_nand.c
b/drivers/mtd/nand/atmel_nand.c
index f8e9975..4f62d20 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -192,7 +192,6 @@ static int atmel_nand_calculate(struct mtd_info
*mtd,
{
struct nand_chip *nand_chip = mtd->priv;
struct atmel_nand_host *host = nand_chip->priv;
- uint32_t *eccpos = nand_chip->ecc.layout->eccpos;
unsigned int ecc_value;
/* get the first 2 ECC bytes */
--
Best Regards,
Artem Bityutskiy (????? ????????)
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-14 8:42 ` Artem Bityutskiy
@ 2009-10-14 17:05 ` H Hartley Sweeten
2009-10-16 6:38 ` Artem Bityutskiy
0 siblings, 1 reply; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-14 17:05 UTC (permalink / raw)
To: linux-arm-kernel
On Wednesday, October 14, 2009 1:42 AM, Artem Bityutskiy wrote:
> On Sun, 2009-10-11 at 17:19 -0400, H Hartley Sweeten wrote:
>> Update the ts72xx platform's nand driver support.
>>
>> This changes the ts72xx platform from using a custom nand driver
>> (ts7250.c) to the generic platform nand driver (plat_nand.c).
>>
>> Tested on TS-7250 with 32MB NAND.
>>
>> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
>> Tested-by: Matthieu Crapet <mcrapet@gmail.com>
>> Cc: David Woodhouse <dwmw2@infradead.org>
>> Cc: Artem Bityutskiy <dedekind1@gmail.com>
>> Cc: <linux-arm-kernel@lists.infradead.org>
>> Cc: <linux-mtd@lists.infradead.org>
>>
>> ---
>>
>> V2 - rebased to current mtd tree (Artem Bityutskiy)
>>
>> arch/arm/mach-ep93xx/ts72xx.c | 177 +++++++++++++++++++++++++++++------------
>> 1 files changed, 125 insertions(+), 52 deletions(-)
>
> Ok, I've tried this patch on both mtd-2.6 and linux-2.6 git trees, and
> it does not apply cleanly.
[snip]
I'm really confused why this does not apply.
My mtd-2.6.git tree is at the same place as yours.
bigguiness at etch:~/src/git/mtd-2.6$ git show
commit 8032747e7680a31cdde293421af62d2e1904c528
Author: David Woodhouse <David.Woodhouse@intel.com>
Date: Mon Oct 5 08:30:04 2009 +0100
mtd: make onenand_base.c compile again
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index 8935e63..6e250f3 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -1051,7 +1051,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
int writesize = this->writesize;
DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %i\n",
- (unsigned int) from, (int) len);
+ __func__, (unsigned int) from, (int) len);
if (ops->mode == MTD_OOB_AUTO)
oobsize = this->ecclayout->oobavail;
@@ -2022,8 +2022,8 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
if (unlikely(to >= mtd->size ||
column + len > ((mtd->size >> this->page_shift) -
(to >> this->page_shift)) * oobsize)) {
- printk(KERN_ERR "%s: Attempted to write past end of device\n"
- __func__);
+ printk(KERN_ERR "%s: Attempted to write past end of device\n",
+ __func__);
return -EINVAL;
}
If I apply the two patches I get.
bigguiness at etch:~/src/git/mtd-2.6$ patch -p1 < /mnt/hgfs/share/ts72xx_plat_nand_v2.patch
patching file arch/arm/mach-ep93xx/ts72xx.c
bigguiness@etch:~/src/git/mtd-2.6$ patch -p1 < /mnt/hgfs/share/ts7250_remove_v2.patch
patching file arch/arm/mach-ep93xx/include/mach/ts72xx.h
patching file drivers/mtd/nand/Kconfig
patching file drivers/mtd/nand/Makefile
patching file drivers/mtd/nand/ts7250.c
I have attached the two patches just in case it's an email issue.
Regards,
Hartley
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ts7250_remove_v2.patch
Type: application/octet-stream
Size: 7973 bytes
Desc: ts7250_remove_v2.patch
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20091014/5bf168b2/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ts72xx_plat_nand_v2.patch
Type: application/octet-stream
Size: 6733 bytes
Desc: ts72xx_plat_nand_v2.patch
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20091014/5bf168b2/attachment-0003.obj>
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-14 17:05 ` H Hartley Sweeten
@ 2009-10-16 6:38 ` Artem Bityutskiy
2009-10-16 17:09 ` H Hartley Sweeten
0 siblings, 1 reply; 14+ messages in thread
From: Artem Bityutskiy @ 2009-10-16 6:38 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, 2009-10-14 at 13:05 -0400, H Hartley Sweeten wrote:
> On Wednesday, October 14, 2009 1:42 AM, Artem Bityutskiy wrote:
> > On Sun, 2009-10-11 at 17:19 -0400, H Hartley Sweeten wrote:
> >> Update the ts72xx platform's nand driver support.
> >>
> >> This changes the ts72xx platform from using a custom nand driver
> >> (ts7250.c) to the generic platform nand driver (plat_nand.c).
> >>
> >> Tested on TS-7250 with 32MB NAND.
> >>
> >> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
> >> Tested-by: Matthieu Crapet <mcrapet@gmail.com>
> >> Cc: David Woodhouse <dwmw2@infradead.org>
> >> Cc: Artem Bityutskiy <dedekind1@gmail.com>
> >> Cc: <linux-arm-kernel@lists.infradead.org>
> >> Cc: <linux-mtd@lists.infradead.org>
> >>
> >> ---
> >>
> >> V2 - rebased to current mtd tree (Artem Bityutskiy)
> >>
> >> arch/arm/mach-ep93xx/ts72xx.c | 177 +++++++++++++++++++++++++++++------------
> >> 1 files changed, 125 insertions(+), 52 deletions(-)
> >
> > Ok, I've tried this patch on both mtd-2.6 and linux-2.6 git trees, and
> > it does not apply cleanly.
>
> [snip]
>
> I'm really confused why this does not apply.
>
> My mtd-2.6.git tree is at the same place as yours.
>
> bigguiness at etch:~/src/git/mtd-2.6$ git show
> commit 8032747e7680a31cdde293421af62d2e1904c528
> Author: David Woodhouse <David.Woodhouse@intel.com>
> Date: Mon Oct 5 08:30:04 2009 +0100
>
> mtd: make onenand_base.c compile again
>
> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
>
> diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
> index 8935e63..6e250f3 100644
> --- a/drivers/mtd/onenand/onenand_base.c
> +++ b/drivers/mtd/onenand/onenand_base.c
> @@ -1051,7 +1051,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
> int writesize = this->writesize;
>
> DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08x, len = %i\n",
> - (unsigned int) from, (int) len);
> + __func__, (unsigned int) from, (int) len);
>
> if (ops->mode == MTD_OOB_AUTO)
> oobsize = this->ecclayout->oobavail;
> @@ -2022,8 +2022,8 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
> if (unlikely(to >= mtd->size ||
> column + len > ((mtd->size >> this->page_shift) -
> (to >> this->page_shift)) * oobsize)) {
> - printk(KERN_ERR "%s: Attempted to write past end of device\n"
> - __func__);
> + printk(KERN_ERR "%s: Attempted to write past end of device\n",
> + __func__);
> return -EINVAL;
> }
My git head was actually different, take a look at my previous answer.
> If I apply the two patches I get.
Could you please try to save your own e-mails, and then apply them using
"git am"?
--
Best Regards,
Artem Bityutskiy (????? ????????)
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-16 6:38 ` Artem Bityutskiy
@ 2009-10-16 17:09 ` H Hartley Sweeten
2009-10-16 17:20 ` David Woodhouse
0 siblings, 1 reply; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-16 17:09 UTC (permalink / raw)
To: linux-arm-kernel
On Thursday, October 15, 2009 11:39 PM, Artem Bityutskiy wrote:
> Could you please try to save your own e-mails, and then apply them using
> "git am"?
Ok, this is strange.
Your previous email said:
> [dedekind at eru mtd-2.6]$ git am ../l2-mtd-2.6.git/sweeten1
> Applying: RE: [PATCH 1/2] Update ts72xx to use generic platform nand driver
> error: patch failed: arch/arm/mach-ep93xx/ts72xx.c:54
> error: arch/arm/mach-ep93xx/ts72xx.c: patch does not apply
If I understand that error correctly, the patch failed at this line:
@@ -54,92 +56,163 @@ static struct map_desc ts72xx_io_desc[] __initdata = {
The patch was created by doing a 'git diff'. If I just is the 'diff' command
it produces a completely different output. Here it is:
---
Update the ts72xx platform's nand driver support.
This changes the ts72xx platform from using a custom nand driver
(ts7250.c) to the generic platform nand driver (plat_nand.c).
Tested on TS-7250 with 32MB NAND.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Matthieu Crapet <mcrapet@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Cc: <linux-arm-kernel@lists.infradead.org>
Cc: <linux-mtd@lists.infradead.org>
---
V3 - generate patch using 'diff -uprN mtd-2.6/arch/arm/mach-ep93xx/ts72xx.c{.orig,}'
V2 - rebased to current mtd tree (Artem Bityutskiy)
--- mtd-2.6/arch/arm/mach-ep93xx/ts72xx.c.orig 2009-10-14 09:59:38.000000000 -0700
+++ mtd-2.6/arch/arm/mach-ep93xx/ts72xx.c 2009-10-07 10:23:48.000000000 -0700
@@ -16,6 +16,8 @@
#include <linux/io.h>
#include <linux/m48t86.h>
#include <linux/mtd/physmap.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
#include <mach/hardware.h>
#include <mach/ts72xx.h>
@@ -54,92 +56,163 @@ static struct map_desc ts72xx_io_desc[]
}
};
-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 = (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((__raw_readb(addr) & ~0x7) | bits, addr);
}
-};
-static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
+ 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 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,
- }, {
- .virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
- .pfn = __phys_to_pfn(TS72XX_NAND2_CONTROL_PHYS_BASE),
- .length = TS72XX_NAND_CONTROL_SIZE,
- .type = MT_DEVICE,
- }, {
- .virtual = TS72XX_NAND_BUSY_VIRT_BASE,
- .pfn = __phys_to_pfn(TS72XX_NAND2_BUSY_PHYS_BASE),
- .length = TS72XX_NAND_BUSY_SIZE,
- .type = MT_DEVICE,
- }
+ .name = "TS-BOOTROM",
+ .offset = 0,
+ .size = TS72XX_BOOTROM_PART_SIZE,
+ .mask_flags = MTD_WRITEABLE, /* force read-only */
+ }, {
+ .name = "Linux",
+ .offset = MTDPART_OFS_APPEND,
+ .size = 0, /* filled in later */
+ }, {
+ .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 board only come with 32MB or 128MB 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("ts72xx: Unknown nand disk size:%lluMB\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 = {
+static struct platform_device ts72xx_nor_flash = {
.name = "physmap-flash",
.id = 0,
.dev = {
- .platform_data = &ts72xx_flash_data,
+ .platform_data = &ts72xx_nor_data,
},
.num_resources = 1,
- .resource = &ts72xx_flash_resource,
+ .resource = &ts72xx_nor_resource,
};
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);
+ }
}
+
static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
{
__raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-16 17:09 ` H Hartley Sweeten
@ 2009-10-16 17:20 ` David Woodhouse
2009-10-16 17:32 ` H Hartley Sweeten
0 siblings, 1 reply; 14+ messages in thread
From: David Woodhouse @ 2009-10-16 17:20 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, 2009-10-16 at 13:09 -0400, H Hartley Sweeten wrote:
> + pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
If it's >>20, then you mean 'MiB' not 'MB'.
--
dwmw2
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] Update ts72xx to use generic platform nand driver
2009-10-16 17:20 ` David Woodhouse
@ 2009-10-16 17:32 ` H Hartley Sweeten
2009-10-16 17:36 ` David Woodhouse
0 siblings, 1 reply; 14+ messages in thread
From: H Hartley Sweeten @ 2009-10-16 17:32 UTC (permalink / raw)
To: linux-arm-kernel
On Friday, October 16, 2009 10:21 AM, David Woodhouse wrote:
> On Fri, 2009-10-16 at 13:09 -0400, H Hartley Sweeten wrote:
>> + pr_warning("ts72xx: Unknown nand disk size:%lluMB\n", size >> 20);
>
> If it's >>20, then you mean 'MiB' not 'MB'.
Thanks. I will update the patch.
Stupid question... What does the 'i' stand for? I see in lib/string_helpers.c that
all the units_10[] values don't have the 'i' and units_2[] do but I would like to
know what it actually means.
Regards,
Hartley
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-10-16 17:36 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-06 22:19 [PATCH 1/2] Update ts72xx to use generic platform nand driver H Hartley Sweeten
2009-10-07 8:16 ` Alexander Clouter
2009-10-07 17:09 ` H Hartley Sweeten
2009-10-07 17:31 ` H Hartley Sweeten
2009-10-11 11:30 ` Artem Bityutskiy
2009-10-11 21:11 ` H Hartley Sweeten
2009-10-11 21:19 ` H Hartley Sweeten
2009-10-14 8:42 ` Artem Bityutskiy
2009-10-14 17:05 ` H Hartley Sweeten
2009-10-16 6:38 ` Artem Bityutskiy
2009-10-16 17:09 ` H Hartley Sweeten
2009-10-16 17:20 ` David Woodhouse
2009-10-16 17:32 ` H Hartley Sweeten
2009-10-16 17:36 ` David Woodhouse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).