#include <linux/gpio.h>
 #include <linux/platform_device.h>
 #include <linux/serial_core.h>
+#include <linux/mtd/physmap.h>
 #include <asm/bootinfo.h>
 #include <asm/time.h>
 #include <asm/reboot.h>
 unsigned long (*__swizzle_addr_b)(unsigned long port) = __swizzle_addr_none;
 EXPORT_SYMBOL(__swizzle_addr_b);
 #endif
+
+void __init txx9_physmap_flash_init(int no, unsigned long addr,
+                                   unsigned long size,
+                                   const struct physmap_flash_data *pdata)
+{
+#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
+       struct resource res = {
+               .start = addr,
+               .end = addr + size - 1,
+               .flags = IORESOURCE_MEM,
+       };
+       struct platform_device *pdev;
+#ifdef CONFIG_MTD_PARTITIONS
+       static struct mtd_partition parts[2];
+       struct physmap_flash_data pdata_part;
+
+       /* If this area contained boot area, make separate partition */
+       if (pdata->nr_parts == 0 && !pdata->parts &&
+           addr < 0x1fc00000 && addr + size > 0x1fc00000 &&
+           !parts[0].name) {
+               parts[0].name = "boot";
+               parts[0].offset = 0x1fc00000 - addr;
+               parts[0].size = addr + size - 0x1fc00000;
+               parts[1].name = "user";
+               parts[1].offset = 0;
+               parts[1].size = 0x1fc00000 - addr;
+               pdata_part = *pdata;
+               pdata_part.nr_parts = ARRAY_SIZE(parts);
+               pdata_part.parts = parts;
+               pdata = &pdata_part;
+       }
+#endif
+       pdev = platform_device_alloc("physmap-flash", no);
+       if (!pdev ||
+           platform_device_add_resources(pdev, &res, 1) ||
+           platform_device_add_data(pdev, pdata, sizeof(*pdata)) ||
+           platform_device_add(pdev))
+               platform_device_put(pdev);
+#endif
+}
 
 #include <linux/delay.h>
 #include <linux/param.h>
 #include <linux/io.h>
+#include <linux/mtd/physmap.h>
 #include <asm/mipsregs.h>
 #include <asm/txx9irq.h>
 #include <asm/txx9tmr.h>
                              TXX9_IRQ_BASE + TX3927_IR_SIO(i),
                              i, sclk, (1 << i) & cts_mask);
 }
+
+void __init tx3927_mtd_init(int ch)
+{
+       struct physmap_flash_data pdata = {
+               .width = TX3927_ROMC_WIDTH(ch) / 8,
+       };
+       unsigned long start = txx9_ce_res[ch].start;
+       unsigned long size = txx9_ce_res[ch].end - start + 1;
+
+       if (!(tx3927_romcptr->cr[ch] & 0x8))
+               return; /* disabled */
+       txx9_physmap_flash_init(ch, start, size, &pdata);
+}
 
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/param.h>
+#include <linux/mtd/physmap.h>
 #include <asm/txx9irq.h>
 #include <asm/txx9tmr.h>
 #include <asm/txx9pio.h>
                              TXX9_IRQ_BASE + TX4927_IR_SIO(i),
                              i, sclk, (1 << i) & cts_mask);
 }
+
+void __init tx4927_mtd_init(int ch)
+{
+       struct physmap_flash_data pdata = {
+               .width = TX4927_EBUSC_WIDTH(ch) / 8,
+       };
+       unsigned long start = txx9_ce_res[ch].start;
+       unsigned long size = txx9_ce_res[ch].end - start + 1;
+
+       if (!(TX4927_EBUSC_CR(ch) & 0x8))
+               return; /* disabled */
+       txx9_physmap_flash_init(ch, start, size, &pdata);
+}
 
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/param.h>
+#include <linux/mtd/physmap.h>
 #include <asm/txx9irq.h>
 #include <asm/txx9tmr.h>
 #include <asm/txx9pio.h>
        if (addr1 && (pcfg & TX4938_PCFG_ETH1_SEL))
                txx9_ethaddr_init(TXX9_IRQ_BASE + TX4938_IR_ETH1, addr1);
 }
+
+void __init tx4938_mtd_init(int ch)
+{
+       struct physmap_flash_data pdata = {
+               .width = TX4938_EBUSC_WIDTH(ch) / 8,
+       };
+       unsigned long start = txx9_ce_res[ch].start;
+       unsigned long size = txx9_ce_res[ch].end - start + 1;
+
+       if (!(TX4938_EBUSC_CR(ch) & 0x8))
+               return; /* disabled */
+       txx9_physmap_flash_init(ch, start, size, &pdata);
+}
 
        platform_device_register_simple("rtc-ds1742", -1, &res, 1);
 }
 
+static void __init jmr3927_mtd_init(void)
+{
+       int i;
+
+       for (i = 0; i < 2; i++)
+               tx3927_mtd_init(i);
+}
+
 static void __init jmr3927_device_init(void)
 {
        __swizzle_addr_b = jmr3927_swizzle_addr_b;
        jmr3927_rtc_init();
        tx3927_wdt_init();
+       jmr3927_mtd_init();
 }
 
 struct txx9_board_vec jmr3927_vec __initdata = {
 
        platform_device_register_simple("ne", -1, res, ARRAY_SIZE(res));
 }
 
