1 /* 2 * Handle mapping of the NOR flash on implementa A7 boards 3 * 4 * Copyright 2002 SYSGO Real-Time Solutions GmbH 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #include <linux/module.h> 12 #include <linux/types.h> 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <asm/io.h> 16 #include <linux/mtd/mtd.h> 17 #include <linux/mtd/map.h> 18 #include <linux/mtd/partitions.h> 19 20 #define WINDOW_ADDR0 0x00000000 /* physical properties of flash */ 21 #define WINDOW_SIZE0 0x00800000 22 #define WINDOW_ADDR1 0x10000000 /* physical properties of flash */ 23 #define WINDOW_SIZE1 0x00800000 24 #define NUM_FLASHBANKS 2 25 #define BUSWIDTH 4 26 27 #define MSG_PREFIX "impA7:" /* prefix for our printk()'s */ 28 #define MTDID "impa7-%d" /* for mtdparts= partitioning */ 29 30 static struct mtd_info *impa7_mtd[NUM_FLASHBANKS]; 31 32 static const char * const rom_probe_types[] = { "jedec_probe", NULL }; 33 34 static struct map_info impa7_map[NUM_FLASHBANKS] = { 35 { 36 .name = "impA7 NOR Flash Bank #0", 37 .size = WINDOW_SIZE0, 38 .bankwidth = BUSWIDTH, 39 }, 40 { 41 .name = "impA7 NOR Flash Bank #1", 42 .size = WINDOW_SIZE1, 43 .bankwidth = BUSWIDTH, 44 }, 45 }; 46 47 /* 48 * MTD partitioning stuff 49 */ 50 static struct mtd_partition partitions[] = 51 { 52 { 53 .name = "FileSystem", 54 .size = 0x800000, 55 .offset = 0x00000000 56 }, 57 }; 58 59 static int __init init_impa7(void) 60 { 61 const char * const *type; 62 int i; 63 static struct { u_long addr; u_long size; } pt[NUM_FLASHBANKS] = { 64 { WINDOW_ADDR0, WINDOW_SIZE0 }, 65 { WINDOW_ADDR1, WINDOW_SIZE1 }, 66 }; 67 int devicesfound = 0; 68 69 for(i=0; i<NUM_FLASHBANKS; i++) 70 { 71 printk(KERN_NOTICE MSG_PREFIX "probing 0x%08lx at 0x%08lx\n", 72 pt[i].size, pt[i].addr); 73 74 impa7_map[i].phys = pt[i].addr; 75 impa7_map[i].virt = ioremap(pt[i].addr, pt[i].size); 76 if (!impa7_map[i].virt) { 77 printk(MSG_PREFIX "failed to ioremap\n"); 78 return -EIO; 79 } 80 simple_map_init(&impa7_map[i]); 81 82 impa7_mtd[i] = NULL; 83 type = rom_probe_types; 84 for(; !impa7_mtd[i] && *type; type++) { 85 impa7_mtd[i] = do_map_probe(*type, &impa7_map[i]); 86 } 87 88 if (impa7_mtd[i]) { 89 impa7_mtd[i]->owner = THIS_MODULE; 90 devicesfound++; 91 mtd_device_parse_register(impa7_mtd[i], NULL, NULL, 92 partitions, 93 ARRAY_SIZE(partitions)); 94 } else { 95 iounmap((void __iomem *)impa7_map[i].virt); 96 } 97 } 98 return devicesfound == 0 ? -ENXIO : 0; 99 } 100 101 static void __exit cleanup_impa7(void) 102 { 103 int i; 104 for (i=0; i<NUM_FLASHBANKS; i++) { 105 if (impa7_mtd[i]) { 106 mtd_device_unregister(impa7_mtd[i]); 107 map_destroy(impa7_mtd[i]); 108 iounmap((void __iomem *)impa7_map[i].virt); 109 impa7_map[i].virt = NULL; 110 } 111 } 112 } 113 114 module_init(init_impa7); 115 module_exit(cleanup_impa7); 116 117 MODULE_LICENSE("GPL"); 118 MODULE_AUTHOR("Pavel Bartusek <pba@sysgo.de>"); 119 MODULE_DESCRIPTION("MTD map driver for implementa impA7"); 120