2 * Flash on Cirrus CDB89712
4 * $Id: cdb89712.c,v 1.3 2001/10/02 15:14:43 rmk Exp $
7 #include <linux/module.h>
8 #include <linux/types.h>
9 #include <linux/kernel.h>
10 #include <linux/ioport.h>
12 #include <asm/arch/hardware.h>
13 #include <linux/mtd/mtd.h>
14 #include <linux/mtd/map.h>
15 #include <linux/mtd/partitions.h>
19 __u8 cdb89712_read8(struct map_info *map, unsigned long ofs)
21 return __raw_readb(map->map_priv_1 + ofs);
24 __u16 cdb89712_read16(struct map_info *map, unsigned long ofs)
26 return __raw_readw(map->map_priv_1 + ofs);
29 __u32 cdb89712_read32(struct map_info *map, unsigned long ofs)
31 return __raw_readl(map->map_priv_1 + ofs);
34 void cdb89712_write8(struct map_info *map, __u8 d, unsigned long adr)
36 __raw_writeb(d, map->map_priv_1 + adr);
40 void cdb89712_write16(struct map_info *map, __u16 d, unsigned long adr)
42 __raw_writew(d, map->map_priv_1 + adr);
46 void cdb89712_write32(struct map_info *map, __u32 d, unsigned long adr)
48 __raw_writel(d, map->map_priv_1 + adr);
52 void cdb89712_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
54 // printk ("cdb89712_copy_from: 0x%x@0x%x -> 0x%x\n", len, from, to);
55 memcpy_fromio(to, map->map_priv_1 + from, len);
58 void cdb89712_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
61 __raw_writeb(*(unsigned char *) from, map->map_priv_1 + to);
69 static struct mtd_info *flash_mtd;
71 struct map_info cdb89712_flash_map = {
74 buswidth: FLASH_WIDTH,
75 read8: cdb89712_read8,
76 read16: cdb89712_read16,
77 read32: cdb89712_read32,
78 copy_from: cdb89712_copy_from,
79 write8: cdb89712_write8,
80 write16: cdb89712_write16,
81 write32: cdb89712_write32,
82 copy_to: cdb89712_copy_to
85 struct resource cdb89712_flash_resource = {
88 end: FLASH_START + FLASH_SIZE - 1,
89 flags: IORESOURCE_IO | IORESOURCE_BUSY,
92 static int __init init_cdb89712_flash (void)
96 if (request_resource (&ioport_resource, &cdb89712_flash_resource)) {
97 printk(KERN_NOTICE "Failed to reserve Cdb89712 FLASH space\n");
102 cdb89712_flash_map.map_priv_1 = (unsigned long)ioremap(FLASH_START, FLASH_SIZE);
103 if (!cdb89712_flash_map.map_priv_1) {
104 printk(KERN_NOTICE "Failed to ioremap Cdb89712 FLASH space\n");
109 flash_mtd = do_map_probe("cfi_probe", &cdb89712_flash_map);
111 flash_mtd = do_map_probe("map_rom", &cdb89712_flash_map);
113 flash_mtd->erasesize = 0x10000;
116 printk("FLASH probe failed\n");
121 flash_mtd->module = THIS_MODULE;
123 if (add_mtd_device(flash_mtd)) {
124 printk("FLASH device addition failed\n");
132 map_destroy(flash_mtd);
135 iounmap((void *)cdb89712_flash_map.map_priv_1);
137 release_resource (&cdb89712_flash_resource);
146 static struct mtd_info *sram_mtd;
148 struct map_info cdb89712_sram_map = {
151 buswidth: SRAM_WIDTH,
152 read8: cdb89712_read8,
153 read16: cdb89712_read16,
154 read32: cdb89712_read32,
155 copy_from: cdb89712_copy_from,
156 write8: cdb89712_write8,
157 write16: cdb89712_write16,
158 write32: cdb89712_write32,
159 copy_to: cdb89712_copy_to
162 struct resource cdb89712_sram_resource = {
165 end: SRAM_START + SRAM_SIZE - 1,
166 flags: IORESOURCE_IO | IORESOURCE_BUSY,
169 static int __init init_cdb89712_sram (void)
173 if (request_resource (&ioport_resource, &cdb89712_sram_resource)) {
174 printk(KERN_NOTICE "Failed to reserve Cdb89712 SRAM space\n");
179 cdb89712_sram_map.map_priv_1 = (unsigned long)ioremap(SRAM_START, SRAM_SIZE);
180 if (!cdb89712_sram_map.map_priv_1) {
181 printk(KERN_NOTICE "Failed to ioremap Cdb89712 SRAM space\n");
186 sram_mtd = do_map_probe("map_ram", &cdb89712_sram_map);
188 printk("SRAM probe failed\n");
193 sram_mtd->module = THIS_MODULE;
194 sram_mtd->erasesize = 16;
196 if (add_mtd_device(sram_mtd)) {
197 printk("SRAM device addition failed\n");
205 map_destroy(sram_mtd);
208 iounmap((void *)cdb89712_sram_map.map_priv_1);
210 release_resource (&cdb89712_sram_resource);
221 static struct mtd_info *bootrom_mtd;
223 struct map_info cdb89712_bootrom_map = {
226 buswidth: BOOTROM_WIDTH,
227 read8: cdb89712_read8,
228 read16: cdb89712_read16,
229 read32: cdb89712_read32,
230 copy_from: cdb89712_copy_from,
233 struct resource cdb89712_bootrom_resource = {
235 start: BOOTROM_START,
236 end: BOOTROM_START + BOOTROM_SIZE - 1,
237 flags: IORESOURCE_IO | IORESOURCE_BUSY,
240 static int __init init_cdb89712_bootrom (void)
244 if (request_resource (&ioport_resource, &cdb89712_bootrom_resource)) {
245 printk(KERN_NOTICE "Failed to reserve Cdb89712 BOOTROM space\n");
250 cdb89712_bootrom_map.map_priv_1 = (unsigned long)ioremap(BOOTROM_START, BOOTROM_SIZE);
251 if (!cdb89712_bootrom_map.map_priv_1) {
252 printk(KERN_NOTICE "Failed to ioremap Cdb89712 BootROM space\n");
257 bootrom_mtd = do_map_probe("map_rom", &cdb89712_bootrom_map);
259 printk("BootROM probe failed\n");
264 bootrom_mtd->module = THIS_MODULE;
265 bootrom_mtd->erasesize = 0x10000;
267 if (add_mtd_device(bootrom_mtd)) {
268 printk("BootROM device addition failed\n");
276 map_destroy(bootrom_mtd);
279 iounmap((void *)cdb89712_bootrom_map.map_priv_1);
281 release_resource (&cdb89712_bootrom_resource);
290 static int __init init_cdb89712_maps(void)
293 printk(KERN_INFO "Cirrus CDB89712 MTD mappings:\n Flash 0x%x at 0x%x\n SRAM 0x%x at 0x%x\n BootROM 0x%x at 0x%x\n",
294 FLASH_SIZE, FLASH_START, SRAM_SIZE, SRAM_START, BOOTROM_SIZE, BOOTROM_START);
296 init_cdb89712_flash();
297 init_cdb89712_sram();
298 init_cdb89712_bootrom();
304 static void __exit cleanup_cdb89712_maps(void)
307 del_mtd_device(sram_mtd);
308 map_destroy(sram_mtd);
309 iounmap((void *)cdb89712_sram_map.map_priv_1);
310 release_resource (&cdb89712_sram_resource);
314 del_mtd_device(flash_mtd);
315 map_destroy(flash_mtd);
316 iounmap((void *)cdb89712_flash_map.map_priv_1);
317 release_resource (&cdb89712_flash_resource);
321 del_mtd_device(bootrom_mtd);
322 map_destroy(bootrom_mtd);
323 iounmap((void *)cdb89712_bootrom_map.map_priv_1);
324 release_resource (&cdb89712_bootrom_resource);
328 module_init(init_cdb89712_maps);
329 module_exit(cleanup_cdb89712_maps);
331 MODULE_AUTHOR("Ray L");
332 MODULE_DESCRIPTION("ARM CDB89712 map driver");
333 MODULE_LICENSE("GPL");