1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
From 0600e3d81628002a5cd80cf83ee454851b0063c0 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sun, 7 Mar 2021 18:19:26 +0100
Subject: mtd: parsers: trx: Allow to specify brcm,trx-magic in DT
Buffalo uses a different TRX magic for every device, to be able to use
this trx parser, make it possible to specify the TRX magic in device
tree. If no TRX magic is specified in device tree, the standard value
will be used. This value should only be specified if a vendor chooses to
use a non standard TRX magic.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
.../bindings/mtd/partitions/brcm,trx.txt | 5 +++++
drivers/mtd/parsers/parser_trx.c | 21 ++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
--- a/Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt
+++ b/Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt
@@ -28,6 +28,11 @@ detected by a software parsing TRX heade
Required properties:
- compatible : (required) must be "brcm,trx"
+Optional properties:
+
+- brcm,trx-magic: TRX magic, if it is different from the default magic
+ 0x30524448 as a u32.
+
Example:
flash@0 {
--- a/drivers/mtd/parsers/parser_trx.c
+++ b/drivers/mtd/parsers/parser_trx.c
@@ -74,6 +74,24 @@ out_default:
return "rootfs";
}
+static uint32_t parser_trx_get_magic(struct mtd_info *mtd)
+{
+ uint32_t trx_magic = TRX_MAGIC;
+ struct device_node *np;
+ int err;
+
+ np = mtd_get_of_node(mtd);
+ if (!np)
+ return trx_magic;
+
+ /* Get different magic from device tree if specified */
+ err = of_property_read_u32(np, "brcm,trx-magic", &trx_magic);
+ if (err != 0 && err != -EINVAL)
+ pr_err("failed to parse \"brcm,trx-magic\" DT attribute, use default: %d\n", err);
+
+ return trx_magic;
+}
+
static int parser_trx_parse(struct mtd_info *mtd,
const struct mtd_partition **pparts,
struct mtd_part_parser_data *data)
@@ -83,6 +101,7 @@ static int parser_trx_parse(struct mtd_i
struct trx_header trx;
size_t bytes_read;
uint8_t curr_part = 0, i = 0;
+ uint32_t trx_magic = parser_trx_get_magic(mtd);
int err;
parts = kcalloc(TRX_PARSER_MAX_PARTS, sizeof(struct mtd_partition),
@@ -97,7 +116,7 @@ static int parser_trx_parse(struct mtd_i
return err;
}
- if (trx.magic != TRX_MAGIC) {
+ if (trx.magic != trx_magic) {
kfree(parts);
return -ENOENT;
}
|