Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8712 / rtl871x_pwrctrl.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5  *
6  * Modifications for inclusion into the Linux staging tree are
7  * Copyright(c) 2010 Larry Finger. All rights reserved.
8  *
9  * Contact information:
10  * WLAN FAE <wlanfae@realtek.com>
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  ******************************************************************************/
14 #ifndef __RTL871X_PWRCTRL_H_
15 #define __RTL871X_PWRCTRL_H_
16
17 #include "osdep_service.h"
18 #include "drv_types.h"
19
20
21 #define CMD_ALIVE       BIT(2)
22
23 enum Power_Mgnt {
24         PS_MODE_ACTIVE  = 0,
25         PS_MODE_MIN,
26         PS_MODE_MAX,
27         PS_MODE_DTIM,
28         PS_MODE_VOIP,
29         PS_MODE_UAPSD_WMM,
30         PS_MODE_UAPSD,
31         PS_MODE_IBSS,
32         PS_MODE_WWLAN,
33         PM_Radio_Off,
34         PM_Card_Disable,
35         PS_MODE_NUM
36 };
37
38 /*
39  * BIT[2:0] = HW state
40  * BIT[3] = Protocol PS state, 0: register active state,
41  *                              1: register sleep state
42  * BIT[4] = sub-state
43  */
44
45 #define         PS_DPS                          BIT(0)
46 #define         PS_LCLK                         (PS_DPS)
47 #define PS_RF_OFF                       BIT(1)
48 #define PS_ALL_ON                       BIT(2)
49 #define PS_ST_ACTIVE            BIT(3)
50 #define PS_LP                           BIT(4)  /* low performance */
51
52 #define PS_STATE_MASK           (0x0F)
53 #define PS_STATE_HW_MASK        (0x07)
54 #define         PS_SEQ_MASK             (0xc0)
55
56 #define PS_STATE(x)                     (PS_STATE_MASK & (x))
57 #define PS_STATE_HW(x)  (PS_STATE_HW_MASK & (x))
58 #define PS_SEQ(x)                       (PS_SEQ_MASK & (x))
59
60 #define PS_STATE_S0             (PS_DPS)
61 #define         PS_STATE_S1             (PS_LCLK)
62 #define PS_STATE_S2             (PS_RF_OFF)
63 #define         PS_STATE_S3             (PS_ALL_ON)
64 #define PS_STATE_S4             ((PS_ST_ACTIVE) | (PS_ALL_ON))
65
66
67 #define         PS_IS_RF_ON(x)          ((x) & (PS_ALL_ON))
68 #define         PS_IS_ACTIVE(x)         ((x) & (PS_ST_ACTIVE))
69 #define         CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
70
71
72 struct reportpwrstate_parm {
73         unsigned char mode;
74         unsigned char state; /* the CPWM value */
75         unsigned short rsvd;
76 };
77
78 struct  pwrctrl_priv {
79         struct mutex mutex_lock;
80         /*volatile*/ u8 rpwm; /* requested power state for fw */
81         /* fw current power state. updated when 1. read from HCPWM or
82          * 2. driver lowers power level
83          */
84         /*volatile*/ u8 cpwm;
85         /*volatile*/ u8 tog; /* toggling */
86         /*volatile*/ u8 cpwm_tog; /* toggling */
87         /*volatile*/ u8 tgt_rpwm; /* wanted power state */
88         uint pwr_mode;
89         uint smart_ps;
90         uint alives;
91         uint ImrContent;        /* used to store original imr. */
92         uint bSleep; /* sleep -> active is different from active -> sleep. */
93
94         struct work_struct SetPSModeWorkItem;
95         struct work_struct rpwm_workitem;
96         struct timer_list rpwm_check_timer;
97         u8      rpwm_retry;
98         uint    bSetPSModeWorkItemInProgress;
99
100         spinlock_t pnp_pwr_mgnt_lock;
101         s32     pnp_current_pwr_state;
102         u8      pnp_bstop_trx;
103         u8      pnp_wwirp_pending;
104 };
105
106 void r8712_init_pwrctrl_priv(struct _adapter *adapter);
107 int r8712_register_cmd_alive(struct _adapter *padapter);
108 void r8712_unregister_cmd_alive(struct _adapter *padapter);
109 void r8712_cpwm_int_hdl(struct _adapter *padapter,
110                         struct reportpwrstate_parm *preportpwrstate);
111 void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode,
112                         uint smart_ps);
113 void r8712_set_rpwm(struct _adapter *padapter, u8 val8);
114
115 #endif  /* __RTL871X_PWRCTRL_H_ */