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>
25 #include <linux/of_address.h>
26 #include <linux/of_platform.h>
27 #include <linux/slab.h>
29 struct of_flash_list
{
36 struct mtd_info
*cmtd
;
37 #ifdef CONFIG_MTD_PARTITIONS
38 struct mtd_partition
*parts
;
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
;
57 part
= of_get_property(dp
, "partitions", &plen
);
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
);
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
;
84 info
->parts
[i
].name
= "unnamed";
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
;
102 info
= dev_get_drvdata(&dev
->dev
);
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
);
113 if (OF_FLASH_PARTS(info
)) {
114 del_mtd_partitions(info
->cmtd
);
115 kfree(OF_FLASH_PARTS(info
));
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
);
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"};
152 dev_warn(&dev
->dev
, "Device tree uses obsolete \"direct-mapped\" "
155 of_probe
= of_get_property(dp
, "probe-type", NULL
);
157 for (i
= 0; i
< ARRAY_SIZE(rom_probe_types
); i
++) {
158 mtd
= do_map_probe(rom_probe_types
[i
], map
);
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
);
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
180 static const char *part_probe_types_def
[] = { "cmdlinepart", "RedBoot", NULL
};
181 static const char ** __devinit
of_get_probes(struct device_node
*dp
)
189 cp
= of_get_property(dp
, "linux,part-probe", &cplen
);
191 return part_probe_types_def
;
194 for (l
= 0; l
!= cplen
; l
++)
198 res
= kzalloc((count
+ 1)*sizeof(*res
), GFP_KERNEL
);
210 static void __devinit
of_free_probes(const char **probes
)
212 if (probes
!= part_probe_types_def
)
217 static int __devinit
of_flash_probe(struct platform_device
*dev
)
219 #ifdef CONFIG_MTD_PARTITIONS
220 const char **part_probe_types
;
222 struct device_node
*dp
= dev
->dev
.of_node
;
224 struct of_flash
*info
;
225 const char *probe_type
;
232 struct mtd_info
**mtd_list
= NULL
;
233 resource_size_t res_size
;
235 if (!dev
->dev
.of_match
)
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
);
252 goto err_flash_remove
;
254 count
/= reg_tuple_size
;
257 info
= kzalloc(sizeof(struct of_flash
) +
258 sizeof(struct of_flash_list
) * count
, GFP_KERNEL
);
260 goto err_flash_remove
;
262 dev_set_drvdata(&dev
->dev
, info
);
264 mtd_list
= kzalloc(sizeof(*mtd_list
) * count
, GFP_KERNEL
);
266 goto err_flash_remove
;
268 for (i
= 0; i
< count
; i
++) {
270 if (of_address_to_resource(dp
, i
, &res
)) {
272 * Continue with next register tuple if this
273 * one is not mappable
278 dev_dbg(&dev
->dev
, "of_flash device: %pR\n", &res
);
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
)
288 width
= of_get_property(dp
, "bank-width", NULL
);
290 dev_err(&dev
->dev
, "Can't get bank width from device"
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
);
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"
309 simple_map_init(&info
->list
[i
].map
);
312 info
->list
[i
].mtd
= do_map_probe(probe_type
,
315 info
->list
[i
].mtd
= obsolete_probe(dev
,
318 mtd_list
[i
] = info
->list
[i
].mtd
;
321 if (!info
->list
[i
].mtd
) {
322 dev_err(&dev
->dev
, "do_map_probe() failed\n");
327 info
->list
[i
].mtd
->owner
= THIS_MODULE
;
328 info
->list
[i
].mtd
->dev
.parent
= &dev
->dev
;
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
)
346 #ifdef CONFIG_MTD_PARTITIONS
347 part_probe_types
= of_get_probes(dp
);
348 err
= parse_mtd_partitions(info
->cmtd
, part_probe_types
,
351 of_free_probes(part_probe_types
);
354 of_free_probes(part_probe_types
);
356 #ifdef CONFIG_MTD_OF_PARTS
358 err
= of_mtd_parse_partitions(&dev
->dev
, dp
, &info
->parts
);
365 err
= parse_obsolete_partitions(dev
, info
, dp
);
371 add_mtd_partitions(info
->cmtd
, info
->parts
, err
);
374 add_mtd_device(info
->cmtd
);
383 of_flash_remove(dev
);
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
401 .compatible
= "jedec-flash",
402 .data
= (void *)"jedec_probe",
405 .compatible
= "mtd-ram",
406 .data
= (void *)"map_ram",
410 .compatible
= "direct-mapped"
414 MODULE_DEVICE_TABLE(of
, of_flash_match
);
416 static struct platform_driver of_flash_driver
= {
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");