BTC_GNT_MAX
 };
 
+enum btc_ctr_path {
+       BTC_CTRL_BY_BT = 0,
+       BTC_CTRL_BY_WL
+};
+
 enum btc_wl_max_tx_time {
        BTC_MAX_TX_TIME_L1 = 500,
        BTC_MAX_TX_TIME_L2 = 1000,
        }
 }
 
-static void _set_gnt_wl(struct rtw89_dev *rtwdev, u8 phy_map, u8 state)
+static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map, u8 wl_state, u8 bt_state)
 {
        struct rtw89_btc *btc = &rtwdev->btc;
        struct rtw89_btc_dm *dm = &btc->dm;
                if (!(phy_map & BIT(i)))
                        continue;
 
-               switch (state) {
+               switch (wl_state) {
                case BTC_GNT_HW:
                        g[i].gnt_wl_sw_en = 0;
                        g[i].gnt_wl = 0;
                        g[i].gnt_wl = 1;
                        break;
                }
+
+               switch (bt_state) {
+               case BTC_GNT_HW:
+                       g[i].gnt_bt_sw_en = 0;
+                       g[i].gnt_bt = 0;
+                       break;
+               case BTC_GNT_SW_LO:
+                       g[i].gnt_bt_sw_en = 1;
+                       g[i].gnt_bt = 0;
+                       break;
+               case BTC_GNT_SW_HI:
+                       g[i].gnt_bt_sw_en = 1;
+                       g[i].gnt_bt = 1;
+                       break;
+               }
        }
 
        rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
 }
 EXPORT_SYMBOL(rtw89_btc_set_policy_v1);
 
-static void _set_gnt_bt(struct rtw89_dev *rtwdev, u8 phy_map, u8 state)
-{
-       struct rtw89_btc *btc = &rtwdev->btc;
-       struct rtw89_btc_dm *dm = &btc->dm;
-       struct rtw89_mac_ax_gnt *g = dm->gnt.band;
-       u8 i;
-
-       if (phy_map > BTC_PHY_ALL)
-               return;
-
-       for (i = 0; i < RTW89_PHY_MAX; i++) {
-               if (!(phy_map & BIT(i)))
-                       continue;
-
-               switch (state) {
-               case BTC_GNT_HW:
-                       g[i].gnt_bt_sw_en = 0;
-                       g[i].gnt_bt = 0;
-                       break;
-               case BTC_GNT_SW_LO:
-                       g[i].gnt_bt_sw_en = 1;
-                       g[i].gnt_bt = 0;
-                       break;
-               case BTC_GNT_SW_HI:
-                       g[i].gnt_bt_sw_en = 1;
-                       g[i].gnt_bt = 1;
-                       break;
-               }
-       }
-
-       rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
-}
-
 static void _set_bt_plut(struct rtw89_dev *rtwdev, u8 phy_map,
                         u8 tx_val, u8 rx_val)
 {
 
        switch (type) {
        case BTC_ANT_WPOWERON:
-               rtw89_chip_cfg_ctrl_path(rtwdev, false);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_BT);
                break;
        case BTC_ANT_WINIT:
-               if (bt->enable.now) {
-                       _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_LO);
-                       _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI);
-               } else {
-                       _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
-                       _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
-               }
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
+               if (bt->enable.now)
+                       _set_gnt(rtwdev, phy_map, BTC_GNT_SW_LO, BTC_GNT_SW_HI);
+               else
+                       _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
+
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
                _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_BT, BTC_PLT_BT);
                break;
        case BTC_ANT_WONLY:
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
                _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        case BTC_ANT_WOFF:
