IPVS: fix netns if reading ip_vs_* procfs entries
[linux-2.6/linux-mips.git] / drivers / mtd / maps / physmap_of.c
blobbd483f0c57e1ae31ca98c1336cd3f4bed248310b
1 /*
2 * Flash mappings described by the OF (or flattened) device tree
4 * Copyright (C) 2006 MontaVista Software Inc.
5 * Author: Vitaly Wool <vwool@ru.mvista.com>
7 * Revised to handle newer style flash binding by:
8 * Copyright (C) 2007 David Gibson, IBM Corporation.
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.
16 #include <linux/module.h>
17 #include <linux/types.h>
18 #include <linux/init.h>
19 #include <linux/device.h>
20 #include <linux/mtd/mtd.h>
21 #include <linux/mtd/map.h>
22 #include <linux/mtd/partitions.h>
23 #include <linux/mtd/concat.h>
24 #include <linux/of.h>
25 #include <linux/of_address.h>
26 #include <linux/of_platform.h>
27 #include <linux/slab.h>
29 struct of_flash_list {
30 struct mtd_info *mtd;
31 struct map_info map;
32 struct resource *res;
35 struct of_flash {
36 struct mtd_info *cmtd;
37 #ifdef CONFIG_MTD_PARTITIONS
38 struct mtd_partition *parts;
39 #endif
40 int list_size; /* number of elements in of_flash_list */
41 struct of_flash_list list[0];
44 #ifdef CONFIG_MTD_PARTITIONS
45 #define OF_FLASH_PARTS(info) ((info)->parts)
47 static int parse_obsolete_partitions(struct platform_device *dev,
48 struct of_flash *info,
49 struct device_node *dp)
51 int i, plen, nr_parts;
52 const struct {
53 __be32 offset, len;
54 } *part;
55 const char *names;
57 part = of_get_property(dp, "partitions", &plen);
58 if (!part)
59 return 0; /* No partitions found */
61 dev_warn(&dev->dev, "Device tree uses obsolete partition map binding\n");
63 nr_parts = plen / sizeof(part[0]);
65 info->parts = kzalloc(nr_parts * sizeof(*info->parts), GFP_KERNEL);
66 if (!info->parts)
67 return -ENOMEM;
69 names = of_get_property(dp, "partition-names", &plen);
71 for (i = 0; i < nr_parts; i++) {
72 info->parts[i].offset = be32_to_cpu(part->offset);
73 info->parts[i].size = be32_to_cpu(part->len) & ~1;
74 if (be32_to_cpu(part->len) & 1) /* bit 0 set signifies read only partition */
75 info->parts[i].mask_flags = MTD_WRITEABLE;
77 if (names && (plen > 0)) {
78 int len = strlen(names) + 1;
80 info->parts[i].name = (char *)names;
81 plen -= len;
82 names += len;
83 } else {
84 info->parts[i].name = "unnamed";
87 part++;
90 return nr_parts;
92 #else /* MTD_PARTITIONS */
93 #define OF_FLASH_PARTS(info) (0)
94 #define parse_partitions(info, dev) (0)
95 #endif /* MTD_PARTITIONS */
97 static int of_flash_remove(struct platform_device *dev)
99 struct of_flash *info;
100 int i;
102 info = dev_get_drvdata(&dev->dev);
103 if (!info)
104 return 0;
105 dev_set_drvdata(&dev->dev, NULL);
107 if (info->cmtd != info->list[0].mtd) {
108 del_mtd_device(info->cmtd);
109 mtd_concat_destroy(info->cmtd);
112 if (info->cmtd) {
113 if (OF_FLASH_PARTS(info)) {
114 del_mtd_partitions(info->cmtd);
115 kfree(OF_FLASH_PARTS(info));
116 } else {
117 del_mtd_device(info->cmtd);
121 for (i = 0; i < info->list_size; i++) {
122 if (info->list[i].mtd)
123 map_destroy(info->list[i].mtd);
125 if (info->list[i].map.virt)
126 iounmap(info->list[i].map.virt);
128 if (info->list[i].res) {
129 release_resource(info->list[i].res);
130 kfree(info->list[i].res);
134 kfree(info);
136 return 0;
139 /* Helper function to handle probing of the obsolete "direct-mapped"
140 * compatible binding, which has an extra "probe-type" property
141 * describing the type of flash probe necessary. */
142 static struct mtd_info * __devinit obsolete_probe(struct platform_device *dev,
143 struct map_info *map)
145 struct device_node *dp = dev->dev.of_node;
146 const char *of_probe;
147 struct mtd_info *mtd;
148 static const char *rom_probe_types[]
149 = { "cfi_probe", "jedec_probe", "map_rom"};
150 int i;
152 dev_warn(&dev->dev, "Device tree uses obsolete \"direct-mapped\" "
153 "flash binding\n");
155 of_probe = of_get_property(dp, "probe-type", NULL);
156 if (!of_probe) {
157 for (i = 0; i < ARRAY_SIZE(rom_probe_types); i++) {
158 mtd = do_map_probe(rom_probe_types[i], map);
159 if (mtd)
160 return mtd;
162 return NULL;
163 } else if (strcmp(of_probe, "CFI") == 0) {
164 return do_map_probe("cfi_probe", map);
165 } else if (strcmp(of_probe, "JEDEC") == 0) {
166 return do_map_probe("jedec_probe", map);
167 } else {
168 if (strcmp(of_probe, "ROM") != 0)
169 dev_warn(&dev->dev, "obsolete_probe: don't know probe "
170 "type '%s', mapping as rom\n", of_probe);
171 return do_map_probe("mtd_rom", map);
175 #ifdef CONFIG_MTD_PARTITIONS
176 /* When partitions are set we look for a linux,part-probe property which
177 specifies the list of partition probers to use. If none is given then the
178 default is use. These take precedence over other device tree
179 information. */
180 static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot", NULL };
181 static const char ** __devinit of_get_probes(struct device_node *dp)
183 const char *cp;
184 int cplen;
185 unsigned int l;
186 unsigned int count;
187 const char **res;
189 cp = of_get_property(dp, "linux,part-probe", &cplen);
190 if (cp == NULL)
191 return part_probe_types_def;
193 count = 0;
194 for (l = 0; l != cplen; l++)
195 if (cp[l] == 0)
196 count++;
198 res = kzalloc((count + 1)*sizeof(*res), GFP_KERNEL);
199 count = 0;
200 while (cplen > 0) {
201 res[count] = cp;
202 l = strlen(cp) + 1;
203 cp += l;
204 cplen -= l;
205 count++;
207 return res;
210 static void __devinit of_free_probes(const char **probes)
212 if (probes != part_probe_types_def)
213 kfree(probes);
215 #endif
217 static int __devinit of_flash_probe(struct platform_device *dev)
219 #ifdef CONFIG_MTD_PARTITIONS
220 const char **part_probe_types;
221 #endif
222 struct device_node *dp = dev->dev.of_node;
223 struct resource res;
224 struct of_flash *info;
225 const char *probe_type;
226 const __be32 *width;
227 int err;
228 int i;
229 int count;
230 const __be32 *p;
231 int reg_tuple_size;
232 struct mtd_info **mtd_list = NULL;
233 resource_size_t res_size;
235 if (!dev->dev.of_match)
236 return -EINVAL;
237 probe_type = dev->dev.of_match->data;
239 reg_tuple_size = (of_n_addr_cells(dp) + of_n_size_cells(dp)) * sizeof(u32);
242 * Get number of "reg" tuples. Scan for MTD devices on area's
243 * described by each "reg" region. This makes it possible (including
244 * the concat support) to support the Intel P30 48F4400 chips which
245 * consists internally of 2 non-identical NOR chips on one die.
247 p = of_get_property(dp, "reg", &count);
248 if (count % reg_tuple_size != 0) {
249 dev_err(&dev->dev, "Malformed reg property on %s\n",
250 dev->dev.of_node->full_name);
251 err = -EINVAL;
252 goto err_flash_remove;
254 count /= reg_tuple_size;
256 err = -ENOMEM;
257 info = kzalloc(sizeof(struct of_flash) +
258 sizeof(struct of_flash_list) * count, GFP_KERNEL);
259 if (!info)
260 goto err_flash_remove;
262 dev_set_drvdata(&dev->dev, info);
264 mtd_list = kzalloc(sizeof(*mtd_list) * count, GFP_KERNEL);
265 if (!mtd_list)
266 goto err_flash_remove;
268 for (i = 0; i < count; i++) {
269 err = -ENXIO;
270 if (of_address_to_resource(dp, i, &res)) {
272 * Continue with next register tuple if this
273 * one is not mappable
275 continue;
278 dev_dbg(&dev->dev, "of_flash device: %pR\n", &res);
280 err = -EBUSY;
281 res_size = resource_size(&res);
282 info->list[i].res = request_mem_region(res.start, res_size,
283 dev_name(&dev->dev));
284 if (!info->list[i].res)
285 goto err_out;
287 err = -ENXIO;
288 width = of_get_property(dp, "bank-width", NULL);
289 if (!width) {
290 dev_err(&dev->dev, "Can't get bank width from device"
291 " tree\n");
292 goto err_out;
295 info->list[i].map.name = dev_name(&dev->dev);
296 info->list[i].map.phys = res.start;
297 info->list[i].map.size = res_size;
298 info->list[i].map.bankwidth = be32_to_cpup(width);
300 err = -ENOMEM;
301 info->list[i].map.virt = ioremap(info->list[i].map.phys,
302 info->list[i].map.size);
303 if (!info->list[i].map.virt) {
304 dev_err(&dev->dev, "Failed to ioremap() flash"
305 " region\n");
306 goto err_out;
309 simple_map_init(&info->list[i].map);
311 if (probe_type) {
312 info->list[i].mtd = do_map_probe(probe_type,
313 &info->list[i].map);
314 } else {
315 info->list[i].mtd = obsolete_probe(dev,
316 &info->list[i].map);
318 mtd_list[i] = info->list[i].mtd;
320 err = -ENXIO;
321 if (!info->list[i].mtd) {
322 dev_err(&dev->dev, "do_map_probe() failed\n");
323 goto err_out;
324 } else {
325 info->list_size++;
327 info->list[i].mtd->owner = THIS_MODULE;
328 info->list[i].mtd->dev.parent = &dev->dev;
331 err = 0;
332 if (info->list_size == 1) {
333 info->cmtd = info->list[0].mtd;
334 } else if (info->list_size > 1) {
336 * We detected multiple devices. Concatenate them together.
338 info->cmtd = mtd_concat_create(mtd_list, info->list_size,
339 dev_name(&dev->dev));
340 if (info->cmtd == NULL)
341 err = -ENXIO;
343 if (err)
344 goto err_out;
346 #ifdef CONFIG_MTD_PARTITIONS
347 part_probe_types = of_get_probes(dp);
348 err = parse_mtd_partitions(info->cmtd, part_probe_types,
349 &info->parts, 0);
350 if (err < 0) {
351 of_free_probes(part_probe_types);
352 goto err_out;
354 of_free_probes(part_probe_types);
356 #ifdef CONFIG_MTD_OF_PARTS
357 if (err == 0) {
358 err = of_mtd_parse_partitions(&dev->dev, dp, &info->parts);
359 if (err < 0)
360 goto err_out;
362 #endif
364 if (err == 0) {
365 err = parse_obsolete_partitions(dev, info, dp);
366 if (err < 0)
367 goto err_out;
370 if (err > 0)
371 add_mtd_partitions(info->cmtd, info->parts, err);
372 else
373 #endif
374 add_mtd_device(info->cmtd);
376 kfree(mtd_list);
378 return 0;
380 err_out:
381 kfree(mtd_list);
382 err_flash_remove:
383 of_flash_remove(dev);
385 return err;
388 static struct of_device_id of_flash_match[] = {
390 .compatible = "cfi-flash",
391 .data = (void *)"cfi_probe",
394 /* FIXME: JEDEC chips can't be safely and reliably
395 * probed, although the mtd code gets it right in
396 * practice most of the time. We should use the
397 * vendor and device ids specified by the binding to
398 * bypass the heuristic probe code, but the mtd layer
399 * provides, at present, no interface for doing so
400 * :(. */
401 .compatible = "jedec-flash",
402 .data = (void *)"jedec_probe",
405 .compatible = "mtd-ram",
406 .data = (void *)"map_ram",
409 .type = "rom",
410 .compatible = "direct-mapped"
412 { },
414 MODULE_DEVICE_TABLE(of, of_flash_match);
416 static struct platform_driver of_flash_driver = {
417 .driver = {
418 .name = "of-flash",
419 .owner = THIS_MODULE,
420 .of_match_table = of_flash_match,
422 .probe = of_flash_probe,
423 .remove = of_flash_remove,
426 static int __init of_flash_init(void)
428 return platform_driver_register(&of_flash_driver);
431 static void __exit of_flash_exit(void)
433 platform_driver_unregister(&of_flash_driver);
436 module_init(of_flash_init);
437 module_exit(of_flash_exit);
439 MODULE_LICENSE("GPL");
440 MODULE_AUTHOR("Vitaly Wool <vwool@ru.mvista.com>");
441 MODULE_DESCRIPTION("Device tree based MTD map driver");