diff --git a/eeprom.c b/eeprom.c
index b2e6e1ed3..2f744c95f 100644
--- a/eeprom.c
+++ b/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"
 
@@ -104,6 +105,37 @@ int mt76_get_of_epprom_from_mtd(struct mt76_dev *dev, void *eep, int offset, int
 }
 #endif
 
+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, "precal");
+	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;
@@ -122,6 +154,8 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int offset, int len)
 		goto exit;
 #endif
 
+	ret = mt76_get_of_epprom_from_nvmem(dev, epp, len);
+
 exit:
 	return ret;
 }