diff options
Diffstat (limited to 'drivers/mtd/nand/autcpu12.c')
-rw-r--r-- | drivers/mtd/nand/autcpu12.c | 237 |
1 files changed, 0 insertions, 237 deletions
diff --git a/drivers/mtd/nand/autcpu12.c b/drivers/mtd/nand/autcpu12.c deleted file mode 100644 index 04769a49a7cb..000000000000 --- a/drivers/mtd/nand/autcpu12.c +++ /dev/null | |||
@@ -1,237 +0,0 @@ | |||
1 | /* | ||
2 | * drivers/mtd/autcpu12.c | ||
3 | * | ||
4 | * Copyright (c) 2002 Thomas Gleixner <tgxl@linutronix.de> | ||
5 | * | ||
6 | * Derived from drivers/mtd/spia.c | ||
7 | * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com) | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * Overview: | ||
14 | * This is a device driver for the NAND flash device found on the | ||
15 | * autronix autcpu12 board, which is a SmartMediaCard. It supports | ||
16 | * 16MiB, 32MiB and 64MiB cards. | ||
17 | * | ||
18 | * | ||
19 | * 02-12-2002 TG Cleanup of module params | ||
20 | * | ||
21 | * 02-20-2002 TG adjusted for different rd/wr address support | ||
22 | * added support for read device ready/busy line | ||
23 | * added page_cache | ||
24 | * | ||
25 | * 10-06-2002 TG 128K card support added | ||
26 | */ | ||
27 | |||
28 | #include <linux/slab.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <linux/mtd/mtd.h> | ||
32 | #include <linux/mtd/nand.h> | ||
33 | #include <linux/mtd/partitions.h> | ||
34 | #include <asm/io.h> | ||
35 | #include <mach/hardware.h> | ||
36 | #include <asm/sizes.h> | ||
37 | #include <mach/autcpu12.h> | ||
38 | |||
39 | /* | ||
40 | * MTD structure for AUTCPU12 board | ||
41 | */ | ||
42 | static struct mtd_info *autcpu12_mtd = NULL; | ||
43 | static void __iomem *autcpu12_fio_base; | ||
44 | |||
45 | /* | ||
46 | * Define partitions for flash devices | ||
47 | */ | ||
48 | static struct mtd_partition partition_info16k[] = { | ||
49 | { .name = "AUTCPU12 flash partition 1", | ||
50 | .offset = 0, | ||
51 | .size = 8 * SZ_1M }, | ||
52 | { .name = "AUTCPU12 flash partition 2", | ||
53 | .offset = 8 * SZ_1M, | ||
54 | .size = 8 * SZ_1M }, | ||
55 | }; | ||
56 | |||
57 | static struct mtd_partition partition_info32k[] = { | ||
58 | { .name = "AUTCPU12 flash partition 1", | ||
59 | .offset = 0, | ||
60 | .size = 8 * SZ_1M }, | ||
61 | { .name = "AUTCPU12 flash partition 2", | ||
62 | .offset = 8 * SZ_1M, | ||
63 | .size = 24 * SZ_1M }, | ||
64 | }; | ||
65 | |||
66 | static struct mtd_partition partition_info64k[] = { | ||
67 | { .name = "AUTCPU12 flash partition 1", | ||
68 | .offset = 0, | ||
69 | .size = 16 * SZ_1M }, | ||
70 | { .name = "AUTCPU12 flash partition 2", | ||
71 | .offset = 16 * SZ_1M, | ||
72 | .size = 48 * SZ_1M }, | ||
73 | }; | ||
74 | |||
75 | static struct mtd_partition partition_info128k[] = { | ||
76 | { .name = "AUTCPU12 flash partition 1", | ||
77 | .offset = 0, | ||
78 | .size = 16 * SZ_1M }, | ||
79 | { .name = "AUTCPU12 flash partition 2", | ||
80 | .offset = 16 * SZ_1M, | ||
81 | .size = 112 * SZ_1M }, | ||
82 | }; | ||
83 | |||
84 | #define NUM_PARTITIONS16K 2 | ||
85 | #define NUM_PARTITIONS32K 2 | ||
86 | #define NUM_PARTITIONS64K 2 | ||
87 | #define NUM_PARTITIONS128K 2 | ||
88 | /* | ||
89 | * hardware specific access to control-lines | ||
90 | * | ||
91 | * ALE bit 4 autcpu12_pedr | ||
92 | * CLE bit 5 autcpu12_pedr | ||
93 | * NCE bit 0 fio_ctrl | ||
94 | * | ||
95 | */ | ||
96 | static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd, | ||
97 | unsigned int ctrl) | ||
98 | { | ||
99 | struct nand_chip *chip = mtd->priv; | ||
100 | |||
101 | if (ctrl & NAND_CTRL_CHANGE) { | ||
102 | void __iomem *addr; | ||
103 | unsigned char bits; | ||
104 | |||
105 | bits = clps_readb(AUTCPU12_SMC_PORT_OFFSET) & ~0x30; | ||
106 | bits |= (ctrl & NAND_CLE) << 4; | ||
107 | bits |= (ctrl & NAND_ALE) << 2; | ||
108 | clps_writeb(bits, AUTCPU12_SMC_PORT_OFFSET); | ||
109 | |||
110 | addr = autcpu12_fio_base + AUTCPU12_SMC_SELECT_OFFSET; | ||
111 | writeb((readb(addr) & ~0x1) | (ctrl & NAND_NCE), addr); | ||
112 | } | ||
113 | |||
114 | if (cmd != NAND_CMD_NONE) | ||
115 | writeb(cmd, chip->IO_ADDR_W); | ||
116 | } | ||
117 | |||
118 | /* | ||
119 | * read device ready pin | ||
120 | */ | ||
121 | int autcpu12_device_ready(struct mtd_info *mtd) | ||
122 | { | ||
123 | return clps_readb(AUTCPU12_SMC_PORT_OFFSET) & AUTCPU12_SMC_RDY; | ||
124 | } | ||
125 | |||
126 | /* | ||
127 | * Main initialization routine | ||
128 | */ | ||
129 | static int __init autcpu12_init(void) | ||
130 | { | ||
131 | struct nand_chip *this; | ||
132 | int err = 0; | ||
133 | |||
134 | /* Allocate memory for MTD device structure and private data */ | ||
135 | autcpu12_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), | ||
136 | GFP_KERNEL); | ||
137 | if (!autcpu12_mtd) { | ||
138 | printk("Unable to allocate AUTCPU12 NAND MTD device structure.\n"); | ||
139 | err = -ENOMEM; | ||
140 | goto out; | ||
141 | } | ||
142 | |||
143 | /* map physical address */ | ||
144 | autcpu12_fio_base = ioremap(AUTCPU12_PHYS_SMC, SZ_1K); | ||
145 | if (!autcpu12_fio_base) { | ||
146 | printk("Ioremap autcpu12 SmartMedia Card failed\n"); | ||
147 | err = -EIO; | ||
148 | goto out_mtd; | ||
149 | } | ||
150 | |||
151 | /* Get pointer to private data */ | ||
152 | this = (struct nand_chip *)(&autcpu12_mtd[1]); | ||
153 | |||
154 | /* Initialize structures */ | ||
155 | memset(autcpu12_mtd, 0, sizeof(struct mtd_info)); | ||
156 | memset(this, 0, sizeof(struct nand_chip)); | ||
157 | |||
158 | /* Link the private data with the MTD structure */ | ||
159 | autcpu12_mtd->priv = this; | ||
160 | autcpu12_mtd->owner = THIS_MODULE; | ||
161 | |||
162 | /* Set address of NAND IO lines */ | ||
163 | this->IO_ADDR_R = autcpu12_fio_base; | ||
164 | this->IO_ADDR_W = autcpu12_fio_base; | ||
165 | this->cmd_ctrl = autcpu12_hwcontrol; | ||
166 | this->dev_ready = autcpu12_device_ready; | ||
167 | /* 20 us command delay time */ | ||
168 | this->chip_delay = 20; | ||
169 | this->ecc.mode = NAND_ECC_SOFT; | ||
170 | |||
171 | /* Enable the following for a flash based bad block table */ | ||
172 | /* | ||
173 | this->bbt_options = NAND_BBT_USE_FLASH; | ||
174 | */ | ||
175 | this->bbt_options = NAND_BBT_USE_FLASH; | ||
176 | |||
177 | /* Scan to find existence of the device */ | ||
178 | if (nand_scan(autcpu12_mtd, 1)) { | ||
179 | err = -ENXIO; | ||
180 | goto out_ior; | ||
181 | } | ||
182 | |||
183 | /* Register the partitions */ | ||
184 | switch (autcpu12_mtd->size) { | ||
185 | case SZ_16M: | ||
186 | mtd_device_register(autcpu12_mtd, partition_info16k, | ||
187 | NUM_PARTITIONS16K); | ||
188 | break; | ||
189 | case SZ_32M: | ||
190 | mtd_device_register(autcpu12_mtd, partition_info32k, | ||
191 | NUM_PARTITIONS32K); | ||
192 | break; | ||
193 | case SZ_64M: | ||
194 | mtd_device_register(autcpu12_mtd, partition_info64k, | ||
195 | NUM_PARTITIONS64K); | ||
196 | break; | ||
197 | case SZ_128M: | ||
198 | mtd_device_register(autcpu12_mtd, partition_info128k, | ||
199 | NUM_PARTITIONS128K); | ||
200 | break; | ||
201 | default: | ||
202 | printk("Unsupported SmartMedia device\n"); | ||
203 | err = -ENXIO; | ||
204 | goto out_ior; | ||
205 | } | ||
206 | goto out; | ||
207 | |||
208 | out_ior: | ||
209 | iounmap(autcpu12_fio_base); | ||
210 | out_mtd: | ||
211 | kfree(autcpu12_mtd); | ||
212 | out: | ||
213 | return err; | ||
214 | } | ||
215 | |||
216 | module_init(autcpu12_init); | ||
217 | |||
218 | /* | ||
219 | * Clean up routine | ||
220 | */ | ||
221 | static void __exit autcpu12_cleanup(void) | ||
222 | { | ||
223 | /* Release resources, unregister device */ | ||
224 | nand_release(autcpu12_mtd); | ||
225 | |||
226 | /* unmap physical address */ | ||
227 | iounmap(autcpu12_fio_base); | ||
228 | |||
229 | /* Free the MTD device structure */ | ||
230 | kfree(autcpu12_mtd); | ||
231 | } | ||
232 | |||
233 | module_exit(autcpu12_cleanup); | ||
234 | |||
235 | MODULE_LICENSE("GPL"); | ||
236 | MODULE_AUTHOR("Thomas Gleixner <tglx@linutronix.de>"); | ||
237 | MODULE_DESCRIPTION("Glue layer for SmartMediaCard on autronix autcpu12"); | ||