#include "efuse.h"
 #include "debug.h"
 
+unsigned int rtw_fw_lps_deep_mode;
+EXPORT_SYMBOL(rtw_fw_lps_deep_mode);
 static bool rtw_fw_support_lps;
 unsigned int rtw_debug_mask;
 EXPORT_SYMBOL(rtw_debug_mask);
 
+module_param_named(lps_deep_mode, rtw_fw_lps_deep_mode, uint, 0644);
 module_param_named(support_lps, rtw_fw_support_lps, bool, 0644);
 module_param_named(debug_mask, rtw_debug_mask, uint, 0644);
 
+MODULE_PARM_DESC(lps_deep_mode, "Deeper PS mode. If 0, deep PS is disabled");
 MODULE_PARM_DESC(support_lps, "Set Y to enable Leisure Power Save support, to turn radio off between beacons");
 MODULE_PARM_DESC(debug_mask, "Debugging mask");
 
 
 int rtw_core_init(struct rtw_dev *rtwdev)
 {
+       struct rtw_chip_info *chip = rtwdev->chip;
        struct rtw_coex *coex = &rtwdev->coex;
        int ret;
 
        rtwdev->sec.total_cam_num = 32;
        rtwdev->hal.current_channel = 1;
        set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map);
+       if (!(BIT(rtw_fw_lps_deep_mode) & chip->lps_deep_mode_supported))
+               rtwdev->lps_conf.deep_mode = LPS_DEEP_MODE_NONE;
+       else
+               rtwdev->lps_conf.deep_mode = rtw_fw_lps_deep_mode;
 
        mutex_lock(&rtwdev->mutex);
        rtw_add_rsvd_page(rtwdev, RSVD_BEACON, false);
 
 #define RTW_RF_PATH_MAX                        4
 #define HW_FEATURE_LEN                 13
 
+extern unsigned int rtw_fw_lps_deep_mode;
 extern unsigned int rtw_debug_mask;
 extern const struct ieee80211_ops rtw_ops;
 extern struct rtw_chip_info rtw8822b_hw_spec;
        RTW_MODE_WMM_PS = 2,
 };
 
+enum rtw_lps_deep_mode {
+       LPS_DEEP_MODE_NONE      = 0,
+       LPS_DEEP_MODE_LCLK      = 1,
+};
+
 enum rtw_pwr_state {
        RTW_RF_OFF      = 0x0,
        RTW_RF_ON       = 0x4,
 
 struct rtw_lps_conf {
        enum rtw_lps_mode mode;
+       enum rtw_lps_deep_mode deep_mode;
        enum rtw_pwr_state state;
        u8 awake_interval;
        u8 rlbm;
 
        bool ht_supported;
        bool vht_supported;
+       u8 lps_deep_mode_supported;
 
        /* init values */
        u8 sys_func_en;
 
 
 static void __rtw_enter_lps_deep(struct rtw_dev *rtwdev)
 {
+       if (rtwdev->lps_conf.deep_mode == LPS_DEEP_MODE_NONE)
+               return;
+
        if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) {
                rtw_dbg(rtwdev, RTW_DBG_PS,
                        "Should enter LPS before entering deep PS\n");