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.30-rc2 146 lines 3.8 kB view raw
1 2/* 3 * drivers/mtd/maps/dmv182.c 4 * 5 * Flash map driver for the Dy4 SVME182 board 6 * 7 * Copyright 2003-2004, TimeSys Corporation 8 * 9 * Based on the SVME181 flash map, by Tom Nelson, Dot4, Inc. for TimeSys Corp. 10 * 11 * This program is free software; you can redistribute it and/or modify it 12 * under the terms of the GNU General Public License as published by the 13 * Free Software Foundation; either version 2 of the License, or (at your 14 * option) any later version. 15 */ 16 17#include <linux/module.h> 18#include <linux/init.h> 19#include <linux/types.h> 20#include <linux/kernel.h> 21#include <asm/io.h> 22#include <linux/mtd/mtd.h> 23#include <linux/mtd/map.h> 24#include <linux/mtd/partitions.h> 25#include <linux/errno.h> 26 27/* 28 * This driver currently handles only the 16MiB user flash bank 1 on the 29 * board. It does not provide access to bank 0 (contains the Dy4 FFW), bank 2 30 * (VxWorks boot), or the optional 48MiB expansion flash. 31 * 32 * scott.wood@timesys.com: On the newer boards with 128MiB flash, it 33 * now supports the first 96MiB (the boot flash bank containing FFW 34 * is excluded). The VxWorks loader is in partition 1. 35 */ 36 37#define FLASH_BASE_ADDR 0xf0000000 38#define FLASH_BANK_SIZE (128*1024*1024) 39 40MODULE_AUTHOR("Scott Wood, TimeSys Corporation <scott.wood@timesys.com>"); 41MODULE_DESCRIPTION("User-programmable flash device on the Dy4 SVME182 board"); 42MODULE_LICENSE("GPL"); 43 44static struct map_info svme182_map = { 45 .name = "Dy4 SVME182", 46 .bankwidth = 32, 47 .size = 128 * 1024 * 1024 48}; 49 50#define BOOTIMAGE_PART_SIZE ((6*1024*1024)-RESERVED_PART_SIZE) 51 52// Allow 6MiB for the kernel 53#define NEW_BOOTIMAGE_PART_SIZE (6 * 1024 * 1024) 54// Allow 1MiB for the bootloader 55#define NEW_BOOTLOADER_PART_SIZE (1024 * 1024) 56// Use the remaining 9MiB at the end of flash for the RFS 57#define NEW_RFS_PART_SIZE (0x01000000 - NEW_BOOTLOADER_PART_SIZE - \ 58 NEW_BOOTIMAGE_PART_SIZE) 59 60static struct mtd_partition svme182_partitions[] = { 61 // The Lower PABS is only 128KiB, but the partition code doesn't 62 // like partitions that don't end on the largest erase block 63 // size of the device, even if all of the erase blocks in the 64 // partition are small ones. The hardware should prevent 65 // writes to the actual PABS areas. 66 { 67 name: "Lower PABS and CPU 0 bootloader or kernel", 68 size: 6*1024*1024, 69 offset: 0, 70 }, 71 { 72 name: "Root Filesystem", 73 size: 10*1024*1024, 74 offset: MTDPART_OFS_NXTBLK 75 }, 76 { 77 name: "CPU1 Bootloader", 78 size: 1024*1024, 79 offset: MTDPART_OFS_NXTBLK, 80 }, 81 { 82 name: "Extra", 83 size: 110*1024*1024, 84 offset: MTDPART_OFS_NXTBLK 85 }, 86 { 87 name: "Foundation Firmware and Upper PABS", 88 size: 1024*1024, 89 offset: MTDPART_OFS_NXTBLK, 90 mask_flags: MTD_WRITEABLE // read-only 91 } 92}; 93 94static struct mtd_info *this_mtd; 95 96static int __init init_svme182(void) 97{ 98 struct mtd_partition *partitions; 99 int num_parts = ARRAY_SIZE(svme182_partitions); 100 101 partitions = svme182_partitions; 102 103 svme182_map.virt = ioremap(FLASH_BASE_ADDR, svme182_map.size); 104 105 if (svme182_map.virt == 0) { 106 printk("Failed to ioremap FLASH memory area.\n"); 107 return -EIO; 108 } 109 110 simple_map_init(&svme182_map); 111 112 this_mtd = do_map_probe("cfi_probe", &svme182_map); 113 if (!this_mtd) 114 { 115 iounmap((void *)svme182_map.virt); 116 return -ENXIO; 117 } 118 119 printk(KERN_NOTICE "SVME182 flash device: %dMiB at 0x%08x\n", 120 this_mtd->size >> 20, FLASH_BASE_ADDR); 121 122 this_mtd->owner = THIS_MODULE; 123 add_mtd_partitions(this_mtd, partitions, num_parts); 124 125 return 0; 126} 127 128static void __exit cleanup_svme182(void) 129{ 130 if (this_mtd) 131 { 132 del_mtd_partitions(this_mtd); 133 map_destroy(this_mtd); 134 } 135 136 if (svme182_map.virt) 137 { 138 iounmap((void *)svme182_map.virt); 139 svme182_map.virt = 0; 140 } 141 142 return; 143} 144 145module_init(init_svme182); 146module_exit(cleanup_svme182);