Merge tag 'devicetree-for-linus' of git://git.secretlab.ca/git/linux-2.6
[deliverable/linux.git] / drivers / mtd / maps / physmap_of.c
CommitLineData
a2c2fe4b 1/*
c4d5e375 2 * Flash mappings described by the OF (or flattened) device tree
a2c2fe4b
VW
3 *
4 * Copyright (C) 2006 MontaVista Software Inc.
5 * Author: Vitaly Wool <vwool@ru.mvista.com>
6 *
2099172d
DG
7 * Revised to handle newer style flash binding by:
8 * Copyright (C) 2007 David Gibson, IBM Corporation.
9 *
a2c2fe4b
VW
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2 of the License, or (at your
13 * option) any later version.
14 */
15
16#include <linux/module.h>
17#include <linux/types.h>
a2c2fe4b 18#include <linux/init.h>
a2c2fe4b
VW
19#include <linux/device.h>
20#include <linux/mtd/mtd.h>
21#include <linux/mtd/map.h>
22#include <linux/mtd/partitions.h>
143070e7 23#include <linux/mtd/concat.h>
c4d5e375 24#include <linux/of.h>
7a50d06e 25#include <linux/of_address.h>
c4d5e375 26#include <linux/of_platform.h>
5a0e3ad6 27#include <linux/slab.h>
a2c2fe4b 28
143070e7
SR
29struct of_flash_list {
30 struct mtd_info *mtd;
31 struct map_info map;
32 struct resource *res;
33};
34
c4d5e375 35struct of_flash {
143070e7 36 struct mtd_info *cmtd;
143070e7
SR
37 int list_size; /* number of elements in of_flash_list */
38 struct of_flash_list list[0];
a2c2fe4b
VW
39};
40
2dc11581 41static int of_flash_remove(struct platform_device *dev)
a2c2fe4b 42{
c4d5e375 43 struct of_flash *info;
143070e7 44 int i;
a2c2fe4b
VW
45
46 info = dev_get_drvdata(&dev->dev);
c4d5e375 47 if (!info)
a2c2fe4b
VW
48 return 0;
49 dev_set_drvdata(&dev->dev, NULL);
50
143070e7 51 if (info->cmtd != info->list[0].mtd) {
984e6d8e 52 mtd_device_unregister(info->cmtd);
143070e7
SR
53 mtd_concat_destroy(info->cmtd);
54 }
143070e7 55
f44dcbd0 56 if (info->cmtd)
984e6d8e 57 mtd_device_unregister(info->cmtd);
a2c2fe4b 58
143070e7
SR
59 for (i = 0; i < info->list_size; i++) {
60 if (info->list[i].mtd)
61 map_destroy(info->list[i].mtd);
a2c2fe4b 62
143070e7
SR
63 if (info->list[i].map.virt)
64 iounmap(info->list[i].map.virt);
65
66 if (info->list[i].res) {
67 release_resource(info->list[i].res);
68 kfree(info->list[i].res);
69 }
a2c2fe4b
VW
70 }
71
143070e7
SR
72 kfree(info);
73
a2c2fe4b
VW
74 return 0;
75}
76
2099172d
DG
77/* Helper function to handle probing of the obsolete "direct-mapped"
78 * compatible binding, which has an extra "probe-type" property
79 * describing the type of flash probe necessary. */
2dc11581 80static struct mtd_info * __devinit obsolete_probe(struct platform_device *dev,
2099172d 81 struct map_info *map)
a2c2fe4b 82{
61c7a080 83 struct device_node *dp = dev->dev.of_node;
a2c2fe4b 84 const char *of_probe;
2099172d
DG
85 struct mtd_info *mtd;
86 static const char *rom_probe_types[]
87 = { "cfi_probe", "jedec_probe", "map_rom"};
88 int i;
89
90 dev_warn(&dev->dev, "Device tree uses obsolete \"direct-mapped\" "
91 "flash binding\n");
92
93 of_probe = of_get_property(dp, "probe-type", NULL);
94 if (!of_probe) {
95 for (i = 0; i < ARRAY_SIZE(rom_probe_types); i++) {
96 mtd = do_map_probe(rom_probe_types[i], map);
97 if (mtd)
98 return mtd;
99 }
100 return NULL;
101 } else if (strcmp(of_probe, "CFI") == 0) {
102 return do_map_probe("cfi_probe", map);
103 } else if (strcmp(of_probe, "JEDEC") == 0) {
104 return do_map_probe("jedec_probe", map);
105 } else {
106 if (strcmp(of_probe, "ROM") != 0)
c4d5e375
DG
107 dev_warn(&dev->dev, "obsolete_probe: don't know probe "
108 "type '%s', mapping as rom\n", of_probe);
2099172d
DG
109 return do_map_probe("mtd_rom", map);
110 }
111}
112
9d5da3a9
JG
113/* When partitions are set we look for a linux,part-probe property which
114 specifies the list of partition probers to use. If none is given then the
115 default is use. These take precedence over other device tree
116 information. */
5f4ba9f9 117static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot",
fbcf62a3 118 "ofpart", "ofoldpart", NULL };
9d5da3a9
JG
119static const char ** __devinit of_get_probes(struct device_node *dp)
120{
121 const char *cp;
122 int cplen;
123 unsigned int l;
124 unsigned int count;
125 const char **res;
126
127 cp = of_get_property(dp, "linux,part-probe", &cplen);
128 if (cp == NULL)
129 return part_probe_types_def;
130
131 count = 0;
132 for (l = 0; l != cplen; l++)
133 if (cp[l] == 0)
134 count++;
135
136 res = kzalloc((count + 1)*sizeof(*res), GFP_KERNEL);
137 count = 0;
138 while (cplen > 0) {
139 res[count] = cp;
140 l = strlen(cp) + 1;
141 cp += l;
142 cplen -= l;
143 count++;
144 }
145 return res;
146}
147
148static void __devinit of_free_probes(const char **probes)
149{
150 if (probes != part_probe_types_def)
151 kfree(probes);
152}
9d5da3a9 153
b1608d69 154static struct of_device_id of_flash_match[];
1c48a5c9 155static int __devinit of_flash_probe(struct platform_device *dev)
a2c2fe4b 156{
9d5da3a9 157 const char **part_probe_types;
b1608d69 158 const struct of_device_id *match;
61c7a080 159 struct device_node *dp = dev->dev.of_node;
a2c2fe4b 160 struct resource res;
c4d5e375 161 struct of_flash *info;
1c48a5c9 162 const char *probe_type;
766f271a 163 const __be32 *width;
a2c2fe4b 164 int err;
143070e7
SR
165 int i;
166 int count;
766f271a 167 const __be32 *p;
143070e7
SR
168 int reg_tuple_size;
169 struct mtd_info **mtd_list = NULL;
2763c508 170 resource_size_t res_size;
5f4ba9f9 171 struct mtd_part_parser_data ppdata;
d0788ce4 172 bool map_indirect;
143070e7 173
b1608d69
GL
174 match = of_match_device(of_flash_match, &dev->dev);
175 if (!match)
1c48a5c9 176 return -EINVAL;
b1608d69 177 probe_type = match->data;
1c48a5c9 178
143070e7
SR
179 reg_tuple_size = (of_n_addr_cells(dp) + of_n_size_cells(dp)) * sizeof(u32);
180
181 /*
182 * Get number of "reg" tuples. Scan for MTD devices on area's
183 * described by each "reg" region. This makes it possible (including
184 * the concat support) to support the Intel P30 48F4400 chips which
185 * consists internally of 2 non-identical NOR chips on one die.
186 */
187 p = of_get_property(dp, "reg", &count);
188 if (count % reg_tuple_size != 0) {
189 dev_err(&dev->dev, "Malformed reg property on %s\n",
61c7a080 190 dev->dev.of_node->full_name);
143070e7 191 err = -EINVAL;
ad4fbc79 192 goto err_flash_remove;
a2c2fe4b 193 }
143070e7 194 count /= reg_tuple_size;
a2c2fe4b 195
d0788ce4
SR
196 map_indirect = of_property_read_bool(dp, "no-unaligned-direct-access");
197
c4d5e375 198 err = -ENOMEM;
143070e7
SR
199 info = kzalloc(sizeof(struct of_flash) +
200 sizeof(struct of_flash_list) * count, GFP_KERNEL);
201 if (!info)
ad4fbc79 202 goto err_flash_remove;
a2c2fe4b
VW
203
204 dev_set_drvdata(&dev->dev, info);
205
e026255f 206 mtd_list = kzalloc(sizeof(*mtd_list) * count, GFP_KERNEL);
ad4fbc79 207 if (!mtd_list)
208 goto err_flash_remove;
209
143070e7
SR
210 for (i = 0; i < count; i++) {
211 err = -ENXIO;
212 if (of_address_to_resource(dp, i, &res)) {
940fe282
SR
213 /*
214 * Continue with next register tuple if this
215 * one is not mappable
216 */
217 continue;
143070e7 218 }
a2c2fe4b 219
f9a5279c 220 dev_dbg(&dev->dev, "of_flash device: %pR\n", &res);
143070e7
SR
221
222 err = -EBUSY;
2763c508
WS
223 res_size = resource_size(&res);
224 info->list[i].res = request_mem_region(res.start, res_size,
143070e7
SR
225 dev_name(&dev->dev));
226 if (!info->list[i].res)
227 goto err_out;
228
229 err = -ENXIO;
230 width = of_get_property(dp, "bank-width", NULL);
231 if (!width) {
232 dev_err(&dev->dev, "Can't get bank width from device"
233 " tree\n");
234 goto err_out;
235 }
a2c2fe4b 236
143070e7
SR
237 info->list[i].map.name = dev_name(&dev->dev);
238 info->list[i].map.phys = res.start;
2763c508 239 info->list[i].map.size = res_size;
766f271a 240 info->list[i].map.bankwidth = be32_to_cpup(width);
143070e7
SR
241
242 err = -ENOMEM;
243 info->list[i].map.virt = ioremap(info->list[i].map.phys,
244 info->list[i].map.size);
245 if (!info->list[i].map.virt) {
246 dev_err(&dev->dev, "Failed to ioremap() flash"
247 " region\n");
248 goto err_out;
249 }
a2c2fe4b 250
143070e7 251 simple_map_init(&info->list[i].map);
a2c2fe4b 252
d0788ce4
SR
253 /*
254 * On some platforms (e.g. MPC5200) a direct 1:1 mapping
255 * may cause problems with JFFS2 usage, as the local bus (LPB)
256 * doesn't support unaligned accesses as implemented in the
257 * JFFS2 code via memcpy(). By setting NO_XIP, the
258 * flash will not be exposed directly to the MTD users
259 * (e.g. JFFS2) any more.
260 */
261 if (map_indirect)
262 info->list[i].map.phys = NO_XIP;
263
143070e7
SR
264 if (probe_type) {
265 info->list[i].mtd = do_map_probe(probe_type,
266 &info->list[i].map);
267 } else {
268 info->list[i].mtd = obsolete_probe(dev,
269 &info->list[i].map);
270 }
271 mtd_list[i] = info->list[i].mtd;
a2c2fe4b 272
143070e7
SR
273 err = -ENXIO;
274 if (!info->list[i].mtd) {
275 dev_err(&dev->dev, "do_map_probe() failed\n");
276 goto err_out;
277 } else {
278 info->list_size++;
279 }
280 info->list[i].mtd->owner = THIS_MODULE;
281 info->list[i].mtd->dev.parent = &dev->dev;
282 }
2099172d 283
143070e7
SR
284 err = 0;
285 if (info->list_size == 1) {
286 info->cmtd = info->list[0].mtd;
287 } else if (info->list_size > 1) {
288 /*
289 * We detected multiple devices. Concatenate them together.
290 */
143070e7
SR
291 info->cmtd = mtd_concat_create(mtd_list, info->list_size,
292 dev_name(&dev->dev));
293 if (info->cmtd == NULL)
294 err = -ENXIO;
a2c2fe4b 295 }
143070e7
SR
296 if (err)
297 goto err_out;
a2c2fe4b 298
5f4ba9f9 299 ppdata.of_node = dp;
9d5da3a9 300 part_probe_types = of_get_probes(dp);
f44dcbd0
DES
301 mtd_device_parse_register(info->cmtd, part_probe_types, &ppdata,
302 NULL, 0);
9d5da3a9 303 of_free_probes(part_probe_types);
9a310d21 304
143070e7 305 kfree(mtd_list);
a2c2fe4b 306
a2c2fe4b
VW
307 return 0;
308
309err_out:
143070e7 310 kfree(mtd_list);
ad4fbc79 311err_flash_remove:
c4d5e375 312 of_flash_remove(dev);
143070e7 313
a2c2fe4b 314 return err;
a2c2fe4b
VW
315}
316
c4d5e375 317static struct of_device_id of_flash_match[] = {
2099172d
DG
318 {
319 .compatible = "cfi-flash",
320 .data = (void *)"cfi_probe",
321 },
322 {
323 /* FIXME: JEDEC chips can't be safely and reliably
324 * probed, although the mtd code gets it right in
325 * practice most of the time. We should use the
326 * vendor and device ids specified by the binding to
327 * bypass the heuristic probe code, but the mtd layer
328 * provides, at present, no interface for doing so
329 * :(. */
330 .compatible = "jedec-flash",
331 .data = (void *)"jedec_probe",
332 },
fc28c39f
WS
333 {
334 .compatible = "mtd-ram",
335 .data = (void *)"map_ram",
336 },
a2c2fe4b
VW
337 {
338 .type = "rom",
339 .compatible = "direct-mapped"
340 },
341 { },
342};
c4d5e375 343MODULE_DEVICE_TABLE(of, of_flash_match);
a2c2fe4b 344
1c48a5c9 345static struct platform_driver of_flash_driver = {
4018294b
GL
346 .driver = {
347 .name = "of-flash",
348 .owner = THIS_MODULE,
349 .of_match_table = of_flash_match,
350 },
c4d5e375
DG
351 .probe = of_flash_probe,
352 .remove = of_flash_remove,
a2c2fe4b
VW
353};
354
f99640de 355module_platform_driver(of_flash_driver);
a2c2fe4b
VW
356
357MODULE_LICENSE("GPL");
358MODULE_AUTHOR("Vitaly Wool <vwool@ru.mvista.com>");
c4d5e375 359MODULE_DESCRIPTION("Device tree based MTD map driver");
This page took 0.420991 seconds and 5 git commands to generate.