1/* 2 * Flash device on Lasat 100 and 200 boards 3 * 4 * (C) 2002 Brian Murphy <brian@murphy.dk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License version 8 * 2 as published by the Free Software Foundation. 9 * 10 * $Id: lasat.c,v 1.1.1.1 2007/08/03 18:52:43 Exp $ 11 * 12 */ 13 14#include <linux/module.h> 15#include <linux/types.h> 16#include <linux/kernel.h> 17#include <linux/init.h> 18#include <asm/io.h> 19#include <linux/mtd/mtd.h> 20#include <linux/mtd/map.h> 21#include <linux/mtd/partitions.h> 22#include <asm/lasat/lasat.h> 23 24static struct mtd_info *lasat_mtd; 25 26static struct mtd_partition partition_info[LASAT_MTD_LAST]; 27static char *lasat_mtd_partnames[] = {"Bootloader", "Service", "Normal", "Filesystem", "Config"}; 28 29static void lasat_set_vpp(struct map_info *map, int vpp) 30{ 31 if (vpp) 32 *lasat_misc->flash_wp_reg |= 1 << lasat_misc->flash_wp_bit; 33 else 34 *lasat_misc->flash_wp_reg &= ~(1 << lasat_misc->flash_wp_bit); 35} 36 37static struct map_info lasat_map = { 38 .name = "LASAT flash", 39 .bankwidth = 4, 40 .set_vpp = lasat_set_vpp 41}; 42 43static int __init init_lasat(void) 44{ 45 int i; 46 /* since we use AMD chips and set_vpp is not implimented 47 * for these (yet) we still have to permanently enable flash write */ 48 printk(KERN_NOTICE "Unprotecting flash\n"); 49 ENABLE_VPP((&lasat_map)); 50 51 lasat_map.phys = lasat_flash_partition_start(LASAT_MTD_BOOTLOADER); 52 lasat_map.virt = (unsigned long)ioremap_nocache( 53 lasat_map.phys, lasat_board_info.li_flash_size); 54 lasat_map.size = lasat_board_info.li_flash_size; 55 56 simple_map_init(&lasat_map); 57 58 for (i=0; i < LASAT_MTD_LAST; i++) 59 partition_info[i].name = lasat_mtd_partnames[i]; 60 61 lasat_mtd = do_map_probe("cfi_probe", &lasat_map); 62 63 if (!lasat_mtd) 64 lasat_mtd = do_map_probe("jedec_probe", &lasat_map); 65 66 if (lasat_mtd) { 67 u32 size, offset = 0; 68 69 lasat_mtd->owner = THIS_MODULE; 70 71 for (i=0; i < LASAT_MTD_LAST; i++) { 72 size = lasat_flash_partition_size(i); 73 partition_info[i].size = size; 74 partition_info[i].offset = offset; 75 offset += size; 76 } 77 78 add_mtd_partitions( lasat_mtd, partition_info, LASAT_MTD_LAST ); 79 return 0; 80 } 81 82 iounmap(lasat_map.virt); 83 return -ENXIO; 84} 85 86static void __exit cleanup_lasat(void) 87{ 88 if (lasat_mtd) { 89 del_mtd_partitions(lasat_mtd); 90 map_destroy(lasat_mtd); 91 } 92 if (lasat_map.virt) { 93 iounmap(lasat_map.virt); 94 lasat_map.virt = 0; 95 } 96} 97 98module_init(init_lasat); 99module_exit(cleanup_lasat); 100 101MODULE_LICENSE("GPL"); 102MODULE_AUTHOR("Brian Murphy <brian@murphy.dk>"); 103MODULE_DESCRIPTION("Lasat Safepipe/Masquerade MTD map driver"); 104