wifi: mt76: add support for providing eeprom in nvmem cells
authorChristian Marangi <ansuelsmth@gmail.com>
Sat, 8 Jul 2023 18:29:36 +0000 (20:29 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 26 Jul 2023 09:15:04 +0000 (11:15 +0200)
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 <ansuelsmth@gmail.com>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/eeprom.c

index c3a7620..3656493 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/of_net.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
+#include <linux/nvmem-consumer.h>
 #include <linux/etherdevice.h>
 #include "mt76.h"
 
@@ -105,6 +106,37 @@ out_put_node:
 #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;
@@ -117,7 +149,11 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len)
        if (!ret)
                return 0;
 
-       return mt76_get_of_epprom_from_mtd(dev, eep, offset, len);
+       ret = mt76_get_of_epprom_from_mtd(dev, eep, offset, len);
+       if (!ret)
+               return 0;
+
+       return mt76_get_of_epprom_from_nvmem(dev, eep, len);
 }
 EXPORT_SYMBOL_GPL(mt76_get_of_eeprom);