This patch adds the maps for the taco. It also gets the ndfc.c NAND driver in a compilable state. The map is guaranteed to change since the exact NOR/NAND flash configuration is in flux right now when we found the 256M NAND flash won't boot properly.

Currently it configures the NOR in a reasonable fashion and leaves the NAND as one honkin' parition.

Cheers,
  Sean

diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index a592fc0..24cbafa 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -588,6 +588,15 @@ config MTD_INTEL_VR_NOR
          Map driver for a NOR flash bank located on the Expansion Bus of the
          Intel Vermilion Range chipset.
 
+config MTD_TACO
+       tristate "Flash devices mapped on Taco boards."
+       depends on MTD_CFI && PPC32 && 44x && TACO
+       help
+         This enables access routined for the flash chips on the PIKA
+         Taco board.
+         If you have this board and would like to use the flash
+         chips on it, say 'Y'.
+
 config MTD_PLATRAM
        tristate "Map driver for platform device RAM (mtd-ram)"
        select MTD_RAM
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 316382a..4de7ef9 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -69,3 +69,4 @@ obj-$(CONFIG_MTD_PLATRAM)     += plat-ram.o
 obj-$(CONFIG_MTD_OMAP_NOR)     += omap_nor.o
 obj-$(CONFIG_MTD_MTX1)         += mtx-1_flash.o
 obj-$(CONFIG_MTD_INTEL_VR_NOR) += intel_vr_nor.o
+obj-$(CONFIG_MTD_TACO)         += taco.o
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 246d451..ca9f35a 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -153,7 +153,7 @@ config MTD_NAND_S3C2410_HWECC
 
 config MTD_NAND_NDFC
        tristate "NDFC NanD Flash Controller"
-       depends on 4xx && !PPC_MERGE
+       depends on 4xx
        select MTD_NAND_ECC_SMC
        help
         NDFC Nand Flash Controllers are integrated in IBM/AMCC's 4xx SoCs
diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
index 1c0e89f..f5e93cf 100644
--- a/drivers/mtd/nand/ndfc.c
+++ b/drivers/mtd/nand/ndfc.c
@@ -24,11 +24,6 @@
 #include <linux/platform_device.h>
 
 #include <asm/io.h>
-#ifdef CONFIG_40x
-#include <asm/ibm405.h>
-#else
-#include <asm/ibm44x.h>
-#endif
 
 struct ndfc_nand_mtd {
        struct mtd_info                 mtd;
@@ -110,6 +105,40 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd,
        return 0;
 }
 
