Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | |
2 | /* | |
f30c2269 | 3 | * drivers/mtd/maps/dmv182.c |
69f34c98 | 4 | * |
1da177e4 | 5 | * Flash map driver for the Dy4 SVME182 board |
69f34c98 | 6 | * |
1da177e4 LT |
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 | ||
1da177e4 LT |
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 | ||
40 | MODULE_AUTHOR("Scott Wood, TimeSys Corporation <scott.wood@timesys.com>"); | |
41 | MODULE_DESCRIPTION("User-programmable flash device on the Dy4 SVME182 board"); | |
42 | MODULE_LICENSE("GPL"); | |
43 | ||
44 | static 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 | ||
60 | static 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 | ||
94 | static struct mtd_info *this_mtd; | |
95 | ||
96 | static int __init init_svme182(void) | |
97 | { | |
98 | struct mtd_partition *partitions; | |
87d10f3c | 99 | int num_parts = ARRAY_SIZE(svme182_partitions); |
1da177e4 LT |
100 | |
101 | partitions = svme182_partitions; | |
102 | ||
103 | svme182_map.virt = ioremap(FLASH_BASE_ADDR, svme182_map.size); | |
69f34c98 | 104 | |
1da177e4 LT |
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; | |
ee0e87b1 | 123 | mtd_device_register(this_mtd, partitions, num_parts); |
1da177e4 LT |
124 | |
125 | return 0; | |
126 | } | |
127 | ||
128 | static void __exit cleanup_svme182(void) | |
129 | { | |
130 | if (this_mtd) | |
131 | { | |
ee0e87b1 | 132 | mtd_device_unregister(this_mtd); |
1da177e4 LT |
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 | ||
145 | module_init(init_svme182); | |
146 | module_exit(cleanup_svme182); |