MTD updates
Gary Thomas
gary at mlbassoc.com
Fri May 28 10:58:03 EDT 2004
David,
Just a final check - here's what I propose to check in. Note: I hope to
have these changes pushed into the Linux/PPC trees someday soon (I'm
working in it...)
--
Gary Thomas <gary at mlbassoc.com>
MLB Associates
-------------- next part --------------
? fs/jffs2/ecos/jffs2-200302041443.epk
? fs/jffs2/ecos/jffs2-200311190423.epk
? fs/jffs2/ecos/jffs2-200312111628.epk
? fs/jffs2/ecos/jffs2-200402170804.epk
? fs/jffs2/ecos/jffs2-200403090905.epk
? fs/jffs2/ecos/jffs2-200403310527.epk
? fs/jffs2/ecos/jffs2-200403312046.epk
? fs/jffs2/ecos/jffs2-200404211238.epk
Index: drivers/mtd/maps/Config.in
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/maps/Config.in,v
retrieving revision 1.67
diff -u -5 -p -r1.67 Config.in
--- drivers/mtd/maps/Config.in 12 Apr 2004 06:38:39 -0000 1.67
+++ drivers/mtd/maps/Config.in 28 May 2004 14:54:32 -0000
@@ -33,10 +33,11 @@ if [ "$CONFIG_X86" = "y" ]; then
dep_tristate ' CFI Flash device mapped on SnapGear/SecureEdge' CONFIG_MTD_NETtel $CONFIG_MTD_PARTITIONS
dep_tristate ' BIOS flash chip on Intel SCB2 boards' CONFIG_MTD_SCB2_FLASH $CONFIG_MTD_GEN_PROBE
fi
if [ "$CONFIG_PPC32" = "y" ]; then
+ dep_tristate ' CFI Flash device mapping exported by RedBoot' CONFIG_MTD_CFI_REDBOOT $CONFIG_MTD_CFI
if [ "$CONFIG_6xx" = "y" -a "$CONFIG_8260" = "y" ]; then
dep_tristate ' Flash device on SBC8240' CONFIG_MTD_SBC8240 $CONFIG_MTD_JEDECPROBE
fi
if [ "$CONFIG_8xx" = "y" ]; then
if [ "$CONFIG_TQM8xxL" = "y" ]; then
Index: drivers/mtd/maps/Makefile.common
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/maps/Makefile.common,v
retrieving revision 1.11
diff -u -5 -p -r1.11 Makefile.common
--- drivers/mtd/maps/Makefile.common 13 May 2004 22:21:26 -0000 1.11
+++ drivers/mtd/maps/Makefile.common 28 May 2004 14:54:32 -0000
@@ -66,7 +66,8 @@ obj-$(CONFIG_MTD_ARCTIC) += arctic-mtd.o
obj-$(CONFIG_MTD_H720X) += h720x-flash.o
obj-$(CONFIG_MTD_SBC8240) += sbc8240.o
obj-$(CONFIG_MTD_NOR_TOTO) += omap-toto-flash.o
obj-$(CONFIG_MTD_MPC1211) += mpc1211.o
obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o
+obj-$(CONFIG_MTD_CFI_REDBOOT) += redboot-mtd.o
-include $(TOPDIR)/Rules.make
Index: drivers/mtd/maps/redboot-mtd.c
===================================================================
RCS file: drivers/mtd/maps/redboot-mtd.c
diff -N drivers/mtd/maps/redboot-mtd.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ drivers/mtd/maps/redboot-mtd.c 28 May 2004 14:54:32 -0000
@@ -0,0 +1,103 @@
+/*
+ * $Id: redboot-mtd.c,v 1.1.6.1 2004/05/28 12:19:31 gthomas Exp $
+ *
+ * Handle mapping of the flash on various Motorola PPC platforms
+ * Patterned after "rpxlite.c"
+ *
+ * Copyright (c) 2003, 2004 Gary Thomas <gary at mlbassoc.com>
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/io.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#if 0
+#define dprintk(p) printk p
+#else
+#define dprintk(p)
+#endif
+
+extern int parse_cmdline_partitions(struct mtd_info *master,
+ struct mtd_partition **pparts,
+ const char *mtd_id);
+
+static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
+
+static struct mtd_partition *mtd_parts;
+static struct mtd_info *mymtd;
+#define PROBETYPES { "cfi_probe", 0 }
+#define MTDID "RedBoot-nor" /* for mtdparts= partitioning */
+
+struct map_info redboot_mtd_map = {
+ .name = "PowerPC/RedBoot 8xx/8xxx boards",
+};
+
+int __init init_redboot_mtd(void)
+{
+ struct mtd_partition *parts;
+ int nb_parts = 0;
+ int parsed_nr_parts = 0;
+ char *part_type;
+ bd_t *bp = (bd_t *)__res;
+
+ redboot_mtd_map.phys = bp->bi_flashbase;
+ redboot_mtd_map.size = bp->bi_flashsize;
+ redboot_mtd_map.buswidth = bp->bi_flashwidth/8;
+ redboot_mtd_map.virt = (unsigned long)ioremap(bp->bi_flashbase, bp->bi_flashsize);
+ if (!redboot_mtd_map.virt) {
+ printk("%s: can't ioremap FLASH\n", __FUNCTION__);
+ return -EIO;
+ }
+ printk("PowerPC/RedBoot 8xx/8xxx flash device: 0x%x bytes at 0x%x (%d bits wide)\n",
+ bp->bi_flashsize, bp->bi_flashbase, bp->bi_flashwidth);
+
+ simple_map_init(&redboot_mtd_map);
+
+ mymtd = do_map_probe("cfi_probe", &redboot_mtd_map);
+ if (mymtd) {
+ mymtd->owner = THIS_MODULE;
+#ifdef CONFIG_MTD_REDBOOT_PARTS
+ parsed_nr_parts = parse_mtd_partitions(mymtd, probes, &mtd_parts, 0);
+ if (parsed_nr_parts > 0)
+ part_type = "detected";
+#endif
+ if (parsed_nr_parts > 0) {
+ parts = mtd_parts;
+ nb_parts = parsed_nr_parts;
+ }
+ if (nb_parts == 0) {
+ printk("PowerPC/RedBoot 8xx/8xxx flash: no partition info available, registering whole flash at once\n");
+ add_mtd_device(mymtd);
+ } else {
+ add_mtd_partitions(mymtd, parts, nb_parts);
+ }
+ return 0;
+ }
+
+ iounmap((void *)redboot_mtd_map.map_priv_1);
+ return -ENXIO;
+}
+
+static void __exit cleanup_redboot_mtd(void)
+{
+ if (mymtd) {
+ del_mtd_device(mymtd);
+ map_destroy(mymtd);
+ }
+ if (redboot_mtd_map.map_priv_1) {
+ iounmap((void *)redboot_mtd_map.map_priv_1);
+ redboot_mtd_map.map_priv_1 = 0;
+ }
+}
+
+module_init(init_redboot_mtd);
+module_exit(cleanup_redboot_mtd);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Gary Thomas <gary at mlbassoc.com>");
+MODULE_DESCRIPTION("MTD map driver for PowerPC 8xx/8xxx boards running RedBoot");
Index: drivers/mtd/nand/Config.in
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/nand/Config.in,v
retrieving revision 1.17
diff -u -5 -p -r1.17 Config.in
--- drivers/mtd/nand/Config.in 10 May 2004 07:28:18 -0000 1.17
+++ drivers/mtd/nand/Config.in 28 May 2004 14:54:32 -0000
@@ -39,6 +39,11 @@ if [ "$CONFIG_PPCHAMELEONEVB" = "y" ]; t
fi
if [ "$CONFIG_SOC_AU1550" = "y" ]; then
dep_tristate ' NAND Flash Driver for Au1550 controller' CONFIG_MTD_NAND_AU1550 $CONFIG_MTD_NAND
fi
+
+if [ "$CONFIG_TAMS_MOAB" = "y" ]; then
+ dep_tristate ' NAND Flash device on TAMS MOAB board' CONFIG_MTD_NAND_TAMS_MOAB $CONFIG_MTD_NAND
+fi
+
endmenu
Index: drivers/mtd/nand/Makefile.common
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/nand/Makefile.common,v
retrieving revision 1.7
diff -u -5 -p -r1.7 Makefile.common
--- drivers/mtd/nand/Makefile.common 26 May 2004 13:35:52 -0000 1.7
+++ drivers/mtd/nand/Makefile.common 28 May 2004 14:54:33 -0000
@@ -17,10 +17,11 @@ obj-$(CONFIG_MTD_NAND_EDB7312) += edb73
obj-$(CONFIG_MTD_NAND_TX4925NDFMC) += tx4925ndfmc.o
obj-$(CONFIG_MTD_NAND_TX4938NDFMC) += tx4938ndfmc.o
obj-$(CONFIG_MTD_NAND_AU1550) += au1550nd.o
obj-$(CONFIG_MTD_NAND_IDS) += nand_ids.o
obj-$(CONFIG_MTD_NAND_PPCHAMELEONEVB) += ppchameleonevb.o
+obj-$(CONFIG_MTD_NAND_TAMS_MOAB) += tams_moab.o
nand-objs = nand_base.o nand_bbt.o
-include $(TOPDIR)/Rules.make
Index: drivers/mtd/nand/tams_moab.c
===================================================================
RCS file: drivers/mtd/nand/tams_moab.c
diff -N drivers/mtd/nand/tams_moab.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ drivers/mtd/nand/tams_moab.c 28 May 2004 14:54:33 -0000
@@ -0,0 +1,214 @@
+/*
+ * drivers/mtd/nand/tams_moab.c
+ * Coyright (C) Gary Thomas (linux at mlbassoc.com)
+ *
+ * Derived from drivers/mtd/nand/edb7312.c & autcu12.c
+ * Copyright (C) 2002 Marius Gr?ger (mag at sysgo.de)
+ * Copyright (c) 2001 Thomas Gleixner (gleixner at autronix.de)
+ *
+ * $Id: tams_moab.c,v 1.1.2.3 2004/05/28 12:14:57 gthomas Exp $
+ *
+ * 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
+ * TAMS MOAB board which utilizes the Toshiba TC58V256AFT part. This
+ * is a 256Mibit (32MiB x 8 bits) NAND flash device.
+ */
+
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <platforms/ibm405gpr.h>
+
+/*
+ * MTD structure for MOAB board
+ */
+static struct mtd_info *moab_mtd = NULL;
+
+/*
+ * Values specific to the MOAB board (PowerPC 405GPr)
+ */
+#define MOAB_NAND_PHYS_BASE 0xC0000000
+#define MOAB_NAND_CLE 0x00010000 // GPIO 15 - asserts CLE to NAND device
+#define MOAB_NAND_ALE 0x00020000 // GPIO 14 - asserts ALE to NAND device
+#define MOAB_NAND_CE 0x00004000 // GPIO 17 - asserts CE to NAND device (active low)
+#define MOAB_NAND_BSY 0x00000200 // GPIO 22 - NAND RDY
+
+/*
+ * Mapped access to device
+ */
+static int moab_dev_base;
+static gpio_t *moab_gpio_base;
+
+/*
+ * Module stuff
+ */
+
+#ifdef CONFIG_MTD_PARTITIONS
+/*
+ * Define static partitions for flash device
+ */
+static struct mtd_partition partition_info[] = {
+ { name: "MOAB Nand Flash",
+ offset: 0,
+ size: 128*1024*1024 }
+};
+#define NUM_PARTITIONS 1
+
+extern int parse_cmdline_partitions(struct mtd_info *master,
+ struct mtd_partition **pparts,
+ const char *mtd_id);
+
+static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
+
+#endif
+static u_char data_buf[512 + 16];
+static u_char oob_buf[16 * 32];
+
+
+/*
+ * hardware specific access to control-lines
+ */
+static void moab_hwcontrol(struct mtd_info *mtd, int cmd)
+{
+ switch(cmd) {
+
+ case NAND_CTL_SETCLE:
+ moab_gpio_base->or |= MOAB_NAND_CLE;
+ break;
+ case NAND_CTL_CLRCLE:
+ moab_gpio_base->or &= ~MOAB_NAND_CLE;
+ break;
+ case NAND_CTL_SETALE:
+ moab_gpio_base->or |= MOAB_NAND_ALE;
+ break;
+ case NAND_CTL_CLRALE:
+ moab_gpio_base->or &= ~MOAB_NAND_ALE;
+ break;
+ case NAND_CTL_SETNCE:
+ moab_gpio_base->or &= ~MOAB_NAND_CE;
+ break;
+ case NAND_CTL_CLRNCE:
+ moab_gpio_base->or |= MOAB_NAND_CE;
+ break;
+ }
+}
+
+/*
+ * read device ready pin
+ */
+#include <linux/delay.h>
+static int moab_device_ready(struct mtd_info *mtd)
+{
+ udelay(1000);
+ return ((moab_gpio_base->ir & MOAB_NAND_BSY) != 0);
+}
+
+/*
+ * Main initialization routine
+ */
+static int __init moab_init (void)
+{
+ struct nand_chip *this;
+ const char *part_type = 0;
+ int mtd_parts_nb = 0;
+ struct mtd_partition *mtd_parts = 0;
+ int moab_fio_base;
+
+ /* Allocate memory for MTD device structure and private data */
+ printk("%s.%d\n", __FUNCTION__, __LINE__);
+ moab_mtd = kmalloc(sizeof(struct mtd_info) +
+ sizeof(struct nand_chip),
+ GFP_KERNEL);
+ if (!moab_mtd) {
+ printk("Unable to allocate MOAB NAND MTD device structure.\n");
+ return -ENOMEM;
+ }
+
+ /* map physical adresses */
+ printk("%s.%d\n", __FUNCTION__, __LINE__);
+ moab_dev_base = (unsigned long)ioremap(MOAB_NAND_PHYS_BASE, 1024);
+ printk("NAND - %x at %x\n", MOAB_NAND_PHYS_BASE, moab_dev_base);
+ if(!moab_dev_base) {
+ printk("ioremap MOAB NAND flash failed\n");
+ kfree(moab_mtd);
+ return -EIO;
+ }
+ /* Why isn't the GPIO just mapped by the platform? */
+ moab_gpio_base = (gpio_t *)ioremap(GPIO0_BASE, 1024);
+ if(!moab_gpio_base) {
+ printk("ioremap MOAB GPIO failed\n");
+ iounmap((void *)moab_dev_base);
+ kfree(moab_mtd);
+ return -EIO;
+ }
+
+ /* Get pointer to private data */
+ this = (struct nand_chip *) (&moab_mtd[1]);
+
+ /* Initialize structures */
+ memset((char *) moab_mtd, 0, sizeof(struct mtd_info));
+ memset((char *) this, 0, sizeof(struct nand_chip));
+
+ /* Link the private data with the MTD structure */
+ moab_mtd->priv = this;
+
+ /* insert callbacks */
+ this->IO_ADDR_R = moab_dev_base;
+ this->IO_ADDR_W = moab_dev_base;
+ this->hwcontrol = moab_hwcontrol;
+ this->dev_ready = moab_device_ready;
+ /* 15 us command delay time */
+ this->chip_delay = 15;
+ this->eccmode = NAND_ECC_SOFT;
+ /* Set internal data buffer */
+ this->data_buf = data_buf;
+ this->oob_buf = oob_buf;
+
+ /* Scan to find existence of the device */
+ if (nand_scan (moab_mtd, 1)) {
+ iounmap((void *)moab_dev_base);
+ iounmap((void *)moab_gpio_base);
+ kfree (moab_mtd);
+ return -ENXIO;
+ }
+
+ mtd_parts_nb = parse_mtd_partitions(moab_mtd, probes, &mtd_parts, 0);
+ if (mtd_parts_nb < 0)
+ return mtd_parts_nb;
+
+ /* Register the partitions */
+ add_mtd_partitions(moab_mtd, mtd_parts, mtd_parts_nb);
+
+ /* Return happy */
+ return 0;
+}
+module_init(moab_init);
+
+/*
+ * Clean up routine
+ */
+static void __exit moab_cleanup (void)
+{
+ struct nand_chip *this = (struct nand_chip *) &moab_mtd[1];
+
+ /* Unregister the device */
+ del_mtd_device (moab_mtd);
+
+ /* Free internal data buffer */
+ kfree (this->data_buf);
+
+ /* Free the MTD device structure */
+ kfree (moab_mtd);
+}
+module_exit(moab_cleanup);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Gary Thomas <linux at mlbassoc.com>");
+MODULE_DESCRIPTION("MTD map driver for TAMS MOAB board");
More information about the linux-mtd
mailing list