From e7bceae83ce8c99878905952d5393ff4aabe6ea3 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Sat, 25 Mar 2023 14:53:55 +0100 Subject: [PATCH 1/2] wifi: mt76: split get_of_eeprom in subfunction In preparation for NVMEM support, split get_of_eeprom() in subfunction to tidy the code and facilitate the addition of alternative method to get eeprom data. No behaviour change intended. While at it also drop OF ifdef checks as OF have stubs and calling of_get_property would result in the same error returned. Signed-off-by: Christian Marangi --- eeprom.c | 59 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/eeprom.c b/eeprom.c index ea54b7af7..a722f7186 100644 --- a/eeprom.c +++ b/eeprom.c @@ -9,31 +9,35 @@ #include #include "mt76.h" -int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) +static int mt76_get_of_eeprom_data(struct mt76_dev *dev, void *eep, int len) { -#if defined(CONFIG_OF) && defined(CONFIG_MTD) struct device_node *np = dev->dev->of_node; - struct mtd_info *mtd; - const __be32 *list; const void *data; - const char *part; - phandle phandle; int size; - size_t retlen; - int ret; - if (!np) + data = of_get_property(np, "mediatek,eeprom-data", &size); + if (!data) return -ENOENT; - data = of_get_property(np, "mediatek,eeprom-data", &size); - if (data) { - if (size > len) - return -EINVAL; + if (size > len) + return -EINVAL; - memcpy(eep, data, size); + memcpy(eep, data, size); - return 0; - } + return 0; +} + +#ifdef CONFIG_MTD +static int mt76_get_of_epprom_from_mtd(struct mt76_dev *dev, void *eep, int offset, int len) +{ + struct device_node *np = dev->dev->of_node; + struct mtd_info *mtd; + const __be32 *list; + const char *part; + phandle phandle; + int size; + size_t retlen; + int ret; list = of_get_property(np, "mediatek,mtd-eeprom", &size); if (!list) @@ -96,9 +100,28 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) out_put_node: of_node_put(np); return ret; -#else - return -ENOENT; +} +#endif + +int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) +{ + struct device_node *np = dev->dev->of_node; + int ret; + + if (!np) + return -ENOENT; + + ret = mt76_get_of_eeprom_data(dev, eep, len); + if (!ret) + return 0; + +#ifdef CONFIG_MTD + ret = mt76_get_of_epprom_from_mtd(dev, eep, offset, len); + if (!ret) + return 0; #endif + + return ret; } EXPORT_SYMBOL_GPL(mt76_get_of_eeprom); From 1a51af711bf2d25d4e72027b7099f8a503ecd20f Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Sat, 25 Mar 2023 14:56:52 +0100 Subject: [PATCH 2/2] wifi: mt76: add support for providing eeprom in nvmem cells Add support for providing eeprom in nvmem cells by adding nvmem cell as an alternative source for mt76_get_of_eeprom(). Nvmem cells will follow standard nvmem cell definition and needs to be called eeprom' to be correctly identified. Signed-off-by: Christian Marangi --- eeprom.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/eeprom.c b/eeprom.c index a722f7186..648bf7697 100644 --- a/eeprom.c +++ b/eeprom.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "mt76.h" @@ -103,6 +104,37 @@ static int mt76_get_of_epprom_from_mtd(struct mt76_dev *dev, void *eep, int offs } #endif +static int mt76_get_of_epprom_from_nvmem(struct mt76_dev *dev, void *eep, int len) +{ + struct device_node *np = dev->dev->of_node; + 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) { + ret = -EINVAL; + goto exit; + } + + memcpy(eep, data, len); + +exit: + kfree(data); + + return ret; +} + int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) { struct device_node *np = dev->dev->of_node; @@ -121,6 +153,8 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len) return 0; #endif + ret = mt76_get_of_epprom_from_nvmem(dev, eep, len); + return ret; } EXPORT_SYMBOL_GPL(mt76_get_of_eeprom);