aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/maps
diff options
context:
space:
mode:
authorPaul Bolle <pebolle@tiscali.nl>2013-05-13 10:40:39 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2013-08-05 16:01:08 -0400
commit795add9a56ef084061a4c5dce50a324f52305f08 (patch)
tree00c5f36a3113f6481b8fcf06786993207394e204 /drivers/mtd/maps
parentf666d6495a4350ebe4ebb8c071b290f9f49514bf (diff)
mtd: remove obsolete JEDEC mapping drivers
JEDEC device support was removed in v2.6.22. (It had been marked as BROKEN (indirectly) since at least v2.6.12.) When it was removed the two JEDEC mapping drivers that depended on it should have been removed too. Do so now. Signed-off-by: Paul Bolle <pebolle@tiscali.nl> Acked-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/maps')
-rw-r--r--drivers/mtd/maps/Kconfig18
-rw-r--r--drivers/mtd/maps/Makefile2
-rw-r--r--drivers/mtd/maps/octagon-5066.c246
-rw-r--r--drivers/mtd/maps/vmax301.c196
4 files changed, 0 insertions, 462 deletions
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 8b27ca054c59..310dc7c93425 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -157,24 +157,6 @@ config MTD_PXA2XX
157 help 157 help
158 This provides a driver for the NOR flash attached to a PXA2xx chip. 158 This provides a driver for the NOR flash attached to a PXA2xx chip.
159 159
160config MTD_OCTAGON
161 tristate "JEDEC Flash device mapped on Octagon 5066 SBC"
162 depends on X86 && MTD_JEDEC && MTD_COMPLEX_MAPPINGS
163 help
164 This provides a 'mapping' driver which supports the way in which
165 the flash chips are connected in the Octagon-5066 Single Board
166 Computer. More information on the board is available at
167 <http://www.octagonsystems.com/products/5066.aspx>.
168
169config MTD_VMAX
170 tristate "JEDEC Flash device mapped on Tempustech VMAX SBC301"
171 depends on X86 && MTD_JEDEC && MTD_COMPLEX_MAPPINGS
172 help
173 This provides a 'mapping' driver which supports the way in which
174 the flash chips are connected in the Tempustech VMAX SBC301 Single
175 Board Computer. More information on the board is available at
176 <http://www.tempustech.com/>.
177
178config MTD_SCx200_DOCFLASH 160config MTD_SCx200_DOCFLASH
179 tristate "Flash device mapped with DOCCS on NatSemi SCx200" 161 tristate "Flash device mapped with DOCCS on NatSemi SCx200"
180 depends on SCx200 && MTD_CFI 162 depends on SCx200 && MTD_CFI
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 9fdbd4ba6441..141c91a5b24c 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -16,7 +16,6 @@ obj-$(CONFIG_MTD_ICHXROM) += ichxrom.o
16obj-$(CONFIG_MTD_CK804XROM) += ck804xrom.o 16obj-$(CONFIG_MTD_CK804XROM) += ck804xrom.o
17obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o 17obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o
18obj-$(CONFIG_MTD_PXA2XX) += pxa2xx-flash.o 18obj-$(CONFIG_MTD_PXA2XX) += pxa2xx-flash.o
19obj-$(CONFIG_MTD_OCTAGON) += octagon-5066.o
20obj-$(CONFIG_MTD_PHYSMAP) += physmap.o 19obj-$(CONFIG_MTD_PHYSMAP) += physmap.o
21obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o 20obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o
22obj-$(CONFIG_MTD_PISMO) += pismo.o 21obj-$(CONFIG_MTD_PISMO) += pismo.o
@@ -28,7 +27,6 @@ obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
28obj-$(CONFIG_MTD_NETSC520) += netsc520.o 27obj-$(CONFIG_MTD_NETSC520) += netsc520.o
29obj-$(CONFIG_MTD_TS5500) += ts5500_flash.o 28obj-$(CONFIG_MTD_TS5500) += ts5500_flash.o
30obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o 29obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
31obj-$(CONFIG_MTD_VMAX) += vmax301.o
32obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o 30obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
33obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o 31obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
34obj-$(CONFIG_MTD_PCI) += pci.o 32obj-$(CONFIG_MTD_PCI) += pci.o
diff --git a/drivers/mtd/maps/octagon-5066.c b/drivers/mtd/maps/octagon-5066.c
deleted file mode 100644
index 807ac2a2e686..000000000000
--- a/drivers/mtd/maps/octagon-5066.c
+++ /dev/null
@@ -1,246 +0,0 @@
1/* ######################################################################
2
3 Octagon 5066 MTD Driver.
4
5 The Octagon 5066 is a SBC based on AMD's 586-WB running at 133 MHZ. It
6 comes with a builtin AMD 29F016 flash chip and a socketed EEPROM that
7 is replacable by flash. Both units are mapped through a multiplexer
8 into a 32k memory window at 0xe8000. The control register for the
9 multiplexing unit is located at IO 0x208 with a bit map of
10 0-5 Page Selection in 32k increments
11 6-7 Device selection:
12 00 SSD off
13 01 SSD 0 (Socket)
14 10 SSD 1 (Flash chip)
15 11 undefined
16
17 On each SSD, the first 128k is reserved for use by the bios
18 (actually it IS the bios..) This only matters if you are booting off the
19 flash, you must not put a file system starting there.
20
21 The driver tries to do a detection algorithm to guess what sort of devices
22 are plugged into the sockets.
23
24 ##################################################################### */
25
26#include <linux/module.h>
27#include <linux/ioport.h>
28#include <linux/init.h>
29#include <asm/io.h>
30
31#include <linux/mtd/map.h>
32#include <linux/mtd/mtd.h>
33
34#define WINDOW_START 0xe8000
35#define WINDOW_LENGTH 0x8000
36#define WINDOW_SHIFT 27
37#define WINDOW_MASK 0x7FFF
38#define PAGE_IO 0x208
39
40static volatile char page_n_dev = 0;
41static unsigned long iomapadr;
42static DEFINE_SPINLOCK(oct5066_spin);
43
44/*
45 * We use map_priv_1 to identify which device we are.
46 */
47
48static void __oct5066_page(struct map_info *map, __u8 byte)
49{
50 outb(byte,PAGE_IO);
51 page_n_dev = byte;
52}
53
54static inline void oct5066_page(struct map_info *map, unsigned long ofs)
55{
56 __u8 byte = map->map_priv_1 | (ofs >> WINDOW_SHIFT);
57
58 if (page_n_dev != byte)
59 __oct5066_page(map, byte);
60}
61
62
63static map_word oct5066_read8(struct map_info *map, unsigned long ofs)
64{
65 map_word ret;
66 spin_lock(&oct5066_spin);
67 oct5066_page(map, ofs);
68 ret.x[0] = readb(iomapadr + (ofs & WINDOW_MASK));
69 spin_unlock(&oct5066_spin);
70 return ret;
71}
72
73static void oct5066_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
74{
75 while(len) {
76 unsigned long thislen = len;
77 if (len > (WINDOW_LENGTH - (from & WINDOW_MASK)))
78 thislen = WINDOW_LENGTH-(from & WINDOW_MASK);
79
80 spin_lock(&oct5066_spin);
81 oct5066_page(map, from);
82 memcpy_fromio(to, iomapadr + from, thislen);
83 spin_unlock(&oct5066_spin);
84 to += thislen;
85 from += thislen;
86 len -= thislen;
87 }
88}
89
90static void oct5066_write8(struct map_info *map, map_word d, unsigned long adr)
91{
92 spin_lock(&oct5066_spin);
93 oct5066_page(map, adr);
94 writeb(d.x[0], iomapadr + (adr & WINDOW_MASK));
95 spin_unlock(&oct5066_spin);
96}
97
98static void oct5066_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
99{
100 while(len) {
101 unsigned long thislen = len;
102 if (len > (WINDOW_LENGTH - (to & WINDOW_MASK)))
103 thislen = WINDOW_LENGTH-(to & WINDOW_MASK);
104
105 spin_lock(&oct5066_spin);
106 oct5066_page(map, to);
107 memcpy_toio(iomapadr + to, from, thislen);
108 spin_unlock(&oct5066_spin);
109 to += thislen;
110 from += thislen;
111 len -= thislen;
112 }
113}
114
115static struct map_info oct5066_map[2] = {
116 {
117 .name = "Octagon 5066 Socket",
118 .phys = NO_XIP,
119 .size = 512 * 1024,
120 .bankwidth = 1,
121 .read = oct5066_read8,
122 .copy_from = oct5066_copy_from,
123 .write = oct5066_write8,
124 .copy_to = oct5066_copy_to,
125 .map_priv_1 = 1<<6
126 },
127 {
128 .name = "Octagon 5066 Internal Flash",
129 .phys = NO_XIP,
130 .size = 2 * 1024 * 1024,
131 .bankwidth = 1,
132 .read = oct5066_read8,
133 .copy_from = oct5066_copy_from,
134 .write = oct5066_write8,
135 .copy_to = oct5066_copy_to,
136 .map_priv_1 = 2<<6
137 }
138};
139
140static struct mtd_info *oct5066_mtd[2] = {NULL, NULL};
141
142// OctProbe - Sense if this is an octagon card
143// ---------------------------------------------------------------------
144/* Perform a simple validity test, we map the window select SSD0 and
145 change pages while monitoring the window. A change in the window,
146 controlled by the PAGE_IO port is a functioning 5066 board. This will
147 fail if the thing in the socket is set to a uniform value. */
148static int __init OctProbe(void)
149{
150 unsigned int Base = (1 << 6);
151 unsigned long I;
152 unsigned long Values[10];
153 for (I = 0; I != 20; I++)
154 {
155 outb(Base + (I%10),PAGE_IO);
156 if (I < 10)
157 {
158 // Record the value and check for uniqueness
159 Values[I%10] = readl(iomapadr);
160 if (I > 0 && Values[I%10] == Values[0])
161 return -EAGAIN;
162 }
163 else
164 {
165 // Make sure we get the same values on the second pass
166 if (Values[I%10] != readl(iomapadr))
167 return -EAGAIN;
168 }
169 }
170 return 0;
171}
172
173void cleanup_oct5066(void)
174{
175 int i;
176 for (i=0; i<2; i++) {
177 if (oct5066_mtd[i]) {
178 mtd_device_unregister(oct5066_mtd[i]);
179 map_destroy(oct5066_mtd[i]);
180 }
181 }
182 iounmap((void *)iomapadr);
183 release_region(PAGE_IO, 1);
184}
185
186static int __init init_oct5066(void)
187{
188 int i;
189 int ret = 0;
190
191 // Do an autoprobe sequence
192 if (!request_region(PAGE_IO,1,"Octagon SSD")) {
193 printk(KERN_NOTICE "5066: Page Register in Use\n");
194 return -EAGAIN;
195 }
196 iomapadr = (unsigned long)ioremap(WINDOW_START, WINDOW_LENGTH);
197 if (!iomapadr) {
198 printk(KERN_NOTICE "Failed to ioremap memory region\n");
199 ret = -EIO;
200 goto out_rel;
201 }
202 if (OctProbe() != 0) {
203 printk(KERN_NOTICE "5066: Octagon Probe Failed, is this an Octagon 5066 SBC?\n");
204 iounmap((void *)iomapadr);
205 ret = -EAGAIN;
206 goto out_unmap;
207 }
208
209 // Print out our little header..
210 printk("Octagon 5066 SSD IO:0x%x MEM:0x%x-0x%x\n",PAGE_IO,WINDOW_START,
211 WINDOW_START+WINDOW_LENGTH);
212
213 for (i=0; i<2; i++) {
214 oct5066_mtd[i] = do_map_probe("cfi_probe", &oct5066_map[i]);
215 if (!oct5066_mtd[i])
216 oct5066_mtd[i] = do_map_probe("jedec", &oct5066_map[i]);
217 if (!oct5066_mtd[i])
218 oct5066_mtd[i] = do_map_probe("map_ram", &oct5066_map[i]);
219 if (!oct5066_mtd[i])
220 oct5066_mtd[i] = do_map_probe("map_rom", &oct5066_map[i]);
221 if (oct5066_mtd[i]) {
222 oct5066_mtd[i]->owner = THIS_MODULE;
223 mtd_device_register(oct5066_mtd[i], NULL, 0);
224 }
225 }
226
227 if (!oct5066_mtd[0] && !oct5066_mtd[1]) {
228 cleanup_oct5066();
229 return -ENXIO;
230 }
231
232 return 0;
233
234 out_unmap:
235 iounmap((void *)iomapadr);
236 out_rel:
237 release_region(PAGE_IO, 1);
238 return ret;
239}
240
241module_init(init_oct5066);
242module_exit(cleanup_oct5066);
243
244MODULE_LICENSE("GPL");
245MODULE_AUTHOR("Jason Gunthorpe <jgg@deltatee.com>, David Woodhouse <dwmw2@infradead.org>");
246MODULE_DESCRIPTION("MTD map driver for Octagon 5066 Single Board Computer");
diff --git a/drivers/mtd/maps/vmax301.c b/drivers/mtd/maps/vmax301.c
deleted file mode 100644
index 5e68de73eabc..000000000000
--- a/drivers/mtd/maps/vmax301.c
+++ /dev/null
@@ -1,196 +0,0 @@
1/* ######################################################################
2
3 Tempustech VMAX SBC301 MTD Driver.
4
5 The VMAx 301 is a SBC based on . It
6 comes with three builtin AMD 29F016B flash chips and a socket for SRAM or
7 more flash. Each unit has it's own 8k mapping into a settable region
8 (0xD8000). There are two 8k mappings for each MTD, the first is always set
9 to the lower 8k of the device the second is paged. Writing a 16 bit page
10 value to anywhere in the first 8k will cause the second 8k to page around.
11
12 To boot the device a bios extension must be installed into the first 8k
13 of flash that is smart enough to copy itself down, page in the rest of
14 itself and begin executing.
15
16 ##################################################################### */
17
18#include <linux/module.h>
19#include <linux/ioport.h>
20#include <linux/init.h>
21#include <linux/spinlock.h>
22#include <asm/io.h>
23
24#include <linux/mtd/map.h>
25#include <linux/mtd/mtd.h>
26
27
28#define WINDOW_START 0xd8000
29#define WINDOW_LENGTH 0x2000
30#define WINDOW_SHIFT 25
31#define WINDOW_MASK 0x1FFF
32
33/* Actually we could use two spinlocks, but we'd have to have
34 more private space in the struct map_info. We lose a little
35 performance like this, but we'd probably lose more by having
36 the extra indirection from having one of the map->map_priv
37 fields pointing to yet another private struct.
38*/
39static DEFINE_SPINLOCK(vmax301_spin);
40
41static void __vmax301_page(struct map_info *map, unsigned long page)
42{
43 writew(page, map->map_priv_2 - WINDOW_LENGTH);
44 map->map_priv_1 = page;
45}
46
47static inline void vmax301_page(struct map_info *map,
48 unsigned long ofs)
49{
50 unsigned long page = (ofs >> WINDOW_SHIFT);
51 if (map->map_priv_1 != page)
52 __vmax301_page(map, page);
53}
54
55static map_word vmax301_read8(struct map_info *map, unsigned long ofs)
56{
57 map_word ret;
58 spin_lock(&vmax301_spin);
59 vmax301_page(map, ofs);
60 ret.x[0] = readb(map->map_priv_2 + (ofs & WINDOW_MASK));
61 spin_unlock(&vmax301_spin);
62 return ret;
63}
64
65static void vmax301_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
66{
67 while(len) {
68 unsigned long thislen = len;
69 if (len > (WINDOW_LENGTH - (from & WINDOW_MASK)))
70 thislen = WINDOW_LENGTH-(from & WINDOW_MASK);
71 spin_lock(&vmax301_spin);
72 vmax301_page(map, from);
73 memcpy_fromio(to, map->map_priv_2 + from, thislen);
74 spin_unlock(&vmax301_spin);
75 to += thislen;
76 from += thislen;
77 len -= thislen;
78 }
79}
80
81static void vmax301_write8(struct map_info *map, map_word d, unsigned long adr)
82{
83 spin_lock(&vmax301_spin);
84 vmax301_page(map, adr);
85 writeb(d.x[0], map->map_priv_2 + (adr & WINDOW_MASK));
86 spin_unlock(&vmax301_spin);
87}
88
89static void vmax301_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
90{
91 while(len) {
92 unsigned long thislen = len;
93 if (len > (WINDOW_LENGTH - (to & WINDOW_MASK)))
94 thislen = WINDOW_LENGTH-(to & WINDOW_MASK);
95
96 spin_lock(&vmax301_spin);
97 vmax301_page(map, to);
98 memcpy_toio(map->map_priv_2 + to, from, thislen);
99 spin_unlock(&vmax301_spin);
100 to += thislen;
101 from += thislen;
102 len -= thislen;
103 }
104}
105
106static struct map_info vmax_map[2] = {
107 {
108 .name = "VMAX301 Internal Flash",
109 .phys = NO_XIP,
110 .size = 3*2*1024*1024,
111 .bankwidth = 1,
112 .read = vmax301_read8,
113 .copy_from = vmax301_copy_from,
114 .write = vmax301_write8,
115 .copy_to = vmax301_copy_to,
116 .map_priv_1 = WINDOW_START + WINDOW_LENGTH,
117 .map_priv_2 = 0xFFFFFFFF
118 },
119 {
120 .name = "VMAX301 Socket",
121 .phys = NO_XIP,
122 .size = 0,
123 .bankwidth = 1,
124 .read = vmax301_read8,
125 .copy_from = vmax301_copy_from,
126 .write = vmax301_write8,
127 .copy_to = vmax301_copy_to,
128 .map_priv_1 = WINDOW_START + (3*WINDOW_LENGTH),
129 .map_priv_2 = 0xFFFFFFFF
130 }
131};
132
133static struct mtd_info *vmax_mtd[2] = {NULL, NULL};
134
135static void __exit cleanup_vmax301(void)
136{
137 int i;
138
139 for (i=0; i<2; i++) {
140 if (vmax_mtd[i]) {
141 mtd_device_unregister(vmax_mtd[i]);
142 map_destroy(vmax_mtd[i]);
143 }
144 }
145 iounmap((void *)vmax_map[0].map_priv_1 - WINDOW_START);
146}
147
148static int __init init_vmax301(void)
149{
150 int i;
151 unsigned long iomapadr;
152 // Print out our little header..
153 printk("Tempustech VMAX 301 MEM:0x%x-0x%x\n",WINDOW_START,
154 WINDOW_START+4*WINDOW_LENGTH);
155
156 iomapadr = (unsigned long)ioremap(WINDOW_START, WINDOW_LENGTH*4);
157 if (!iomapadr) {
158 printk("Failed to ioremap memory region\n");
159 return -EIO;
160 }
161 /* Put the address in the map's private data area.
162 We store the actual MTD IO address rather than the
163 address of the first half, because it's used more
164 often.
165 */
166 vmax_map[0].map_priv_2 = iomapadr + WINDOW_START;
167 vmax_map[1].map_priv_2 = iomapadr + (3*WINDOW_START);
168
169 for (i=0; i<2; i++) {
170 vmax_mtd[i] = do_map_probe("cfi_probe", &vmax_map[i]);
171 if (!vmax_mtd[i])
172 vmax_mtd[i] = do_map_probe("jedec", &vmax_map[i]);
173 if (!vmax_mtd[i])
174 vmax_mtd[i] = do_map_probe("map_ram", &vmax_map[i]);
175 if (!vmax_mtd[i])
176 vmax_mtd[i] = do_map_probe("map_rom", &vmax_map[i]);
177 if (vmax_mtd[i]) {
178 vmax_mtd[i]->owner = THIS_MODULE;
179 mtd_device_register(vmax_mtd[i], NULL, 0);
180 }
181 }
182
183 if (!vmax_mtd[0] && !vmax_mtd[1]) {
184 iounmap((void *)iomapadr);
185 return -ENXIO;
186 }
187
188 return 0;
189}
190
191module_init(init_vmax301);
192module_exit(cleanup_vmax301);
193
194MODULE_LICENSE("GPL");
195MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
196MODULE_DESCRIPTION("MTD map driver for Tempustech VMAX SBC301 board");