901bb6dd3cfaf68a68cf0e50b98a5108a0e56cec
[openwrt/openwrt.git] / target / linux / bcm53xx / patches-6.1 / 800-nvmem-brcm_nvram-store-a-copy-of-NVRAM-content.patch
1 From a18378409fee1cac0f0c58a4770ff557b498c778 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3 Date: Fri, 1 Sep 2023 10:44:26 +0200
4 Subject: [PATCH] nvmem: brcm_nvram: store a copy of NVRAM content
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
10 ---
11 drivers/nvmem/brcm_nvram.c | 54 +++++++++++++++++++-------------------
12 1 file changed, 27 insertions(+), 27 deletions(-)
13
14 --- a/drivers/nvmem/brcm_nvram.c
15 +++ b/drivers/nvmem/brcm_nvram.c
16 @@ -19,7 +19,7 @@
17
18 struct brcm_nvram {
19 struct device *dev;
20 - void __iomem *base;
21 + uint8_t *data;
22 struct nvmem_cell_info *cells;
23 int ncells;
24 };
25 @@ -36,10 +36,8 @@ static int brcm_nvram_read(void *context
26 size_t bytes)
27 {
28 struct brcm_nvram *priv = context;
29 - u8 *dst = val;
30
31 - while (bytes--)
32 - *dst++ = readb(priv->base + offset++);
33 + memcpy(val, priv->data + offset, bytes);
34
35 return 0;
36 }
37 @@ -110,35 +108,27 @@ static int brcm_nvram_add_cells(struct b
38
39 static int brcm_nvram_parse(struct brcm_nvram *priv)
40 {
41 + struct brcm_nvram_header *header = (struct brcm_nvram_header *)priv->data;
42 struct device *dev = priv->dev;
43 - struct brcm_nvram_header header;
44 - uint8_t *data;
45 + uint8_t tmp;
46 size_t len;
47 int err;
48
49 - memcpy_fromio(&header, priv->base, sizeof(header));
50 -
51 - if (memcmp(header.magic, NVRAM_MAGIC, 4)) {
52 + if (memcmp(header->magic, NVRAM_MAGIC, 4)) {
53 dev_err(dev, "Invalid NVRAM magic\n");
54 return -EINVAL;
55 }
56
57 - len = le32_to_cpu(header.len);
58 + len = le32_to_cpu(header->len);
59
60 - data = kzalloc(len, GFP_KERNEL);
61 - if (!data)
62 - return -ENOMEM;
63 -
64 - memcpy_fromio(data, priv->base, len);
65 - data[len - 1] = '\0';
66 + tmp = priv->data[len - 1];
67 + priv->data[len - 1] = '\0';
68
69 - err = brcm_nvram_add_cells(priv, data, len);
70 - if (err) {
71 + err = brcm_nvram_add_cells(priv, priv->data, len);
72 + if (err)
73 dev_err(dev, "Failed to add cells: %d\n", err);
74 - return err;
75 - }
76
77 - kfree(data);
78 + priv->data[len - 1] = tmp;
79
80 return 0;
81 }
82 @@ -150,8 +140,10 @@ static int brcm_nvram_probe(struct platf
83 .reg_read = brcm_nvram_read,
84 };
85 struct device *dev = &pdev->dev;
86 - struct resource *res;
87 struct brcm_nvram *priv;
88 + struct resource *res;
89 + void __iomem *base;
90 + size_t size;
91 int err;
92
93 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
94 @@ -159,21 +151,29 @@ static int brcm_nvram_probe(struct platf
95 return -ENOMEM;
96 priv->dev = dev;
97
98 - priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
99 - if (IS_ERR(priv->base))
100 - return PTR_ERR(priv->base);
101 + base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
102 + if (IS_ERR(base))
103 + return PTR_ERR(base);
104 +
105 + size = resource_size(res);
106 +
107 + priv->data = kzalloc(size, GFP_KERNEL);
108 + if (!priv->data)
109 + return -ENOMEM;
110 +
111 + memcpy_fromio(priv->data, base, size);
112
113 err = brcm_nvram_parse(priv);
114 if (err)
115 return err;
116
117 - bcm47xx_nvram_init_from_iomem(priv->base, resource_size(res));
118 + bcm47xx_nvram_init_from_iomem(base, size);
119
120 config.dev = dev;
121 config.cells = priv->cells;
122 config.ncells = priv->ncells;
123 config.priv = priv;
124 - config.size = resource_size(res);
125 + config.size = size;
126
127 return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config));
128 }