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
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
11 drivers/nvmem/brcm_nvram.c | 54 +++++++++++++++++++-------------------
12 1 file changed, 27 insertions(+), 27 deletions(-)
14 --- a/drivers/nvmem/brcm_nvram.c
15 +++ b/drivers/nvmem/brcm_nvram.c
22 struct nvmem_cell_info *cells;
25 @@ -36,10 +36,8 @@ static int brcm_nvram_read(void *context
28 struct brcm_nvram *priv = context;
32 - *dst++ = readb(priv->base + offset++);
33 + memcpy(val, priv->data + offset, bytes);
37 @@ -110,35 +108,27 @@ static int brcm_nvram_add_cells(struct b
39 static int brcm_nvram_parse(struct brcm_nvram *priv)
41 + struct brcm_nvram_header *header = (struct brcm_nvram_header *)priv->data;
42 struct device *dev = priv->dev;
43 - struct brcm_nvram_header header;
49 - memcpy_fromio(&header, priv->base, sizeof(header));
51 - if (memcmp(header.magic, NVRAM_MAGIC, 4)) {
52 + if (memcmp(header->magic, NVRAM_MAGIC, 4)) {
53 dev_err(dev, "Invalid NVRAM magic\n");
57 - len = le32_to_cpu(header.len);
58 + len = le32_to_cpu(header->len);
60 - data = kzalloc(len, GFP_KERNEL);
64 - memcpy_fromio(data, priv->base, len);
65 - data[len - 1] = '\0';
66 + tmp = priv->data[len - 1];
67 + priv->data[len - 1] = '\0';
69 - err = brcm_nvram_add_cells(priv, data, len);
71 + err = brcm_nvram_add_cells(priv, priv->data, len);
73 dev_err(dev, "Failed to add cells: %d\n", err);
78 + priv->data[len - 1] = tmp;
82 @@ -150,8 +140,10 @@ static int brcm_nvram_probe(struct platf
83 .reg_read = brcm_nvram_read,
85 struct device *dev = &pdev->dev;
86 - struct resource *res;
87 struct brcm_nvram *priv;
88 + struct resource *res;
93 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
94 @@ -159,21 +151,29 @@ static int brcm_nvram_probe(struct platf
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);
103 + return PTR_ERR(base);
105 + size = resource_size(res);
107 + priv->data = kzalloc(size, GFP_KERNEL);
111 + memcpy_fromio(priv->data, base, size);
113 err = brcm_nvram_parse(priv);
117 - bcm47xx_nvram_init_from_iomem(priv->base, resource_size(res));
118 + bcm47xx_nvram_init_from_iomem(base, size);
121 config.cells = priv->cells;
122 config.ncells = priv->ncells;
124 - config.size = resource_size(res);
125 + config.size = size;
127 return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config));