18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: ISC
28c2ecf20Sopenharmony_ci/* Copyright (C) 2019 MediaTek Inc.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Author: Ryder Lee <ryder.lee@mediatek.com>
58c2ecf20Sopenharmony_ci *         Felix Fietkau <nbd@nbd.name>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/of.h>
98c2ecf20Sopenharmony_ci#include "mt7615.h"
108c2ecf20Sopenharmony_ci#include "eeprom.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistatic int mt7615_efuse_read(struct mt7615_dev *dev, u32 base,
138c2ecf20Sopenharmony_ci			     u16 addr, u8 *data)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	u32 val;
168c2ecf20Sopenharmony_ci	int i;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	val = mt76_rr(dev, base + MT_EFUSE_CTRL);
198c2ecf20Sopenharmony_ci	val &= ~(MT_EFUSE_CTRL_AIN | MT_EFUSE_CTRL_MODE);
208c2ecf20Sopenharmony_ci	val |= FIELD_PREP(MT_EFUSE_CTRL_AIN, addr & ~0xf);
218c2ecf20Sopenharmony_ci	val |= MT_EFUSE_CTRL_KICK;
228c2ecf20Sopenharmony_ci	mt76_wr(dev, base + MT_EFUSE_CTRL, val);
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	if (!mt76_poll(dev, base + MT_EFUSE_CTRL, MT_EFUSE_CTRL_KICK, 0, 1000))
258c2ecf20Sopenharmony_ci		return -ETIMEDOUT;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	udelay(2);
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	val = mt76_rr(dev, base + MT_EFUSE_CTRL);
308c2ecf20Sopenharmony_ci	if ((val & MT_EFUSE_CTRL_AOUT) == MT_EFUSE_CTRL_AOUT ||
318c2ecf20Sopenharmony_ci	    WARN_ON_ONCE(!(val & MT_EFUSE_CTRL_VALID))) {
328c2ecf20Sopenharmony_ci		memset(data, 0x0, 16);
338c2ecf20Sopenharmony_ci		return 0;
348c2ecf20Sopenharmony_ci	}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	for (i = 0; i < 4; i++) {
378c2ecf20Sopenharmony_ci		val = mt76_rr(dev, base + MT_EFUSE_RDATA(i));
388c2ecf20Sopenharmony_ci		put_unaligned_le32(val, data + 4 * i);
398c2ecf20Sopenharmony_ci	}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	return 0;
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic int mt7615_efuse_init(struct mt7615_dev *dev, u32 base)
458c2ecf20Sopenharmony_ci{
468c2ecf20Sopenharmony_ci	int i, len = MT7615_EEPROM_SIZE;
478c2ecf20Sopenharmony_ci	void *buf;
488c2ecf20Sopenharmony_ci	u32 val;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	val = mt76_rr(dev, base + MT_EFUSE_BASE_CTRL);
518c2ecf20Sopenharmony_ci	if (val & MT_EFUSE_BASE_CTRL_EMPTY)
528c2ecf20Sopenharmony_ci		return 0;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	dev->mt76.otp.data = devm_kzalloc(dev->mt76.dev, len, GFP_KERNEL);
558c2ecf20Sopenharmony_ci	dev->mt76.otp.size = len;
568c2ecf20Sopenharmony_ci	if (!dev->mt76.otp.data)
578c2ecf20Sopenharmony_ci		return -ENOMEM;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	buf = dev->mt76.otp.data;
608c2ecf20Sopenharmony_ci	for (i = 0; i + 16 <= len; i += 16) {
618c2ecf20Sopenharmony_ci		int ret;
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci		ret = mt7615_efuse_read(dev, base, i, buf + i);
648c2ecf20Sopenharmony_ci		if (ret)
658c2ecf20Sopenharmony_ci			return ret;
668c2ecf20Sopenharmony_ci	}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	return 0;
698c2ecf20Sopenharmony_ci}
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_cistatic int mt7615_eeprom_load(struct mt7615_dev *dev, u32 addr)
728c2ecf20Sopenharmony_ci{
738c2ecf20Sopenharmony_ci	int ret;
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	ret = mt76_eeprom_init(&dev->mt76, MT7615_EEPROM_FULL_SIZE);
768c2ecf20Sopenharmony_ci	if (ret < 0)
778c2ecf20Sopenharmony_ci		return ret;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	return mt7615_efuse_init(dev, addr);
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistatic int mt7615_check_eeprom(struct mt76_dev *dev)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	u16 val = get_unaligned_le16(dev->eeprom.data);
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	switch (val) {
878c2ecf20Sopenharmony_ci	case 0x7615:
888c2ecf20Sopenharmony_ci	case 0x7622:
898c2ecf20Sopenharmony_ci	case 0x7663:
908c2ecf20Sopenharmony_ci		return 0;
918c2ecf20Sopenharmony_ci	default:
928c2ecf20Sopenharmony_ci		return -EINVAL;
938c2ecf20Sopenharmony_ci	}
948c2ecf20Sopenharmony_ci}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_cistatic void
978c2ecf20Sopenharmony_cimt7615_eeprom_parse_hw_band_cap(struct mt7615_dev *dev)
988c2ecf20Sopenharmony_ci{
998c2ecf20Sopenharmony_ci	u8 val, *eeprom = dev->mt76.eeprom.data;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	if (is_mt7663(&dev->mt76)) {
1028c2ecf20Sopenharmony_ci		/* dual band */
1038c2ecf20Sopenharmony_ci		dev->mphy.cap.has_2ghz = true;
1048c2ecf20Sopenharmony_ci		dev->mphy.cap.has_5ghz = true;
1058c2ecf20Sopenharmony_ci		return;
1068c2ecf20Sopenharmony_ci	}
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	if (is_mt7622(&dev->mt76)) {
1098c2ecf20Sopenharmony_ci		/* 2GHz only */
1108c2ecf20Sopenharmony_ci		dev->mphy.cap.has_2ghz = true;
1118c2ecf20Sopenharmony_ci		return;
1128c2ecf20Sopenharmony_ci	}
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci	if (is_mt7611(&dev->mt76)) {
1158c2ecf20Sopenharmony_ci		/* 5GHz only */
1168c2ecf20Sopenharmony_ci		dev->mphy.cap.has_5ghz = true;
1178c2ecf20Sopenharmony_ci		return;
1188c2ecf20Sopenharmony_ci	}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	val = FIELD_GET(MT_EE_NIC_WIFI_CONF_BAND_SEL,
1218c2ecf20Sopenharmony_ci			eeprom[MT_EE_WIFI_CONF]);
1228c2ecf20Sopenharmony_ci	switch (val) {
1238c2ecf20Sopenharmony_ci	case MT_EE_5GHZ:
1248c2ecf20Sopenharmony_ci		dev->mphy.cap.has_5ghz = true;
1258c2ecf20Sopenharmony_ci		break;
1268c2ecf20Sopenharmony_ci	case MT_EE_DBDC:
1278c2ecf20Sopenharmony_ci		dev->dbdc_support = true;
1288c2ecf20Sopenharmony_ci		fallthrough;
1298c2ecf20Sopenharmony_ci	case MT_EE_2GHZ:
1308c2ecf20Sopenharmony_ci		dev->mphy.cap.has_2ghz = true;
1318c2ecf20Sopenharmony_ci		break;
1328c2ecf20Sopenharmony_ci	default:
1338c2ecf20Sopenharmony_ci		dev->mphy.cap.has_2ghz = true;
1348c2ecf20Sopenharmony_ci		dev->mphy.cap.has_5ghz = true;
1358c2ecf20Sopenharmony_ci		break;
1368c2ecf20Sopenharmony_ci	}
1378c2ecf20Sopenharmony_ci}
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistatic void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev)
1408c2ecf20Sopenharmony_ci{
1418c2ecf20Sopenharmony_ci	u8 *eeprom = dev->mt76.eeprom.data;
1428c2ecf20Sopenharmony_ci	u8 tx_mask, max_nss;
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	mt7615_eeprom_parse_hw_band_cap(dev);
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	if (is_mt7663(&dev->mt76)) {
1478c2ecf20Sopenharmony_ci		max_nss = 2;
1488c2ecf20Sopenharmony_ci		tx_mask = FIELD_GET(MT_EE_HW_CONF1_TX_MASK,
1498c2ecf20Sopenharmony_ci				    eeprom[MT7663_EE_HW_CONF1]);
1508c2ecf20Sopenharmony_ci	} else {
1518c2ecf20Sopenharmony_ci		u32 val;
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci		/* read tx-rx mask from eeprom */
1548c2ecf20Sopenharmony_ci		val = mt76_rr(dev, MT_TOP_STRAP_STA);
1558c2ecf20Sopenharmony_ci		max_nss = val & MT_TOP_3NSS ? 3 : 4;
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci		tx_mask =  FIELD_GET(MT_EE_NIC_CONF_TX_MASK,
1588c2ecf20Sopenharmony_ci				     eeprom[MT_EE_NIC_CONF_0]);
1598c2ecf20Sopenharmony_ci	}
1608c2ecf20Sopenharmony_ci	if (!tx_mask || tx_mask > max_nss)
1618c2ecf20Sopenharmony_ci		tx_mask = max_nss;
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	dev->chainmask = BIT(tx_mask) - 1;
1648c2ecf20Sopenharmony_ci	dev->mphy.antenna_mask = dev->chainmask;
1658c2ecf20Sopenharmony_ci	dev->phy.chainmask = dev->chainmask;
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_cistatic int mt7663_eeprom_get_target_power_index(struct mt7615_dev *dev,
1698c2ecf20Sopenharmony_ci						struct ieee80211_channel *chan,
1708c2ecf20Sopenharmony_ci						u8 chain_idx)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	int index, group;
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	if (chain_idx > 1)
1758c2ecf20Sopenharmony_ci		return -EINVAL;
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	if (chan->band == NL80211_BAND_2GHZ)
1788c2ecf20Sopenharmony_ci		return MT7663_EE_TX0_2G_TARGET_POWER + (chain_idx << 4);
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci	group = mt7615_get_channel_group(chan->hw_value);
1818c2ecf20Sopenharmony_ci	if (chain_idx == 1)
1828c2ecf20Sopenharmony_ci		index = MT7663_EE_TX1_5G_G0_TARGET_POWER;
1838c2ecf20Sopenharmony_ci	else
1848c2ecf20Sopenharmony_ci		index = MT7663_EE_TX0_5G_G0_TARGET_POWER;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	return index + group * 3;
1878c2ecf20Sopenharmony_ci}
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ciint mt7615_eeprom_get_target_power_index(struct mt7615_dev *dev,
1908c2ecf20Sopenharmony_ci					 struct ieee80211_channel *chan,
1918c2ecf20Sopenharmony_ci					 u8 chain_idx)
1928c2ecf20Sopenharmony_ci{
1938c2ecf20Sopenharmony_ci	int index;
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	if (is_mt7663(&dev->mt76))
1968c2ecf20Sopenharmony_ci		return mt7663_eeprom_get_target_power_index(dev, chan,
1978c2ecf20Sopenharmony_ci							    chain_idx);
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci	if (chain_idx > 3)
2008c2ecf20Sopenharmony_ci		return -EINVAL;
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci	/* TSSI disabled */
2038c2ecf20Sopenharmony_ci	if (mt7615_ext_pa_enabled(dev, chan->band)) {
2048c2ecf20Sopenharmony_ci		if (chan->band == NL80211_BAND_2GHZ)
2058c2ecf20Sopenharmony_ci			return MT_EE_EXT_PA_2G_TARGET_POWER;
2068c2ecf20Sopenharmony_ci		else
2078c2ecf20Sopenharmony_ci			return MT_EE_EXT_PA_5G_TARGET_POWER;
2088c2ecf20Sopenharmony_ci	}
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	/* TSSI enabled */
2118c2ecf20Sopenharmony_ci	if (chan->band == NL80211_BAND_2GHZ) {
2128c2ecf20Sopenharmony_ci		index = MT_EE_TX0_2G_TARGET_POWER + chain_idx * 6;
2138c2ecf20Sopenharmony_ci	} else {
2148c2ecf20Sopenharmony_ci		int group = mt7615_get_channel_group(chan->hw_value);
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci		switch (chain_idx) {
2178c2ecf20Sopenharmony_ci		case 1:
2188c2ecf20Sopenharmony_ci			index = MT_EE_TX1_5G_G0_TARGET_POWER;
2198c2ecf20Sopenharmony_ci			break;
2208c2ecf20Sopenharmony_ci		case 2:
2218c2ecf20Sopenharmony_ci			index = MT_EE_TX2_5G_G0_TARGET_POWER;
2228c2ecf20Sopenharmony_ci			break;
2238c2ecf20Sopenharmony_ci		case 3:
2248c2ecf20Sopenharmony_ci			index = MT_EE_TX3_5G_G0_TARGET_POWER;
2258c2ecf20Sopenharmony_ci			break;
2268c2ecf20Sopenharmony_ci		case 0:
2278c2ecf20Sopenharmony_ci		default:
2288c2ecf20Sopenharmony_ci			index = MT_EE_TX0_5G_G0_TARGET_POWER;
2298c2ecf20Sopenharmony_ci			break;
2308c2ecf20Sopenharmony_ci		}
2318c2ecf20Sopenharmony_ci		index += 5 * group;
2328c2ecf20Sopenharmony_ci	}
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	return index;
2358c2ecf20Sopenharmony_ci}
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ciint mt7615_eeprom_get_power_delta_index(struct mt7615_dev *dev,
2388c2ecf20Sopenharmony_ci					enum nl80211_band band)
2398c2ecf20Sopenharmony_ci{
2408c2ecf20Sopenharmony_ci	/* assume the first rate has the highest power offset */
2418c2ecf20Sopenharmony_ci	if (is_mt7663(&dev->mt76)) {
2428c2ecf20Sopenharmony_ci		if (band == NL80211_BAND_2GHZ)
2438c2ecf20Sopenharmony_ci			return MT_EE_TX0_5G_G0_TARGET_POWER;
2448c2ecf20Sopenharmony_ci		else
2458c2ecf20Sopenharmony_ci			return MT7663_EE_5G_RATE_POWER;
2468c2ecf20Sopenharmony_ci	}
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci	if (band == NL80211_BAND_2GHZ)
2498c2ecf20Sopenharmony_ci		return MT_EE_2G_RATE_POWER;
2508c2ecf20Sopenharmony_ci	else
2518c2ecf20Sopenharmony_ci		return MT_EE_5G_RATE_POWER;
2528c2ecf20Sopenharmony_ci}
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_cistatic void mt7615_apply_cal_free_data(struct mt7615_dev *dev)
2558c2ecf20Sopenharmony_ci{
2568c2ecf20Sopenharmony_ci	static const u16 ical[] = {
2578c2ecf20Sopenharmony_ci		0x53, 0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x62, 0x63, 0x68,
2588c2ecf20Sopenharmony_ci		0x69, 0x6e, 0x6f, 0x73, 0x74, 0x78, 0x79, 0x82, 0x83, 0x87,
2598c2ecf20Sopenharmony_ci		0x88, 0x8c, 0x8d, 0x91, 0x92, 0x96, 0x97, 0x9b, 0x9c, 0xa0,
2608c2ecf20Sopenharmony_ci		0xa1, 0xaa, 0xab, 0xaf, 0xb0, 0xb4, 0xb5, 0xb9, 0xba, 0xf4,
2618c2ecf20Sopenharmony_ci		0xf7, 0xff,
2628c2ecf20Sopenharmony_ci		0x140, 0x141, 0x145, 0x146, 0x14a, 0x14b, 0x154, 0x155, 0x159,
2638c2ecf20Sopenharmony_ci		0x15a, 0x15e, 0x15f, 0x163, 0x164, 0x168, 0x169, 0x16d, 0x16e,
2648c2ecf20Sopenharmony_ci		0x172, 0x173, 0x17c, 0x17d, 0x181, 0x182, 0x186, 0x187, 0x18b,
2658c2ecf20Sopenharmony_ci		0x18c
2668c2ecf20Sopenharmony_ci	};
2678c2ecf20Sopenharmony_ci	static const u16 ical_nocheck[] = {
2688c2ecf20Sopenharmony_ci		0x110, 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117, 0x118,
2698c2ecf20Sopenharmony_ci		0x1b5, 0x1b6, 0x1b7, 0x3ac, 0x3ad, 0x3ae, 0x3af, 0x3b0, 0x3b1,
2708c2ecf20Sopenharmony_ci		0x3b2
2718c2ecf20Sopenharmony_ci	};
2728c2ecf20Sopenharmony_ci	u8 *eeprom = dev->mt76.eeprom.data;
2738c2ecf20Sopenharmony_ci	u8 *otp = dev->mt76.otp.data;
2748c2ecf20Sopenharmony_ci	int i;
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	if (!otp)
2778c2ecf20Sopenharmony_ci		return;
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(ical); i++)
2808c2ecf20Sopenharmony_ci		if (!otp[ical[i]])
2818c2ecf20Sopenharmony_ci			return;
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(ical); i++)
2848c2ecf20Sopenharmony_ci		eeprom[ical[i]] = otp[ical[i]];
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(ical_nocheck); i++)
2878c2ecf20Sopenharmony_ci		eeprom[ical_nocheck[i]] = otp[ical_nocheck[i]];
2888c2ecf20Sopenharmony_ci}
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_cistatic void mt7622_apply_cal_free_data(struct mt7615_dev *dev)
2918c2ecf20Sopenharmony_ci{
2928c2ecf20Sopenharmony_ci	static const u16 ical[] = {
2938c2ecf20Sopenharmony_ci		0x53, 0x54, 0x55, 0x56, 0xf4, 0xf7, 0x144, 0x156, 0x15b
2948c2ecf20Sopenharmony_ci	};
2958c2ecf20Sopenharmony_ci	u8 *eeprom = dev->mt76.eeprom.data;
2968c2ecf20Sopenharmony_ci	u8 *otp = dev->mt76.otp.data;
2978c2ecf20Sopenharmony_ci	int i;
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci	if (!otp)
3008c2ecf20Sopenharmony_ci		return;
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(ical); i++) {
3038c2ecf20Sopenharmony_ci		if (!otp[ical[i]])
3048c2ecf20Sopenharmony_ci			continue;
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ci		eeprom[ical[i]] = otp[ical[i]];
3078c2ecf20Sopenharmony_ci	}
3088c2ecf20Sopenharmony_ci}
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_cistatic void mt7615_cal_free_data(struct mt7615_dev *dev)
3118c2ecf20Sopenharmony_ci{
3128c2ecf20Sopenharmony_ci	struct device_node *np = dev->mt76.dev->of_node;
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	if (!np || !of_property_read_bool(np, "mediatek,eeprom-merge-otp"))
3158c2ecf20Sopenharmony_ci		return;
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci	switch (mt76_chip(&dev->mt76)) {
3188c2ecf20Sopenharmony_ci	case 0x7622:
3198c2ecf20Sopenharmony_ci		mt7622_apply_cal_free_data(dev);
3208c2ecf20Sopenharmony_ci		break;
3218c2ecf20Sopenharmony_ci	case 0x7615:
3228c2ecf20Sopenharmony_ci	case 0x7611:
3238c2ecf20Sopenharmony_ci		mt7615_apply_cal_free_data(dev);
3248c2ecf20Sopenharmony_ci		break;
3258c2ecf20Sopenharmony_ci	}
3268c2ecf20Sopenharmony_ci}
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ciint mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr)
3298c2ecf20Sopenharmony_ci{
3308c2ecf20Sopenharmony_ci	int ret;
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	ret = mt7615_eeprom_load(dev, addr);
3338c2ecf20Sopenharmony_ci	if (ret < 0)
3348c2ecf20Sopenharmony_ci		return ret;
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci	ret = mt7615_check_eeprom(&dev->mt76);
3378c2ecf20Sopenharmony_ci	if (ret && dev->mt76.otp.data) {
3388c2ecf20Sopenharmony_ci		memcpy(dev->mt76.eeprom.data, dev->mt76.otp.data,
3398c2ecf20Sopenharmony_ci		       MT7615_EEPROM_SIZE);
3408c2ecf20Sopenharmony_ci	} else {
3418c2ecf20Sopenharmony_ci		dev->flash_eeprom = true;
3428c2ecf20Sopenharmony_ci		mt7615_cal_free_data(dev);
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci	mt7615_eeprom_parse_hw_cap(dev);
3468c2ecf20Sopenharmony_ci	memcpy(dev->mt76.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
3478c2ecf20Sopenharmony_ci	       ETH_ALEN);
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ci	mt76_eeprom_override(&dev->mt76);
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci	return 0;
3528c2ecf20Sopenharmony_ci}
3538c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mt7615_eeprom_init);
354