xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/hndlhl.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Misc utility routines for accessing lhl specific features
3*4882a593Smuzhiyun  * of the SiliconBackplane-based Broadcom chips.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
10*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
11*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
12*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
13*4882a593Smuzhiyun  * following added to such license:
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
16*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
17*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
18*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
19*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
20*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
21*4882a593Smuzhiyun  * modifications of the software.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
24*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
25*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
29*4882a593Smuzhiyun  *
30*4882a593Smuzhiyun  * $Id: hndpmu.c 547757 2015-04-13 10:18:04Z $
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #include <hndpmu.h>
34*4882a593Smuzhiyun #include <hndlhl.h>
35*4882a593Smuzhiyun #include <sbchipc.h>
36*4882a593Smuzhiyun #include <hndsoc.h>
37*4882a593Smuzhiyun #include <bcmdevs.h>
38*4882a593Smuzhiyun #include <osl.h>
39*4882a593Smuzhiyun #include <sbgci.h>
40*4882a593Smuzhiyun #include <siutils.h>
41*4882a593Smuzhiyun #include <bcmutils.h>
42*4882a593Smuzhiyun #ifdef BCMULP
43*4882a593Smuzhiyun #include <ulp.h>
44*4882a593Smuzhiyun #endif // endif
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define SI_LHL_EXT_WAKE_REQ_MASK_MAGIC		0x7FBBF7FF	/* magic number for LHL EXT */
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* PmuRev1 has a 24-bit PMU RsrcReq timer. However it pushes all other bits
49*4882a593Smuzhiyun  * upward. To make the code to run for all revs we use a variable to tell how
50*4882a593Smuzhiyun  * many bits we need to shift.
51*4882a593Smuzhiyun  */
52*4882a593Smuzhiyun #define FLAGS_SHIFT	14
53*4882a593Smuzhiyun #define	LHL_ERROR(args) printf args
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun void
si_lhl_setup(si_t * sih,osl_t * osh)56*4882a593Smuzhiyun si_lhl_setup(si_t *sih, osl_t *osh)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	if (CHIPID(sih->chip) == BCM43012_CHIP_ID) {
59*4882a593Smuzhiyun 		/* Enable PMU sleep mode0 */
60*4882a593Smuzhiyun #ifdef BCMQT
61*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_0);
62*4882a593Smuzhiyun #else
63*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_2);
64*4882a593Smuzhiyun #endif // endif
65*4882a593Smuzhiyun 		/* Modify as per the
66*4882a593Smuzhiyun 		BCM43012/LHL#LHL-RecommendedsettingforvariousPMUSleepModes:
67*4882a593Smuzhiyun 		*/
68*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup_ctl_adr, LHL_PWRUP_CTL_MASK, LHL_PWRUP_CTL);
69*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup2_ctl_adr, LHL_PWRUP2_CTL_MASK, LHL_PWRUP2_CTL);
70*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn_ctl_adr, LHL_PWRDN_CTL_MASK, LHL_PWRDN_SLEEP_CNT);
71*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn2_ctl_adr, LHL_PWRDN2_CTL_MASK, LHL_PWRDN2_CTL);
72*4882a593Smuzhiyun 	} else if (BCM4347_CHIP(sih->chip)) {
73*4882a593Smuzhiyun 		if (LHL_IS_PSMODE_1(sih)) {
74*4882a593Smuzhiyun 			LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_1);
75*4882a593Smuzhiyun 		} else {
76*4882a593Smuzhiyun 			LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_0);
77*4882a593Smuzhiyun 		}
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup_ctl_adr, LHL_PWRUP_CTL_MASK, LHL_PWRUP_CTL_4347);
80*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup2_ctl_adr, LHL_PWRUP2_CTL_MASK, LHL_PWRUP2_CTL);
81*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn_ctl_adr,
82*4882a593Smuzhiyun 			LHL_PWRDN_CTL_MASK, LHL_PWRDN_SLEEP_CNT);
83*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn2_ctl_adr, LHL_PWRDN2_CTL_MASK, LHL_PWRDN2_CTL);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 		/*
86*4882a593Smuzhiyun 		 * Enable wakeup on GPIO1, PCIE clkreq and perst signal,
87*4882a593Smuzhiyun 		 * GPIO[0] is mapped to GPIO1
88*4882a593Smuzhiyun 		 * GPIO[1] is mapped to PCIE perst
89*4882a593Smuzhiyun 		 * GPIO[2] is mapped to PCIE clkreq
90*4882a593Smuzhiyun 		 */
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 		/* GPIO1 */
93*4882a593Smuzhiyun 		/* Clear any old interrupt status */
94*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
95*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
96*4882a593Smuzhiyun 		/* active high level trigger */
97*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_GPIO1_GPIO_PIN], ~0,
98*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT);
99*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
100*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
101*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
102*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
103*4882a593Smuzhiyun #if !defined(_CFEZ_)
104*4882a593Smuzhiyun 		si_gci_set_functionsel(sih, 1, CC4347_FNSEL_SAMEASPIN);
105*4882a593Smuzhiyun #endif // endif
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 		/* PCIE perst */
108*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
109*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
110*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_PERST_GPIO_PIN], ~0,
111*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_EDGE_TRIG_BIT |
112*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT));
113*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
114*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
115*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
116*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 		/* PCIE clkreq */
119*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
120*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
121*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_CLKREQ_GPIO_PIN], ~0,
122*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_EDGE_TRIG_BIT |
123*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_NEG_EDGE_TRIG_BIT |
124*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT));
125*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
126*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
127*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
128*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
129*4882a593Smuzhiyun 	}
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /* To skip this function, specify a invalid "lpo_select" value in nvram */
133*4882a593Smuzhiyun int
si_lhl_set_lpoclk(si_t * sih,osl_t * osh,uint32 lpo_force)134*4882a593Smuzhiyun si_lhl_set_lpoclk(si_t *sih, osl_t *osh, uint32 lpo_force)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	gciregs_t *gciregs;
137*4882a593Smuzhiyun 	uint clk_det_cnt, status;
138*4882a593Smuzhiyun 	int lhl_wlclk_sel;
139*4882a593Smuzhiyun 	uint32 lpo = 0;
140*4882a593Smuzhiyun 	int timeout = 0;
141*4882a593Smuzhiyun 	gciregs = si_setcore(sih, GCI_CORE_ID, 0);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	ASSERT(gciregs != NULL);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	/* Apply nvram override to lpo */
146*4882a593Smuzhiyun 	if ((lpo_force == LHL_LPO_AUTO) && ((lpo = (uint32)getintvar(NULL, "lpo_select")) == 0)) {
147*4882a593Smuzhiyun 		lpo = LHL_OSC_32k_ENAB;
148*4882a593Smuzhiyun 	} else {
149*4882a593Smuzhiyun 		lpo = lpo_force;
150*4882a593Smuzhiyun 	}
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* Power up the desired LPO */
153*4882a593Smuzhiyun 	switch (lpo) {
154*4882a593Smuzhiyun 		case LHL_EXT_LPO_ENAB:
155*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, EXTLPO_BUF_PD, 0);
156*4882a593Smuzhiyun 			lhl_wlclk_sel = LHL_EXT_SEL;
157*4882a593Smuzhiyun 			break;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 		case LHL_LPO1_ENAB:
160*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO1_PD_EN, 0);
161*4882a593Smuzhiyun 			lhl_wlclk_sel = LHL_LPO1_SEL;
162*4882a593Smuzhiyun 			break;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 		case LHL_LPO2_ENAB:
165*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO2_PD_EN, 0);
166*4882a593Smuzhiyun 			lhl_wlclk_sel = LHL_LPO2_SEL;
167*4882a593Smuzhiyun 			break;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 		case LHL_OSC_32k_ENAB:
170*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, OSC_32k_PD, 0);
171*4882a593Smuzhiyun 			lhl_wlclk_sel = LHL_32k_SEL;
172*4882a593Smuzhiyun 			break;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 		default:
175*4882a593Smuzhiyun 			goto done;
176*4882a593Smuzhiyun 	}
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr,
179*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_AD_CNTR_CLK_SEL, lhl_wlclk_sel);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	/* Detect the desired LPO */
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN, 0);
184*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr,
185*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR, LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR);
186*4882a593Smuzhiyun 	timeout = 0;
187*4882a593Smuzhiyun 	clk_det_cnt =
188*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
189*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
190*4882a593Smuzhiyun 	while (clk_det_cnt != 0 && timeout <= LPO_SEL_TIMEOUT) {
191*4882a593Smuzhiyun 		OSL_DELAY(10);
192*4882a593Smuzhiyun 		clk_det_cnt =
193*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
194*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
195*4882a593Smuzhiyun 		timeout++;
196*4882a593Smuzhiyun 	}
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	if (clk_det_cnt != 0) {
199*4882a593Smuzhiyun 		LHL_ERROR(("Clock not present as clear did not work timeout = %d\n", timeout));
200*4882a593Smuzhiyun 		goto error;
201*4882a593Smuzhiyun 	}
202*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR, 0);
203*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN,
204*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN);
205*4882a593Smuzhiyun 	clk_det_cnt =
206*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
207*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
208*4882a593Smuzhiyun 	timeout = 0;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	while (clk_det_cnt <= CLK_DET_CNT_THRESH && timeout <= LPO_SEL_TIMEOUT) {
211*4882a593Smuzhiyun 		OSL_DELAY(10);
212*4882a593Smuzhiyun 		clk_det_cnt =
213*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
214*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
215*4882a593Smuzhiyun 		timeout++;
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	if (timeout >= LPO_SEL_TIMEOUT) {
219*4882a593Smuzhiyun 		LHL_ERROR(("LPO is not available timeout = %u\n, timeout", timeout));
220*4882a593Smuzhiyun 		goto error;
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	/* Select the desired LPO */
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	LHL_REG(sih, lhl_main_ctl_adr,
226*4882a593Smuzhiyun 		LHL_MAIN_CTL_ADR_LHL_WLCLK_SEL, (lhl_wlclk_sel) << LPO_SEL_SHIFT);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	status = ((R_REG(osh, &gciregs->lhl_clk_status_adr) & LHL_MAIN_CTL_ADR_FINAL_CLK_SEL) ==
229*4882a593Smuzhiyun 		(unsigned)(((1 << lhl_wlclk_sel) << LPO_FINAL_SEL_SHIFT))) ? 1 : 0;
230*4882a593Smuzhiyun 	timeout = 0;
231*4882a593Smuzhiyun 	while (!status && timeout <= LPO_SEL_TIMEOUT) {
232*4882a593Smuzhiyun 		OSL_DELAY(10);
233*4882a593Smuzhiyun 		status =
234*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_status_adr) & LHL_MAIN_CTL_ADR_FINAL_CLK_SEL) ==
235*4882a593Smuzhiyun 		(unsigned)(((1 << lhl_wlclk_sel) << LPO_FINAL_SEL_SHIFT))) ? 1 : 0;
236*4882a593Smuzhiyun 		timeout++;
237*4882a593Smuzhiyun 	}
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	if (timeout >= LPO_SEL_TIMEOUT) {
240*4882a593Smuzhiyun 		LHL_ERROR(("LPO is not available timeout = %u\n, timeout", timeout));
241*4882a593Smuzhiyun 		goto error;
242*4882a593Smuzhiyun 	}
243*4882a593Smuzhiyun 	/* Power down the rest of the LPOs */
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	if (lpo != LHL_EXT_LPO_ENAB) {
246*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, EXTLPO_BUF_PD, EXTLPO_BUF_PD);
247*4882a593Smuzhiyun 	}
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	if (lpo != LHL_LPO1_ENAB) {
250*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, LPO1_PD_EN, LPO1_PD_EN);
251*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, LPO1_PD_SEL, LPO1_PD_SEL_VAL);
252*4882a593Smuzhiyun 	}
253*4882a593Smuzhiyun 	if (lpo != LHL_LPO2_ENAB) {
254*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, LPO2_PD_EN, LPO2_PD_EN);
255*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, LPO2_PD_SEL, LPO2_PD_SEL_VAL);
256*4882a593Smuzhiyun 	}
257*4882a593Smuzhiyun 	if (lpo != LHL_OSC_32k_ENAB) {
258*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, OSC_32k_PD, OSC_32k_PD);
259*4882a593Smuzhiyun 	}
260*4882a593Smuzhiyun 	if (lpo != RADIO_LPO_ENAB) {
261*4882a593Smuzhiyun 		si_gci_chipcontrol(sih, CC_GCI_CHIPCTRL_06, LPO_SEL, 0);
262*4882a593Smuzhiyun 	}
263*4882a593Smuzhiyun done:
264*4882a593Smuzhiyun 	return BCME_OK;
265*4882a593Smuzhiyun error:
266*4882a593Smuzhiyun 	ROMMABLE_ASSERT(0);
267*4882a593Smuzhiyun 	return BCME_ERROR;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun void
si_lhl_timer_config(si_t * sih,osl_t * osh,int timer_type)271*4882a593Smuzhiyun si_lhl_timer_config(si_t *sih, osl_t *osh, int timer_type)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	uint origidx;
274*4882a593Smuzhiyun 	pmuregs_t *pmu = NULL;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	/* Remember original core before switch to chipc/pmu */
277*4882a593Smuzhiyun 	origidx = si_coreidx(sih);
278*4882a593Smuzhiyun 	if (AOB_ENAB(sih)) {
279*4882a593Smuzhiyun 		pmu = si_setcore(sih, PMU_CORE_ID, 0);
280*4882a593Smuzhiyun 	} else {
281*4882a593Smuzhiyun 		pmu = si_setcoreidx(sih, SI_CC_IDX);
282*4882a593Smuzhiyun 	}
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	ASSERT(pmu != NULL);
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	switch (timer_type) {
287*4882a593Smuzhiyun 	case LHL_MAC_TIMER:
288*4882a593Smuzhiyun 		/* Enable MAC Timer interrupt */
289*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_mactim0_intrp_adr,
290*4882a593Smuzhiyun 			(LHL_WL_MACTIM0_INTRP_EN | LHL_WL_MACTIM0_INTRP_EDGE_TRIGGER),
291*4882a593Smuzhiyun 			(LHL_WL_MACTIM0_INTRP_EN | LHL_WL_MACTIM0_INTRP_EDGE_TRIGGER));
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 		/* Programs bits for MACPHY_CLK_AVAIL and all its dependent bits in
294*4882a593Smuzhiyun 		 * MacResourceReqMask0.
295*4882a593Smuzhiyun 		 */
296*4882a593Smuzhiyun 		PMU_REG(sih, mac_res_req_mask, ~0, si_pmu_rsrc_macphy_clk_deps(sih, osh, 0));
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 		/* One time init of mac_res_req_timer to enable interrupt and clock request */
299*4882a593Smuzhiyun 		HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
300*4882a593Smuzhiyun 				PMUREGADDR(sih, pmu, pmu, mac_res_req_timer),
301*4882a593Smuzhiyun 				((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 		if (si_numd11coreunits(sih) > 1) {
304*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim1_intrp_adr,
305*4882a593Smuzhiyun 				(LHL_WL_MACTIM0_INTRP_EN | LHL_WL_MACTIM0_INTRP_EDGE_TRIGGER),
306*4882a593Smuzhiyun 				(LHL_WL_MACTIM0_INTRP_EN | LHL_WL_MACTIM0_INTRP_EDGE_TRIGGER));
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 			PMU_REG(sih, mac_res_req_mask1, ~0,
309*4882a593Smuzhiyun 				si_pmu_rsrc_macphy_clk_deps(sih, osh, 1));
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 			HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
312*4882a593Smuzhiyun 					PMUREGADDR(sih, pmu, pmu, mac_res_req_timer1),
313*4882a593Smuzhiyun 					((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
314*4882a593Smuzhiyun 		}
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 		break;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	case LHL_ARM_TIMER:
319*4882a593Smuzhiyun 		/* Enable ARM Timer interrupt */
320*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_armtim0_intrp_adr,
321*4882a593Smuzhiyun 				(LHL_WL_ARMTIM0_INTRP_EN | LHL_WL_ARMTIM0_INTRP_EDGE_TRIGGER),
322*4882a593Smuzhiyun 				(LHL_WL_ARMTIM0_INTRP_EN | LHL_WL_ARMTIM0_INTRP_EDGE_TRIGGER));
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 		/* Programs bits for HT_AVAIL and all its dependent bits in ResourceReqMask0 */
325*4882a593Smuzhiyun 		PMU_REG(sih, res_req_mask, ~0, si_pmu_rsrc_ht_avail_clk_deps(sih, osh));
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 		/* One time init of res_req_timer to enable interrupt and clock request
328*4882a593Smuzhiyun 		 * For low power request only ALP (HT_AVAIL is anyway requested by res_req_mask)
329*4882a593Smuzhiyun 		 */
330*4882a593Smuzhiyun 		HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
331*4882a593Smuzhiyun 				PMUREGADDR(sih, pmu, pmu, res_req_timer),
332*4882a593Smuzhiyun 				((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
333*4882a593Smuzhiyun 		break;
334*4882a593Smuzhiyun 	}
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	/* Return to original core */
337*4882a593Smuzhiyun 	si_setcoreidx(sih, origidx);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun void
si_lhl_timer_enable(si_t * sih)341*4882a593Smuzhiyun si_lhl_timer_enable(si_t *sih)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun 	/* Enable clks for pmu int propagation */
344*4882a593Smuzhiyun 	PMU_REG(sih, pmuintctrl0, PMU_INTC_ALP_REQ, PMU_INTC_ALP_REQ);
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	PMU_REG(sih, pmuintmask0, RSRC_INTR_MASK_TIMER_INT_0, RSRC_INTR_MASK_TIMER_INT_0);
347*4882a593Smuzhiyun #ifndef BCMQT
348*4882a593Smuzhiyun 	LHL_REG(sih, lhl_main_ctl_adr, LHL_FAST_WRITE_EN, LHL_FAST_WRITE_EN);
349*4882a593Smuzhiyun #endif /* BCMQT */
350*4882a593Smuzhiyun 	PMU_REG(sih, pmucontrol_ext, PCTL_EXT_USE_LHL_TIMER, PCTL_EXT_USE_LHL_TIMER);
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun void
si_lhl_ilp_config(si_t * sih,osl_t * osh,uint32 ilp_period)354*4882a593Smuzhiyun si_lhl_ilp_config(si_t *sih, osl_t *osh, uint32 ilp_period)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	 gciregs_t *gciregs;
357*4882a593Smuzhiyun 	 if (CHIPID(sih->chip) == BCM43012_CHIP_ID) {
358*4882a593Smuzhiyun 		gciregs = si_setcore(sih, GCI_CORE_ID, 0);
359*4882a593Smuzhiyun 		ASSERT(gciregs != NULL);
360*4882a593Smuzhiyun 		W_REG(osh, &gciregs->lhl_wl_ilp_val_adr, ilp_period);
361*4882a593Smuzhiyun 	 }
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun #ifdef BCMULP
365*4882a593Smuzhiyun void
si_lhl_disable_sdio_wakeup(si_t * sih)366*4882a593Smuzhiyun si_lhl_disable_sdio_wakeup(si_t *sih)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun 	/* Disable the interrupt */
369*4882a593Smuzhiyun 	LHL_REG(sih, gpio_int_en_port_adr[0], (1 << ULP_SDIO_CMD_PIN), 0);
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	/* Clear the pending interrupt status */
372*4882a593Smuzhiyun 	LHL_REG(sih, gpio_int_st_port_adr[0], (1 << ULP_SDIO_CMD_PIN), (1 << ULP_SDIO_CMD_PIN));
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun void
si_lhl_enable_sdio_wakeup(si_t * sih,osl_t * osh)376*4882a593Smuzhiyun si_lhl_enable_sdio_wakeup(si_t *sih, osl_t *osh)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	gciregs_t *gciregs;
380*4882a593Smuzhiyun 	pmuregs_t *pmu;
381*4882a593Smuzhiyun 	gciregs = si_setcore(sih, GCI_CORE_ID, 0);
382*4882a593Smuzhiyun 	ASSERT(gciregs != NULL);
383*4882a593Smuzhiyun 	if (CHIPID(sih->chip) == BCM43012_CHIP_ID) {
384*4882a593Smuzhiyun 		/* For SDIO_CMD configure P8 for wake on negedge
385*4882a593Smuzhiyun 		  * LHL  0 -> edge trigger intr mode,
386*4882a593Smuzhiyun 		  * 1 -> neg edge trigger intr mode ,
387*4882a593Smuzhiyun 		  * 6 -> din from wl side enable
388*4882a593Smuzhiyun 		  */
389*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gpio_ctrl_iocfg_p_adr[ULP_SDIO_CMD_PIN],
390*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_EDGE_TRIG_BIT |
391*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_NEG_EDGE_TRIG_BIT |
392*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT));
393*4882a593Smuzhiyun 		/* Clear any old interrupt status */
394*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gpio_int_st_port_adr[0], 1 << ULP_SDIO_CMD_PIN);
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 		/* LHL GPIO[8] intr en , GPIO[8] is mapped to SDIO_CMD */
397*4882a593Smuzhiyun 		/* Enable P8 to generate interrupt */
398*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gpio_int_en_port_adr[0], 1 << ULP_SDIO_CMD_PIN);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 		/* Clear LHL GPIO status to trigger GCI Interrupt */
401*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gci_intstat, GCI_INTSTATUS_LHLWLWAKE);
402*4882a593Smuzhiyun 		/* Enable LHL GPIO Interrupt to trigger GCI Interrupt */
403*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gci_intmask, GCI_INTMASK_LHLWLWAKE);
404*4882a593Smuzhiyun 		OR_REG(osh, &gciregs->gci_wakemask, GCI_WAKEMASK_LHLWLWAKE);
405*4882a593Smuzhiyun 		/* Note ->Enable GCI interrupt to trigger Chipcommon interrupt
406*4882a593Smuzhiyun 		 * Set EciGciIntEn in IntMask and will be done from FCBS saved tuple
407*4882a593Smuzhiyun 		 */
408*4882a593Smuzhiyun 		/* Enable LHL to trigger extWake upto HT_AVAIL */
409*4882a593Smuzhiyun 		/* LHL GPIO Interrupt is mapped to extWake[7] */
410*4882a593Smuzhiyun 		pmu = si_setcore(sih, PMU_CORE_ID, 0);
411*4882a593Smuzhiyun 		ASSERT(pmu != NULL);
412*4882a593Smuzhiyun 		/* Set bit 4 and 7 in ExtWakeMask */
413*4882a593Smuzhiyun 		W_REG(osh, &pmu->extwakemask[0], CI_ECI	| CI_WECI);
414*4882a593Smuzhiyun 		/* Program bits for MACPHY_CLK_AVAIL rsrc in ExtWakeReqMaskN */
415*4882a593Smuzhiyun 		W_REG(osh, &pmu->extwakereqmask[0], SI_LHL_EXT_WAKE_REQ_MASK_MAGIC);
416*4882a593Smuzhiyun 		/* Program 0 (no need to request explicitly for any backplane clk) */
417*4882a593Smuzhiyun 		W_REG(osh, &pmu->extwakectrl, 0x0);
418*4882a593Smuzhiyun 		/* Note: Configure MAC/Ucode to receive interrupt
419*4882a593Smuzhiyun 		  * it will be done from saved tuple using FCBS code
420*4882a593Smuzhiyun 		 */
421*4882a593Smuzhiyun 	}
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun #endif /* BCMULP */
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun lhl_reg_set_t lv_sleep_mode_4369_lhl_reg_set[] =
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	/* set wl_sleep_en */
428*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 0), (1 << 0)},
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* set top_pwrsw_en, top_slb_en, top_iso_en */
431*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), BCM_MASK32(5, 3), (0x0 << 3)},
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	/* set VMUX_asr_sel_en */
434*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 8), (1 << 8)},
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
437*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.64V and trim_adj -5mV */
440*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9E8F97},
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.76V and trim_adj +5mV */
443*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x07EE},
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
446*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4369_CSR_OVERI_DIS_DWN_CNT << 16) |
447*4882a593Smuzhiyun 		(LHL4369_CSR_MODE_DWN_CNT << 8) | (LHL4369_CSR_ADJ_DWN_CNT << 0))},
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
450*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4369_CSR_OVERI_DIS_UP_CNT << 16) |
451*4882a593Smuzhiyun 		(LHL4369_CSR_MODE_UP_CNT << 8) | (LHL4369_CSR_ADJ_UP_CNT << 0))},
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
454*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4369_VDDC_SW_DIS_DWN_CNT << 24) |
455*4882a593Smuzhiyun 		(LHL4369_ASR_ADJ_DWN_CNT << 16) | (LHL4369_HPBG_CHOP_DIS_DWN_CNT << 0))},
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
458*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4369_VDDC_SW_DIS_UP_CNT << 24) |
459*4882a593Smuzhiyun 		(LHL4369_ASR_ADJ_UP_CNT << 16) | (LHL4369_HPBG_CHOP_DIS_UP_CNT << 0))},
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
462*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
463*4882a593Smuzhiyun 	 */
464*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4369_ASR_MANUAL_MODE_DWN_CNT << 24) |
465*4882a593Smuzhiyun 		(LHL4369_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4369_ASR_LPPFM_MODE_DWN_CNT << 8) |
466*4882a593Smuzhiyun 		(LHL4369_ASR_CLK4M_DIS_DWN_CNT << 0))},
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
469*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
470*4882a593Smuzhiyun 	 */
471*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4369_ASR_MANUAL_MODE_UP_CNT << 24) |
472*4882a593Smuzhiyun 		(LHL4369_ASR_MODE_SEL_UP_CNT << 16)| (LHL4369_ASR_LPPFM_MODE_UP_CNT << 8) |
473*4882a593Smuzhiyun 		(LHL4369_ASR_CLK4M_DIS_UP_CNT << 0))},
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
476*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
477*4882a593Smuzhiyun 	 */
478*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4369_PFM_PWR_SLICE_DWN_CNT << 24) |
479*4882a593Smuzhiyun 		(LHL4369_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4369_SRBG_REF_SEL_DWN_CNT << 8) |
480*4882a593Smuzhiyun 		(LHL4369_HPBG_PU_EN_DWN_CNT << 0))},
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
483*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
484*4882a593Smuzhiyun 	 */
485*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4369_PFM_PWR_SLICE_UP_CNT << 24) |
486*4882a593Smuzhiyun 		(LHL4369_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4369_SRBG_REF_SEL_UP_CNT << 8) |
487*4882a593Smuzhiyun 		(LHL4369_HPBG_PU_EN_UP_CNT << 0))},
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
490*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), ~0, (LHL4369_CSR_TRIM_ADJ_DWN_CNT << 16)},
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
493*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), ~0, (LHL4369_CSR_TRIM_ADJ_UP_CNT << 16)},
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
496*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), ~0, (LHL4369_ASR_TRIM_ADJ_DWN_CNT << 0)},
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
499*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), ~0, (LHL4369_ASR_TRIM_ADJ_UP_CNT << 0)},
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
502*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
503*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4369_PWRSW_EN_DWN_CNT << 24) |
504*4882a593Smuzhiyun 		(LHL4369_SLB_EN_DWN_CNT << 16) | (LHL4369_ISO_EN_DWN_CNT << 8))},
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
507*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4369_VMUX_ASR_SEL_DWN_CNT << 16)},
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
510*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
511*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4369_PWRSW_EN_UP_CNT << 24) |
512*4882a593Smuzhiyun 		(LHL4369_SLB_EN_UP_CNT << 16) | (LHL4369_ISO_EN_UP_CNT << 8))},
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
515*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4369_VMUX_ASR_SEL_UP_CNT << 16))},
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	/* Enable lhl interrupt */
518*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	/* Enable LHL Wake up */
521*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 0 */
524*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), 0}
525*4882a593Smuzhiyun };
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /* LV sleep mode summary:
528*4882a593Smuzhiyun  * LV mode is where both ABUCK and CBUCK are programmed to low voltages during
529*4882a593Smuzhiyun  * sleep, and VMUX selects ABUCK as VDDOUT_AON. LPLDO needs to power off.
530*4882a593Smuzhiyun  * With ASR ON, LPLDO OFF
531*4882a593Smuzhiyun  */
532*4882a593Smuzhiyun void
si_set_lv_sleep_mode_lhl_config_4369(si_t * sih)533*4882a593Smuzhiyun si_set_lv_sleep_mode_lhl_config_4369(si_t *sih)
534*4882a593Smuzhiyun {
535*4882a593Smuzhiyun 	uint i;
536*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
537*4882a593Smuzhiyun 	lhl_reg_set_t *regs = lv_sleep_mode_4369_lhl_reg_set;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	/* Enable LHL LV mode:
540*4882a593Smuzhiyun 	 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
541*4882a593Smuzhiyun 	 */
542*4882a593Smuzhiyun 	for (i = 0; i < ARRAYSIZE(lv_sleep_mode_4369_lhl_reg_set); i++) {
543*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
544*4882a593Smuzhiyun 	}
545*4882a593Smuzhiyun }
546