Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtw88: 8723d: Add new chip op efuse_grant() to control efuse access

8723D devices need to grant efuse access before dumping physical efuse
map, other chips don't need it, so keep this ops as blank.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200420055054.14592-8-yhchuang@realtek.com

authored by

Ping-Ke Shih and committed by
Kalle Valo
44baa97c 1afb5eb7

+39
+4
drivers/net/wireless/realtek/rtw88/efuse.c
··· 90 90 u32 addr; 91 91 u32 cnt; 92 92 93 + rtw_chip_efuse_grant_on(rtwdev); 94 + 93 95 switch_efuse_bank(rtwdev); 94 96 95 97 /* disable 2.5V LDO */ ··· 114 112 115 113 *(map + addr) = (u8)(efuse_ctl & BIT_MASK_EF_DATA); 116 114 } 115 + 116 + rtw_chip_efuse_grant_off(rtwdev); 117 117 118 118 return 0; 119 119 }
+13
drivers/net/wireless/realtek/rtw88/main.h
··· 811 811 u32 antenna_tx, 812 812 u32 antenna_rx); 813 813 void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable); 814 + void (*efuse_grant)(struct rtw_dev *rtwdev, bool enable); 814 815 void (*false_alarm_statistics)(struct rtw_dev *rtwdev); 815 816 void (*phy_calibration)(struct rtw_dev *rtwdev); 816 817 void (*dpk_track)(struct rtw_dev *rtwdev); ··· 1711 1710 return false; 1712 1711 1713 1712 return true; 1713 + } 1714 + 1715 + static inline void rtw_chip_efuse_grant_on(struct rtw_dev *rtwdev) 1716 + { 1717 + if (rtwdev->chip->ops->efuse_grant) 1718 + rtwdev->chip->ops->efuse_grant(rtwdev, true); 1719 + } 1720 + 1721 + static inline void rtw_chip_efuse_grant_off(struct rtw_dev *rtwdev) 1722 + { 1723 + if (rtwdev->chip->ops->efuse_grant) 1724 + rtwdev->chip->ops->efuse_grant(rtwdev, false); 1714 1725 } 1715 1726 1716 1727 void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
+9
drivers/net/wireless/realtek/rtw88/reg.h
··· 6 6 #define __RTW_REG_DEF_H__ 7 7 8 8 #define REG_SYS_FUNC_EN 0x0002 9 + #define BIT_FEN_ELDR BIT(12) 9 10 #define BIT_FEN_CPUEN BIT(2) 10 11 #define BIT_FEN_BB_GLB_RST BIT(1) 11 12 #define BIT_FEN_BB_RSTB BIT(0) ··· 15 14 #define REG_SYS_PW_CTRL 0x0004 16 15 #define REG_SYS_CLK_CTRL 0x0008 17 16 #define BIT_CPU_CLK_EN BIT(14) 17 + 18 + #define REG_SYS_CLKR 0x0008 19 + #define BIT_ANA8M BIT(1) 20 + #define BIT_LOADER_CLK_EN BIT(5) 18 21 19 22 #define REG_RSV_CTRL 0x001C 20 23 #define DISABLE_PI 0x3 ··· 91 86 BIT_IMEM_DW_OK | BIT_DMEM_DW_OK | \ 92 87 BIT_CHECK_SUM_OK) 93 88 #define FW_READY_MASK 0xffff 89 + 90 + #define REG_EFUSE_ACCESS 0x00CF 91 + #define EFUSE_ACCESS_ON 0x69 92 + #define EFUSE_ACCESS_OFF 0x00 94 93 95 94 #define REG_WLRF1 0x00EC 96 95 #define REG_WIFI_BT_INFO 0x00AA
+13
drivers/net/wireless/realtek/rtw88/rtw8723d.c
··· 28 28 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr); 29 29 } 30 30 31 + static void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on) 32 + { 33 + if (on) { 34 + rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); 35 + 36 + rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR); 37 + rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M); 38 + } else { 39 + rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); 40 + } 41 + } 42 + 31 43 static struct rtw_chip_ops rtw8723d_ops = { 32 44 .read_rf = rtw_phy_read_rf_sipi, 33 45 .write_rf = rtw_phy_write_rf_reg_sipi, 34 46 .set_antenna = NULL, 35 47 .cfg_ldo25 = rtw8723d_cfg_ldo25, 48 + .efuse_grant = rtw8723d_efuse_grant, 36 49 .config_bfee = NULL, 37 50 .set_gid_table = NULL, 38 51 .cfg_csi_rate = NULL,