-               rtw89_chip_cfg_ctrl_path(rtwdev, false);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_BT);
                _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        case BTC_ANT_W2G:
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
                if (rtwdev->dbcc_en) {
                        for (i = 0; i < RTW89_PHY_MAX; i++) {
                                b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G);
 
                                gnt_wl_ctrl = b2g ? BTC_GNT_HW : BTC_GNT_SW_HI;
-                               _set_gnt_wl(rtwdev, BIT(i), gnt_wl_ctrl);
-
                                gnt_bt_ctrl = b2g ? BTC_GNT_HW : BTC_GNT_SW_HI;
                                /* BT should control by GNT_BT if WL_2G at S0 */
                                if (i == 1 &&
                                    wl_dinfo->real_band[0] == RTW89_BAND_2G &&
                                    wl_dinfo->real_band[1] == RTW89_BAND_5G)
                                        gnt_bt_ctrl = BTC_GNT_HW;
-                               _set_gnt_bt(rtwdev, BIT(i), gnt_bt_ctrl);
-
+                               _set_gnt(rtwdev, BIT(i), gnt_wl_ctrl, gnt_bt_ctrl);
                                plt_ctrl = b2g ? BTC_PLT_BT : BTC_PLT_NONE;
                                _set_bt_plut(rtwdev, BIT(i),
                                             plt_ctrl, plt_ctrl);
                        }
                } else {
-                       _set_gnt_wl(rtwdev, phy_map, BTC_GNT_HW);
-                       _set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW);
+                       _set_gnt(rtwdev, phy_map, BTC_GNT_HW, BTC_GNT_HW);
                        _set_bt_plut(rtwdev, BTC_PHY_ALL,
                                     BTC_PLT_BT, BTC_PLT_BT);
                }
                break;
        case BTC_ANT_W5G:
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_HW);
                _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        case BTC_ANT_W25G:
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_HW);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_HW, BTC_GNT_HW);
                _set_bt_plut(rtwdev, BTC_PHY_ALL,
                             BTC_PLT_GNT_WL, BTC_PLT_GNT_WL);
                break;
        case BTC_ANT_FREERUN:
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_HI);
                _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        case BTC_ANT_WRFK:
-               rtw89_chip_cfg_ctrl_path(rtwdev, true);
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
                _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        case BTC_ANT_BRFK:
-               rtw89_chip_cfg_ctrl_path(rtwdev, false);
-               _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_LO);
-               _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI);
+               rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_BT);
+               _set_gnt(rtwdev, phy_map, BTC_GNT_SW_LO, BTC_GNT_SW_HI);
                _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
                break;
        default:
        _write_scbd(rtwdev,
                    BTC_WSCB_ACTIVE | BTC_WSCB_ON | BTC_WSCB_BTLOG, true);
        _update_bt_scbd(rtwdev, true);