+static void __init rbtx4927_mtd_init(void)
+{
+       int i;
+
+       for (i = 0; i < 2; i++)
+               tx4927_mtd_init(i);
+}
+
 static void __init rbtx4927_device_init(void)
 {
        toshiba_rbtx4927_rtc_init();
        rbtx4927_ne_init();
        tx4927_wdt_init();
+       rbtx4927_mtd_init();
 }
 
 struct txx9_board_vec rbtx4927_vec __initdata = {
 
 #include <linux/delay.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
+#include <linux/mtd/physmap.h>
 
 #include <asm/reboot.h>
 #include <asm/io.h>
        return 0;
 }
 
+static void __init rbtx4938_mtd_init(void)
+{
+       struct physmap_flash_data pdata = {
+               .width = 4,
+       };
+
+       switch (readb(rbtx4938_bdipsw_addr) & 7) {
+       case 0:
+               /* Boot */
+               txx9_physmap_flash_init(0, 0x1fc00000, 0x400000, &pdata);
+               /* System */
+               txx9_physmap_flash_init(1, 0x1e000000, 0x1000000, &pdata);
+               break;
+       case 1:
+               /* System */
+               txx9_physmap_flash_init(0, 0x1f000000, 0x1000000, &pdata);
+               /* Boot */
+               txx9_physmap_flash_init(1, 0x1ec00000, 0x400000, &pdata);
+               break;
+       case 2:
+               /* Ext */
+               txx9_physmap_flash_init(0, 0x1f000000, 0x1000000, &pdata);
+               /* System */
+               txx9_physmap_flash_init(1, 0x1e000000, 0x1000000, &pdata);
+               /* Boot */
+               txx9_physmap_flash_init(2, 0x1dc00000, 0x400000, &pdata);
+               break;
+       case 3:
+               /* Boot */
+               txx9_physmap_flash_init(1, 0x1bc00000, 0x400000, &pdata);
+               /* System */
+               txx9_physmap_flash_init(2, 0x1a000000, 0x1000000, &pdata);
+               break;
+       }
+}
+
 static void __init rbtx4938_arch_init(void)
 {
        gpiochip_add(&rbtx4938_spi_gpio_chip);
        rbtx4938_ethaddr_init();
        rbtx4938_ne_init();
        tx4938_wdt_init();
+       rbtx4938_mtd_init();
 }
 
 struct txx9_board_vec rbtx4938_vec __initdata = {
 
 }
 #endif
 
+struct physmap_flash_data;
+void txx9_physmap_flash_init(int no, unsigned long addr, unsigned long size,
+                            const struct physmap_flash_data *pdata);
+
 #endif /* __ASM_TXX9_GENERIC_H */
 
 #define TX3927_ROMC_BA(ch)     (tx3927_romcptr->cr[(ch)] & 0xfff00000)
 #define TX3927_ROMC_SIZE(ch)   \
        (0x00100000 << ((tx3927_romcptr->cr[(ch)] >> 8) & 0xf))
+#define TX3927_ROMC_WIDTH(ch)  (32 >> ((tx3927_romcptr->cr[(ch)] >> 7) & 0x1))
 
 void tx3927_wdt_init(void);
 void tx3927_setup(void);
                       unsigned long sdram_size, int extarb);
 void tx3927_setup_pcierr_irq(void);
 void tx3927_irq_init(void);
+void tx3927_mtd_init(int ch);
 
 #endif /* __ASM_TXX9_TX3927_H */
 
 #define TX4927_EBUSC_BA(ch)    ((TX4927_EBUSC_CR(ch) >> 48) << 20)
 #define TX4927_EBUSC_SIZE(ch)  \
        (0x00100000 << ((unsigned long)(TX4927_EBUSC_CR(ch) >> 8) & 0xf))
+#define TX4927_EBUSC_WIDTH(ch) \
+       (64 >> ((__u32)(TX4927_EBUSC_CR(ch) >> 20) & 0x3))
 
 /* utilities */
 static inline void txx9_clear64(__u64 __iomem *adr, __u64 bits)
 int tx4927_pciclk66_setup(void);
 void tx4927_setup_pcierr_irq(void);
 void tx4927_irq_init(void);
+void tx4927_mtd_init(int ch);
 
 #endif /* __ASM_TXX9_TX4927_H */
 
 #define TX4938_EBUSC_CR(ch)    TX4927_EBUSC_CR(ch)
 #define TX4938_EBUSC_BA(ch)    TX4927_EBUSC_BA(ch)
 #define TX4938_EBUSC_SIZE(ch)  TX4927_EBUSC_SIZE(ch)
+#define TX4938_EBUSC_WIDTH(ch) TX4927_EBUSC_WIDTH(ch)
 
 #define tx4938_get_mem_size() tx4927_get_mem_size()
 void tx4938_wdt_init(void);
 int tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot);
 void tx4938_setup_pcierr_irq(void);
 void tx4938_irq_init(void);
+void tx4938_mtd_init(int ch);
 
 #endif