help
          Clock code for the S3C2410, and similar processors
 
+config SIMTEC_NOR
+       bool
+       help
+         Internal node to specify machine has simtec NOR mapping
+
 config MACH_BAST_IDE
        bool
        select HAVE_PATA_PLATFORM
        bool "Simtec Electronics BAST (EB2410ITX)"
        select CPU_S3C2410
        select PM_SIMTEC if PM
+       select SIMTEC_NOR
        select MACH_BAST_IDE
        select ISA
        help
 config MACH_VR1000
        bool "Thorcom VR1000"
        select PM_SIMTEC if PM
+       select SIMTEC_NOR
        select MACH_BAST_IDE
        select CPU_S3C2410
        help
 
 obj-$(CONFIG_MACH_VR1000)      += mach-vr1000.o usb-simtec.o
 obj-$(CONFIG_MACH_QT2410)      += mach-qt2410.o
 
+# Common bits of machine support
+
+obj-$(CONFIG_SIMTEC_NOR)       += nor-simtec.o
+
 # machine additions
 
 obj-$(CONFIG_MACH_BAST_IDE)    += bast-ide.o
 
 #include <asm/plat-s3c24xx/clock.h>
 #include <asm/plat-s3c24xx/devs.h>
 #include <asm/plat-s3c24xx/cpu.h>
+
 #include "usb-simtec.h"
+#include "nor-simtec.h"
 
 #define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
 
        }
 };
 
-/* NOR Flash on BAST board */
-
-static struct resource bast_nor_resource[] = {
-       [0] = {
-               .start = S3C2410_CS1 + 0x4000000,
-               .end   = S3C2410_CS1 + 0x4000000 + (32*1024*1024) - 1,
-               .flags = IORESOURCE_MEM,
-       }
-};
-
-static struct platform_device bast_device_nor = {
-       .name           = "bast-nor",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(bast_nor_resource),
-       .resource       = bast_nor_resource,
-};
-
 /* NAND Flash on BAST board */
 
 #ifdef CONFIG_PM
        &s3c_device_i2c,
        &s3c_device_rtc,
        &s3c_device_nand,
-       &bast_device_nor,
        &bast_device_dm9k,
        &bast_device_asix,
        &bast_device_axpp,
 
        s3c24xx_fb_set_platdata(&bast_fb_info);
        platform_add_devices(bast_devices, ARRAY_SIZE(bast_devices));
+
+       nor_simtec_init();
 }
 
 MACHINE_START(BAST, "Simtec-BAST")
 
 #include <asm/plat-s3c24xx/clock.h>
 #include <asm/plat-s3c24xx/devs.h>
 #include <asm/plat-s3c24xx/cpu.h>
+
 #include "usb-simtec.h"
+#include "nor-simtec.h"
 
 /* macros for virtual address mods for the io space entries */
 #define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5)
        },
 };
 
-/* MTD NOR Flash */
-
-static struct resource vr1000_nor_resource[] = {
-       [0] = {
-               .start  = S3C2410_CS1 + 0x4000000,
-               .end    = S3C2410_CS1 + 0x4000000 + SZ_16M - 1,
-               .flags  = IORESOURCE_MEM,
-       }
-};
-
-static struct platform_device vr1000_nor = {
-       .name           = "bast-nor",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(vr1000_nor_resource),
-       .resource       = vr1000_nor_resource,
-};
-
 /* DM9000 ethernet devices */
 
 static struct resource vr1000_dm9k0_resource[] = {
        &s3c_device_i2c,
        &s3c_device_adc,
        &serial_device,
-       &vr1000_nor,
        &vr1000_dm9k0,
        &vr1000_dm9k1,
        &vr1000_led1,
 static void __init vr1000_init(void)
 {
        platform_add_devices(vr1000_devices, ARRAY_SIZE(vr1000_devices));
+
+       nor_simtec_init();
 }
 
 MACHINE_START(VR1000, "Thorcom-VR1000")
 
--- /dev/null
+/* linux/arch/arm/mach-s3c2410/nor-simtec.c
+ *
+ * Copyright (c) 2008 Simtec Electronics
+ *     http://armlinux.simtec.co.uk/
+ *     Ben Dooks <ben@simtec.co.uk>
+ *
+ * Simtec NOR mapping
+ *
+ * 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 <linux/module.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/map.h>
+#include <asm/arch/bast-map.h>
+#include <asm/arch/bast-cpld.h>
+
+
+static void simtec_nor_vpp(struct map_info *map, int vpp)
+{
+       unsigned int val;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       val = __raw_readb(BAST_VA_CTRL3);
+
+       printk(KERN_DEBUG "%s(%d)\n", __func__, vpp);
+
+       if (vpp)
+               val |= BAST_CPLD_CTRL3_ROMWEN;
+       else
+               val &= ~BAST_CPLD_CTRL3_ROMWEN;
+
+       __raw_writeb(val, BAST_VA_CTRL3);
+       local_irq_restore(flags);
+}
+
+struct physmap_flash_data simtec_nor_pdata = {
+       .width          = 2,
+       .set_vpp        = simtec_nor_vpp,
+       .nr_parts       = 0,
+};
+
+static struct resource simtec_nor_resource[] = {
+       [0] = {
+               .start = S3C2410_CS1 + 0x4000000,
+               .end   = S3C2410_CS1 + 0x4000000 + SZ_8M - 1,
+               .flags = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device simtec_device_nor = {
+       .name           = "physmap-flash",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(simtec_nor_resource),
+       .resource       = simtec_nor_resource,
+       .dev            = {
+               .platform_data = &simtec_nor_pdata,
+       },
+};
+
+void __init nor_simtec_init(void)
+{
+       int ret;
+
+       ret = platform_device_register(&simtec_device_nor);
+       if (ret < 0)
+               printk(KERN_ERR "failed to register physmap-flash device\n");
+       else
+               simtec_nor_vpp(NULL, 1);
+}
 
--- /dev/null
+/* linux/arch/arm/mach-s3c2410/nor-simtec.h
+ *
+ * Copyright (c) 2008 Simtec Electronics
+ *     http://armlinux.simtec.co.uk/
+ *     Ben Dooks <ben@simtec.co.uk>
+ *
+ * Simtec NOR mapping
+ *
+ * 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.
+*/
+
+extern void nor_simtec_init(void);