* [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, linux-mtd; +Cc: Matthieu Crapet, David Woodhouse 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
* Re: [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-mtd; +Cc: 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
* RE: [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: Alexander Clouter, linux-arm-kernel; +Cc: linux-mtd 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
* RE: [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, linux-mtd Cc: David Woodhouse, Matthieu Crapet, Alexander Clouter 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
* Re: [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: H Hartley Sweeten Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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
* RE: [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: dedekind1; +Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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
* RE: [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: dedekind1; +Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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
* RE: [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: H Hartley Sweeten Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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@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@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@eru mtd-2.6]$ git update-index arch/arm/mach-ep93xx/ts72xx.c [dedekind@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@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@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@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
* RE: [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: dedekind1; +Cc: Matthieu Crapet, linux-mtd, David Woodhouse, linux-arm-kernel [-- Attachment #1: Type: text/plain, Size: 3121 bytes --] 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@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@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 [-- Attachment #2: ts7250_remove_v2.patch --] [-- Type: application/octet-stream, Size: 7973 bytes --] arch/arm/mach-ep93xx/include/mach/ts72xx.h | 19 --- drivers/mtd/nand/Kconfig | 6 - drivers/mtd/nand/Makefile | 1 - drivers/mtd/nand/ts7250.c | 207 ---------------------------- 4 files changed, 0 insertions(+), 233 deletions(-) diff --git a/arch/arm/mach-ep93xx/include/mach/ts72xx.h b/arch/arm/mach-ep93xx/include/mach/ts72xx.h index 3bd934e..61c0e13 100644 --- a/arch/arm/mach-ep93xx/include/mach/ts72xx.h +++ b/arch/arm/mach-ep93xx/include/mach/ts72xx.h @@ -9,9 +9,6 @@ * febff000 22000000 4K model number register * febfe000 22400000 4K options register * febfd000 22800000 4K options register #2 - * febfc000 [67]0000000 4K NAND data register - * febfb000 [67]0400000 4K NAND control register - * febfa000 [67]0800000 4K NAND busy register * febf9000 10800000 4K TS-5620 RTC index register * febf8000 11700000 4K TS-5620 RTC data register */ @@ -41,22 +38,6 @@ #define TS72XX_OPTIONS2_TS9420_BOOT 0x02 -#define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000 -#define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000 -#define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000 -#define TS72XX_NAND_DATA_SIZE 0x00001000 - -#define TS72XX_NAND1_CONTROL_PHYS_BASE 0x60400000 -#define TS72XX_NAND2_CONTROL_PHYS_BASE 0x70400000 -#define TS72XX_NAND_CONTROL_VIRT_BASE 0xfebfb000 -#define TS72XX_NAND_CONTROL_SIZE 0x00001000 - -#define TS72XX_NAND1_BUSY_PHYS_BASE 0x60800000 -#define TS72XX_NAND2_BUSY_PHYS_BASE 0x70800000 -#define TS72XX_NAND_BUSY_VIRT_BASE 0xfebfa000 -#define TS72XX_NAND_BUSY_SIZE 0x00001000 - - #define TS72XX_RTC_INDEX_VIRT_BASE 0xfebf9000 #define TS72XX_RTC_INDEX_PHYS_BASE 0x10800000 #define TS72XX_RTC_INDEX_SIZE 0x00001000 diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 2fda0b6..fdee525 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -97,12 +97,6 @@ config MTD_NAND_OMAP_PREFETCH_DMA or in DMA interrupt mode. Say y for DMA mode or MPU mode will be used -config MTD_NAND_TS7250 - tristate "NAND Flash device on TS-7250 board" - depends on MACH_TS72XX - help - Support for NAND flash on Technologic Systems TS-7250 platform. - config MTD_NAND_IDS tristate diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile index 6950d3d..ecc404c 100644 --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile @@ -19,7 +19,6 @@ obj-$(CONFIG_MTD_NAND_DISKONCHIP) += diskonchip.o obj-$(CONFIG_MTD_NAND_H1900) += h1910.o obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o -obj-$(CONFIG_MTD_NAND_TS7250) += ts7250.o obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o obj-$(CONFIG_MTD_NAND_NDFC) += ndfc.o diff --git a/drivers/mtd/nand/ts7250.c b/drivers/mtd/nand/ts7250.c deleted file mode 100644 index 0f5562a..0000000 --- a/drivers/mtd/nand/ts7250.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * drivers/mtd/nand/ts7250.c - * - * Copyright (C) 2004 Technologic Systems (support@embeddedARM.com) - * - * Derived from drivers/mtd/nand/edb7312.c - * Copyright (C) 2004 Marius Gröger (mag@sysgo.de) - * - * Derived from drivers/mtd/nand/autcpu12.c - * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Overview: - * This is a device driver for the NAND flash device found on the - * TS-7250 board which utilizes a Samsung 32 Mbyte part. - */ - -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/nand.h> -#include <linux/mtd/partitions.h> -#include <linux/io.h> - -#include <mach/hardware.h> -#include <mach/ts72xx.h> - -#include <asm/sizes.h> -#include <asm/mach-types.h> - -/* - * MTD structure for TS7250 board - */ -static struct mtd_info *ts7250_mtd = NULL; - -#ifdef CONFIG_MTD_PARTITIONS -static const char *part_probes[] = { "cmdlinepart", NULL }; - -#define NUM_PARTITIONS 3 - -/* - * Define static partitions for flash device - */ -static struct mtd_partition partition_info32[] = { - { - .name = "TS-BOOTROM", - .offset = 0x00000000, - .size = 0x00004000, - }, { - .name = "Linux", - .offset = 0x00004000, - .size = 0x01d00000, - }, { - .name = "RedBoot", - .offset = 0x01d04000, - .size = 0x002fc000, - }, -}; - -/* - * Define static partitions for flash device - */ -static struct mtd_partition partition_info128[] = { - { - .name = "TS-BOOTROM", - .offset = 0x00000000, - .size = 0x00004000, - }, { - .name = "Linux", - .offset = 0x00004000, - .size = 0x07d00000, - }, { - .name = "RedBoot", - .offset = 0x07d04000, - .size = 0x002fc000, - }, -}; -#endif - - -/* - * hardware specific access to control-lines - * - * ctrl: - * NAND_NCE: bit 0 -> bit 2 - * NAND_CLE: bit 1 -> bit 1 - * NAND_ALE: bit 2 -> bit 0 - */ -static void ts7250_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) -{ - struct nand_chip *chip = mtd->priv; - - if (ctrl & NAND_CTRL_CHANGE) { - unsigned long addr = TS72XX_NAND_CONTROL_VIRT_BASE; - unsigned char bits; - - bits = (ctrl & NAND_NCE) << 2; - bits |= ctrl & NAND_CLE; - bits |= (ctrl & NAND_ALE) >> 2; - - __raw_writeb((__raw_readb(addr) & ~0x7) | bits, addr); - } - - if (cmd != NAND_CMD_NONE) - writeb(cmd, chip->IO_ADDR_W); -} - -/* - * read device ready pin - */ -static int ts7250_device_ready(struct mtd_info *mtd) -{ - return __raw_readb(TS72XX_NAND_BUSY_VIRT_BASE) & 0x20; -} - -/* - * Main initialization routine - */ -static int __init ts7250_init(void) -{ - struct nand_chip *this; - const char *part_type = 0; - int mtd_parts_nb = 0; - struct mtd_partition *mtd_parts = 0; - - if (!machine_is_ts72xx() || board_is_ts7200()) - return -ENXIO; - - /* Allocate memory for MTD device structure and private data */ - ts7250_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); - if (!ts7250_mtd) { - printk("Unable to allocate TS7250 NAND MTD device structure.\n"); - return -ENOMEM; - } - - /* Get pointer to private data */ - this = (struct nand_chip *)(&ts7250_mtd[1]); - - /* Initialize structures */ - memset(ts7250_mtd, 0, sizeof(struct mtd_info)); - memset(this, 0, sizeof(struct nand_chip)); - - /* Link the private data with the MTD structure */ - ts7250_mtd->priv = this; - ts7250_mtd->owner = THIS_MODULE; - - /* insert callbacks */ - this->IO_ADDR_R = (void *)TS72XX_NAND_DATA_VIRT_BASE; - this->IO_ADDR_W = (void *)TS72XX_NAND_DATA_VIRT_BASE; - this->cmd_ctrl = ts7250_hwcontrol; - this->dev_ready = ts7250_device_ready; - this->chip_delay = 15; - this->ecc.mode = NAND_ECC_SOFT; - - printk("Searching for NAND flash...\n"); - /* Scan to find existence of the device */ - if (nand_scan(ts7250_mtd, 1)) { - kfree(ts7250_mtd); - return -ENXIO; - } -#ifdef CONFIG_MTD_PARTITIONS - ts7250_mtd->name = "ts7250-nand"; - mtd_parts_nb = parse_mtd_partitions(ts7250_mtd, part_probes, &mtd_parts, 0); - if (mtd_parts_nb > 0) - part_type = "command line"; - else - mtd_parts_nb = 0; -#endif - if (mtd_parts_nb == 0) { - mtd_parts = partition_info32; - if (ts7250_mtd->size >= (128 * 0x100000)) - mtd_parts = partition_info128; - mtd_parts_nb = NUM_PARTITIONS; - part_type = "static"; - } - - /* Register the partitions */ - printk(KERN_NOTICE "Using %s partition definition\n", part_type); - add_mtd_partitions(ts7250_mtd, mtd_parts, mtd_parts_nb); - - /* Return happy */ - return 0; -} - -module_init(ts7250_init); - -/* - * Clean up routine - */ -static void __exit ts7250_cleanup(void) -{ - /* Unregister the device */ - del_mtd_device(ts7250_mtd); - - /* Free the MTD device structure */ - kfree(ts7250_mtd); -} - -module_exit(ts7250_cleanup); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Jesse Off <joff@embeddedARM.com>"); -MODULE_DESCRIPTION("MTD map driver for Technologic Systems TS-7250 board"); [-- Attachment #3: ts72xx_plat_nand_v2.patch --] [-- Type: application/octet-stream, Size: 6733 bytes --] 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
* RE: [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: H Hartley Sweeten Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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@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
* RE: [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: dedekind1; +Cc: Matthieu Crapet, linux-mtd, David Woodhouse, 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@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
* RE: [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: H Hartley Sweeten; +Cc: Matthieu Crapet, linux-mtd, linux-arm-kernel, dedekind1 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
* RE: [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: David Woodhouse; +Cc: Matthieu Crapet, linux-mtd, linux-arm-kernel, dedekind1 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
* RE: [PATCH 1/2] Update ts72xx to use generic platform nand driver 2009-10-16 17:32 ` H Hartley Sweeten @ 2009-10-16 17:36 ` David Woodhouse 0 siblings, 0 replies; 14+ messages in thread From: David Woodhouse @ 2009-10-16 17:36 UTC (permalink / raw) To: H Hartley Sweeten; +Cc: Matthieu Crapet, linux-mtd, linux-arm-kernel, dedekind1 On Fri, 2009-10-16 at 13:32 -0400, H Hartley Sweeten wrote: > 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. http://physics.nist.gov/cuu/Units/binary.html -- dwmw2 ^ 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