/* Copyright(c) 2019-2022  Realtek Corporation
  */
 
+#include "chan.h"
 #include "coex.h"
 #include "debug.h"
 #include "fw.h"
        rtwdev->is_tssi_mode[RF_PATH_B] = false;
        memset(rfk_mcc, 0, sizeof(*rfk_mcc));
        rtw8852c_lck_init(rtwdev);
+       rtw8852c_dpk_init(rtwdev);
 
        rtw8852c_rck(rtwdev);
        rtw8852c_dack(rtwdev);
        return 0;
 }
 
+static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {
+       .callbacks[RTW89_CHANCTX_CALLBACK_RFK] = rtw8852c_rfk_chanctx_cb,
+};
+
 #ifdef CONFIG_PM
 static const struct wiphy_wowlan_support rtw_wowlan_stub_8852c = {
        .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
        .byr_table              = &rtw89_8852c_byr_table,
        .dflt_parms             = &rtw89_8852c_dflt_parms,
        .rfe_parms_conf         = NULL,
+       .chanctx_listener       = &rtw8852c_chanctx_listener,
        .txpwr_factor_rf        = 2,
        .txpwr_factor_mac       = 1,
        .dig_table              = NULL,
 
        rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
 }
 
+void rtw8852c_dpk_init(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       dpk->is_dpk_enable = true;
+       dpk->is_dpk_reload_en = false;
+}
+
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
 {
        u32 tx_en;
        rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
        _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
 
-       rtwdev->dpk.is_dpk_enable = true;
-       rtwdev->dpk.is_dpk_reload_en = false;
        _dpk(rtwdev, phy_idx, false);
 
        rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
        else
                rtw8852c_tssi_default_txagc(rtwdev, phy_idx, false);
 }
+
+void rtw8852c_rfk_chanctx_cb(struct rtw89_dev *rtwdev,
+                            enum rtw89_chanctx_state state)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u8 path;
+
+       switch (state) {
+       case RTW89_CHANCTX_STATE_MCC_START:
+               dpk->is_dpk_enable = false;
+               for (path = 0; path < RTW8852C_DPK_RF_PATH; path++)
+                       _dpk_onoff(rtwdev, path, false);
+               break;
+       case RTW89_CHANCTX_STATE_MCC_STOP:
+               dpk->is_dpk_enable = true;
+               for (path = 0; path < RTW8852C_DPK_RF_PATH; path++)
+                       _dpk_onoff(rtwdev, path, false);
+               rtw8852c_dpk(rtwdev, RTW89_PHY_0);
+               break;
+       default:
+               break;
+       }
+}
 
 void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
 void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool is_afe);
 void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev);
+void rtw8852c_dpk_init(struct rtw89_dev *rtwdev);
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
 void rtw8852c_dpk_track(struct rtw89_dev *rtwdev);
 void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
                             enum rtw89_phy_idx phy_idx);
 void rtw8852c_lck_init(struct rtw89_dev *rtwdev);
 void rtw8852c_lck_track(struct rtw89_dev *rtwdev);
+void rtw8852c_rfk_chanctx_cb(struct rtw89_dev *rtwdev,
+                            enum rtw89_chanctx_state state);
 
 #endif