Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.17-rc3 151 lines 3.4 kB view raw
1/* 2 * Mapping for Ocotea user flash 3 * 4 * Matt Porter <mporter@kernel.crashing.org> 5 * 6 * Copyright 2002-2004 MontaVista Software Inc. 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 */ 13 14#include <linux/module.h> 15#include <linux/types.h> 16#include <linux/kernel.h> 17#include <linux/init.h> 18#include <linux/mtd/mtd.h> 19#include <linux/mtd/map.h> 20#include <linux/mtd/partitions.h> 21#include <linux/config.h> 22#include <asm/io.h> 23#include <asm/ibm44x.h> 24#include <platforms/4xx/ocotea.h> 25 26static struct mtd_info *flash; 27 28static struct map_info ocotea_small_map = { 29 .name = "Ocotea small flash", 30 .size = OCOTEA_SMALL_FLASH_SIZE, 31 .buswidth = 1, 32}; 33 34static struct map_info ocotea_large_map = { 35 .name = "Ocotea large flash", 36 .size = OCOTEA_LARGE_FLASH_SIZE, 37 .buswidth = 1, 38}; 39 40static struct mtd_partition ocotea_small_partitions[] = { 41 { 42 .name = "pibs", 43 .offset = 0x0, 44 .size = 0x100000, 45 } 46}; 47 48static struct mtd_partition ocotea_large_partitions[] = { 49 { 50 .name = "fs", 51 .offset = 0, 52 .size = 0x300000, 53 }, 54 { 55 .name = "firmware", 56 .offset = 0x300000, 57 .size = 0x100000, 58 } 59}; 60 61int __init init_ocotea(void) 62{ 63 u8 fpga0_reg; 64 u8 *fpga0_adr; 65 unsigned long long small_flash_base, large_flash_base; 66 67 fpga0_adr = ioremap64(OCOTEA_FPGA_ADDR, 16); 68 if (!fpga0_adr) 69 return -ENOMEM; 70 71 fpga0_reg = readb((unsigned long)fpga0_adr); 72 iounmap(fpga0_adr); 73 74 if (OCOTEA_BOOT_LARGE_FLASH(fpga0_reg)) { 75 small_flash_base = OCOTEA_SMALL_FLASH_HIGH; 76 large_flash_base = OCOTEA_LARGE_FLASH_LOW; 77 } 78 else { 79 small_flash_base = OCOTEA_SMALL_FLASH_LOW; 80 large_flash_base = OCOTEA_LARGE_FLASH_HIGH; 81 } 82 83 ocotea_small_map.phys = small_flash_base; 84 ocotea_small_map.virt = ioremap64(small_flash_base, 85 ocotea_small_map.size); 86 87 if (!ocotea_small_map.virt) { 88 printk("Failed to ioremap flash\n"); 89 return -EIO; 90 } 91 92 simple_map_init(&ocotea_small_map); 93 94 flash = do_map_probe("map_rom", &ocotea_small_map); 95 if (flash) { 96 flash->owner = THIS_MODULE; 97 add_mtd_partitions(flash, ocotea_small_partitions, 98 ARRAY_SIZE(ocotea_small_partitions)); 99 } else { 100 printk("map probe failed for flash\n"); 101 return -ENXIO; 102 } 103 104 ocotea_large_map.phys = large_flash_base; 105 ocotea_large_map.virt = ioremap64(large_flash_base, 106 ocotea_large_map.size); 107 108 if (!ocotea_large_map.virt) { 109 printk("Failed to ioremap flash\n"); 110 return -EIO; 111 } 112 113 simple_map_init(&ocotea_large_map); 114 115 flash = do_map_probe("cfi_probe", &ocotea_large_map); 116 if (flash) { 117 flash->owner = THIS_MODULE; 118 add_mtd_partitions(flash, ocotea_large_partitions, 119 ARRAY_SIZE(ocotea_large_partitions)); 120 } else { 121 printk("map probe failed for flash\n"); 122 return -ENXIO; 123 } 124 125 return 0; 126} 127 128static void __exit cleanup_ocotea(void) 129{ 130 if (flash) { 131 del_mtd_partitions(flash); 132 map_destroy(flash); 133 } 134 135 if (ocotea_small_map.virt) { 136 iounmap((void *)ocotea_small_map.virt); 137 ocotea_small_map.virt = 0; 138 } 139 140 if (ocotea_large_map.virt) { 141 iounmap((void *)ocotea_large_map.virt); 142 ocotea_large_map.virt = 0; 143 } 144} 145 146module_init(init_ocotea); 147module_exit(cleanup_ocotea); 148 149MODULE_LICENSE("GPL"); 150MODULE_AUTHOR("Matt Porter <mporter@kernel.crashing.org>"); 151MODULE_DESCRIPTION("MTD map and partitions for IBM 440GX Ocotea boards");