+#ifdef CONFIG_TACO
+/* The NDFC may allow 32bit read/writes, but it sure doesn't work on
+ * the taco!
+ */
+static void ndfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       struct ndfc_controller *ndfc = &ndfc_ctrl;
+       uint8_t *p = (uint8_t *) buf;
+
+       for(;len > 0; len -= 1)
+               *p++ = __raw_readb(ndfc->ndfcbase + NDFC_DATA);
+}
+
+static void ndfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
+{
+       struct ndfc_controller *ndfc = &ndfc_ctrl;
+       uint8_t *p = (uint8_t *) buf;
+
+       for(;len > 0; len -= 1)
+               __raw_writeb(*p++, ndfc->ndfcbase + NDFC_DATA);
+}
+
+static int ndfc_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
+{
+       struct ndfc_controller *ndfc = &ndfc_ctrl;
+       uint8_t *p = (uint8_t *) buf;
+
+       for(;len > 0; len -= 1)
+               if (*p++ != __raw_readb(ndfc->ndfcbase + NDFC_DATA))
+                       return -EFAULT;
+
+       return 0;
+}
+#else
 /*
  * Speedups for buffer read/write/verify
  *
@@ -145,6 +174,7 @@ static int ndfc_verify_buf(struct mtd_info *mtd, const 
uint8_t *buf, int len)
                        return -EFAULT;
        return 0;
 }
+#endif
 
 /*
  * Initialize chip structure
@@ -237,7 +267,7 @@ static int ndfc_nand_probe(struct platform_device *pdev)
 #ifndef CONFIG_PHYS_64BIT
        ndfc->ndfcbase = ioremap((phys_addr_t)phys, res->end - res->start + 1);
 #else
-       ndfc->ndfcbase = ioremap64(phys, res->end - res->start + 1);
+       ndfc->ndfcbase = ioremap(phys, res->end - res->start + 1);
 #endif
        if (!ndfc->ndfcbase) {
                printk(KERN_ERR "NDFC: ioremap failed\n");
--- /dev/null   2005-11-20 22:22:37.000000000 -0500
+++ drivers/mtd/maps/taco.c     2008-01-02 13:07:43.000000000 -0500
@@ -0,0 +1,140 @@
+/*
+ * $Id: $
+ *
+ * drivers/mtd/maps/taco.c
+ *
+ * Mapping for PIKA Taco flash
+ *
+ * Based on original work by
+ *      Matt Porter <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/io.h>
+
+#define TACO_FLASH_BASE 0xffc00000 // SAM CHECK
+
+#define RW_KERNEL_SZ   0x00180000
+#define RW_ROOT_SZ      0x03480000
+#define RW_FPGA_SZ     0x00040000
+#define RW_ENV_SZ       0x00040000
+#define RW_UBOOT_SZ    0x00080000
+
+static struct mtd_partition taco_flash_parts[] = {
+       { // 0
+               .name   = "kernel",
+               .offset = 0,
+               .size   = RW_KERNEL_SZ
+       },
+       { // 1
+               .name   = "root",
+               .offset = RW_KERNEL_SZ,
+               .size   = RW_ROOT_SZ
+       },
+       { // 2
+               .name   = "user",
+               .offset = RW_KERNEL_SZ + RW_ROOT_SZ,
+               .size   = 0 // auto - must be zero
+       },
+       /* ------------------------ */
+       {  // 3
+               .name = "fpga",
+               .size = RW_FPGA_SZ
+       },
+       { // 4
+               .name = "env",
+               .size = RW_ENV_SZ
+       },
+       { // 5
+               .name = "u-boot",
+               .size = RW_UBOOT_SZ
+       }
+};
+
+struct map_info taco_flash_map = {
+       .name = "taco-flash",
+       .bankwidth = 2,
+};
+
+static struct mtd_info *taco_mtd;
+
+int __init init_taco_flash(void)
+{
+       unsigned long flash_base, flash_size;
+       int i, user_size; // must be signed!
+
+       // SAM How do we get the flash size??????
+       flash_base = TACO_FLASH_BASE;
+       flash_size = 64 * 0x100000; // SAM HACK 64M
+
+       taco_flash_map.size = flash_size;
+       taco_flash_map.phys = flash_base;
+       taco_flash_map.virt = (void __iomem *)ioremap(flash_base, flash_size);
+
+       if (!taco_flash_map.virt) {
+               printk("init_taco_flash: failed to ioremap\n");
+               return -EIO;
+       }
+
+       /* user gets left over space */
+       user_size = flash_size;
+       for(i = 0; i < ARRAY_SIZE(taco_flash_parts); ++i)
+               user_size -= taco_flash_parts[i].size;
+       if(user_size > 0)
+               taco_flash_parts[2].size = user_size;
+
+       /* u-boot */
+       flash_size -= RW_UBOOT_SZ;
+       taco_flash_parts[5].offset = flash_size;
+
+       /* env */
+       flash_size -= RW_ENV_SZ;
+       taco_flash_parts[4].offset = flash_size;
+
+       /* fpga */
+       flash_size -= RW_FPGA_SZ;
+       taco_flash_parts[3].offset = flash_size;
+
+       simple_map_init(&taco_flash_map);
+
+       taco_mtd = do_map_probe("cfi_probe", &taco_flash_map);
+
+       if (taco_mtd) {
+               taco_mtd->owner = THIS_MODULE;
+               return add_mtd_partitions(taco_mtd,
+                                                                 
taco_flash_parts,
+                                                                 
ARRAY_SIZE(taco_flash_parts));
+       }
+
+       return -ENXIO;
+}
+
+static void __exit cleanup_taco_flash(void)
+{
+       if (taco_mtd) {
+               del_mtd_partitions(taco_mtd);
+               /* moved iounmap after map_destroy - armin */
+               map_destroy(taco_mtd);
+               iounmap((void *)taco_flash_map.virt);
+               taco_mtd = NULL;
+       }
+}
+
+module_init(init_taco_flash);
+module_exit(cleanup_taco_flash);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("MTD map and partitions for Taco boards");
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to