xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/hndpmu.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * HND SiliconBackplane PMU support.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef _hndpmu_h_
25*4882a593Smuzhiyun #define _hndpmu_h_
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <typedefs.h>
28*4882a593Smuzhiyun #include <osl_decl.h>
29*4882a593Smuzhiyun #include <siutils.h>
30*4882a593Smuzhiyun #include <sbchipc.h>
31*4882a593Smuzhiyun #if defined(BTOVERPCIE) || defined(BT_WLAN_REG_ON_WAR)
32*4882a593Smuzhiyun #include <hnd_gcisem.h>
33*4882a593Smuzhiyun #endif /* BTOVERPCIE || BT_WLAN_REG_ON_WAR */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #if !defined(BCMDONGLEHOST)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO1		1
38*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO2		2
39*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO3		3
40*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_PAREF		4
41*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CLDO_PWM	5
42*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CLDO_BURST	6
43*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CBUCK_PWM	7
44*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CBUCK_BURST	8
45*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LNLDO1		9
46*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LNLDO2_SEL	10
47*4882a593Smuzhiyun #define SET_LNLDO_PWERUP_LATCH_CTRL	11
48*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO3P3		12
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define BBPLL_NDIV_FRAC_BITS		24
51*4882a593Smuzhiyun #define P1_DIV_SCALE_BITS			12
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define PMUREQTIMER (1 << 0)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define XTAL_FREQ_40MHZ		40000
56*4882a593Smuzhiyun #define XTAL_FREQ_54MHZ		54000
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* selects core based on AOB_ENAB() */
59*4882a593Smuzhiyun #define PMUREGADDR(sih, pmur, ccr, member) \
60*4882a593Smuzhiyun 	(AOB_ENAB(sih) ? (&(pmur)->member) : (&(ccr)->member))
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* prevents backplane stall caused by subsequent writes to 'ilp domain' PMU registers */
63*4882a593Smuzhiyun #define HND_PMU_SYNC_WR(sih, pmur, ccr, osh, r, v) do { \
64*4882a593Smuzhiyun 	if ((sih) && (sih)->pmurev >= 22) { \
65*4882a593Smuzhiyun 		while (R_REG(osh, PMUREGADDR(sih, pmur, ccr, pmustatus)) & \
66*4882a593Smuzhiyun 		       PST_SLOW_WR_PENDING) { \
67*4882a593Smuzhiyun 			; /* empty */ \
68*4882a593Smuzhiyun 		} \
69*4882a593Smuzhiyun 	} \
70*4882a593Smuzhiyun 	W_REG(osh, r, v); \
71*4882a593Smuzhiyun 	(void)R_REG(osh, r); \
72*4882a593Smuzhiyun } while (0)
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* PMU Stat Timer */
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* for count mode */
77*4882a593Smuzhiyun enum {
78*4882a593Smuzhiyun 	PMU_STATS_LEVEL_HIGH = 0,
79*4882a593Smuzhiyun 	PMU_STATS_LEVEL_LOW,
80*4882a593Smuzhiyun 	PMU_STATS_EDGE_RISE,
81*4882a593Smuzhiyun 	PMU_STATS_EDGE_FALL
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun typedef struct {
85*4882a593Smuzhiyun 	uint8 src_num; /* predefined source hw signal num to map timer */
86*4882a593Smuzhiyun 	bool  enable;  /* timer enable/disable */
87*4882a593Smuzhiyun 	bool  int_enable; /* overflow interrupts enable/disable */
88*4882a593Smuzhiyun 	uint8 cnt_mode;
89*4882a593Smuzhiyun } pmu_stats_timer_t;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* internal hw signal source number for Timer  */
92*4882a593Smuzhiyun #define SRC_PMU_RESRC_OFFSET 0x40
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define SRC_LINK_IN_L12 0
95*4882a593Smuzhiyun #define SRC_LINK_IN_L23 1
96*4882a593Smuzhiyun #define SRC_PM_ST_IN_D0 2
97*4882a593Smuzhiyun #define SRC_PM_ST_IN_D3 3
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define SRC_XTAL_PU (SRC_PMU_RESRC_OFFSET + RES4347_XTAL_PU)
100*4882a593Smuzhiyun #define SRC_CORE_RDY_MAIN (SRC_PMU_RESRC_OFFSET + RES4347_CORE_RDY_MAIN)
101*4882a593Smuzhiyun #define SRC_CORE_RDY_AUX (SRC_PMU_RESRC_OFFSET + RES4347_CORE_RDY_AUX)
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #ifdef BCMPMU_STATS
104*4882a593Smuzhiyun extern bool _pmustatsenab;
105*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK)
106*4882a593Smuzhiyun 	#define PMU_STATS_ENAB()	(_pmustatsenab)
107*4882a593Smuzhiyun #elif defined(BCMPMU_STATS_DISABLED)
108*4882a593Smuzhiyun 	#define PMU_STATS_ENAB()	(0)
109*4882a593Smuzhiyun #else
110*4882a593Smuzhiyun 	#define PMU_STATS_ENAB()	(1)
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun #else
113*4882a593Smuzhiyun 	#define PMU_STATS_ENAB()	(0)
114*4882a593Smuzhiyun #endif /* BCMPMU_STATS */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define RES4369_HTAVAIL_VAL 0x00a80022
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #if defined(BTOVERPCIE) && defined(BT_WLAN_REG_ON_WAR)
119*4882a593Smuzhiyun #error "'BT over PCIe' and 'WLAN/BT REG_ON WAR' are mutually exclusive as "
120*4882a593Smuzhiyun 	"both share the same GCI semaphore - THREAD_0_GCI_SEM_3_ID"
121*4882a593Smuzhiyun #endif /* BTOVERPCIE && BT_WLAN_REG_ON_WAR */
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #if defined(BTOVERPCIE)
124*4882a593Smuzhiyun #define GCI_PLL_LOCK_SEM			THREAD_0_GCI_SEM_3_ID
125*4882a593Smuzhiyun /* changed from msec to usec */
126*4882a593Smuzhiyun #define GCI_PLL_LOCK_SEM_TIMEOUT		(GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000)
127*4882a593Smuzhiyun #endif /* BTOVERPCIE */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #if defined(BT_WLAN_REG_ON_WAR)
130*4882a593Smuzhiyun #define GCI_BT_WLAN_REG_ON_WAR_SEM		THREAD_0_GCI_SEM_3_ID
131*4882a593Smuzhiyun #define GCI_BT_WLAN_REG_ON_WAR_SEM_TIMEOUT	(GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000)
132*4882a593Smuzhiyun #endif /* BT_WLAN_REG_ON_WAR */
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define GCI_INDIRECT_ACCESS_SEM                 THREAD_0_GCI_SEM_2_ID
135*4882a593Smuzhiyun #define GCI_INDIRECT_ACCESS_SEM_TIMEOUT         (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000)
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define GCI_TREFUP_DS_SEM                       THREAD_0_GCI_SEM_5_ID
138*4882a593Smuzhiyun #define GCI_TREFUP_DS_SEM_TIMEOUT               (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_MEMOFFSET              (0x570u)
141*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_WAIT                0u  /* BT ROM code waiting on FW boot */
142*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_BOOT                2u  /* upon FW boot/start */
143*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_TRAP                3u  /* upon a trap */
144*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_INVALID             0xFFu
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define GCI_TREFUP_DS_MEMOFFSET                 (0x57Cu)
147*4882a593Smuzhiyun #define GCI_TREFUP_DS_WLAN                      (1u << 0u)
148*4882a593Smuzhiyun #define GCI_TREFUP_DS_BT                        (1u << 1u)
149*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_RSVD                  (1u << 2u)
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM			THREAD_0_GCI_SEM_6_ID
152*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM_TIMEOUT	GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000
153*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM_ERASE_RSVD_TIMEOUT		50 + 30 /* 50 us + headroom */
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4369	(PMU_VREG_6)
156*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4369(x)		(9u + (x * 8u))
157*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4369		(3u)
158*4882a593Smuzhiyun #define SLEW_RATE_MASK_4369		((1u << SLEW_RATE_SIZE_4369) - 1u)
159*4882a593Smuzhiyun #define SOFT_START_EN_REG_4369		(PMU_VREG_5)
160*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4369(x)	(4u + x)
161*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4369		(1u)
162*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4369		((1u << SOFT_START_EN_SIZE_4369) - 1u)
163*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4369	(1u)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4378	(PMU_VREG_6)
166*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4378(x)		(9u + (x * 8u))
167*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4378		(3u)
168*4882a593Smuzhiyun #define SLEW_RATE_MASK_4378		((1u << SLEW_RATE_SIZE_4378) - 1u)
169*4882a593Smuzhiyun #define SOFT_START_EN_REG_4378		(PMU_VREG_5)
170*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4378(x)	(4u + x)
171*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4378		(1u)
172*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4378		((1u << SOFT_START_EN_SIZE_4378) - 1u)
173*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4378	(1u)
174*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4378_REV37	(0u)
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4387	(PMU_VREG_6)
177*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4387(x)		(18u)
178*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4387		(2u)
179*4882a593Smuzhiyun #define SLEW_RATE_MASK_4387		((1u << SLEW_RATE_SIZE_4387) - 1u)
180*4882a593Smuzhiyun #define SOFT_START_EN_REG_4387		(PMU_VREG_6)
181*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4387(x)	(17u)
182*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4387		(1u)
183*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4387		((1u << SOFT_START_EN_SIZE_4387) - 1u)
184*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4387	(0u)
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun extern void si_pmu_init(si_t *sih, osl_t *osh);
187*4882a593Smuzhiyun extern void si_pmu_chip_init(si_t *sih, osl_t *osh);
188*4882a593Smuzhiyun extern void si_pmu_pll_init(si_t *sih, osl_t *osh, uint32 xtalfreq);
189*4882a593Smuzhiyun extern void si_pmu_res_init(si_t *sih, osl_t *osh);
190*4882a593Smuzhiyun extern void si_pmu_swreg_init(si_t *sih, osl_t *osh);
191*4882a593Smuzhiyun extern void si_pmu_res_minmax_update(si_t *sih, osl_t *osh);
192*4882a593Smuzhiyun extern void si_pmu_clear_intmask(si_t *sih);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun extern uint32 si_pmu_si_clock(si_t *sih, osl_t *osh);   /* returns [Hz] units */
195*4882a593Smuzhiyun extern uint32 si_pmu_cpu_clock(si_t *sih, osl_t *osh);  /* returns [hz] units */
196*4882a593Smuzhiyun extern uint32 si_pmu_mem_clock(si_t *sih, osl_t *osh);  /* returns [Hz] units */
197*4882a593Smuzhiyun extern uint32 si_pmu_alp_clock(si_t *sih, osl_t *osh);  /* returns [Hz] units */
198*4882a593Smuzhiyun extern void si_pmu_ilp_clock_set(uint32 cycles);
199*4882a593Smuzhiyun extern uint32 si_pmu_ilp_clock(si_t *sih, osl_t *osh);  /* returns [Hz] units */
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun extern void si_pmu_set_ldo_voltage(si_t *sih, osl_t *osh, uint8 ldo, uint8 voltage);
202*4882a593Smuzhiyun extern uint16 si_pmu_fast_pwrup_delay(si_t *sih, osl_t *osh);
203*4882a593Smuzhiyun extern uint si_pmu_fast_pwrup_delay_dig(si_t *sih, osl_t *osh);
204*4882a593Smuzhiyun extern void si_pmu_pllupd(si_t *sih);
205*4882a593Smuzhiyun extern void si_pmu_spuravoid(si_t *sih, osl_t *osh, uint8 spuravoid);
206*4882a593Smuzhiyun extern void si_pmu_pll_off_PARR(si_t *sih, osl_t *osh, uint32 *min_res_mask,
207*4882a593Smuzhiyun 	uint32 *max_res_mask, uint32 *clk_ctl_st);
208*4882a593Smuzhiyun extern uint32 si_pmu_pll28nm_fvco(si_t *sih);
209*4882a593Smuzhiyun /* below function are only for BBPLL parallel purpose */
210*4882a593Smuzhiyun extern void si_pmu_gband_spurwar(si_t *sih, osl_t *osh);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun extern bool si_pmu_is_otp_powered(si_t *sih, osl_t *osh);
213*4882a593Smuzhiyun extern uint32 si_pmu_measure_alpclk(si_t *sih, osl_t *osh);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun extern uint32 si_pmu_chipcontrol(si_t *sih, uint reg, uint32 mask, uint32 val);
216*4882a593Smuzhiyun #if defined(SAVERESTORE)
217*4882a593Smuzhiyun extern void si_set_abuck_mode_4362(si_t *sih, uint8 mode);
218*4882a593Smuzhiyun #endif /* SAVERESTORE */
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #define si_pmu_regcontrol si_pmu_vreg_control /* prevents build err because of usage in PHY */
221*4882a593Smuzhiyun extern uint32 si_pmu_vreg_control(si_t *sih, uint reg, uint32 mask, uint32 val);
222*4882a593Smuzhiyun extern uint32 si_pmu_pllcontrol(si_t *sih, uint reg, uint32 mask, uint32 val);
223*4882a593Smuzhiyun extern void si_pmu_pllupd(si_t *sih);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun extern uint32 si_pmu_waitforclk_on_backplane(si_t *sih, osl_t *osh, uint32 clk, uint32 delay);
226*4882a593Smuzhiyun extern uint32 si_pmu_get_bb_vcofreq(si_t *sih, osl_t *osh, int xtalfreq);
227*4882a593Smuzhiyun typedef void (*si_pmu_callback_t)(void* arg);
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun extern uint32 si_mac_clk(si_t *sih, osl_t *osh);
230*4882a593Smuzhiyun extern void si_pmu_switch_on_PARLDO(si_t *sih, osl_t *osh);
231*4882a593Smuzhiyun extern void si_pmu_switch_off_PARLDO(si_t *sih, osl_t *osh);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /* TODO: need a better fn name or better abstraction than the raw fvco
234*4882a593Smuzhiyun  * and MAC clock channel divisor...
235*4882a593Smuzhiyun  */
236*4882a593Smuzhiyun extern int si_pmu_fvco_macdiv(si_t *sih, uint32 *fvco, uint32 *div);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun extern bool si_pmu_reset_ret_sleep_log(si_t *sih, osl_t *osh);
239*4882a593Smuzhiyun extern bool si_pmu_reset_chip_sleep_log(si_t *sih, osl_t *osh);
240*4882a593Smuzhiyun extern int si_pmu_openloop_cal(si_t *sih, uint16 currtemp);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun #ifdef LDO3P3_MIN_RES_MASK
243*4882a593Smuzhiyun extern int si_pmu_min_res_ldo3p3_set(si_t *sih, osl_t *osh, bool on);
244*4882a593Smuzhiyun extern int si_pmu_min_res_ldo3p3_get(si_t *sih, osl_t *osh, int *res);
245*4882a593Smuzhiyun #endif /* LDO3P3_MIN_RES_MASK */
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun void si_pmu_bt_ldo_pu(si_t *sih, bool up);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_wl_get(si_t *sih, osl_t *osh, int *res);
250*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_wl_set(si_t *sih, osl_t *osh, uint32 slew_rate);
251*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_bt_get(si_t *sih, osl_t *osh, int *res);
252*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_bt_set(si_t *sih, osl_t *osh, uint32 slew_rate);
253*4882a593Smuzhiyun extern int si_pmu_min_res_otp_pu_set(si_t *sih, osl_t *osh, bool on);
254*4882a593Smuzhiyun #endif /* !defined(BCMDONGLEHOST) */
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun #if defined(EDV)
257*4882a593Smuzhiyun extern uint32 si_pmu_get_backplaneclkspeed(si_t *sih);
258*4882a593Smuzhiyun extern void si_pmu_update_backplane_clock(si_t *sih, osl_t *osh, uint reg, uint32 mask, uint32 val);
259*4882a593Smuzhiyun #endif
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_macphy_clk_deps(si_t *sih, osl_t *osh, int maccore_index);
262*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_ht_avail_clk_deps(si_t *sih, osl_t *osh);
263*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_cb_ready_deps(si_t *sih, osl_t *osh);
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun extern void si_pmu_otp_power(si_t *sih, osl_t *osh, bool on, uint32* min_res_mask);
266*4882a593Smuzhiyun extern void si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength);
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun extern void si_pmu_slow_clk_reinit(si_t *sih, osl_t *osh);
269*4882a593Smuzhiyun extern void si_pmu_avbtimer_enable(si_t *sih, osl_t *osh, bool set_flag);
270*4882a593Smuzhiyun extern uint32 si_pmu_dump_pmucap_binary(si_t *sih, uchar *p);
271*4882a593Smuzhiyun extern uint32 si_pmu_dump_buf_size_pmucap(si_t *sih);
272*4882a593Smuzhiyun extern int si_pmu_wait_for_steady_state(si_t *sih, osl_t *osh, pmuregs_t *pmu);
273*4882a593Smuzhiyun #ifdef ATE_BUILD
274*4882a593Smuzhiyun extern void hnd_pmu_clr_int_sts_req_active(osl_t *hnd_osh, si_t *hnd_sih);
275*4882a593Smuzhiyun #endif
276*4882a593Smuzhiyun extern uint32 si_pmu_wake_bit_offset(si_t *sih);
277*4882a593Smuzhiyun extern uint32 si_pmu_get_pmutimer(si_t *sih);
278*4882a593Smuzhiyun extern void si_pmu_set_min_res_mask(si_t *sih, osl_t *osh, uint min_res_mask);
279*4882a593Smuzhiyun extern void si_pmu_set_mac_rsrc_req(si_t *sih, int macunit);
280*4882a593Smuzhiyun extern void si_pmu_set_mac_rsrc_req_sc(si_t *sih, osl_t *osh);
281*4882a593Smuzhiyun extern bool si_pmu_fast_lpo_enable_pcie(si_t *sih);
282*4882a593Smuzhiyun extern bool si_pmu_fast_lpo_enable_pmu(si_t *sih);
283*4882a593Smuzhiyun extern uint32 si_cur_pmu_time(si_t *sih);
284*4882a593Smuzhiyun extern bool si_pmu_cap_fast_lpo(si_t *sih);
285*4882a593Smuzhiyun extern int si_pmu_fast_lpo_disable(si_t *sih);
286*4882a593Smuzhiyun extern void si_pmu_dmn1_perst_wakeup(si_t *sih, bool set);
287*4882a593Smuzhiyun #ifdef BCMPMU_STATS
288*4882a593Smuzhiyun extern void si_pmustatstimer_init(si_t *sih);
289*4882a593Smuzhiyun extern void si_pmustatstimer_dump(si_t *sih);
290*4882a593Smuzhiyun extern void si_pmustatstimer_start(si_t *sih, uint8 timerid);
291*4882a593Smuzhiyun extern void si_pmustatstimer_stop(si_t *sih, uint8 timerid);
292*4882a593Smuzhiyun extern void si_pmustatstimer_clear(si_t *sih, uint8 timerid);
293*4882a593Smuzhiyun extern void si_pmustatstimer_clear_overflow(si_t *sih);
294*4882a593Smuzhiyun extern uint32 si_pmustatstimer_read(si_t *sih, uint8 timerid);
295*4882a593Smuzhiyun extern void si_pmustatstimer_cfg_src_num(si_t *sih, uint8 src_num, uint8 timerid);
296*4882a593Smuzhiyun extern void si_pmustatstimer_cfg_cnt_mode(si_t *sih, uint8 cnt_mode, uint8 timerid);
297*4882a593Smuzhiyun extern void si_pmustatstimer_int_enable(si_t *sih);
298*4882a593Smuzhiyun extern void si_pmustatstimer_int_disable(si_t *sih);
299*4882a593Smuzhiyun #endif /* BCMPMU_STATS */
300*4882a593Smuzhiyun extern int si_pmu_min_res_set(si_t *sih, osl_t *osh, uint min_mask, bool set);
301*4882a593Smuzhiyun extern void si_pmu_disable_intr_pwrreq(si_t *sih);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun #ifdef DONGLEBUILD
304*4882a593Smuzhiyun /* Get PMU registers in rodata */
305*4882a593Smuzhiyun extern int si_pmu_regs_in_rodata_dump(void *sih, void *arg2, uint32 *bufptr, uint16 *len);
306*4882a593Smuzhiyun #endif
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun extern void si_pmu_fis_setup(si_t *sih);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun extern uint si_pmu_get_mac_rsrc_req_tmr_cnt(si_t *sih);
311*4882a593Smuzhiyun extern uint si_pmu_get_pmu_interrupt_rcv_cnt(si_t *sih);
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun extern bool _bcm_pwr_opt_dis;
314*4882a593Smuzhiyun #define BCM_PWR_OPT_ENAB()	(FALSE)
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun extern int si_pmu_mem_pwr_off(si_t *sih, int core_idx);
317*4882a593Smuzhiyun extern int si_pmu_mem_pwr_on(si_t *sih);
318*4882a593Smuzhiyun extern int si_pmu_lvm_csr_update(si_t *sih, bool lvm);
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun #if defined(BT_WLAN_REG_ON_WAR)
321*4882a593Smuzhiyun #define REG_ON_WAR_PMU_EXT_WAKE_REQ_MASK0_VAL 0x060000CDu
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun extern void si_pmu_reg_on_war_ext_wake_perst_set(si_t *sih);
324*4882a593Smuzhiyun extern void si_pmu_reg_on_war_ext_wake_perst_clear(si_t *sih);
325*4882a593Smuzhiyun #endif /* BT_WLAN_REG_ON_WAR */
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun #if defined (BCMSRTOPOFF)
328*4882a593Smuzhiyun 	extern bool _srtopoff_enab;
329*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD)
330*4882a593Smuzhiyun 	#define BCMSRTOPOFF_ENAB()	(_srtopoff_enab)
331*4882a593Smuzhiyun #elif defined(BCMSRTOPOFF_DISABLED)
332*4882a593Smuzhiyun 	#define BCMSRTOPOFF_ENAB()	(0)
333*4882a593Smuzhiyun #else
334*4882a593Smuzhiyun 	#define BCMSRTOPOFF_ENAB()	(_srtopoff_enab)
335*4882a593Smuzhiyun #endif
336*4882a593Smuzhiyun #else
337*4882a593Smuzhiyun 	#define BCMSRTOPOFF_ENAB()	(0)
338*4882a593Smuzhiyun #endif /* BCMSRTOPOFF */
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun #ifdef BCM_PMU_FLL_PU_MANAGE
341*4882a593Smuzhiyun #define PMU_FLL_PU_ENAB()	(TRUE)
342*4882a593Smuzhiyun #else
343*4882a593Smuzhiyun #define PMU_FLL_PU_ENAB()	(FALSE)
344*4882a593Smuzhiyun #endif
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun extern pmuregs_t *hnd_pmur;	/* PMU core regs */
347*4882a593Smuzhiyun extern void si_pmu_res_state_wait(si_t *sih, uint rsrc);
348*4882a593Smuzhiyun #endif /* _hndpmu_h_ */
349