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_platform.h>
26 #include <linux/slab.h>
28 struct of_flash_list
{
35 struct mtd_info
*cmtd
;
36 #ifdef CONFIG_MTD_PARTITIONS
37 struct mtd_partition
*parts
;
39 int list_size
; /* number of elements in of_flash_list */
40 struct of_flash_list list
[0];
43 #ifdef CONFIG_MTD_PARTITIONS
44 #define OF_FLASH_PARTS(info) ((info)->parts)
46 static int parse_obsolete_partitions(struct of_device
*dev
,
47 struct of_flash
*info
,
48 struct device_node
*dp
)
50 int i
, plen
, nr_parts
;
56 part
= of_get_property(dp
, "partitions", &plen
);
58 return 0; /* No partitions found */
60 dev_warn(&dev
->dev
, "Device tree uses obsolete partition map binding\n");
62 nr_parts
= plen
/ sizeof(part
[0]);
64 info
->parts
= kzalloc(nr_parts
* sizeof(*info
->parts
), GFP_KERNEL
);
68 names
= of_get_property(dp
, "partition-names", &plen
);
70 for (i
= 0; i
< nr_parts
; i
++) {
71 info
->parts
[i
].offset
= part
->offset
;
72 info
->parts
[i
].size
= part
->len
& ~1;
73 if (part
->len
& 1) /* bit 0 set signifies read only partition */
74 info
->parts
[i
].mask_flags
= MTD_WRITEABLE
;
76 if (names
&& (plen
> 0)) {
77 int len
= strlen(names
) + 1;
79 info
->parts
[i
].name
= (char *)names
;
83 info
->parts
[i
].name
= "unnamed";
91 #else /* MTD_PARTITIONS */
92 #define OF_FLASH_PARTS(info) (0)
93 #define parse_partitions(info, dev) (0)
94 #endif /* MTD_PARTITIONS */
96 static int of_flash_remove(struct of_device
*dev
)
98 struct of_flash
*info
;
101 info
= dev_get_drvdata(&dev
->dev
);
104 dev_set_drvdata(&dev
->dev
, NULL
);
106 #ifdef CONFIG_MTD_CONCAT
107 if (info
->cmtd
!= info
->list
[0].mtd
) {
108 del_mtd_device(info
->cmtd
);
109 mtd_concat_destroy(info
->cmtd
);
114 if (OF_FLASH_PARTS(info
)) {
115 del_mtd_partitions(info
->cmtd
);
116 kfree(OF_FLASH_PARTS(info
));
118 del_mtd_device(info
->cmtd
);
122 for (i
= 0; i
< info
->list_size
; i
++) {
123 if (info
->list
[i
].mtd
)
124 map_destroy(info
->list
[i
].mtd
);
126 if (info
->list
[i
].map
.virt
)
127 iounmap(info
->list
[i
].map
.virt
);
129 if (info
->list
[i
].res
) {
130 release_resource(info
->list
[i
].res
);
131 kfree(info
->list
[i
].res
);
140 /* Helper function to handle probing of the obsolete "direct-mapped"
141 * compatible binding, which has an extra "probe-type" property
142 * describing the type of flash probe necessary. */
143 static struct mtd_info
* __devinit
obsolete_probe(struct of_device
*dev
,
144 struct map_info
*map
)
146 struct device_node
*dp
= dev
->dev
.of_node
;
147 const char *of_probe
;
148 struct mtd_info
*mtd
;
149 static const char *rom_probe_types
[]
150 = { "cfi_probe", "jedec_probe", "map_rom"};
153 dev_warn(&dev
->dev
, "Device tree uses obsolete \"direct-mapped\" "
156 of_probe
= of_get_property(dp
, "probe-type", NULL
);
158 for (i
= 0; i
< ARRAY_SIZE(rom_probe_types
); i
++) {
159 mtd
= do_map_probe(rom_probe_types
[i
], map
);
164 } else if (strcmp(of_probe
, "CFI") == 0) {
165 return do_map_probe("cfi_probe", map
);
166 } else if (strcmp(of_probe
, "JEDEC") == 0) {
167 return do_map_probe("jedec_probe", map
);
169 if (strcmp(of_probe
, "ROM") != 0)
170 dev_warn(&dev
->dev
, "obsolete_probe: don't know probe "
171 "type '%s', mapping as rom\n", of_probe
);
172 return do_map_probe("mtd_rom", map
);
176 #ifdef CONFIG_MTD_PARTITIONS
177 /* When partitions are set we look for a linux,part-probe property which
178 specifies the list of partition probers to use. If none is given then the
179 default is use. These take precedence over other device tree
181 static const char *part_probe_types_def
[] = { "cmdlinepart", "RedBoot", NULL
};
182 static const char ** __devinit
of_get_probes(struct device_node
*dp
)
190 cp
= of_get_property(dp
, "linux,part-probe", &cplen
);
192 return part_probe_types_def
;
195 for (l
= 0; l
!= cplen
; l
++)
199 res
= kzalloc((count
+ 1)*sizeof(*res
), GFP_KERNEL
);
211 static void __devinit
of_free_probes(const char **probes
)
213 if (probes
!= part_probe_types_def
)
218 static int __devinit
of_flash_probe(struct of_device
*dev
,
219 const struct of_device_id
*match
)
221 #ifdef CONFIG_MTD_PARTITIONS
222 const char **part_probe_types
;
224 struct device_node
*dp
= dev
->dev
.of_node
;
226 struct of_flash
*info
;
227 const char *probe_type
= match
->data
;
234 struct mtd_info
**mtd_list
= NULL
;
235 resource_size_t res_size
;
237 reg_tuple_size
= (of_n_addr_cells(dp
) + of_n_size_cells(dp
)) * sizeof(u32
);
240 * Get number of "reg" tuples. Scan for MTD devices on area's
241 * described by each "reg" region. This makes it possible (including
242 * the concat support) to support the Intel P30 48F4400 chips which
243 * consists internally of 2 non-identical NOR chips on one die.
245 p
= of_get_property(dp
, "reg", &count
);
246 if (count
% reg_tuple_size
!= 0) {
247 dev_err(&dev
->dev
, "Malformed reg property on %s\n",
248 dev
->dev
.of_node
->full_name
);
250 goto err_flash_remove
;
252 count
/= reg_tuple_size
;
255 info
= kzalloc(sizeof(struct of_flash
) +
256 sizeof(struct of_flash_list
) * count
, GFP_KERNEL
);
258 goto err_flash_remove
;
260 dev_set_drvdata(&dev
->dev
, info
);
262 mtd_list
= kzalloc(sizeof(*mtd_list
) * count
, GFP_KERNEL
);
264 goto err_flash_remove
;
266 for (i
= 0; i
< count
; i
++) {
268 if (of_address_to_resource(dp
, i
, &res
)) {
269 dev_err(&dev
->dev
, "Can't get IO address from device"
274 dev_dbg(&dev
->dev
, "of_flash device: %.8llx-%.8llx\n",
275 (unsigned long long)res
.start
,
276 (unsigned long long)res
.end
);
279 res_size
= resource_size(&res
);
280 info
->list
[i
].res
= request_mem_region(res
.start
, res_size
,
281 dev_name(&dev
->dev
));
282 if (!info
->list
[i
].res
)
286 width
= of_get_property(dp
, "bank-width", NULL
);
288 dev_err(&dev
->dev
, "Can't get bank width from device"
293 info
->list
[i
].map
.name
= dev_name(&dev
->dev
);
294 info
->list
[i
].map
.phys
= res
.start
;
295 info
->list
[i
].map
.size
= res_size
;
296 info
->list
[i
].map
.bankwidth
= *width
;
299 info
->list
[i
].map
.virt
= ioremap(info
->list
[i
].map
.phys
,
300 info
->list
[i
].map
.size
);
301 if (!info
->list
[i
].map
.virt
) {
302 dev_err(&dev
->dev
, "Failed to ioremap() flash"
307 simple_map_init(&info
->list
[i
].map
);
310 info
->list
[i
].mtd
= do_map_probe(probe_type
,
313 info
->list
[i
].mtd
= obsolete_probe(dev
,
316 mtd_list
[i
] = info
->list
[i
].mtd
;
319 if (!info
->list
[i
].mtd
) {
320 dev_err(&dev
->dev
, "do_map_probe() failed\n");
325 info
->list
[i
].mtd
->owner
= THIS_MODULE
;
326 info
->list
[i
].mtd
->dev
.parent
= &dev
->dev
;
330 if (info
->list_size
== 1) {
331 info
->cmtd
= info
->list
[0].mtd
;
332 } else if (info
->list_size
> 1) {
334 * We detected multiple devices. Concatenate them together.
336 #ifdef CONFIG_MTD_CONCAT
337 info
->cmtd
= mtd_concat_create(mtd_list
, info
->list_size
,
338 dev_name(&dev
->dev
));
339 if (info
->cmtd
== NULL
)
342 printk(KERN_ERR
"physmap_of: multiple devices "
343 "found but MTD concat support disabled.\n");
350 #ifdef CONFIG_MTD_PARTITIONS
351 part_probe_types
= of_get_probes(dp
);
352 err
= parse_mtd_partitions(info
->cmtd
, part_probe_types
,
355 of_free_probes(part_probe_types
);
358 of_free_probes(part_probe_types
);
360 #ifdef CONFIG_MTD_OF_PARTS
362 err
= of_mtd_parse_partitions(&dev
->dev
, dp
, &info
->parts
);
369 err
= parse_obsolete_partitions(dev
, info
, dp
);
375 add_mtd_partitions(info
->cmtd
, info
->parts
, err
);
378 add_mtd_device(info
->cmtd
);
387 of_flash_remove(dev
);
392 static struct of_device_id of_flash_match
[] = {
394 .compatible
= "cfi-flash",
395 .data
= (void *)"cfi_probe",
398 /* FIXME: JEDEC chips can't be safely and reliably
399 * probed, although the mtd code gets it right in
400 * practice most of the time. We should use the
401 * vendor and device ids specified by the binding to
402 * bypass the heuristic probe code, but the mtd layer
403 * provides, at present, no interface for doing so
405 .compatible
= "jedec-flash",
406 .data
= (void *)"jedec_probe",
409 .compatible
= "mtd-ram",
410 .data
= (void *)"map_ram",
414 .compatible
= "direct-mapped"
418 MODULE_DEVICE_TABLE(of
, of_flash_match
);
420 static struct of_platform_driver of_flash_driver
= {
423 .owner
= THIS_MODULE
,
424 .of_match_table
= of_flash_match
,
426 .probe
= of_flash_probe
,
427 .remove
= of_flash_remove
,
430 static int __init
of_flash_init(void)
432 return of_register_platform_driver(&of_flash_driver
);
435 static void __exit
of_flash_exit(void)
437 of_unregister_platform_driver(&of_flash_driver
);
440 module_init(of_flash_init
);
441 module_exit(of_flash_exit
);
443 MODULE_LICENSE("GPL");
444 MODULE_AUTHOR("Vitaly Wool <vwool@ru.mvista.com>");
445 MODULE_DESCRIPTION("Device tree based MTD map driver");