xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/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  * Copyright (C) 2020, Broadcom.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
8*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
9*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
10*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11*4882a593Smuzhiyun  * following added to such license:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
14*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
15*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
16*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
17*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
18*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
19*4882a593Smuzhiyun  * modifications of the software.
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <hndpmu.h>
26*4882a593Smuzhiyun #include <hndlhl.h>
27*4882a593Smuzhiyun #include <sbchipc.h>
28*4882a593Smuzhiyun #include <hndsoc.h>
29*4882a593Smuzhiyun #include <bcmdevs.h>
30*4882a593Smuzhiyun #include <osl.h>
31*4882a593Smuzhiyun #include <sbgci.h>
32*4882a593Smuzhiyun #include <siutils.h>
33*4882a593Smuzhiyun #include <bcmutils.h>
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define SI_LHL_EXT_WAKE_REQ_MASK_MAGIC		0x7FBBF7FF	/* magic number for LHL EXT */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* PmuRev1 has a 24-bit PMU RsrcReq timer. However it pushes all other bits
38*4882a593Smuzhiyun  * upward. To make the code to run for all revs we use a variable to tell how
39*4882a593Smuzhiyun  * many bits we need to shift.
40*4882a593Smuzhiyun  */
41*4882a593Smuzhiyun #define FLAGS_SHIFT	14
42*4882a593Smuzhiyun #define	LHL_ERROR(args) printf args
43*4882a593Smuzhiyun static const char BCMATTACHDATA(rstr_rfldo3p3_cap_war)[] = "rfldo3p3_cap_war";
44*4882a593Smuzhiyun static const char BCMATTACHDATA(rstr_abuck_volt_sleep)[] = "abuck_volt_sleep";
45*4882a593Smuzhiyun static const char BCMATTACHDATA(rstr_cbuck_volt_sleep)[] = "cbuck_volt_sleep";
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun void
si_lhl_setup(si_t * sih,osl_t * osh)48*4882a593Smuzhiyun si_lhl_setup(si_t *sih, osl_t *osh)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun 	if ((CHIPID(sih->chip) == BCM43012_CHIP_ID) ||
51*4882a593Smuzhiyun 		(CHIPID(sih->chip) == BCM43013_CHIP_ID) ||
52*4882a593Smuzhiyun 		(CHIPID(sih->chip) == BCM43014_CHIP_ID)) {
53*4882a593Smuzhiyun 		/* Enable PMU sleep mode0 */
54*4882a593Smuzhiyun #ifdef BCMQT
55*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_0);
56*4882a593Smuzhiyun #else
57*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrseq_ctl_adr, LHL_PWRSEQ_CTL, PMU_SLEEP_MODE_2);
58*4882a593Smuzhiyun #endif
59*4882a593Smuzhiyun 		/* Modify as per the
60*4882a593Smuzhiyun 		BCM43012/LHL#LHL-RecommendedsettingforvariousPMUSleepModes:
61*4882a593Smuzhiyun 		*/
62*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup_ctl_adr, LHL_PWRUP_CTL_MASK, LHL_PWRUP_CTL);
63*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrup2_ctl_adr, LHL_PWRUP2_CTL_MASK, LHL_PWRUP2_CTL);
64*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn_ctl_adr, LHL_PWRDN_CTL_MASK, LHL_PWRDN_SLEEP_CNT);
65*4882a593Smuzhiyun 		LHL_REG(sih, lhl_top_pwrdn2_ctl_adr, LHL_PWRDN2_CTL_MASK, LHL_PWRDN2_CTL);
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	if (!FWSIGN_ENAB() && si_hib_ext_wakeup_isenab(sih)) {
69*4882a593Smuzhiyun 		/*
70*4882a593Smuzhiyun 		 * Enable wakeup on GPIO1, PCIE clkreq and perst signal,
71*4882a593Smuzhiyun 		 * GPIO[0] is mapped to GPIO1
72*4882a593Smuzhiyun 		 * GPIO[1] is mapped to PCIE perst
73*4882a593Smuzhiyun 		 * GPIO[2] is mapped to PCIE clkreq
74*4882a593Smuzhiyun 		 */
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 		/* GPIO1 */
77*4882a593Smuzhiyun 		/* Clear any old interrupt status */
78*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
79*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
80*4882a593Smuzhiyun 		/* active high level trigger */
81*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_GPIO1_GPIO_PIN], ~0,
82*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT);
83*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
84*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
85*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
86*4882a593Smuzhiyun 			1 << PCIE_GPIO1_GPIO_PIN, 1 << PCIE_GPIO1_GPIO_PIN);
87*4882a593Smuzhiyun 		si_gci_set_functionsel(sih, 1, CC_FNSEL_SAMEASPIN);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 		/* PCIE perst */
90*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
91*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
92*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_PERST_GPIO_PIN], ~0,
93*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_EDGE_TRIG_BIT |
94*4882a593Smuzhiyun 			1 << GCI_GPIO_STS_WL_DIN_SELECT));
95*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
96*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
97*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
98*4882a593Smuzhiyun 			1 << PCIE_PERST_GPIO_PIN, 1 << PCIE_PERST_GPIO_PIN);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 		/* PCIE clkreq */
101*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
102*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
103*4882a593Smuzhiyun 		LHL_REG(sih, gpio_ctrl_iocfg_p_adr[PCIE_CLKREQ_GPIO_PIN], ~0,
104*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_NEG_EDGE_TRIG_BIT) |
105*4882a593Smuzhiyun 			(1 << GCI_GPIO_STS_WL_DIN_SELECT));
106*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_en_port_adr[0],
107*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
108*4882a593Smuzhiyun 		LHL_REG(sih, gpio_int_st_port_adr[0],
109*4882a593Smuzhiyun 			1 << PCIE_CLKREQ_GPIO_PIN, 1 << PCIE_CLKREQ_GPIO_PIN);
110*4882a593Smuzhiyun 	}
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun static const uint32 lpo_opt_tab[4][2] = {
114*4882a593Smuzhiyun 	{ LPO1_PD_EN, LHL_LPO1_SEL },
115*4882a593Smuzhiyun 	{ LPO2_PD_EN, LHL_LPO2_SEL },
116*4882a593Smuzhiyun 	{ OSC_32k_PD, LHL_32k_SEL},
117*4882a593Smuzhiyun 	{ EXTLPO_BUF_PD, LHL_EXT_SEL }
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define LPO_EN_OFFSET 0u
121*4882a593Smuzhiyun #define LPO_SEL_OFFSET 1u
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun static int
si_lhl_get_lpo_sel(si_t * sih,uint32 lpo)124*4882a593Smuzhiyun si_lhl_get_lpo_sel(si_t *sih, uint32 lpo)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	int sel;
127*4882a593Smuzhiyun 	if (lpo <= LHL_EXT_SEL) {
128*4882a593Smuzhiyun 		LHL_REG(sih, lhl_main_ctl_adr, lpo_opt_tab[lpo - 1u][LPO_EN_OFFSET], 0u);
129*4882a593Smuzhiyun 		sel = lpo_opt_tab[lpo - 1u][LPO_SEL_OFFSET];
130*4882a593Smuzhiyun 	} else {
131*4882a593Smuzhiyun 		sel = BCME_NOTFOUND;
132*4882a593Smuzhiyun 	}
133*4882a593Smuzhiyun 	return sel;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static void
si_lhl_detect_lpo(si_t * sih,osl_t * osh)137*4882a593Smuzhiyun si_lhl_detect_lpo(si_t *sih, osl_t *osh)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	uint clk_det_cnt;
140*4882a593Smuzhiyun 	int timeout = 0;
141*4882a593Smuzhiyun 	gciregs_t *gciregs;
142*4882a593Smuzhiyun 	gciregs = si_setcore(sih, GCI_CORE_ID, 0);
143*4882a593Smuzhiyun 	ASSERT(gciregs != NULL);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN, 0);
146*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr,
147*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR, LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR);
148*4882a593Smuzhiyun 	timeout = 0;
149*4882a593Smuzhiyun 	clk_det_cnt =
150*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
151*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
152*4882a593Smuzhiyun 	while (clk_det_cnt != 0 && timeout <= LPO_SEL_TIMEOUT) {
153*4882a593Smuzhiyun 		OSL_DELAY(10);
154*4882a593Smuzhiyun 		clk_det_cnt =
155*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
156*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
157*4882a593Smuzhiyun 		timeout++;
158*4882a593Smuzhiyun 	}
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	if (clk_det_cnt != 0) {
161*4882a593Smuzhiyun 		LHL_ERROR(("Clock not present as clear did not work timeout = %d\n", timeout));
162*4882a593Smuzhiyun 		ROMMABLE_ASSERT(0);
163*4882a593Smuzhiyun 	}
164*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_CLR, 0);
165*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr, LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN,
166*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_ADR_LHL_CNTR_EN);
167*4882a593Smuzhiyun 	clk_det_cnt =
168*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
169*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
170*4882a593Smuzhiyun 	timeout = 0;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	while (clk_det_cnt <= CLK_DET_CNT_THRESH && timeout <= LPO_SEL_TIMEOUT) {
173*4882a593Smuzhiyun 		OSL_DELAY(10);
174*4882a593Smuzhiyun 		clk_det_cnt =
175*4882a593Smuzhiyun 		((R_REG(osh, &gciregs->lhl_clk_det_ctl_adr) & LHL_CLK_DET_CNT) >>
176*4882a593Smuzhiyun 		LHL_CLK_DET_CNT_SHIFT);
177*4882a593Smuzhiyun 		timeout++;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	if (timeout >= LPO_SEL_TIMEOUT) {
181*4882a593Smuzhiyun 		LHL_ERROR(("LPO is not available timeout = %u\n, timeout", timeout));
182*4882a593Smuzhiyun 		ROMMABLE_ASSERT(0);
183*4882a593Smuzhiyun 	}
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun static void
si_lhl_select_lpo(si_t * sih,osl_t * osh,int sel,uint32 lpo)187*4882a593Smuzhiyun si_lhl_select_lpo(si_t *sih, osl_t *osh, int sel, uint32 lpo)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun 	uint status;
190*4882a593Smuzhiyun 	int timeout = 0u;
191*4882a593Smuzhiyun 	gciregs_t *gciregs;
192*4882a593Smuzhiyun 	uint32 final_clk_sel;
193*4882a593Smuzhiyun 	uint32 final_lpo_sel;
194*4882a593Smuzhiyun 	gciregs = si_setcore(sih, GCI_CORE_ID, 0);
195*4882a593Smuzhiyun 	ASSERT(gciregs != NULL);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	LHL_REG(sih, lhl_main_ctl_adr,
198*4882a593Smuzhiyun 		LHL_MAIN_CTL_ADR_LHL_WLCLK_SEL, (sel) << LPO_SEL_SHIFT);
199*4882a593Smuzhiyun 	final_clk_sel = (R_REG(osh, &gciregs->lhl_clk_status_adr)
200*4882a593Smuzhiyun 		& LHL_MAIN_CTL_ADR_FINAL_CLK_SEL);
201*4882a593Smuzhiyun 	final_lpo_sel = (unsigned)(((1u << sel) << LPO_FINAL_SEL_SHIFT));
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	status = (final_clk_sel == final_lpo_sel) ? 1u : 0u;
204*4882a593Smuzhiyun 	timeout = 0;
205*4882a593Smuzhiyun 	while (!status && timeout <= LPO_SEL_TIMEOUT) {
206*4882a593Smuzhiyun 		OSL_DELAY(10);
207*4882a593Smuzhiyun 		final_clk_sel = (R_REG(osh, &gciregs->lhl_clk_status_adr)
208*4882a593Smuzhiyun 			& LHL_MAIN_CTL_ADR_FINAL_CLK_SEL);
209*4882a593Smuzhiyun 		status = (final_clk_sel == final_lpo_sel) ? 1u : 0u;
210*4882a593Smuzhiyun 		timeout++;
211*4882a593Smuzhiyun 	}
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	if (timeout >= LPO_SEL_TIMEOUT) {
214*4882a593Smuzhiyun 		LHL_ERROR(("LPO is not available timeout = %u\n, timeout", timeout));
215*4882a593Smuzhiyun 		ROMMABLE_ASSERT(0);
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* for 4377 and chiprev B0 and greater do not power-off other LPOs */
219*4882a593Smuzhiyun 	if (BCM4389_CHIP(sih->chip) || BCM4378_CHIP(sih->chip) || BCM4397_CHIP(sih->chip) ||
220*4882a593Smuzhiyun 		BCM4388_CHIP(sih->chip) || BCM4387_CHIP(sih->chip) ||
221*4882a593Smuzhiyun 		(CHIPID(sih->chip) == BCM4377_CHIP_ID)) {
222*4882a593Smuzhiyun 		LHL_ERROR(("NOT Power Down other LPO\n"));
223*4882a593Smuzhiyun 	} else {
224*4882a593Smuzhiyun 		/* Power down the rest of the LPOs */
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 		if (lpo != LHL_EXT_LPO_ENAB) {
227*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, EXTLPO_BUF_PD, EXTLPO_BUF_PD);
228*4882a593Smuzhiyun 		}
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 		if (lpo != LHL_LPO1_ENAB) {
231*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO1_PD_EN, LPO1_PD_EN);
232*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO1_PD_SEL, LPO1_PD_SEL_VAL);
233*4882a593Smuzhiyun 		}
234*4882a593Smuzhiyun 		if (lpo != LHL_LPO2_ENAB) {
235*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO2_PD_EN, LPO2_PD_EN);
236*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, LPO2_PD_SEL, LPO2_PD_SEL_VAL);
237*4882a593Smuzhiyun 		}
238*4882a593Smuzhiyun 		if (lpo != LHL_OSC_32k_ENAB) {
239*4882a593Smuzhiyun 			LHL_REG(sih, lhl_main_ctl_adr, OSC_32k_PD, OSC_32k_PD);
240*4882a593Smuzhiyun 		}
241*4882a593Smuzhiyun 		if (lpo != RADIO_LPO_ENAB) {
242*4882a593Smuzhiyun 			si_gci_chipcontrol(sih, CC_GCI_CHIPCTRL_06, LPO_SEL, 0);
243*4882a593Smuzhiyun 		}
244*4882a593Smuzhiyun 	}
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun /* To skip this function, specify a invalid "lpo_select" value in nvram */
249*4882a593Smuzhiyun int
BCMATTACHFN(si_lhl_set_lpoclk)250*4882a593Smuzhiyun BCMATTACHFN(si_lhl_set_lpoclk)(si_t *sih, osl_t *osh, uint32 lpo_force)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	int lhl_wlclk_sel;
253*4882a593Smuzhiyun 	uint32 lpo = 0;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	/* Apply nvram override to lpo */
256*4882a593Smuzhiyun 	if (!FWSIGN_ENAB()) {
257*4882a593Smuzhiyun 		if ((lpo = (uint32)getintvar(NULL, "lpo_select")) == 0) {
258*4882a593Smuzhiyun 			if (lpo_force == LHL_LPO_AUTO) {
259*4882a593Smuzhiyun 				lpo = LHL_OSC_32k_ENAB;
260*4882a593Smuzhiyun 			} else {
261*4882a593Smuzhiyun 				lpo = lpo_force;
262*4882a593Smuzhiyun 			}
263*4882a593Smuzhiyun 		}
264*4882a593Smuzhiyun 	} else {
265*4882a593Smuzhiyun 		lpo = lpo_force;
266*4882a593Smuzhiyun 	}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	lhl_wlclk_sel = si_lhl_get_lpo_sel(sih, lpo);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	if (lhl_wlclk_sel < 0) {
271*4882a593Smuzhiyun 		return BCME_OK;
272*4882a593Smuzhiyun 	}
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	LHL_REG(sih, lhl_clk_det_ctl_adr,
275*4882a593Smuzhiyun 		LHL_CLK_DET_CTL_AD_CNTR_CLK_SEL, lhl_wlclk_sel);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	/* Detect the desired LPO */
278*4882a593Smuzhiyun 	si_lhl_detect_lpo(sih, osh);
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	/* Select the desired LPO */
281*4882a593Smuzhiyun 	si_lhl_select_lpo(sih, osh, lhl_wlclk_sel, lpo);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	return BCME_OK;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun void
BCMATTACHFN(si_lhl_timer_config)287*4882a593Smuzhiyun BCMATTACHFN(si_lhl_timer_config)(si_t *sih, osl_t *osh, int timer_type)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun 	uint origidx;
290*4882a593Smuzhiyun 	pmuregs_t *pmu = NULL;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* Remember original core before switch to chipc/pmu */
293*4882a593Smuzhiyun 	origidx = si_coreidx(sih);
294*4882a593Smuzhiyun 	if (AOB_ENAB(sih)) {
295*4882a593Smuzhiyun 		pmu = si_setcore(sih, PMU_CORE_ID, 0);
296*4882a593Smuzhiyun 	} else {
297*4882a593Smuzhiyun 		pmu = si_setcoreidx(sih, SI_CC_IDX);
298*4882a593Smuzhiyun 	}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	ASSERT(pmu != NULL);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	switch (timer_type) {
303*4882a593Smuzhiyun 	case LHL_MAC_TIMER:
304*4882a593Smuzhiyun 		/* Enable MAC Timer interrupt */
305*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_mactim0_intrp_adr,
306*4882a593Smuzhiyun 			(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER),
307*4882a593Smuzhiyun 			(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER));
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 		/* Programs bits for MACPHY_CLK_AVAIL and all its dependent bits in
310*4882a593Smuzhiyun 		 * MacResourceReqMask0.
311*4882a593Smuzhiyun 		 */
312*4882a593Smuzhiyun 		PMU_REG(sih, mac_res_req_mask, ~0, si_pmu_rsrc_macphy_clk_deps(sih, osh, 0));
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 		/* One time init of mac_res_req_timer to enable interrupt and clock request */
315*4882a593Smuzhiyun 		HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
316*4882a593Smuzhiyun 				PMUREGADDR(sih, pmu, pmu, mac_res_req_timer),
317*4882a593Smuzhiyun 				((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 		/*
320*4882a593Smuzhiyun 		 * Reset MAC Main Timer if in case it is running due to previous instance
321*4882a593Smuzhiyun 		 * This also resets the interrupt status
322*4882a593Smuzhiyun 		 */
323*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_mactim_int0_adr, LHL_WL_MACTIMER_MASK, 0x0);
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 		if (si_pmu_get_mac_rsrc_req_tmr_cnt(sih) > 1) {
326*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim1_intrp_adr,
327*4882a593Smuzhiyun 				(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER),
328*4882a593Smuzhiyun 				(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER));
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 			PMU_REG(sih, mac_res_req_mask1, ~0,
331*4882a593Smuzhiyun 				si_pmu_rsrc_macphy_clk_deps(sih, osh, 1));
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 			HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
334*4882a593Smuzhiyun 					PMUREGADDR(sih, pmu, pmu, mac_res_req_timer1),
335*4882a593Smuzhiyun 					((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 			/*
338*4882a593Smuzhiyun 			 * Reset MAC Aux Timer if in case it is running due to previous instance
339*4882a593Smuzhiyun 			 * This also resets the interrupt status
340*4882a593Smuzhiyun 			 */
341*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim_int1_adr, LHL_WL_MACTIMER_MASK, 0x0);
342*4882a593Smuzhiyun 		}
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		if (si_pmu_get_mac_rsrc_req_tmr_cnt(sih) > 2) {
345*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim2_intrp_adr,
346*4882a593Smuzhiyun 				(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER),
347*4882a593Smuzhiyun 				(LHL_WL_MACTIM_INTRP_EN | LHL_WL_MACTIM_INTRP_EDGE_TRIGGER));
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 			PMU_REG_NEW(sih, mac_res_req_mask2, ~0,
350*4882a593Smuzhiyun 				si_pmu_rsrc_macphy_clk_deps(sih, osh, 2));
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 			HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
353*4882a593Smuzhiyun 					PMUREGADDR(sih, pmu, pmu, mac_res_req_timer2),
354*4882a593Smuzhiyun 					((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 			/*
357*4882a593Smuzhiyun 			 * Reset Scan MAC Timer if in case it is running due to previous instance
358*4882a593Smuzhiyun 			 * This also resets the interrupt status
359*4882a593Smuzhiyun 			 */
360*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim_int2_adr, LHL_WL_MACTIMER_MASK, 0x0);
361*4882a593Smuzhiyun 		}
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 		break;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	case LHL_ARM_TIMER:
366*4882a593Smuzhiyun 		/* Enable ARM Timer interrupt */
367*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_armtim0_intrp_adr,
368*4882a593Smuzhiyun 				(LHL_WL_ARMTIM0_INTRP_EN | LHL_WL_ARMTIM0_INTRP_EDGE_TRIGGER),
369*4882a593Smuzhiyun 				(LHL_WL_ARMTIM0_INTRP_EN | LHL_WL_ARMTIM0_INTRP_EDGE_TRIGGER));
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 		/* Programs bits for HT_AVAIL and all its dependent bits in ResourceReqMask0 */
372*4882a593Smuzhiyun 		/* Programs bits for CORE_RDY_CB and all its dependent bits in ResourceReqMask0 */
373*4882a593Smuzhiyun 		PMU_REG(sih, res_req_mask, ~0, (si_pmu_rsrc_ht_avail_clk_deps(sih, osh) |
374*4882a593Smuzhiyun 			si_pmu_rsrc_cb_ready_deps(sih, osh)));
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 		/* One time init of res_req_timer to enable interrupt and clock request
377*4882a593Smuzhiyun 		 * For low power request only ALP (HT_AVAIL is anyway requested by res_req_mask)
378*4882a593Smuzhiyun 		 */
379*4882a593Smuzhiyun 		HND_PMU_SYNC_WR(sih, pmu, pmu, osh,
380*4882a593Smuzhiyun 				PMUREGADDR(sih, pmu, pmu, res_req_timer),
381*4882a593Smuzhiyun 				((PRRT_ALP_REQ | PRRT_HQ_REQ | PRRT_INTEN) << FLAGS_SHIFT));
382*4882a593Smuzhiyun 		break;
383*4882a593Smuzhiyun 	}
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	/* Return to original core */
386*4882a593Smuzhiyun 	si_setcoreidx(sih, origidx);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun void
BCMATTACHFN(si_lhl_timer_enable)390*4882a593Smuzhiyun BCMATTACHFN(si_lhl_timer_enable)(si_t *sih)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	/* Enable clks for pmu int propagation */
393*4882a593Smuzhiyun 	PMU_REG(sih, pmuintctrl0, PMU_INTC_ALP_REQ, PMU_INTC_ALP_REQ);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	PMU_REG(sih, pmuintmask0, RSRC_INTR_MASK_TIMER_INT_0, RSRC_INTR_MASK_TIMER_INT_0);
396*4882a593Smuzhiyun #ifndef BCMQT
397*4882a593Smuzhiyun 	LHL_REG(sih, lhl_main_ctl_adr, LHL_FAST_WRITE_EN, LHL_FAST_WRITE_EN);
398*4882a593Smuzhiyun #endif /* BCMQT */
399*4882a593Smuzhiyun 	PMU_REG(sih, pmucontrol_ext, PCTL_EXT_USE_LHL_TIMER, PCTL_EXT_USE_LHL_TIMER);
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun void
BCMPOSTTRAPFN(si_lhl_timer_reset)403*4882a593Smuzhiyun BCMPOSTTRAPFN(si_lhl_timer_reset)(si_t *sih, uint coreid, uint coreunit)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	switch (coreid) {
406*4882a593Smuzhiyun 	case D11_CORE_ID:
407*4882a593Smuzhiyun 		switch (coreunit) {
408*4882a593Smuzhiyun 		case 0: /* MAC_CORE_UNIT_0 */
409*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim_int0_adr, LHL_WL_MACTIMER_MASK, 0x0);
410*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim0_st_adr,
411*4882a593Smuzhiyun 				LHL_WL_MACTIMER_INT_ST_MASK, LHL_WL_MACTIMER_INT_ST_MASK);
412*4882a593Smuzhiyun 			break;
413*4882a593Smuzhiyun 		case 1: /* MAC_CORE_UNIT_1 */
414*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim_int1_adr, LHL_WL_MACTIMER_MASK, 0x0);
415*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim1_st_adr,
416*4882a593Smuzhiyun 				LHL_WL_MACTIMER_INT_ST_MASK, LHL_WL_MACTIMER_INT_ST_MASK);
417*4882a593Smuzhiyun 			break;
418*4882a593Smuzhiyun 		case 2: /* SCAN_CORE_UNIT */
419*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim_int2_adr, LHL_WL_MACTIMER_MASK, 0x0);
420*4882a593Smuzhiyun 			LHL_REG(sih, lhl_wl_mactim2_st_adr,
421*4882a593Smuzhiyun 				LHL_WL_MACTIMER_INT_ST_MASK, LHL_WL_MACTIMER_INT_ST_MASK);
422*4882a593Smuzhiyun 			break;
423*4882a593Smuzhiyun 		default:
424*4882a593Smuzhiyun 			LHL_ERROR(("Cannot reset lhl timer, wrong coreunit = %d\n", coreunit));
425*4882a593Smuzhiyun 		}
426*4882a593Smuzhiyun 		break;
427*4882a593Smuzhiyun 	case ARMCR4_CORE_ID: /* intentional fallthrough */
428*4882a593Smuzhiyun 	case ARMCA7_CORE_ID:
429*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_armtim0_adr, LHL_WL_MACTIMER_MASK, 0x0);
430*4882a593Smuzhiyun 		LHL_REG(sih, lhl_wl_armtim0_st_adr,
431*4882a593Smuzhiyun 			LHL_WL_MACTIMER_INT_ST_MASK, LHL_WL_MACTIMER_INT_ST_MASK);
432*4882a593Smuzhiyun 		break;
433*4882a593Smuzhiyun 	default:
434*4882a593Smuzhiyun 		LHL_ERROR(("Cannot reset lhl timer, wrong coreid = 0x%x\n", coreid));
435*4882a593Smuzhiyun 	}
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun void
si_lhl_ilp_config(si_t * sih,osl_t * osh,uint32 ilp_period)439*4882a593Smuzhiyun si_lhl_ilp_config(si_t *sih, osl_t *osh, uint32 ilp_period)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun 	 gciregs_t *gciregs;
442*4882a593Smuzhiyun 	 if ((CHIPID(sih->chip) == BCM43012_CHIP_ID) ||
443*4882a593Smuzhiyun 	     (CHIPID(sih->chip) == BCM43013_CHIP_ID) ||
444*4882a593Smuzhiyun 	     (CHIPID(sih->chip) == BCM43014_CHIP_ID)) {
445*4882a593Smuzhiyun 		gciregs = si_setcore(sih, GCI_CORE_ID, 0);
446*4882a593Smuzhiyun 		ASSERT(gciregs != NULL);
447*4882a593Smuzhiyun 		W_REG(osh, &gciregs->lhl_wl_ilp_val_adr, ilp_period);
448*4882a593Smuzhiyun 	 }
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4369_lhl_reg_set)[] =
452*4882a593Smuzhiyun {
453*4882a593Smuzhiyun 	/* set wl_sleep_en */
454*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 0), (1 << 0)},
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	/* set top_pwrsw_en, top_slb_en, top_iso_en */
457*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), BCM_MASK32(5, 3), (0x0 << 3)},
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	/* set VMUX_asr_sel_en */
460*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 8), (1 << 8)},
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
463*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.64V and trim_adj -5mV */
466*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9E9F97},
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.76V and trim_adj +5mV */
469*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x07EE},
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
472*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4369_CSR_OVERI_DIS_DWN_CNT << 16) |
473*4882a593Smuzhiyun 		(LHL4369_CSR_MODE_DWN_CNT << 8) | (LHL4369_CSR_ADJ_DWN_CNT << 0))},
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
476*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4369_CSR_OVERI_DIS_UP_CNT << 16) |
477*4882a593Smuzhiyun 		(LHL4369_CSR_MODE_UP_CNT << 8) | (LHL4369_CSR_ADJ_UP_CNT << 0))},
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
480*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4369_VDDC_SW_DIS_DWN_CNT << 24) |
481*4882a593Smuzhiyun 		(LHL4369_ASR_ADJ_DWN_CNT << 16) | (LHL4369_HPBG_CHOP_DIS_DWN_CNT << 0))},
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
484*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4369_VDDC_SW_DIS_UP_CNT << 24) |
485*4882a593Smuzhiyun 		(LHL4369_ASR_ADJ_UP_CNT << 16) | (LHL4369_HPBG_CHOP_DIS_UP_CNT << 0))},
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
488*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
489*4882a593Smuzhiyun 	 */
490*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4369_ASR_MANUAL_MODE_DWN_CNT << 24) |
491*4882a593Smuzhiyun 		(LHL4369_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4369_ASR_LPPFM_MODE_DWN_CNT << 8) |
492*4882a593Smuzhiyun 		(LHL4369_ASR_CLK4M_DIS_DWN_CNT << 0))},
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
495*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
496*4882a593Smuzhiyun 	 */
497*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4369_ASR_MANUAL_MODE_UP_CNT << 24) |
498*4882a593Smuzhiyun 		(LHL4369_ASR_MODE_SEL_UP_CNT << 16)| (LHL4369_ASR_LPPFM_MODE_UP_CNT << 8) |
499*4882a593Smuzhiyun 		(LHL4369_ASR_CLK4M_DIS_UP_CNT << 0))},
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
502*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
503*4882a593Smuzhiyun 	 */
504*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4369_PFM_PWR_SLICE_DWN_CNT << 24) |
505*4882a593Smuzhiyun 		(LHL4369_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4369_SRBG_REF_SEL_DWN_CNT << 8) |
506*4882a593Smuzhiyun 		(LHL4369_HPBG_PU_EN_DWN_CNT << 0))},
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
509*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
510*4882a593Smuzhiyun 	 */
511*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4369_PFM_PWR_SLICE_UP_CNT << 24) |
512*4882a593Smuzhiyun 		(LHL4369_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4369_SRBG_REF_SEL_UP_CNT << 8) |
513*4882a593Smuzhiyun 		(LHL4369_HPBG_PU_EN_UP_CNT << 0))},
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
516*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), ~0, (LHL4369_CSR_TRIM_ADJ_DWN_CNT << 16)},
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
519*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), ~0, (LHL4369_CSR_TRIM_ADJ_UP_CNT << 16)},
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
522*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), ~0, (LHL4369_ASR_TRIM_ADJ_DWN_CNT << 0)},
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
525*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), ~0, (LHL4369_ASR_TRIM_ADJ_UP_CNT << 0)},
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
528*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
529*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4369_PWRSW_EN_DWN_CNT << 24) |
530*4882a593Smuzhiyun 		(LHL4369_SLB_EN_DWN_CNT << 16) | (LHL4369_ISO_EN_DWN_CNT << 8))},
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
533*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4369_VMUX_ASR_SEL_DWN_CNT << 16)},
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
536*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
537*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4369_PWRSW_EN_UP_CNT << 24) |
538*4882a593Smuzhiyun 		(LHL4369_SLB_EN_UP_CNT << 16) | (LHL4369_ISO_EN_UP_CNT << 8))},
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
541*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4369_VMUX_ASR_SEL_UP_CNT << 16))},
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	/* Enable lhl interrupt */
544*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun 	/* Enable LHL Wake up */
547*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
550*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)}
551*4882a593Smuzhiyun };
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4378_lhl_reg_set)[] =
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun 	/* set wl_sleep_en */
556*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 0), (1 << 0)},
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	/* set top_pwrsw_en, top_slb_en, top_iso_en */
559*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), BCM_MASK32(5, 3), (0x0 << 3)},
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	/* set VMUX_asr_sel_en */
562*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 8), (1 << 8)},
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
565*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.66V and trim_adj -5mV */
568*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9E9F97},
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.76V and trim_adj +5mV */
571*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x07EE},
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
574*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_DWN_CNT << 16) |
575*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_DWN_CNT << 8) | (LHL4378_CSR_ADJ_DWN_CNT << 0))},
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
578*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_UP_CNT << 16) |
579*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_UP_CNT << 8) | (LHL4378_CSR_ADJ_UP_CNT << 0))},
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
582*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_DWN_CNT << 24) |
583*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_DWN_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_DWN_CNT << 0))},
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
586*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_UP_CNT << 24) |
587*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_UP_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_UP_CNT << 0))},
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
590*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
591*4882a593Smuzhiyun 	 */
592*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_DWN_CNT << 24) |
593*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4378_ASR_LPPFM_MODE_DWN_CNT << 8) |
594*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_DWN_CNT << 0))},
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
597*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
598*4882a593Smuzhiyun 	 */
599*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_UP_CNT << 24) |
600*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_UP_CNT << 16)| (LHL4378_ASR_LPPFM_MODE_UP_CNT << 8) |
601*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_UP_CNT << 0))},
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
604*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
605*4882a593Smuzhiyun 	 */
606*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_DWN_CNT << 24) |
607*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4378_SRBG_REF_SEL_DWN_CNT << 8) |
608*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_DWN_CNT << 0))},
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
611*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
612*4882a593Smuzhiyun 	 */
613*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_UP_CNT << 24) |
614*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4378_SRBG_REF_SEL_UP_CNT << 8) |
615*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_UP_CNT << 0))},
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
618*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK,
619*4882a593Smuzhiyun 		(LHL4378_CSR_TRIM_ADJ_DWN_CNT << LHL4378_CSR_TRIM_ADJ_CNT_SHIFT)},
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
622*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK,
623*4882a593Smuzhiyun 		(LHL4378_CSR_TRIM_ADJ_UP_CNT << LHL4378_CSR_TRIM_ADJ_CNT_SHIFT)},
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
626*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), ~0, (LHL4378_ASR_TRIM_ADJ_DWN_CNT << 0)},
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
629*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK,
630*4882a593Smuzhiyun 		(LHL4378_ASR_TRIM_ADJ_UP_CNT << LHL4378_ASR_TRIM_ADJ_CNT_SHIFT)},
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
633*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
634*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4378_PWRSW_EN_DWN_CNT << 24) |
635*4882a593Smuzhiyun 		(LHL4378_SLB_EN_DWN_CNT << 16) | (LHL4378_ISO_EN_DWN_CNT << 8))},
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
638*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4378_VMUX_ASR_SEL_DWN_CNT << 16)},
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
641*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
642*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4378_PWRSW_EN_UP_CNT << 24) |
643*4882a593Smuzhiyun 		(LHL4378_SLB_EN_UP_CNT << 16) | (LHL4378_ISO_EN_UP_CNT << 8))},
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
646*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4378_VMUX_ASR_SEL_UP_CNT << 16))},
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	/* Enable lhl interrupt */
649*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	/* Enable LHL Wake up */
652*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
655*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)}
656*4882a593Smuzhiyun };
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4387_lhl_reg_set)[] =
659*4882a593Smuzhiyun {
660*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr),
661*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SLEEP_ENAB_MASK |
662*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_MISCLDO_PU_EN_MASK |
663*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SERDES_SLB_EN_MASK |
664*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SERDES_CLK_DIS_EN_MASK,
665*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SLEEP_ENAB_MASK |
666*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_MISCLDO_PU_EN_MASK |
667*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SERDES_SLB_EN_MASK |
668*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SERDES_CLK_DIS_EN_MASK},
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
671*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.64V and trim_adj -5mV */
674*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9ED797},
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.64V and trim_adj +5mV */
677*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x076D},
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
680*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_DWN_CNT << 16) |
681*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_DWN_CNT << 8) | (LHL4378_CSR_ADJ_DWN_CNT << 0))},
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
684*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_UP_CNT << 16) |
685*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_UP_CNT << 8) | (LHL4378_CSR_ADJ_UP_CNT << 0))},
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
688*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_DWN_CNT << 24) |
689*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_DWN_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_DWN_CNT << 0))},
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
692*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_UP_CNT << 24) |
693*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_UP_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_UP_CNT << 0))},
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
696*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
697*4882a593Smuzhiyun 	 */
698*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_DWN_CNT << 24) |
699*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4378_ASR_LPPFM_MODE_DWN_CNT << 8) |
700*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_DWN_CNT << 0))},
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
703*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
704*4882a593Smuzhiyun 	 */
705*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_UP_CNT << 24) |
706*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_UP_CNT << 16)| (LHL4378_ASR_LPPFM_MODE_UP_CNT << 8) |
707*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_UP_CNT << 0))},
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
710*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
711*4882a593Smuzhiyun 	 */
712*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_DWN_CNT << 24) |
713*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4378_SRBG_REF_SEL_DWN_CNT << 8) |
714*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_DWN_CNT << 0))},
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
717*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
718*4882a593Smuzhiyun 	 */
719*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_UP_CNT << 24) |
720*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4378_SRBG_REF_SEL_UP_CNT << 8) |
721*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_UP_CNT << 0))},
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
724*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK,
725*4882a593Smuzhiyun 		(LHL4378_CSR_TRIM_ADJ_DWN_CNT << LHL4378_CSR_TRIM_ADJ_CNT_SHIFT)},
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
728*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK,
729*4882a593Smuzhiyun 		(LHL4378_CSR_TRIM_ADJ_UP_CNT << LHL4378_CSR_TRIM_ADJ_CNT_SHIFT)},
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
732*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK,
733*4882a593Smuzhiyun 		(LHL4378_ASR_TRIM_ADJ_DWN_CNT << LHL4378_ASR_TRIM_ADJ_CNT_SHIFT)},
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
736*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK,
737*4882a593Smuzhiyun 		(LHL4378_ASR_TRIM_ADJ_UP_CNT << LHL4378_ASR_TRIM_ADJ_CNT_SHIFT)},
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
740*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
741*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4378_PWRSW_EN_DWN_CNT << 24) |
742*4882a593Smuzhiyun 		(LHL4378_SLB_EN_DWN_CNT << 16) | (LHL4378_ISO_EN_DWN_CNT << 8))},
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
745*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4387_VMUX_ASR_SEL_DWN_CNT << 16)},
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
748*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
749*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4378_PWRSW_EN_UP_CNT << 24) |
750*4882a593Smuzhiyun 		(LHL4378_SLB_EN_UP_CNT << 16) | (LHL4378_ISO_EN_UP_CNT << 8))},
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
753*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4387_VMUX_ASR_SEL_UP_CNT << 16))},
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun 	/* Enable lhl interrupt */
756*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun 	/* Enable LHL Wake up */
759*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
762*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)},
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	/* serdes_clk_dis dn=2, miscldo_pu dn=6; Also include CRWLLHL-48 WAR set bit31 */
765*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn3_ctl_adr), ~0, 0x80040c02},
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	/* serdes_clk_dis dn=11, miscldo_pu dn=0 */
768*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup3_ctl_adr), ~0, 0x00160010}
769*4882a593Smuzhiyun };
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4387_lhl_reg_set_top_off)[] =
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr),
774*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SLEEP_ENAB_MASK |
775*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_ISO_EN_MASK |
776*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_SLB_EN_MASK |
777*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_PWRSW_EN_MASK |
778*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_MISCLDO_PU_EN_MASK,
779*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_SLEEP_ENAB_MASK |
780*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_ISO_EN_MASK |
781*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_SLB_EN_MASK |
782*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_TOP_PWRSW_EN_MASK |
783*4882a593Smuzhiyun 		LHL_TOP_PWRSEQ_MISCLDO_PU_EN_MASK},
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
786*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F87DB},
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.64V and trim_adj -5mV */
789*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9ED7B7},
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.64V and trim_adj +5mV */
792*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x076D},
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
795*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4387_TO_CSR_OVERI_DIS_DWN_CNT << 16) |
796*4882a593Smuzhiyun 		(LHL4387_TO_CSR_MODE_DWN_CNT << 8) | (LHL4387_TO_CSR_ADJ_DWN_CNT << 0))},
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
799*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4387_TO_CSR_OVERI_DIS_UP_CNT << 16) |
800*4882a593Smuzhiyun 		(LHL4387_TO_CSR_MODE_UP_CNT << 8) | (LHL4387_TO_CSR_ADJ_UP_CNT << 0))},
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, lp_mode_dn_cnt,
803*4882a593Smuzhiyun 	 * ASR_adj, vddc_sw_dis
804*4882a593Smuzhiyun 	 */
805*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4387_TO_VDDC_SW_DIS_DWN_CNT << 24) |
806*4882a593Smuzhiyun 		(LHL4387_TO_ASR_ADJ_DWN_CNT << 16) | (LHL4387_TO_LP_MODE_DWN_CNT << 8) |
807*4882a593Smuzhiyun 		(LHL4387_TO_HPBG_CHOP_DIS_DWN_CNT << 0))},
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, lp_mode_dn_cnt,
810*4882a593Smuzhiyun 	 * ASR_adj, vddc_sw_dis
811*4882a593Smuzhiyun 	 */
812*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4387_TO_VDDC_SW_DIS_UP_CNT << 24) |
813*4882a593Smuzhiyun 		(LHL4387_TO_ASR_ADJ_UP_CNT << 16) | (LHL4387_TO_LP_MODE_UP_CNT << 8) |
814*4882a593Smuzhiyun 		(LHL4387_TO_HPBG_CHOP_DIS_UP_CNT << 0))},
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
817*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
818*4882a593Smuzhiyun 	 */
819*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4387_TO_ASR_MANUAL_MODE_DWN_CNT << 24) |
820*4882a593Smuzhiyun 		(LHL4387_TO_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4387_TO_ASR_LPPFM_MODE_DWN_CNT << 8) |
821*4882a593Smuzhiyun 		(LHL4387_TO_ASR_CLK4M_DIS_DWN_CNT << 0))},
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
824*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
825*4882a593Smuzhiyun 	 */
826*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4387_TO_ASR_MANUAL_MODE_UP_CNT << 24) |
827*4882a593Smuzhiyun 		(LHL4387_TO_ASR_MODE_SEL_UP_CNT << 16)| (LHL4387_TO_ASR_LPPFM_MODE_UP_CNT << 8) |
828*4882a593Smuzhiyun 		(LHL4387_TO_ASR_CLK4M_DIS_UP_CNT << 0))},
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
831*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
832*4882a593Smuzhiyun 	 */
833*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4387_TO_PFM_PWR_SLICE_DWN_CNT << 24) |
834*4882a593Smuzhiyun 		(LHL4387_TO_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4387_TO_SRBG_REF_SEL_DWN_CNT << 8) |
835*4882a593Smuzhiyun 		(LHL4387_TO_HPBG_PU_EN_DWN_CNT << 0))},
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
838*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
839*4882a593Smuzhiyun 	 */
840*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4387_TO_PFM_PWR_SLICE_UP_CNT << 24) |
841*4882a593Smuzhiyun 		(LHL4387_TO_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4387_TO_SRBG_REF_SEL_UP_CNT << 8) |
842*4882a593Smuzhiyun 		(LHL4387_TO_HPBG_PU_EN_UP_CNT << 0))},
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 	/* ASR_trim_adj downcount=0x3, [30:24] is default value for spmi_*io_sel */
845*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK, 0x3},
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	/* ASR_trim_adj upcount=0x1, [30:24] is default value for spmi_*io_sel */
848*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK, 0x1},
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
851*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
852*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4387_TO_PWRSW_EN_DWN_CNT << 24) |
853*4882a593Smuzhiyun 		(LHL4387_TO_SLB_EN_DWN_CNT << 16) | (LHL4387_TO_ISO_EN_DWN_CNT << 8) |
854*4882a593Smuzhiyun 		(LHL4387_TO_TOP_SLP_EN_DWN_CNT))},
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
857*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
858*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4387_TO_PWRSW_EN_UP_CNT << 24) |
859*4882a593Smuzhiyun 		(LHL4387_TO_SLB_EN_UP_CNT << 16) | (LHL4387_TO_ISO_EN_UP_CNT << 8) |
860*4882a593Smuzhiyun 		(LHL4387_TO_TOP_SLP_EN_UP_CNT))},
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun 	/* lhl_top_pwrup2_ctl, serdes_slb_en_up_cnt=0x7 */
863*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK, 0xe0000},
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl, serdes_slb_en_dn_cnt=0x2 */
866*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), LHL4378_CSR_TRIM_ADJ_CNT_MASK, 0x40000},
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun 	/* Enable lhl interrupt */
869*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	/* Enable LHL Wake up */
872*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
875*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)},
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	/* lhl_top_pwrup3_ctl, FLL pu power up count=0x8, miscldo pu power up count=0x0,
878*4882a593Smuzhiyun 	 * serdes_clk_dis up count=0x7
879*4882a593Smuzhiyun 	 */
880*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup3_ctl_adr), ~0, 0xe0010},
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	/* lhl_top_pwrdn3_ctl, FLL pu power up count=0x1,miscldo pu power up count=0x3,
883*4882a593Smuzhiyun 	 * serdes_clk_dis up count=0x1
884*4882a593Smuzhiyun 	 */
885*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn3_ctl_adr), ~0, 0x20602}
886*4882a593Smuzhiyun };
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4389_lhl_reg_set)[] =
889*4882a593Smuzhiyun {
890*4882a593Smuzhiyun 	/* set wl_sleep_en */
891*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 0), (1 << 0)},
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun 	/* set top_pwrsw_en, top_slb_en, top_iso_en */
894*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), BCM_MASK32(5, 3), (0x0 << 3)},
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 	/* set VMUX_asr_sel_en */
897*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 8), (1 << 8)},
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
900*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.64V and trim_adj -5mV */
903*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9EDF97},
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.64V and trim_adj +5mV */
906*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x07ED},
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
909*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_DWN_CNT << 16) |
910*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_DWN_CNT << 8) | (LHL4378_CSR_ADJ_DWN_CNT << 0))},
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
913*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4378_CSR_OVERI_DIS_UP_CNT << 16) |
914*4882a593Smuzhiyun 		(LHL4378_CSR_MODE_UP_CNT << 8) | (LHL4378_CSR_ADJ_UP_CNT << 0))},
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
917*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_DWN_CNT << 24) |
918*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_DWN_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_DWN_CNT << 0))},
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
921*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4378_VDDC_SW_DIS_UP_CNT << 24) |
922*4882a593Smuzhiyun 		(LHL4378_ASR_ADJ_UP_CNT << 16) | (LHL4378_HPBG_CHOP_DIS_UP_CNT << 0))},
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
925*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
926*4882a593Smuzhiyun 	 */
927*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_DWN_CNT << 24) |
928*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4378_ASR_LPPFM_MODE_DWN_CNT << 8) |
929*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_DWN_CNT << 0))},
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
932*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
933*4882a593Smuzhiyun 	 */
934*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4378_ASR_MANUAL_MODE_UP_CNT << 24) |
935*4882a593Smuzhiyun 		(LHL4378_ASR_MODE_SEL_UP_CNT << 16)| (LHL4378_ASR_LPPFM_MODE_UP_CNT << 8) |
936*4882a593Smuzhiyun 		(LHL4378_ASR_CLK4M_DIS_UP_CNT << 0))},
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
939*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
940*4882a593Smuzhiyun 	 */
941*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_DWN_CNT << 24) |
942*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4378_SRBG_REF_SEL_DWN_CNT << 8) |
943*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_DWN_CNT << 0))},
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
946*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
947*4882a593Smuzhiyun 	 */
948*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4378_PFM_PWR_SLICE_UP_CNT << 24) |
949*4882a593Smuzhiyun 		(LHL4378_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4378_SRBG_REF_SEL_UP_CNT << 8) |
950*4882a593Smuzhiyun 		(LHL4378_HPBG_PU_EN_UP_CNT << 0))},
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
953*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), ~0, (LHL4378_CSR_TRIM_ADJ_DWN_CNT << 16)},
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
956*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), ~0, (LHL4378_CSR_TRIM_ADJ_UP_CNT << 16)},
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
959*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK,
960*4882a593Smuzhiyun 		(LHL4378_ASR_TRIM_ADJ_DWN_CNT << LHL4378_ASR_TRIM_ADJ_CNT_SHIFT)},
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
963*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), LHL4378_ASR_TRIM_ADJ_CNT_MASK,
964*4882a593Smuzhiyun 		(LHL4378_ASR_TRIM_ADJ_UP_CNT << LHL4378_ASR_TRIM_ADJ_CNT_SHIFT)},
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
967*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
968*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4378_PWRSW_EN_DWN_CNT << 24) |
969*4882a593Smuzhiyun 		(LHL4378_SLB_EN_DWN_CNT << 16) | (LHL4378_ISO_EN_DWN_CNT << 8))},
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
972*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4387_VMUX_ASR_SEL_DWN_CNT << 16)},
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
975*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
976*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4378_PWRSW_EN_UP_CNT << 24) |
977*4882a593Smuzhiyun 		(LHL4378_SLB_EN_UP_CNT << 16) | (LHL4378_ISO_EN_UP_CNT << 8))},
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
980*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4387_VMUX_ASR_SEL_UP_CNT << 16))},
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	/* Enable lhl interrupt */
983*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun 	/* Enable LHL Wake up */
986*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
989*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)},
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun 	/* serdes_clk_dis dn=2, miscldo_pu dn=6; Also include CRWLLHL-48 WAR set bit31 */
992*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn3_ctl_adr), ~0, 0x80040c02},
993*4882a593Smuzhiyun 
994*4882a593Smuzhiyun 	/* serdes_clk_dis dn=11, miscldo_pu dn=0 */
995*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup3_ctl_adr), ~0, 0x00160010}
996*4882a593Smuzhiyun };
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun /* LV sleep mode summary:
999*4882a593Smuzhiyun  * LV mode is where both ABUCK and CBUCK are programmed to low voltages during
1000*4882a593Smuzhiyun  * sleep, and VMUX selects ABUCK as VDDOUT_AON. LPLDO needs to power off.
1001*4882a593Smuzhiyun  * With ASR ON, LPLDO OFF
1002*4882a593Smuzhiyun  */
1003*4882a593Smuzhiyun void
BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4369)1004*4882a593Smuzhiyun BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4369)(si_t *sih)
1005*4882a593Smuzhiyun {
1006*4882a593Smuzhiyun 	uint i;
1007*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
1008*4882a593Smuzhiyun 	lhl_reg_set_t *regs = lv_sleep_mode_4369_lhl_reg_set;
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun 	/* Enable LHL LV mode:
1011*4882a593Smuzhiyun 	 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
1012*4882a593Smuzhiyun 	 */
1013*4882a593Smuzhiyun 	for (i = 0; i < ARRAYSIZE(lv_sleep_mode_4369_lhl_reg_set); i++) {
1014*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
1015*4882a593Smuzhiyun 	}
1016*4882a593Smuzhiyun 	if (getintvar(NULL, rstr_rfldo3p3_cap_war)) {
1017*4882a593Smuzhiyun 		si_corereg(sih, coreidx, LHL_REG_OFF(lhl_lp_main_ctl1_adr),
1018*4882a593Smuzhiyun 				BCM_MASK32(23, 0), 0x9E9F9F);
1019*4882a593Smuzhiyun 	}
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun void
BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4378)1023*4882a593Smuzhiyun BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4378)(si_t *sih)
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun 	uint i;
1026*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
1027*4882a593Smuzhiyun 	lhl_reg_set_t *regs = lv_sleep_mode_4378_lhl_reg_set;
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun 	/* Enable LHL LV mode:
1030*4882a593Smuzhiyun 	 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
1031*4882a593Smuzhiyun 	 */
1032*4882a593Smuzhiyun 	for (i = 0; i < ARRAYSIZE(lv_sleep_mode_4378_lhl_reg_set); i++) {
1033*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
1034*4882a593Smuzhiyun 	}
1035*4882a593Smuzhiyun }
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun void
BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4387)1038*4882a593Smuzhiyun BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4387)(si_t *sih)
1039*4882a593Smuzhiyun {
1040*4882a593Smuzhiyun 	uint i;
1041*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
1042*4882a593Smuzhiyun 	lhl_reg_set_t *regs;
1043*4882a593Smuzhiyun 	uint32 abuck_volt_sleep, cbuck_volt_sleep;
1044*4882a593Smuzhiyun 	uint regs_size;
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun 	if (BCMSRTOPOFF_ENAB()) {
1047*4882a593Smuzhiyun 		regs = lv_sleep_mode_4387_lhl_reg_set_top_off;
1048*4882a593Smuzhiyun 		regs_size = ARRAYSIZE(lv_sleep_mode_4387_lhl_reg_set_top_off);
1049*4882a593Smuzhiyun 	} else {
1050*4882a593Smuzhiyun 		/* Enable LHL LV mode:
1051*4882a593Smuzhiyun 		 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
1052*4882a593Smuzhiyun 		 */
1053*4882a593Smuzhiyun 		regs = lv_sleep_mode_4387_lhl_reg_set;
1054*4882a593Smuzhiyun 		regs_size = ARRAYSIZE(lv_sleep_mode_4387_lhl_reg_set);
1055*4882a593Smuzhiyun 	}
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun 	for (i = 0; i < regs_size; i++) {
1058*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
1059*4882a593Smuzhiyun 	}
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun 	if (getvar(NULL, rstr_cbuck_volt_sleep) != NULL) {
1062*4882a593Smuzhiyun 		cbuck_volt_sleep = getintvar(NULL, rstr_cbuck_volt_sleep);
1063*4882a593Smuzhiyun 		LHL_REG(sih, lhl_lp_main_ctl1_adr, LHL_CBUCK_VOLT_SLEEP_MASK,
1064*4882a593Smuzhiyun 			(cbuck_volt_sleep << LHL_CBUCK_VOLT_SLEEP_SHIFT));
1065*4882a593Smuzhiyun 	}
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun 	if (getvar(NULL, rstr_abuck_volt_sleep) != NULL) {
1068*4882a593Smuzhiyun 		abuck_volt_sleep = getintvar(NULL, rstr_abuck_volt_sleep);
1069*4882a593Smuzhiyun 		LHL_REG(sih, lhl_lp_main_ctl2_adr, LHL_ABUCK_VOLT_SLEEP_MASK,
1070*4882a593Smuzhiyun 			(abuck_volt_sleep << LHL_ABUCK_VOLT_SLEEP_SHIFT));
1071*4882a593Smuzhiyun 	}
1072*4882a593Smuzhiyun 
1073*4882a593Smuzhiyun 	if (BCMSRTOPOFF_ENAB()) {
1074*4882a593Smuzhiyun 		/* Serdes AFE retention control enable */
1075*4882a593Smuzhiyun 		si_gci_chipcontrol(sih, CC_GCI_CHIPCTRL_05,
1076*4882a593Smuzhiyun 			CC_GCI_05_4387C0_AFE_RET_ENB_MASK,
1077*4882a593Smuzhiyun 			CC_GCI_05_4387C0_AFE_RET_ENB_MASK);
1078*4882a593Smuzhiyun 	}
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun void
BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4389)1082*4882a593Smuzhiyun BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4389)(si_t *sih)
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun 	uint i;
1085*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
1086*4882a593Smuzhiyun 	lhl_reg_set_t *regs = lv_sleep_mode_4389_lhl_reg_set;
1087*4882a593Smuzhiyun 	uint32 abuck_volt_sleep, cbuck_volt_sleep;
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	/* Enable LHL LV mode:
1090*4882a593Smuzhiyun 	 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
1091*4882a593Smuzhiyun 	 */
1092*4882a593Smuzhiyun 	for (i = 0; i < ARRAYSIZE(lv_sleep_mode_4389_lhl_reg_set); i++) {
1093*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
1094*4882a593Smuzhiyun 	}
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 	if (getvar(NULL, rstr_cbuck_volt_sleep) != NULL) {
1097*4882a593Smuzhiyun 		cbuck_volt_sleep = getintvar(NULL, rstr_cbuck_volt_sleep);
1098*4882a593Smuzhiyun 		LHL_REG(sih, lhl_lp_main_ctl1_adr, LHL_CBUCK_VOLT_SLEEP_MASK,
1099*4882a593Smuzhiyun 			(cbuck_volt_sleep << LHL_CBUCK_VOLT_SLEEP_SHIFT));
1100*4882a593Smuzhiyun 	}
1101*4882a593Smuzhiyun 
1102*4882a593Smuzhiyun 	if (getvar(NULL, rstr_abuck_volt_sleep) != NULL) {
1103*4882a593Smuzhiyun 		abuck_volt_sleep = getintvar(NULL, rstr_abuck_volt_sleep);
1104*4882a593Smuzhiyun 		LHL_REG(sih, lhl_lp_main_ctl2_adr, LHL_ABUCK_VOLT_SLEEP_MASK,
1105*4882a593Smuzhiyun 			(abuck_volt_sleep << LHL_ABUCK_VOLT_SLEEP_SHIFT));
1106*4882a593Smuzhiyun 	}
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun 	OSL_DELAY(100);
1109*4882a593Smuzhiyun 	LHL_REG(sih, lhl_top_pwrseq_ctl_adr, ~0, 0x00000101);
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun 	/* Clear Misc_LDO override */
1112*4882a593Smuzhiyun 	si_pmu_vreg_control(sih, PMU_VREG_5, VREG5_4387_MISCLDO_PU_MASK, 0);
1113*4882a593Smuzhiyun }
1114*4882a593Smuzhiyun 
1115*4882a593Smuzhiyun lhl_reg_set_t BCMATTACHDATA(lv_sleep_mode_4362_lhl_reg_set)[] =
1116*4882a593Smuzhiyun {
1117*4882a593Smuzhiyun 	/* set wl_sleep_en */
1118*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 0), (1 << 0)},
1119*4882a593Smuzhiyun 
1120*4882a593Smuzhiyun 	/* set top_pwrsw_en, top_slb_en, top_iso_en */
1121*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), BCM_MASK32(5, 3), (0x0 << 3)},
1122*4882a593Smuzhiyun 
1123*4882a593Smuzhiyun 	/* set VMUX_asr_sel_en */
1124*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrseq_ctl_adr), (1 << 8), (1 << 8)},
1125*4882a593Smuzhiyun 
1126*4882a593Smuzhiyun 	/* lhl_lp_main_ctl_adr, disable lp_mode_en, set CSR and ASR field enables for LV mode */
1127*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl_adr), BCM_MASK32(21, 0), 0x3F89FF},
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 	/* lhl_lp_main_ctl1_adr, set CSR field values - CSR_adj - 0.66V and trim_adj -5mV */
1130*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl1_adr), BCM_MASK32(23, 0), 0x9E9F97},
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun 	/* lhl_lp_main_ctl2_adr, set ASR field values - ASR_adj - 0.76V and trim_adj +5mV */
1133*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_main_ctl2_adr), BCM_MASK32(13, 0), 0x07EE},
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl_adr, set down count for CSR fields- adj, mode, overi_dis */
1136*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl_adr), ~0, ((LHL4362_CSR_OVERI_DIS_DWN_CNT << 16) |
1137*4882a593Smuzhiyun 		(LHL4362_CSR_MODE_DWN_CNT << 8) | (LHL4362_CSR_ADJ_DWN_CNT << 0))},
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 	/* lhl_lp_up_ctl_adr, set up count for CSR fields- adj, mode, overi_dis */
1140*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl_adr), ~0, ((LHL4362_CSR_OVERI_DIS_UP_CNT << 16) |
1141*4882a593Smuzhiyun 		(LHL4362_CSR_MODE_UP_CNT << 8) | (LHL4362_CSR_ADJ_UP_CNT << 0))},
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl1_adr, set down count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
1144*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl1_adr), ~0, ((LHL4362_VDDC_SW_DIS_DWN_CNT << 24) |
1145*4882a593Smuzhiyun 		(LHL4362_ASR_ADJ_DWN_CNT << 16) | (LHL4362_HPBG_CHOP_DIS_DWN_CNT << 0))},
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun 	/* lhl_lp_up_ctl1_adr, set up count for hpbg_chop_dis, ASR_adj, vddc_sw_dis */
1148*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl1_adr), ~0, ((LHL4362_VDDC_SW_DIS_UP_CNT << 24) |
1149*4882a593Smuzhiyun 		(LHL4362_ASR_ADJ_UP_CNT << 16) | (LHL4362_HPBG_CHOP_DIS_UP_CNT << 0))},
1150*4882a593Smuzhiyun 
1151*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl4_adr, set down count for ASR fields -
1152*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
1153*4882a593Smuzhiyun 	 */
1154*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl4_adr), ~0, ((LHL4362_ASR_MANUAL_MODE_DWN_CNT << 24) |
1155*4882a593Smuzhiyun 		(LHL4362_ASR_MODE_SEL_DWN_CNT << 16) | (LHL4362_ASR_LPPFM_MODE_DWN_CNT << 8) |
1156*4882a593Smuzhiyun 		(LHL4362_ASR_CLK4M_DIS_DWN_CNT << 0))},
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	/* lhl_lp_up_ctl4_adr, set up count for ASR fields -
1159*4882a593Smuzhiyun 	 *     clk4m_dis, lppfm_mode, mode_sel, manual_mode
1160*4882a593Smuzhiyun 	 */
1161*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl4_adr), ~0, ((LHL4362_ASR_MANUAL_MODE_UP_CNT << 24) |
1162*4882a593Smuzhiyun 		(LHL4362_ASR_MODE_SEL_UP_CNT << 16)| (LHL4362_ASR_LPPFM_MODE_UP_CNT << 8) |
1163*4882a593Smuzhiyun 		(LHL4362_ASR_CLK4M_DIS_UP_CNT << 0))},
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl3_adr, set down count for hpbg_pu, srbg_ref, ASR_overi_dis,
1166*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
1167*4882a593Smuzhiyun 	 */
1168*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl3_adr), ~0, ((LHL4362_PFM_PWR_SLICE_DWN_CNT << 24) |
1169*4882a593Smuzhiyun 		(LHL4362_ASR_OVERI_DIS_DWN_CNT << 16) | (LHL4362_SRBG_REF_SEL_DWN_CNT << 8) |
1170*4882a593Smuzhiyun 		(LHL4362_HPBG_PU_EN_DWN_CNT << 0))},
1171*4882a593Smuzhiyun 
1172*4882a593Smuzhiyun 	/* lhl_lp_up_ctl3_adr, set up count for hpbg_pu, srbg_ref, ASR_overi_dis,
1173*4882a593Smuzhiyun 	 * CSR_pfm_pwr_slice_en
1174*4882a593Smuzhiyun 	 */
1175*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl3_adr), ~0, ((LHL4362_PFM_PWR_SLICE_UP_CNT << 24) |
1176*4882a593Smuzhiyun 		(LHL4362_ASR_OVERI_DIS_UP_CNT << 16) | (LHL4362_SRBG_REF_SEL_UP_CNT << 8) |
1177*4882a593Smuzhiyun 		(LHL4362_HPBG_PU_EN_UP_CNT << 0))},
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl2_adr, set down count for CSR_trim_adj */
1180*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl2_adr), ~0, (LHL4362_CSR_TRIM_ADJ_DWN_CNT << 16)},
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun 	/* lhl_lp_up_ctl2_adr, set up count for CSR_trim_adj */
1183*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl2_adr), ~0, (LHL4362_CSR_TRIM_ADJ_UP_CNT << 16)},
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	/* lhl_lp_dn_ctl5_adr, set down count for ASR_trim_adj */
1186*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_dn_ctl5_adr), ~0, (LHL4362_ASR_TRIM_ADJ_DWN_CNT << 0)},
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun 	/* lhl_lp_up_ctl5_adr, set down count for ASR_trim_adj */
1189*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_lp_up_ctl5_adr), ~0, (LHL4362_ASR_TRIM_ADJ_UP_CNT << 0)},
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun 	/* Change the default down count values for the resources */
1192*4882a593Smuzhiyun 	/* lhl_top_pwrdn_ctl_adr, set down count for top_level_sleep, iso, slb and pwrsw */
1193*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn_ctl_adr), ~0, ((LHL4362_PWRSW_EN_DWN_CNT << 24) |
1194*4882a593Smuzhiyun 		(LHL4362_SLB_EN_DWN_CNT << 16) | (LHL4362_ISO_EN_DWN_CNT << 8))},
1195*4882a593Smuzhiyun 
1196*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
1197*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrdn2_ctl_adr), ~0, (LHL4362_VMUX_ASR_SEL_DWN_CNT << 16)},
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun 	/* Change the default up count values for the resources */
1200*4882a593Smuzhiyun 	/* lhl_top_pwrup_ctl_adr, set up count for top_level_sleep, iso, slb and pwrsw */
1201*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup_ctl_adr), ~0, ((LHL4362_PWRSW_EN_UP_CNT << 24) |
1202*4882a593Smuzhiyun 		(LHL4362_SLB_EN_UP_CNT << 16) | (LHL4362_ISO_EN_UP_CNT << 8))},
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun 	/* lhl_top_pwrdn2_ctl_adr, set down count for VMUX_asr_sel */
1205*4882a593Smuzhiyun 	{LHL_REG_OFF(lhl_top_pwrup2_ctl_adr), ~0, ((LHL4362_VMUX_ASR_SEL_UP_CNT << 16))},
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun 	/* Enable lhl interrupt */
1208*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_intmask), (1 << 30), (1 << 30)},
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	/* Enable LHL Wake up */
1211*4882a593Smuzhiyun 	{LHL_REG_OFF(gci_wakemask), (1 << 30), (1 << 30)},
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun 	/* Making forceOTPpwrOn 1 */
1214*4882a593Smuzhiyun 	{LHL_REG_OFF(otpcontrol), (1 << 16), (1 << 16)}
1215*4882a593Smuzhiyun };
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun /* LV sleep mode summary:
1218*4882a593Smuzhiyun  * LV mode is where both ABUCK and CBUCK are programmed to low voltages during
1219*4882a593Smuzhiyun  * sleep, and VMUX selects ABUCK as VDDOUT_AON. LPLDO needs to power off.
1220*4882a593Smuzhiyun  * With ASR ON, LPLDO OFF
1221*4882a593Smuzhiyun  */
1222*4882a593Smuzhiyun void
BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4362)1223*4882a593Smuzhiyun BCMATTACHFN(si_set_lv_sleep_mode_lhl_config_4362)(si_t *sih)
1224*4882a593Smuzhiyun {
1225*4882a593Smuzhiyun 	uint i;
1226*4882a593Smuzhiyun 	uint coreidx = si_findcoreidx(sih, GCI_CORE_ID, 0);
1227*4882a593Smuzhiyun 	lhl_reg_set_t *regs = lv_sleep_mode_4362_lhl_reg_set;
1228*4882a593Smuzhiyun 
1229*4882a593Smuzhiyun 	/* Enable LHL LV mode:
1230*4882a593Smuzhiyun 	 * lhl_top_pwrseq_ctl_adr, set wl_sleep_en, iso_en, slb_en, pwrsw_en,VMUX_asr_sel_en
1231*4882a593Smuzhiyun 	 */
1232*4882a593Smuzhiyun 	for (i = 0; i < ARRAYSIZE(lv_sleep_mode_4362_lhl_reg_set); i++) {
1233*4882a593Smuzhiyun 		si_corereg(sih, coreidx, regs[i].offset, regs[i].mask, regs[i].val);
1234*4882a593Smuzhiyun 	}
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun void
si_lhl_mactim0_set(si_t * sih,uint32 val)1238*4882a593Smuzhiyun si_lhl_mactim0_set(si_t *sih, uint32 val)
1239*4882a593Smuzhiyun {
1240*4882a593Smuzhiyun 	LHL_REG(sih, lhl_wl_mactim_int0_adr, LHL_WL_MACTIMER_MASK, val);
1241*4882a593Smuzhiyun }
1242