Commit ec81b33b authored by Rosen Penev's avatar Rosen Penev Committed by Johannes Berg
Browse files

wifi: rt2x00: add nvmem eeprom support



Some embedded platforms have eeproms located in flash. Add nvmem support
to handle this. Support is added for PCI and SOC backends.

Signed-off-by: default avatarRosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20251027180639.3797-1-rosenp@gmail.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent db82ddea
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <linux/crc-ccitt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/nvmem-consumer.h>
#include <linux/slab.h>

#include "rt2x00.h"
@@ -10962,6 +10963,36 @@ int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
}
EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);

int rt2800_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;

	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);
		kfree(data);
		return -EINVAL;
	}

	memcpy(rt2x00dev->eeprom, data, len);
	kfree(data);
	return 0;
}
EXPORT_SYMBOL_GPL(rt2800_read_eeprom_nvmem);

static u8 rt2800_get_txmixer_gain_24g(struct rt2x00_dev *rt2x00dev)
{
	u16 word;
+2 −0
Original line number Diff line number Diff line
@@ -248,6 +248,8 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev);
int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev);
int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev);

int rt2800_read_eeprom_nvmem(struct rt2x00_dev *rt2x00dev);

int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev);

void rt2800_get_key_seq(struct ieee80211_hw *hw,
+3 −0
Original line number Diff line number Diff line
@@ -278,6 +278,9 @@ static int rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
{
	int retval;

	if (!rt2800_read_eeprom_nvmem(rt2x00dev))
		return 0;

	if (rt2800pci_efuse_detect(rt2x00dev))
		retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
	else
+5 −1
Original line number Diff line number Diff line
@@ -92,8 +92,12 @@ static int rt2800soc_set_device_state(struct rt2x00_dev *rt2x00dev,

static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev)
{
	void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
	void __iomem *base_addr;

	if (!rt2800_read_eeprom_nvmem(rt2x00dev))
		return 0;

	base_addr = ioremap(0x1F040000, EEPROM_SIZE);
	if (!base_addr)
		return -ENOMEM;