1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
29
30
31
32
33
34
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
53#define NEW_BOOTIMAGE_PART_SIZE (6 * 1024 * 1024)
54
55#define NEW_BOOTLOADER_PART_SIZE (1024 * 1024)
56
57#define NEW_RFS_PART_SIZE (0x01000000 - NEW_BOOTLOADER_PART_SIZE - \
58 NEW_BOOTIMAGE_PART_SIZE)
59
60static struct mtd_partition svme182_partitions[] = {
61
62
63
64
65
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
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);
147