diff options
-rw-r--r-- | Documentation/devicetree/bindings/mtd/partition.txt | 36 | ||||
-rw-r--r-- | drivers/mtd/ofpart.c | 7 |
2 files changed, 39 insertions, 4 deletions
diff --git a/Documentation/devicetree/bindings/mtd/partition.txt b/Documentation/devicetree/bindings/mtd/partition.txt index 6e1f61f1e789..9315ac96b49b 100644 --- a/Documentation/devicetree/bindings/mtd/partition.txt +++ b/Documentation/devicetree/bindings/mtd/partition.txt | |||
@@ -5,8 +5,12 @@ on platforms which have strong conventions about which portions of a flash are | |||
5 | used for what purposes, but which don't use an on-flash partition table such | 5 | used for what purposes, but which don't use an on-flash partition table such |
6 | as RedBoot. | 6 | as RedBoot. |
7 | 7 | ||
8 | #address-cells & #size-cells must both be present in the mtd device and be | 8 | #address-cells & #size-cells must both be present in the mtd device. There are |
9 | equal to 1. | 9 | two valid values for both: |
10 | <1>: for partitions that require a single 32-bit cell to represent their | ||
11 | size/address (aka the value is below 4 GiB) | ||
12 | <2>: for partitions that require two 32-bit cells to represent their | ||
13 | size/address (aka the value is 4 GiB or greater). | ||
10 | 14 | ||
11 | Required properties: | 15 | Required properties: |
12 | - reg : The partition's offset and size within the mtd bank. | 16 | - reg : The partition's offset and size within the mtd bank. |
@@ -36,3 +40,31 @@ flash@0 { | |||
36 | reg = <0x0100000 0x200000>; | 40 | reg = <0x0100000 0x200000>; |
37 | }; | 41 | }; |
38 | }; | 42 | }; |
43 | |||
44 | flash@1 { | ||
45 | #address-cells = <1>; | ||
46 | #size-cells = <2>; | ||
47 | |||
48 | /* a 4 GiB partition */ | ||
49 | partition@0 { | ||
50 | label = "filesystem"; | ||
51 | reg = <0x00000000 0x1 0x00000000>; | ||
52 | }; | ||
53 | }; | ||
54 | |||
55 | flash@2 { | ||
56 | #address-cells = <2>; | ||
57 | #size-cells = <2>; | ||
58 | |||
59 | /* an 8 GiB partition */ | ||
60 | partition@0 { | ||
61 | label = "filesystem #1"; | ||
62 | reg = <0x0 0x00000000 0x2 0x00000000>; | ||
63 | }; | ||
64 | |||
65 | /* a 4 GiB partition */ | ||
66 | partition@200000000 { | ||
67 | label = "filesystem #2"; | ||
68 | reg = <0x2 0x00000000 0x1 0x00000000>; | ||
69 | }; | ||
70 | }; | ||
diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c index 30bd907a260a..553d6d6d5603 100644 --- a/drivers/mtd/ofpart.c +++ b/drivers/mtd/ofpart.c | |||
@@ -55,6 +55,7 @@ static int parse_ofpart_partitions(struct mtd_info *master, | |||
55 | while ((pp = of_get_next_child(node, pp))) { | 55 | while ((pp = of_get_next_child(node, pp))) { |
56 | const __be32 *reg; | 56 | const __be32 *reg; |
57 | int len; | 57 | int len; |
58 | int a_cells, s_cells; | ||
58 | 59 | ||
59 | reg = of_get_property(pp, "reg", &len); | 60 | reg = of_get_property(pp, "reg", &len); |
60 | if (!reg) { | 61 | if (!reg) { |
@@ -62,8 +63,10 @@ static int parse_ofpart_partitions(struct mtd_info *master, | |||
62 | continue; | 63 | continue; |
63 | } | 64 | } |
64 | 65 | ||
65 | (*pparts)[i].offset = be32_to_cpu(reg[0]); | 66 | a_cells = of_n_addr_cells(pp); |
66 | (*pparts)[i].size = be32_to_cpu(reg[1]); | 67 | s_cells = of_n_size_cells(pp); |
68 | (*pparts)[i].offset = of_read_number(reg, a_cells); | ||
69 | (*pparts)[i].size = of_read_number(reg + a_cells, s_cells); | ||
67 | 70 | ||
68 | partname = of_get_property(pp, "label", &len); | 71 | partname = of_get_property(pp, "label", &len); |
69 | if (!partname) | 72 | if (!partname) |