Commit fb8177d7 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

rtw89: 8852c: rfk: add LCK

LCK is short fro LC Tank calibration. Do this calibration once driver
loads RF parameters table. Since the characteristic can be changed by
temperature, we do this calibration again if difference of thermal value
is over a threshold.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220502235408.15052-4-pkshih@realtek.com
parent 76599a8d
...@@ -2642,6 +2642,10 @@ struct rtw89_mcc_info { ...@@ -2642,6 +2642,10 @@ struct rtw89_mcc_info {
u8 table_idx; u8 table_idx;
}; };
struct rtw89_lck_info {
u8 thermal[RF_PATH_MAX];
};
struct rtw89_iqk_info { struct rtw89_iqk_info {
bool lok_cor_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR]; bool lok_cor_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
bool lok_fin_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR]; bool lok_fin_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
...@@ -3114,6 +3118,7 @@ struct rtw89_dev { ...@@ -3114,6 +3118,7 @@ struct rtw89_dev {
struct rtw89_iqk_info iqk; struct rtw89_iqk_info iqk;
struct rtw89_dpk_info dpk; struct rtw89_dpk_info dpk;
struct rtw89_mcc_info mcc; struct rtw89_mcc_info mcc;
struct rtw89_lck_info lck;
bool is_tssi_mode[RF_PATH_MAX]; bool is_tssi_mode[RF_PATH_MAX];
bool is_bt_iqk_timeout; bool is_bt_iqk_timeout;
......
...@@ -3327,6 +3327,8 @@ ...@@ -3327,6 +3327,8 @@
#define RR_MIXER_GN GENMASK(4, 3) #define RR_MIXER_GN GENMASK(4, 3)
#define RR_XTALX2 0xb8 #define RR_XTALX2 0xb8
#define RR_MALSEL 0xbe #define RR_MALSEL 0xbe
#define RR_LCK_TRG 0xd3
#define RR_LCK_TRGSEL BIT(8)
#define RR_RCKD 0xde #define RR_RCKD 0xde
#define RR_RCKD_POW GENMASK(19, 13) #define RR_RCKD_POW GENMASK(19, 13)
#define RR_RCKD_BW BIT(2) #define RR_RCKD_BW BIT(2)
......
...@@ -1771,6 +1771,7 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev) ...@@ -1771,6 +1771,7 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev)
struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; struct rtw89_mcc_info *mcc_info = &rtwdev->mcc;
memset(mcc_info, 0, sizeof(*mcc_info)); memset(mcc_info, 0, sizeof(*mcc_info));
rtw8852c_lck_init(rtwdev);
rtw8852c_dack(rtwdev); rtw8852c_dack(rtwdev);
} }
...@@ -1780,6 +1781,11 @@ static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev) ...@@ -1780,6 +1781,11 @@ static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev)
rtw89_fw_h2c_rf_ntfy_mcc(rtwdev); rtw89_fw_h2c_rf_ntfy_mcc(rtwdev);
} }
static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
{
rtw8852c_lck_track(rtwdev);
}
static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev, static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
enum rtw89_phy_idx phy_idx, s16 ref) enum rtw89_phy_idx phy_idx, s16 ref)
{ {
...@@ -2708,6 +2714,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = { ...@@ -2708,6 +2714,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
.read_phycap = rtw8852c_read_phycap, .read_phycap = rtw8852c_read_phycap,
.rfk_init = rtw8852c_rfk_init, .rfk_init = rtw8852c_rfk_init,
.rfk_channel = rtw8852c_rfk_channel, .rfk_channel = rtw8852c_rfk_channel,
.rfk_track = rtw8852c_rfk_track,
.power_trim = rtw8852c_power_trim, .power_trim = rtw8852c_power_trim,
.set_txpwr = rtw8852c_set_txpwr, .set_txpwr = rtw8852c_set_txpwr,
.set_txpwr_ctrl = rtw8852c_set_txpwr_ctrl, .set_txpwr_ctrl = rtw8852c_set_txpwr_ctrl,
......
...@@ -632,6 +632,69 @@ static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ...@@ -632,6 +632,69 @@ static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
} }
} }
static void _lck_keep_thermal(struct rtw89_dev *rtwdev)
{
struct rtw89_lck_info *lck = &rtwdev->lck;
int path;
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
lck->thermal[path] =
ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
"[LCK] path=%d thermal=0x%x", path, lck->thermal[path]);
}
}
static void _lck(struct rtw89_dev *rtwdev)
{
u32 tmp18[2];
int path = rtwdev->dbcc_en ? 2 : 1;
int i;
rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, "[LCK] DO LCK\n");
tmp18[0] = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
tmp18[1] = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK);
for (i = 0; i < path; i++) {
rtw89_write_rf(rtwdev, i, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
rtw89_write_rf(rtwdev, i, RR_CFGCH, RFREG_MASK, tmp18[i]);
rtw89_write_rf(rtwdev, i, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
}
_lck_keep_thermal(rtwdev);
}
#define RTW8852C_LCK_TH 8
void rtw8852c_lck_track(struct rtw89_dev *rtwdev)
{
struct rtw89_lck_info *lck = &rtwdev->lck;
u8 cur_thermal;
int delta;
int path;
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
cur_thermal =
ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
delta = abs((int)cur_thermal - lck->thermal[path]);
rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
"[LCK] path=%d current thermal=0x%x delta=0x%x\n",
path, cur_thermal, delta);
if (delta >= RTW8852C_LCK_TH) {
_lck(rtwdev);
return;
}
}
}
void rtw8852c_lck_init(struct rtw89_dev *rtwdev)
{
_lck_keep_thermal(rtwdev);
}
static static
void rtw8852c_ctrl_bw_ch(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, void rtw8852c_ctrl_bw_ch(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
u8 central_ch, enum rtw89_band band, u8 central_ch, enum rtw89_band band,
......
...@@ -11,5 +11,7 @@ void rtw8852c_dack(struct rtw89_dev *rtwdev); ...@@ -11,5 +11,7 @@ void rtw8852c_dack(struct rtw89_dev *rtwdev);
void rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev, void rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev,
struct rtw89_channel_params *param, struct rtw89_channel_params *param,
enum rtw89_phy_idx phy_idx); enum rtw89_phy_idx phy_idx);
void rtw8852c_lck_init(struct rtw89_dev *rtwdev);
void rtw8852c_lck_track(struct rtw89_dev *rtwdev);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment