Arctic-2 MTD driver
David Gibson
david at gibson.dropbear.id.au
Mon Dec 16 13:09:22 EST 2002
Having committed the core support code for the Arctic-2, here come
some drivers for it. Below is an MTD map for the Arctic-2, derived
from beech-mtd.c. Essentially all it does is provide suitable
hardwired partitions.
Again, any comments before I commit this?
diff -urN /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/Config.in linux-bartholomew/drivers/mtd/maps/Config.in
--- /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/Config.in 2002-09-13 16:01:34.000000000 +1000
+++ linux-bartholomew/drivers/mtd/maps/Config.in 2002-12-12 15:28:27.000000000 +1100
@@ -57,6 +57,9 @@
if [ "$CONFIG_BEECH" = "y" ]; then
dep_tristate ' CFI Flash device mapped on IBM Beech' CONFIG_MTD_BEECH $CONFIG_MTD_CFI
fi
+ if [ "$CONFIG_ARCTIC2" = "y" ]; then
+ dep_tristate ' CFI Flash device mapped on IBM Arctic' CONFIG_MTD_ARCTIC $CONFIG_MTD_CFI
+ fi
dep_tristate ' CFI Flash device mapped on D-Box2' CONFIG_MTD_DBOX2 $CONFIG_MTD_CFI
dep_tristate ' CFI Flash device mapping on FlagaDM' CONFIG_MTD_CFI_FLAGADM $CONFIG_MTD_CFI
fi
diff -urN /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/Makefile linux-bartholomew/drivers/mtd/maps/Makefile
--- /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/Makefile 2002-09-13 16:08:05.000000000 +1000
+++ linux-bartholomew/drivers/mtd/maps/Makefile 2002-12-12 15:28:08.000000000 +1100
@@ -44,5 +44,6 @@
obj-$(CONFIG_MTD_MOT_MVP) += mot-mvp.o
obj-$(CONFIG_MTD_EBONY) += ebony.o
obj-$(CONFIG_MTD_BEECH) += beech-mtd.o
+obj-$(CONFIG_MTD_ARCTIC) += arctic-mtd.o
include $(TOPDIR)/Rules.make
diff -urN /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/arctic-mtd.c linux-bartholomew/drivers/mtd/maps/arctic-mtd.c
--- /home/dgibson/kernel/linuxppc_2_4_devel/drivers/mtd/maps/arctic-mtd.c Thu Jan 01 10:00:00 1970
+++ linux-bartholomew/drivers/mtd/maps/arctic-mtd.c Mon Dec 16 13:08:02 2002
@@ -0,0 +1,168 @@
+/*
+ * drivers/mtd/maps/arctic-mtd.c MTD mappings and partition tables for
+ * IBM 405LP Arctic boards.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2002, International Business Machines Corporation
+ * All Rights Reserved.
+ *
+ * Bishop Brock
+ * IBM Research, Austin Center for Low-Power Computing
+ * bcbrock at us.ibm.com
+ * March 2002
+ *
+ * modified for Arctic by,
+ * David Gibson
+ * IBM OzLabs, Canberra, Australia
+ * <arctic at gibson.dropbear.id.au>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/io.h>
+#include <asm/ibm4xx.h>
+
+#define ARCTIC_FFS_SIZE 0x1a00000 /* 26 M */
+
+#define NAME "Arctic Linux Flash"
+#define PADDR SUBZERO_BOOTFLASH_PADDR
+#define SIZE SUBZERO_BOOTFLASH_SIZE
+#define BUSWIDTH 2
+
+/* Flash memories on these boards are memory resources, accessed big-endian. */
+
+static u8
+arctic_mtd_read8(struct map_info *map, unsigned long offset)
+{
+ return __raw_readb(map->map_priv_1 + offset);
+}
+
+static u16
+arctic_mtd_read16(struct map_info *map, unsigned long offset)
+{
+ return __raw_readw(map->map_priv_1 + offset);
+}
+
+static u32
+arctic_mtd_read32(struct map_info *map, unsigned long offset)
+{
+ return __raw_readl(map->map_priv_1 + offset);
+}
+
+static void
+arctic_mtd_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
+{
+ memcpy_fromio(to, (void *) (map->map_priv_1 + from), len);
+}
+
+static void
+arctic_mtd_write8(struct map_info *map, u8 data, unsigned long address)
+{
+ __raw_writeb(data, map->map_priv_1 + address);
+ mb();
+}
+
+static void
+arctic_mtd_write16(struct map_info *map, u16 data, unsigned long address)
+{
+ __raw_writew(data, map->map_priv_1 + address);
+ mb();
+}
+
+static void
+arctic_mtd_write32(struct map_info *map, u32 data, unsigned long address)
+{
+ __raw_writel(data, map->map_priv_1 + address);
+ mb();
+}
+
+static void
+arctic_mtd_copy_to(struct map_info *map,
+ unsigned long to, const void *from, ssize_t len)
+{
+ memcpy_toio((void *) (map->map_priv_1 + to), from, len);
+}
+
+static struct map_info arctic_mtd_map = {
+ .name = NAME,
+ .size = SIZE,
+ .buswidth = BUSWIDTH,
+ .read8 = arctic_mtd_read8,
+ .read16 = arctic_mtd_read16,
+ .read32 = arctic_mtd_read32,
+ .copy_from = arctic_mtd_copy_from,
+ .write8 = arctic_mtd_write8,
+ .write16 = arctic_mtd_write16,
+ .write32 = arctic_mtd_write32,
+ .copy_to = arctic_mtd_copy_to,
+};
+
+static struct mtd_info *arctic_mtd;
+
+static struct mtd_partition arctic_partitions[2] = {
+ { .name = "Arctic FFS",
+ .size = ARCTIC_FFS_SIZE,
+ .offset = 0,},
+ { .name = "Kernel & firmware",
+ .size = (SUBZERO_BOOTFLASH_SIZE - ARCTIC_FFS_SIZE),
+ .offset = ARCTIC_FFS_SIZE,},
+};
+
+static int __init
+init_arctic_mtd(void)
+{
+ printk("%s: 0x%08x at 0x%08x\n", NAME, SIZE, PADDR);
+
+ arctic_mtd_map.map_priv_1 = (unsigned long) ioremap(PADDR, SIZE);
+
+ if (!arctic_mtd_map.map_priv_1) {
+ printk("%s: failed to ioremap 0x%x\n", NAME, PADDR);
+ return -EIO;
+ }
+
+ printk("%s: probing %d-bit flash bus\n", NAME, BUSWIDTH * 8);
+ arctic_mtd = do_map_probe("cfi_probe", &arctic_mtd_map);
+
+ if (!arctic_mtd)
+ return -ENXIO;
+
+ arctic_mtd->module = THIS_MODULE;
+
+ return add_mtd_partitions(arctic_mtd, arctic_partitions, 2);
+}
+
+static void __exit
+cleanup_arctic_mtd(void)
+{
+ if (arctic_mtd) {
+ del_mtd_partitions(arctic_mtd);
+ map_destroy(arctic_mtd);
+ iounmap((void *) arctic_mtd_map.map_priv_1);
+ }
+}
+
+module_init(init_arctic_mtd);
+module_exit(cleanup_arctic_mtd);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("David Gibson <arctic at gibson.dropbear.id.au>");
+MODULE_DESCRIPTION("MTD map and partitions for IBM 405LP Arctic boards");
--
David Gibson | For every complex problem there is a
david at gibson.dropbear.id.au | solution which is simple, neat and
| wrong.
http://www.ozlabs.org/people/dgibson
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list