MTD map support for pxa27x on the EZX diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/mtd/maps/Kconfig linux-2.6.16.5-exz/drivers/mtd/maps/Kconfig --- linux-2.6.16.5/drivers/mtd/maps/Kconfig 2006-04-12 22:27:57.000000000 +0200 +++ linux-2.6.16.5-exz/drivers/mtd/maps/Kconfig 2006-04-16 22:31:41.000000000 +0200 @@ -621,6 +621,13 @@ help This enables access to the flash chip on the Sharp SL Series of PDAs. +config MTD_PXA27x + bool "Map driver for Intel PXA27x" + depends on MTD && ARCH_PXA + help + This enables access to the flash chip on the Intel PXA27x + + config MTD_PLATRAM tristate "Map driver for platform device RAM (mtd-ram)" depends on MTD diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/mtd/maps/Makefile linux-2.6.16.5-exz/drivers/mtd/maps/Makefile --- linux-2.6.16.5/drivers/mtd/maps/Makefile 2006-04-12 22:27:57.000000000 +0200 +++ linux-2.6.16.5-exz/drivers/mtd/maps/Makefile 2006-04-16 22:30:56.000000000 +0200 @@ -71,3 +71,4 @@ obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o obj-$(CONFIG_MTD_MTX1) += mtx-1_flash.o obj-$(CONFIG_MTD_TQM834x) += tqm834x.o +obj-$(CONFIG_MTD_PXA27x) += pxa27x.o diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/mtd/maps/pxa27x.c linux-2.6.16.5-exz/drivers/mtd/maps/pxa27x.c --- linux-2.6.16.5/drivers/mtd/maps/pxa27x.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.16.5-exz/drivers/mtd/maps/pxa27x.c 2006-04-16 22:53:13.000000000 +0200 @@ -0,0 +1,187 @@ +/* + * $Id: $ + * + * Map driver for the PXA27x + * + * Author: Harald Welte + * Copyright: (C) 2001 MontaVista Software Inc. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#define WINDOW_ADDR 0x0 +#define WINDOW_SIZE (32*1024*1024) +#define WINDOW_CACHE_ADDR 0x0 +#define WINDOW_CACHE_SIZE 0x1a00000 + +static void pxa27x_map_inval_cache(struct map_info *map, unsigned long from, + ssize_t len) +{ + unsigned long endaddress, i, j; + + /* FIXME: can this be replaced by consistent_sync? */ + + endaddress = from + len -1; + from &= ~(32-1); + endaddress &= ~(32-1); + for (i = from; i <= endaddress; i += 32) + asm("mcr p15, 0, %0, c7, c6, 1"::"r"(i)); + + asm( "mrc p15, 0, %0, c2, c0, 0\n" + "mov %0, %0\n" + "sub pc, pc #4" + :"=r"(j)); +} + + +struct map_info pxa27x_map = { + .name = "PXA27x flash", + .size = WINDOW_SIZE, + .phys = WINDOW_ADDR, + .inval_cache = &pxa27x_map_inval_cache, +}; + +#if defined (CONFIG_PXA_EZX_A780) || defined (CONFIG_PXA_EZX_E680) +static struct mtd_partition pxa27x_partitions[] = { + { + .name = "Bootloader", + .size = 0x00020000, + .offset = 0, + .mask_flags = MTD_WRITEABLE, + }, { + .name = "Kernel", + .size = 0x000e0000, + .offset = 0x00020000, + } , { + .name = "rootfs", + .size = 0x018e0000, + .offset = 0x00120000, + } , { + .name = "VFM_Filesystem", + .size = 0x00580000, + .offset = 0x01a00000, + } , { + .name = "setup", + .size = 0x00020000, + .offset = 0x01fa0000, + } , { + .name = "Logo", + .size = 0x00020000, + .offset = 0x01fc0000, + }, +}; +#else +#error "please define partition for this PXA27x implementation" +#endif + + +static struct mtd_info *mymtd; +static struct mtd_partition *parsed_parts; + +static const char *probes[] = { "RedBoot", "cmdlinepart", NULL }; + +static int __init init_pxa27x(void) +{ + struct mtd_partition *parts; + int nb_parts = 0; + int parsed_nr_parts = 0; + char *part_type = "static"; + + pxa27x_map.bankwidth = (BOOT_DEF & 1) ? 2 : 4; + + printk("Probing PXA27x flash at physical address 0x%08x (%d-bit bankwidth)\n", + WINDOW_ADDR, pxa27x_map.bankwidth * 8); + pxa27x_map.virt = ioremap(pxa27x_map.phys, pxa27x_map.size); + + if (!pxa27x_map.virt) { + printk("Failed to ioremap\n"); + return -EIO; + } + + mymtd = do_map_probe("cfi_probe", &pxa27x_map); + if (!mymtd) { + iounmap((void *)pxa27x_map.virt); + return -ENXIO; + } + mymtd->owner = THIS_MODULE; + +#if 0 + /* ioremap the first flash chip as cacheable */ + pxa27x_map.cached = ioremap_cached(pxa27x_map.phys, pxa27x_map.size); + if (!pxa27x_map.cached) { + printk("Failed to do cacheable-ioremap\n"); + iounmap((void *)pxa27x_map.virt); + return -EIO; + } +#endif + simple_map_init(&pxa27x_map); + + if (parsed_nr_parts == 0) { + int ret = parse_mtd_partitions(mymtd, probes, &parsed_parts, 0); + + if (ret > 0) { + part_type = "RedBoot"; + parsed_nr_parts = ret; + } + } + + if (parsed_nr_parts > 0) { + parts = parsed_parts; + nb_parts = parsed_nr_parts; + } else { + parts = pxa27x_partitions; + nb_parts = ARRAY_SIZE(pxa27x_partitions); + } + + if (nb_parts) { + printk(KERN_NOTICE "Using %s partition definition\n", part_type); + add_mtd_partitions(mymtd, parts, nb_parts); + } else { + add_mtd_device(mymtd); + } +#if 0 + if (ret = ezx_partition_init()) +#endif + return 0; +} + +static void __exit cleanup_pxa27x(void) +{ + if (mymtd) { + del_mtd_partitions(mymtd); + map_destroy(mymtd); + if (parsed_parts) + kfree(parsed_parts); + } + if (pxa27x_map.virt) + iounmap((void *)pxa27x_map.virt); + if (pxa27x_map.cached) + iounmap((void *)pxa27x_map.cached); + return; +} + +module_init(init_pxa27x); +module_exit(cleanup_pxa27x); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Harald Welte "); +MODULE_DESCRIPTION("MTD map driver for Intel PXA27x");