Message ID | 20230708182936.24469-2-ansuelsmth@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Felix Fietkau |
Headers | show |
Series | [1/2] wifi: mt76: split get_of_eeprom in subfunction | expand |
On Sat, Jul 08, 2023 at 08:29:36PM +0200, Christian Marangi wrote: > 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> > --- > drivers/net/wireless/mediatek/mt76/eeprom.c | 38 ++++++++++++++++++++- > 1 file changed, 37 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c > index c3a762074be8..36564930aef1 100644 > --- a/drivers/net/wireless/mediatek/mt76/eeprom.c > +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c > @@ -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 @@ 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; > @@ -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); > > -- > 2.40.1 > >
On 8.07.2023 20:29, Christian Marangi wrote: > 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: Rafał Miłecki <rafal@milecki.pl>
diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c index c3a762074be8..36564930aef1 100644 --- a/drivers/net/wireless/mediatek/mt76/eeprom.c +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c @@ -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 @@ 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; @@ -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);
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> --- drivers/net/wireless/mediatek/mt76/eeprom.c | 38 ++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)