1/* 2 * $Id: dbox2-flash.c,v 1.1.1.1 2007/08/03 18:52:43 Exp $ 3 * 4 * D-Box 2 flash driver 5 */ 6 7#include <linux/module.h> 8#include <linux/types.h> 9#include <linux/kernel.h> 10#include <linux/init.h> 11#include <asm/io.h> 12#include <linux/mtd/mtd.h> 13#include <linux/mtd/map.h> 14#include <linux/mtd/partitions.h> 15#include <linux/errno.h> 16 17/* partition_info gives details on the logical partitions that the split the 18 * single flash device into. If the size if zero we use up to the end of the 19 * device. */ 20static struct mtd_partition partition_info[]= { 21 { 22 .name = "BR bootloader", 23 .size = 128 * 1024, 24 .offset = 0, 25 .mask_flags = MTD_WRITEABLE 26 }, 27 { 28 .name = "FLFS (U-Boot)", 29 .size = 128 * 1024, 30 .offset = MTDPART_OFS_APPEND, 31 .mask_flags = 0 32 }, 33 { 34 .name = "Root (SquashFS)", 35 .size = 7040 * 1024, 36 .offset = MTDPART_OFS_APPEND, 37 .mask_flags = 0 38 }, 39 { 40 .name = "var (JFFS2)", 41 .size = 896 * 1024, 42 .offset = MTDPART_OFS_APPEND, 43 .mask_flags = 0 44 }, 45 { 46 .name = "Flash without bootloader", 47 .size = MTDPART_SIZ_FULL, 48 .offset = 128 * 1024, 49 .mask_flags = 0 50 }, 51 { 52 .name = "Complete Flash", 53 .size = MTDPART_SIZ_FULL, 54 .offset = 0, 55 .mask_flags = MTD_WRITEABLE 56 } 57}; 58 59#define NUM_PARTITIONS ARRAY_SIZE(partition_info) 60 61#define WINDOW_ADDR 0x10000000 62#define WINDOW_SIZE 0x800000 63 64static struct mtd_info *mymtd; 65 66 67struct map_info dbox2_flash_map = { 68 .name = "D-Box 2 flash memory", 69 .size = WINDOW_SIZE, 70 .bankwidth = 4, 71 .phys = WINDOW_ADDR, 72}; 73 74int __init init_dbox2_flash(void) 75{ 76 printk(KERN_NOTICE "D-Box 2 flash driver (size->0x%X mem->0x%X)\n", WINDOW_SIZE, WINDOW_ADDR); 77 dbox2_flash_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); 78 79 if (!dbox2_flash_map.virt) { 80 printk("Failed to ioremap\n"); 81 return -EIO; 82 } 83 simple_map_init(&dbox2_flash_map); 84 85 // Probe for dual Intel 28F320 or dual AMD 86 mymtd = do_map_probe("cfi_probe", &dbox2_flash_map); 87 if (!mymtd) { 88 // Probe for single Intel 28F640 89 dbox2_flash_map.bankwidth = 2; 90 91 mymtd = do_map_probe("cfi_probe", &dbox2_flash_map); 92 } 93 94 if (mymtd) { 95 mymtd->owner = THIS_MODULE; 96 97 /* Create MTD devices for each partition. */ 98 add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS); 99 100 return 0; 101 } 102 103 iounmap((void *)dbox2_flash_map.virt); 104 return -ENXIO; 105} 106 107static void __exit cleanup_dbox2_flash(void) 108{ 109 if (mymtd) { 110 del_mtd_partitions(mymtd); 111 map_destroy(mymtd); 112 } 113 if (dbox2_flash_map.virt) { 114 iounmap((void *)dbox2_flash_map.virt); 115 dbox2_flash_map.virt = 0; 116 } 117} 118 119module_init(init_dbox2_flash); 120module_exit(cleanup_dbox2_flash); 121 122 123MODULE_LICENSE("GPL"); 124MODULE_AUTHOR("K��ri Dav����sson <kd@flaga.is>, Bastian Blank <waldi@tuxbox.org>, Alexander Wild <wild@te-elektronik.com>"); 125MODULE_DESCRIPTION("MTD map driver for D-Box 2 board"); 126