/* * $Id: redwood.c,v 1.10 2004/11/04 13:24:15 gleixner Exp $ * * drivers/mtd/maps/redwood.c * * FLASH map for the IBM Redwood 4/5/6 boards. * * Author: MontaVista Software, Inc. <source@mvista.com> * * 2001-2003 (c) MontaVista, Software, Inc. This file is licensed under * the terms of the GNU General Public License version 2. This program * is licensed "as is" without any warranty of any kind, whether express * or implied. */ #include <linux/config.h> #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> #if !defined (CONFIG_REDWOOD_6) #define WINDOW_ADDR 0xffc00000 #define WINDOW_SIZE 0x00400000 #define RW_PART0_OF 0 #define RW_PART0_SZ 0x10000 #define RW_PART1_OF RW_PART0_SZ #define RW_PART1_SZ 0x200000 - 0x10000 #define RW_PART2_OF 0x200000 #define RW_PART2_SZ 0x10000 #define RW_PART3_OF 0x210000 #define RW_PART3_SZ 0x200000 - (0x10000 + 0x20000) #define RW_PART4_OF 0x3e0000 #define RW_PART4_SZ 0x20000 static struct mtd_partition redwood_flash_partitions[] = { { .name = "Redwood OpenBIOS Vital Product Data", .offset = RW_PART0_OF, .size = RW_PART0_SZ, .mask_flags = MTD_WRITEABLE /* force read-only */ }, { .name = "Redwood kernel", .offset = RW_PART1_OF, .size = RW_PART1_SZ }, { .name = "Redwood OpenBIOS non-volatile storage", .offset = RW_PART2_OF, .size = RW_PART2_SZ, .mask_flags = MTD_WRITEABLE /* force read-only */ }, { .name = "Redwood filesystem", .offset = RW_PART3_OF, .size = RW_PART3_SZ }, { .name = "Redwood OpenBIOS", .offset = RW_PART4_OF, .size = RW_PART4_SZ, .mask_flags = MTD_WRITEABLE /* force read-only */ } }; #else /* CONFIG_REDWOOD_6 */ /* FIXME: the window is bigger - armin */ #define WINDOW_ADDR 0xff800000 #define WINDOW_SIZE 0x00800000 #define RW_PART0_OF 0 #define RW_PART0_SZ 0x400000 /* 4 MiB data */ #define RW_PART1_OF RW_PART0_OF + RW_PART0_SZ #define RW_PART1_SZ 0x10000 /* 64K VPD */ #define RW_PART2_OF RW_PART1_OF + RW_PART1_SZ #define RW_PART2_SZ 0x400000 - (0x10000 + 0x20000) #define RW_PART3_OF RW_PART2_OF + RW_PART2_SZ #define RW_PART3_SZ 0x20000 static struct mtd_partition redwood_flash_partitions[] = { { .name = "Redwood filesystem", .offset = RW_PART0_OF, .size = RW_PART0_SZ }, { .name = "Redwood OpenBIOS Vital Product Data", .offset = RW_PART1_OF, .size = RW_PART1_SZ, .mask_flags = MTD_WRITEABLE /* force read-only */ }, { .name = "Redwood kernel", .offset = RW_PART2_OF, .size = RW_PART2_SZ }, { .name = "Redwood OpenBIOS", .offset = RW_PART3_OF, .size = RW_PART3_SZ, .mask_flags = MTD_WRITEABLE /* force read-only */ } }; #endif /* CONFIG_REDWOOD_6 */ struct map_info redwood_flash_map = { .name = "IBM Redwood", .size = WINDOW_SIZE, .bankwidth = 2, .phys = WINDOW_ADDR, }; #define NUM_REDWOOD_FLASH_PARTITIONS \ (sizeof(redwood_flash_partitions)/sizeof(redwood_flash_partitions[0])) static struct mtd_info *redwood_mtd; int __init init_redwood_flash(void) { printk(KERN_NOTICE "redwood: flash mapping: %x at %x\n", WINDOW_SIZE, WINDOW_ADDR); redwood_flash_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); if (!redwood_flash_map.virt) { printk("init_redwood_flash: failed to ioremap\n"); return -EIO; } simple_map_init(&redwood_flash_map); redwood_mtd = do_map_probe("cfi_probe",&redwood_flash_map); if (redwood_mtd) { redwood_mtd->owner = THIS_MODULE; return add_mtd_partitions(redwood_mtd, redwood_flash_partitions, NUM_REDWOOD_FLASH_PARTITIONS); } return -ENXIO; } static void __exit cleanup_redwood_flash(void) { if (redwood_mtd) { del_mtd_partitions(redwood_mtd); /* moved iounmap after map_destroy - armin */ map_destroy(redwood_mtd); iounmap((void *)redwood_flash_map.virt); } } module_init(init_redwood_flash); module_exit(cleanup_redwood_flash); MODULE_LICENSE("GPL"); MODULE_AUTHOR("MontaVista Software <source@mvista.com>"); MODULE_DESCRIPTION("MTD map driver for the IBM Redwood reference boards");