rtw88: 8723d: Add new chip op efuse_grant() to control efuse access
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 20 Apr 2020 05:50:53 +0000 (13:50 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 21 Apr 2020 12:59:23 +0000 (15:59 +0300)
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
drivers/net/wireless/realtek/rtw88/efuse.c
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/reg.h
drivers/net/wireless/realtek/rtw88/rtw8723d.c

index 212c837..df969d3 100644 (file)
@@ -90,6 +90,8 @@ static int rtw_dump_physical_efuse_map(struct rtw_dev *rtwdev, u8 *map)
        u32 addr;
        u32 cnt;
 
+       rtw_chip_efuse_grant_on(rtwdev);
+
        switch_efuse_bank(rtwdev);
 
        /* disable 2.5V LDO */
@@ -113,6 +115,8 @@ static int rtw_dump_physical_efuse_map(struct rtw_dev *rtwdev, u8 *map)
                *(map + addr) = (u8)(efuse_ctl & BIT_MASK_EF_DATA);
        }
 
+       rtw_chip_efuse_grant_off(rtwdev);
+
        return 0;
 }
 
index 8f15fc1..7430218 100644 (file)
@@ -811,6 +811,7 @@ struct rtw_chip_ops {
                           u32 antenna_tx,
                           u32 antenna_rx);
        void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable);
+       void (*efuse_grant)(struct rtw_dev *rtwdev, bool enable);
        void (*false_alarm_statistics)(struct rtw_dev *rtwdev);
        void (*phy_calibration)(struct rtw_dev *rtwdev);
        void (*dpk_track)(struct rtw_dev *rtwdev);
@@ -1712,6 +1713,18 @@ static inline bool rtw_ssid_equal(struct cfg80211_ssid *a,
        return true;
 }
 
+static inline void rtw_chip_efuse_grant_on(struct rtw_dev *rtwdev)
+{
+       if (rtwdev->chip->ops->efuse_grant)
+               rtwdev->chip->ops->efuse_grant(rtwdev, true);
+}
+
+static inline void rtw_chip_efuse_grant_off(struct rtw_dev *rtwdev)
+{
+       if (rtwdev->chip->ops->efuse_grant)
+               rtwdev->chip->ops->efuse_grant(rtwdev, false);
+}
+
 void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
                            struct rtw_channel_params *ch_param);
 bool check_hw_ready(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 target);
index 2afd547..911d8e7 100644 (file)
@@ -6,6 +6,7 @@
 #define __RTW_REG_DEF_H__
 
 #define REG_SYS_FUNC_EN                0x0002
+#define BIT_FEN_ELDR           BIT(12)
 #define BIT_FEN_CPUEN          BIT(2)
 #define BIT_FEN_BB_GLB_RST     BIT(1)
 #define BIT_FEN_BB_RSTB                BIT(0)
 #define REG_SYS_CLK_CTRL       0x0008
 #define BIT_CPU_CLK_EN         BIT(14)
 
+#define REG_SYS_CLKR           0x0008
+#define BIT_ANA8M              BIT(1)
+#define BIT_LOADER_CLK_EN      BIT(5)
+
 #define REG_RSV_CTRL           0x001C
 #define DISABLE_PI             0x3
 #define ENABLE_PI              0x2
                                 BIT_CHECK_SUM_OK)
 #define FW_READY_MASK          0xffff
 
+#define REG_EFUSE_ACCESS       0x00CF
+#define EFUSE_ACCESS_ON                0x69
+#define EFUSE_ACCESS_OFF       0x00
+
 #define REG_WLRF1              0x00EC
 #define REG_WIFI_BT_INFO       0x00AA
 #define BIT_BT_INT_EN          BIT(15)
index 04f8d73..756454d 100644 (file)
@@ -28,11 +28,24 @@ static void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
        rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
 }
 
+static void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on)
+{
+       if (on) {
+               rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
+
+               rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
+               rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M);
+       } else {
+               rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
+       }
+}
+
 static struct rtw_chip_ops rtw8723d_ops = {
        .read_rf                = rtw_phy_read_rf_sipi,
        .write_rf               = rtw_phy_write_rf_reg_sipi,
        .set_antenna            = NULL,
        .cfg_ldo25              = rtw8723d_cfg_ldo25,
+       .efuse_grant            = rtw8723d_efuse_grant,
        .config_bfee            = NULL,
        .set_gid_table          = NULL,
        .cfg_csi_rate           = NULL,