-       if (rtw89_mac_get_ctrl_path(rtwdev)) {
+       if (rtw89_mac_get_ctrl_path(rtwdev) && chip->chip_id == RTL8852A) {
                rtw89_debug(rtwdev, RTW89_DBG_BTC,
                            "[BTC], %s(): PTA owner warning!!\n",
                            __func__);
        _show_fbtc_step(rtwdev, m);
 }
 
+static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt_cfg)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       struct rtw89_mac_ax_gnt *gnt;
+       u32 val, status;
+
+       if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B) {
+               rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_1, &val);
+               rtw89_mac_read_lte(rtwdev, R_AX_GNT_VAL, &status);
+
+               gnt = &gnt_cfg->band[0];
+               gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SW_CTRL);
+               gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0_STA);
+               gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SW_CTRL);
+               gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0_STA);
+
+               gnt = &gnt_cfg->band[1];
+               gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SW_CTRL);
+               gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1_STA);
+               gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SW_CTRL);
+               gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1_STA);
+       } else if (chip->chip_id == RTL8852C) {
+               val = rtw89_read32(rtwdev, R_AX_GNT_SW_CTRL);
+               status = rtw89_read32(rtwdev, R_AX_GNT_VAL_V1);
+
+               gnt = &gnt_cfg->band[0];
+               gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SWCTRL);
+               gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0);
+               gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SWCTRL);
+               gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0);
+
+               gnt = &gnt_cfg->band[1];
+               gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SWCTRL);
+               gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1);
+               gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SWCTRL);
+               gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1);
+       } else {
+               return;
+       }
+}
+
 static void _show_mreg(struct rtw89_dev *rtwdev, struct seq_file *m)
 {
        const struct rtw89_chip_info *chip = rtwdev->chip;
        struct rtw89_btc_cx *cx = &btc->cx;
        struct rtw89_btc_wl_info *wl = &btc->cx.wl;
        struct rtw89_btc_bt_info *bt = &btc->cx.bt;
-       struct rtw89_mac_ax_gnt gnt[2] = {0};
+       struct rtw89_mac_ax_coex_gnt gnt_cfg = {};
+       struct rtw89_mac_ax_gnt gnt;
        u8 i = 0, type = 0, cnt = 0;
        u32 val, offset;
 
 
        /* To avoid I/O if WL LPS or power-off  */
        if (!wl->status.map.lps && !wl->status.map.rf_off) {
-               rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_1, &val);
-               if (val & (B_AX_GNT_BT_RFC_S0_SW_VAL |
-                   B_AX_GNT_BT_BB_S0_SW_VAL))
-                       gnt[0].gnt_bt = true;
-               if (val & (B_AX_GNT_BT_RFC_S0_SW_CTRL |
-                   B_AX_GNT_BT_BB_S0_SW_CTRL))
-                       gnt[0].gnt_bt_sw_en = true;
-               if (val & (B_AX_GNT_WL_RFC_S0_SW_VAL |
-                   B_AX_GNT_WL_BB_S0_SW_VAL))
-                       gnt[0].gnt_wl = true;
-               if (val & (B_AX_GNT_WL_RFC_S0_SW_CTRL |
-                   B_AX_GNT_WL_BB_S0_SW_CTRL))
-                       gnt[0].gnt_wl_sw_en = true;
-
-               if (val & (B_AX_GNT_BT_RFC_S1_SW_VAL |
-                   B_AX_GNT_BT_BB_S1_SW_VAL))
-                       gnt[1].gnt_bt = true;
-               if (val & (B_AX_GNT_BT_RFC_S1_SW_CTRL |
-                   B_AX_GNT_BT_BB_S1_SW_CTRL))
-                       gnt[1].gnt_bt_sw_en = true;
-               if (val & (B_AX_GNT_WL_RFC_S1_SW_VAL |
-                   B_AX_GNT_WL_BB_S1_SW_VAL))
-                       gnt[1].gnt_wl = true;
-               if (val & (B_AX_GNT_WL_RFC_S1_SW_CTRL |
-                   B_AX_GNT_WL_BB_S1_SW_CTRL))
-                       gnt[1].gnt_wl_sw_en = true;
+               if (chip->chip_id == RTL8852A)
+                       btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
+               else if (chip->chip_id == RTL8852C)
+                       btc->dm.pta_owner = 0;
 
+               _get_gnt(rtwdev, &gnt_cfg);
+               gnt = gnt_cfg.band[0];
                seq_printf(m,
                           " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ",
                           "[gnt_status]",
-                          (rtw89_mac_get_ctrl_path(rtwdev) ? "WL" : "BT"),
-                          (gnt[0].gnt_wl_sw_en ? "SW" : "HW"), gnt[0].gnt_wl,
-                          (gnt[0].gnt_bt_sw_en ? "SW" : "HW"), gnt[0].gnt_bt);
+                          chip->chip_id == RTL8852C ? "HW" :
+                          btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
+                          gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl,
+                          gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt);
 
+               gnt = gnt_cfg.band[1];
                seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
-                          (gnt[1].gnt_wl_sw_en ? "SW" : "HW"), gnt[1].gnt_wl,
-                          (gnt[1].gnt_bt_sw_en ? "SW" : "HW"), gnt[1].gnt_bt);
+                          gnt.gnt_wl_sw_en ? "SW" : "HW",
+                          gnt.gnt_wl,
+                          gnt.gnt_bt_sw_en ? "SW" : "HW",
+                          gnt.gnt_bt);
        }
-
        pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
        if (!pcinfo->valid) {
                rtw89_debug(rtwdev, RTW89_DBG_BTC,