mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
bea4f50207
Improve EEPROME load patches. Reorganize and rework them. The current patch are bugged and with the case of MTD loading, leaks and never free the EEPROM read values. Also add support for loading EEPROM using NVMEM cells. As a cleanup, change the binding to swap EEPROM read from mtd to ralink,eeprom-swap and generilize it. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
97 lines
2.4 KiB
Diff
97 lines
2.4 KiB
Diff
From 9008cdacdc41f8233f4444b86cf3a17201686e2d Mon Sep 17 00:00:00 2001
|
|
From: Shiji Yang <yangshiji66@outlook.com>
|
|
Date: Tue, 18 Jul 2023 20:18:16 +0800
|
|
Subject: [PATCH 5/5] wifi: rt2x00: support loading eeprom from NVMEM cells
|
|
|
|
This patch allows rt2x00 to load eeprom from "eeprom" NVMEM cell.
|
|
|
|
Example:
|
|
|
|
/* load eeprom from NVMEM provider 'eep' */
|
|
&wmac {
|
|
nvmem-cells = <&eep>;
|
|
nvmem-cell-names = "eeprom";
|
|
};
|
|
|
|
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
---
|
|
.../net/wireless/ralink/rt2x00/rt2x00eeprom.c | 41 ++++++++++++++++++-
|
|
1 file changed, 40 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
|
@@ -14,12 +14,12 @@
|
|
#include <linux/mtd/mtd.h>
|
|
#include <linux/mtd/partitions.h>
|
|
#endif
|
|
+#include <linux/nvmem-consumer.h>
|
|
#include <linux/of.h>
|
|
|
|
#include "rt2x00.h"
|
|
#include "rt2x00soc.h"
|
|
|
|
-#if IS_ENABLED(CONFIG_MTD)
|
|
static void rt2800lib_eeprom_swap(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
struct device_node *np = rt2x00dev->dev->of_node;
|
|
@@ -33,6 +33,7 @@ static void rt2800lib_eeprom_swap(struct
|
|
rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
|
|
}
|
|
|
|
+#if IS_ENABLED(CONFIG_MTD)
|
|
static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
int ret = -EINVAL;
|
|
@@ -88,6 +89,40 @@ static int rt2800lib_read_eeprom_mtd(str
|
|
}
|
|
#endif
|
|
|
|
+static int rt2800lib_read_eeprom_nvmem(struct rt2x00_dev *rt2x00dev)
|
|
+{
|
|
+ struct device_node *np = rt2x00dev->dev->of_node;
|
|
+ unsigned int len = rt2x00dev->ops->eeprom_size;
|
|
+ struct nvmem_cell *cell;
|
|
+ const void *data;
|
|
+ size_t retlen;
|
|
+ int ret = 0;
|
|
+
|
|
+ cell = of_nvmem_cell_get(np, "eeprom");
|
|
+ if (IS_ERR(cell))
|
|
+ return PTR_ERR(cell);
|
|
+
|
|
+ data = nvmem_cell_read(cell, &retlen);
|
|
+ nvmem_cell_put(cell);
|
|
+
|
|
+ if (IS_ERR(data))
|
|
+ return PTR_ERR(data);
|
|
+
|
|
+ if (retlen != len) {
|
|
+ dev_err(rt2x00dev->dev, "invalid eeprom size, required: 0x%04x\n", len);
|
|
+ ret = -EINVAL;
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ memcpy(rt2x00dev->eeprom, data, len);
|
|
+
|
|
+ rt2800lib_eeprom_swap(rt2x00dev);
|
|
+
|
|
+exit:
|
|
+ kfree(data);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static const char *
|
|
rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
@@ -164,5 +199,9 @@ int rt2x00lib_read_eeprom(struct rt2x00_
|
|
return 0;
|
|
#endif
|
|
|
|
+ ret = rt2800lib_read_eeprom_nvmem(rt2x00dev);
|
|
+ if (!ret)
|
|
+ return 0;
|
|
+
|
|
return rt2x00lib_read_eeprom_file(rt2x00dev);
|
|
}
|