1/* 2 * $Id: redwood.c,v 1.1.1.1 2007/08/03 18:52:44 Exp $ 3 * 4 * drivers/mtd/maps/redwood.c 5 * 6 * FLASH map for the IBM Redwood 4/5/6 boards. 7 * 8 * Author: MontaVista Software, Inc. <source@mvista.com> 9 * 10 * 2001-2003 (c) MontaVista, Software, Inc. This file is licensed under 11 * the terms of the GNU General Public License version 2. This program 12 * is licensed "as is" without any warranty of any kind, whether express 13 * or implied. 14 */ 15 16#include <linux/module.h> 17#include <linux/types.h> 18#include <linux/kernel.h> 19#include <linux/init.h> 20 21#include <linux/mtd/mtd.h> 22#include <linux/mtd/map.h> 23#include <linux/mtd/partitions.h> 24 25#include <asm/io.h> 26 27#if !defined(CONFIG_REDWOOD_6) 28 29#define WINDOW_ADDR 0xffc00000 30#define WINDOW_SIZE 0x00400000 31 32#define RW_PART0_OF 0 33#define RW_PART0_SZ 0x10000 34#define RW_PART1_OF RW_PART0_SZ 35#define RW_PART1_SZ 0x200000 - 0x10000 36#define RW_PART2_OF 0x200000 37#define RW_PART2_SZ 0x10000 38#define RW_PART3_OF 0x210000 39#define RW_PART3_SZ 0x200000 - (0x10000 + 0x20000) 40#define RW_PART4_OF 0x3e0000 41#define RW_PART4_SZ 0x20000 42 43static struct mtd_partition redwood_flash_partitions[] = { 44 { 45 .name = "Redwood OpenBIOS Vital Product Data", 46 .offset = RW_PART0_OF, 47 .size = RW_PART0_SZ, 48 .mask_flags = MTD_WRITEABLE /* force read-only */ 49 }, 50 { 51 .name = "Redwood kernel", 52 .offset = RW_PART1_OF, 53 .size = RW_PART1_SZ 54 }, 55 { 56 .name = "Redwood OpenBIOS non-volatile storage", 57 .offset = RW_PART2_OF, 58 .size = RW_PART2_SZ, 59 .mask_flags = MTD_WRITEABLE /* force read-only */ 60 }, 61 { 62 .name = "Redwood filesystem", 63 .offset = RW_PART3_OF, 64 .size = RW_PART3_SZ 65 }, 66 { 67 .name = "Redwood OpenBIOS", 68 .offset = RW_PART4_OF, 69 .size = RW_PART4_SZ, 70 .mask_flags = MTD_WRITEABLE /* force read-only */ 71 } 72}; 73 74#else /* CONFIG_REDWOOD_6 */ 75#define WINDOW_ADDR 0xff800000 76#define WINDOW_SIZE 0x00800000 77 78#define RW_PART0_OF 0 79#define RW_PART0_SZ 0x400000 /* 4 MiB data */ 80#define RW_PART1_OF RW_PART0_OF + RW_PART0_SZ 81#define RW_PART1_SZ 0x10000 /* 64K VPD */ 82#define RW_PART2_OF RW_PART1_OF + RW_PART1_SZ 83#define RW_PART2_SZ 0x400000 - (0x10000 + 0x20000) 84#define RW_PART3_OF RW_PART2_OF + RW_PART2_SZ 85#define RW_PART3_SZ 0x20000 86 87static struct mtd_partition redwood_flash_partitions[] = { 88 { 89 .name = "Redwood filesystem", 90 .offset = RW_PART0_OF, 91 .size = RW_PART0_SZ 92 }, 93 { 94 .name = "Redwood OpenBIOS Vital Product Data", 95 .offset = RW_PART1_OF, 96 .size = RW_PART1_SZ, 97 .mask_flags = MTD_WRITEABLE /* force read-only */ 98 }, 99 { 100 .name = "Redwood kernel", 101 .offset = RW_PART2_OF, 102 .size = RW_PART2_SZ 103 }, 104 { 105 .name = "Redwood OpenBIOS", 106 .offset = RW_PART3_OF, 107 .size = RW_PART3_SZ, 108 .mask_flags = MTD_WRITEABLE /* force read-only */ 109 } 110}; 111 112#endif /* CONFIG_REDWOOD_6 */ 113 114struct map_info redwood_flash_map = { 115 .name = "IBM Redwood", 116 .size = WINDOW_SIZE, 117 .bankwidth = 2, 118 .phys = WINDOW_ADDR, 119}; 120 121 122#define NUM_REDWOOD_FLASH_PARTITIONS ARRAY_SIZE(redwood_flash_partitions) 123 124static struct mtd_info *redwood_mtd; 125 126int __init init_redwood_flash(void) 127{ 128 int err; 129 130 printk(KERN_NOTICE "redwood: flash mapping: %x at %x\n", 131 WINDOW_SIZE, WINDOW_ADDR); 132 133 redwood_flash_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); 134 135 if (!redwood_flash_map.virt) { 136 printk("init_redwood_flash: failed to ioremap\n"); 137 return -EIO; 138 } 139 simple_map_init(&redwood_flash_map); 140 141 redwood_mtd = do_map_probe("cfi_probe",&redwood_flash_map); 142 143 if (redwood_mtd) { 144 redwood_mtd->owner = THIS_MODULE; 145 err = add_mtd_partitions(redwood_mtd, 146 redwood_flash_partitions, 147 NUM_REDWOOD_FLASH_PARTITIONS); 148 if (err) { 149 printk("init_redwood_flash: add_mtd_partitions failed\n"); 150 iounmap(redwood_flash_map.virt); 151 } 152 return err; 153 154 } 155 156 iounmap(redwood_flash_map.virt); 157 return -ENXIO; 158} 159 160static void __exit cleanup_redwood_flash(void) 161{ 162 if (redwood_mtd) { 163 del_mtd_partitions(redwood_mtd); 164 /* moved iounmap after map_destroy - armin */ 165 map_destroy(redwood_mtd); 166 iounmap((void *)redwood_flash_map.virt); 167 } 168} 169 170module_init(init_redwood_flash); 171module_exit(cleanup_redwood_flash); 172 173MODULE_LICENSE("GPL"); 174MODULE_AUTHOR("MontaVista Software <source@mvista.com>"); 175MODULE_DESCRIPTION("MTD map driver for the IBM Redwood reference boards"); 176