xref: /rk3399_ARM-atf/plat/mediatek/drivers/pmic/mt8196/pmic_shutdown_cfg.c (revision cf2df874cd09305ac7282fadb0fef6be597dfffb)
1*d4e6f98dSHope Wang /*
2*d4e6f98dSHope Wang  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*d4e6f98dSHope Wang  *
4*d4e6f98dSHope Wang  * SPDX-License-Identifier: BSD-3-Clause
5*d4e6f98dSHope Wang  */
6*d4e6f98dSHope Wang 
7*d4e6f98dSHope Wang #include <errno.h>
8*d4e6f98dSHope Wang 
9*d4e6f98dSHope Wang #include <common/debug.h>
10*d4e6f98dSHope Wang 
11*d4e6f98dSHope Wang #include <drivers/pmic/pmic_shutdown_cfg.h>
12*d4e6f98dSHope Wang #include <drivers/spmi/spmi_common.h>
13*d4e6f98dSHope Wang #include <drivers/spmi_api.h>
14*d4e6f98dSHope Wang #include <lib/mtk_init/mtk_init.h>
15*d4e6f98dSHope Wang 
16*d4e6f98dSHope Wang #define MASTER_ID				SPMI_MASTER_1
17*d4e6f98dSHope Wang 
18*d4e6f98dSHope Wang #ifndef MT8678_PMIC_SUPPORT
19*d4e6f98dSHope Wang /* MT6316 will automatically disable wdt in poffs */
20*d4e6f98dSHope Wang #define MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR	0x408
21*d4e6f98dSHope Wang #define MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_MASK	0x1
22*d4e6f98dSHope Wang #define MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT	1
23*d4e6f98dSHope Wang #else
24*d4e6f98dSHope Wang /* MT6319 will automatically disable wdt in poffs */
25*d4e6f98dSHope Wang #define MT6319_TOP_RST_MISC_CLR			0x128
26*d4e6f98dSHope Wang #define MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR	0x138
27*d4e6f98dSHope Wang #define MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_MASK	0x1
28*d4e6f98dSHope Wang #define MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT	2
29*d4e6f98dSHope Wang #endif
30*d4e6f98dSHope Wang 
31*d4e6f98dSHope Wang #define MT6373_TOP_RST_MISC1_CLR		0x13B
32*d4e6f98dSHope Wang #define MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR	0x408
33*d4e6f98dSHope Wang #define MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_MASK	0x1
34*d4e6f98dSHope Wang #define MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT	1
35*d4e6f98dSHope Wang 
36*d4e6f98dSHope Wang #define MT6685_TOP_RST_MISC_CLR			0x129
37*d4e6f98dSHope Wang #define MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR	0x408
38*d4e6f98dSHope Wang #define MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_MASK	0x1
39*d4e6f98dSHope Wang #define MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT	1
40*d4e6f98dSHope Wang 
41*d4e6f98dSHope Wang struct spmi_device *sdev_arr[SPMI_MAX_SLAVE_ID];
42*d4e6f98dSHope Wang 
43*d4e6f98dSHope Wang struct cfg_t {
44*d4e6f98dSHope Wang 	uint8_t slvid;
45*d4e6f98dSHope Wang 	uint32_t addr;
46*d4e6f98dSHope Wang 	uint32_t shutdown_src_addr;
47*d4e6f98dSHope Wang 	uint32_t shutdown_src_mask;
48*d4e6f98dSHope Wang 	uint32_t shutdown_src_shift;
49*d4e6f98dSHope Wang 	uint8_t val;
50*d4e6f98dSHope Wang };
51*d4e6f98dSHope Wang 
52*d4e6f98dSHope Wang #ifndef MT8678_PMIC_SUPPORT
53*d4e6f98dSHope Wang static const struct cfg_t cfg_arr[] = {
54*d4e6f98dSHope Wang 	{
55*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_6,
56*d4e6f98dSHope Wang 		.addr = 0,
57*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
58*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
59*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
60*d4e6f98dSHope Wang 		.val = 0x1
61*d4e6f98dSHope Wang 	}, {
62*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_7,
63*d4e6f98dSHope Wang 		.addr = 0,
64*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
65*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
66*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
67*d4e6f98dSHope Wang 		.val = 0x1
68*d4e6f98dSHope Wang 	}, {
69*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_8,
70*d4e6f98dSHope Wang 		.addr = 0,
71*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
72*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
73*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
74*d4e6f98dSHope Wang 		.val = 0x1
75*d4e6f98dSHope Wang 	}, {
76*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_15,
77*d4e6f98dSHope Wang 		.addr = 0,
78*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
79*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
80*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6316_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
81*d4e6f98dSHope Wang 		.val = 0x1
82*d4e6f98dSHope Wang 	}, {
83*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_5,
84*d4e6f98dSHope Wang 		.addr = MT6373_TOP_RST_MISC1_CLR,
85*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
86*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
87*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
88*d4e6f98dSHope Wang 		.val = 0x1
89*d4e6f98dSHope Wang 	}, {
90*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_9,
91*d4e6f98dSHope Wang 		.addr = MT6685_TOP_RST_MISC_CLR,
92*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
93*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
94*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
95*d4e6f98dSHope Wang 		.val = 0x1
96*d4e6f98dSHope Wang 	}
97*d4e6f98dSHope Wang };
98*d4e6f98dSHope Wang #else /* MT8678_PMIC_SUPPORT */
99*d4e6f98dSHope Wang static const struct cfg_t cfg_arr[] = {
100*d4e6f98dSHope Wang 	{
101*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_6,
102*d4e6f98dSHope Wang 		.addr = MT6319_TOP_RST_MISC_CLR,
103*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
104*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
105*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
106*d4e6f98dSHope Wang 		.val = 0x1
107*d4e6f98dSHope Wang 	}, {
108*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_7,
109*d4e6f98dSHope Wang 		.addr = MT6319_TOP_RST_MISC_CLR,
110*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
111*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
112*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
113*d4e6f98dSHope Wang 		.val = 0x1
114*d4e6f98dSHope Wang 	}, {
115*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_8,
116*d4e6f98dSHope Wang 		.addr = MT6319_TOP_RST_MISC_CLR,
117*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
118*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
119*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
120*d4e6f98dSHope Wang 		.val = 0x1
121*d4e6f98dSHope Wang 	}, {
122*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_15,
123*d4e6f98dSHope Wang 		.addr = MT6319_TOP_RST_MISC_CLR,
124*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
125*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
126*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6319_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
127*d4e6f98dSHope Wang 		.val = 0x1
128*d4e6f98dSHope Wang 	}, {
129*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_5,
130*d4e6f98dSHope Wang 		.addr = MT6373_TOP_RST_MISC1_CLR,
131*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
132*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
133*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6373_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
134*d4e6f98dSHope Wang 		.val = 0x1
135*d4e6f98dSHope Wang 	}, {
136*d4e6f98dSHope Wang 		.slvid = SPMI_SLAVE_9,
137*d4e6f98dSHope Wang 		.addr = MT6685_TOP_RST_MISC_CLR,
138*d4e6f98dSHope Wang 		.shutdown_src_addr = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_ADDR,
139*d4e6f98dSHope Wang 		.shutdown_src_mask = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_MASK,
140*d4e6f98dSHope Wang 		.shutdown_src_shift = MT6685_PMIC_RG_SHUTDOWN_SRC_SEL_SHIFT,
141*d4e6f98dSHope Wang 		.val = 0x1
142*d4e6f98dSHope Wang 	}
143*d4e6f98dSHope Wang };
144*d4e6f98dSHope Wang #endif /* MT8678_PMIC_SUPPORT */
145*d4e6f98dSHope Wang 
146*d4e6f98dSHope Wang #define MT6316_TOP_ANA_KEY			0x3AA
147*d4e6f98dSHope Wang #define MT6316_PMIC_RG_VI075_SINK_CUR_ADDR	0x994
148*d4e6f98dSHope Wang #define MT6316_PMIC_RG_VI075_SINK_CUR_MASK	0xF
149*d4e6f98dSHope Wang #define MT6316_PMIC_RG_VI075_SINK_CUR_SHIFT	4
150*d4e6f98dSHope Wang #define MT6316_PMIC_RG_PSEQ_ELR_RSV2_ADDR	0xA2C
151*d4e6f98dSHope Wang #define MT6316_PMIC_RG_PSEQ_ELR_RSV2_MASK	0x7
152*d4e6f98dSHope Wang #define MT6316_PMIC_RG_PSEQ_ELR_RSV2_SHIFT	5
153*d4e6f98dSHope Wang #define PSEQ_ELR_RSV2_VAL_MASK_1		0x3
154*d4e6f98dSHope Wang #define PSEQ_ELR_RSV2_VAL_MASK_2		0x1
155*d4e6f98dSHope Wang #define VI075_SINK_CUR_SOURCE_1			0x5
156*d4e6f98dSHope Wang #define VI075_SINK_CUR_SOURCE_2			0
157*d4e6f98dSHope Wang #define VI075_SINK_CUR_SOURCE_3			0xB
158*d4e6f98dSHope Wang #define ARRAY_LENGTH_MAX			2
159*d4e6f98dSHope Wang 
160*d4e6f98dSHope Wang #ifndef MT8678_PMIC_SUPPORT
mt6316_key_lock_check(struct spmi_device * mt6316_dev,uint16_t key)161*d4e6f98dSHope Wang static void mt6316_key_lock_check(struct spmi_device *mt6316_dev, uint16_t key)
162*d4e6f98dSHope Wang {
163*d4e6f98dSHope Wang 	int i, ret;
164*d4e6f98dSHope Wang 	uint16_t rdata;
165*d4e6f98dSHope Wang 	uint8_t work_val[ARRAY_LENGTH_MAX];
166*d4e6f98dSHope Wang 	uint8_t wdata[ARRAY_LENGTH_MAX];
167*d4e6f98dSHope Wang 
168*d4e6f98dSHope Wang 	for (i = 0; i < 2; i++) {
169*d4e6f98dSHope Wang 		ret = spmi_ext_register_readl(mt6316_dev, key, &work_val[0], 2);
170*d4e6f98dSHope Wang 		if (ret < 0) {
171*d4e6f98dSHope Wang 			INFO("[%s]: read fail, addr = 0x%x, ret = %d\n"
172*d4e6f98dSHope Wang 			      , __func__, key, ret);
173*d4e6f98dSHope Wang 			i = 0;
174*d4e6f98dSHope Wang 			continue;
175*d4e6f98dSHope Wang 		}
176*d4e6f98dSHope Wang 		rdata = work_val[0] | (work_val[1] << 8);
177*d4e6f98dSHope Wang 
178*d4e6f98dSHope Wang 		if (rdata != 0) {
179*d4e6f98dSHope Wang 			INFO("[%s] lock fail, addr = 0x%x, rdata = 0x%x.\n"
180*d4e6f98dSHope Wang 			      , __func__, key, rdata);
181*d4e6f98dSHope Wang 			wdata[0] = 0;
182*d4e6f98dSHope Wang 			wdata[1] = 0;
183*d4e6f98dSHope Wang 			spmi_ext_register_writel(mt6316_dev, key, &wdata[0], 2);
184*d4e6f98dSHope Wang 			i = 0;
185*d4e6f98dSHope Wang 		}
186*d4e6f98dSHope Wang 	}
187*d4e6f98dSHope Wang }
188*d4e6f98dSHope Wang 
wk_vio075_sink_cur(struct spmi_device * mt6316_dev,unsigned char en_seq_off)189*d4e6f98dSHope Wang static void wk_vio075_sink_cur(struct spmi_device *mt6316_dev, unsigned char en_seq_off)
190*d4e6f98dSHope Wang {
191*d4e6f98dSHope Wang 	uint8_t rval, wval;
192*d4e6f98dSHope Wang 	int ret;
193*d4e6f98dSHope Wang 	uint8_t buf[ARRAY_LENGTH_MAX];
194*d4e6f98dSHope Wang 
195*d4e6f98dSHope Wang 	ret = spmi_ext_register_readl(mt6316_dev, MT6316_PMIC_RG_PSEQ_ELR_RSV2_ADDR, &rval, 1);
196*d4e6f98dSHope Wang 	if (ret < 0)
197*d4e6f98dSHope Wang 		return;
198*d4e6f98dSHope Wang 	rval = (rval >> MT6316_PMIC_RG_PSEQ_ELR_RSV2_SHIFT) & MT6316_PMIC_RG_PSEQ_ELR_RSV2_MASK;
199*d4e6f98dSHope Wang 
200*d4e6f98dSHope Wang 	if (!(rval & PSEQ_ELR_RSV2_VAL_MASK_1)) {
201*d4e6f98dSHope Wang 		wval = VI075_SINK_CUR_SOURCE_1;
202*d4e6f98dSHope Wang 	} else if (rval & PSEQ_ELR_RSV2_VAL_MASK_2) {
203*d4e6f98dSHope Wang 		if (en_seq_off)
204*d4e6f98dSHope Wang 			wval = VI075_SINK_CUR_SOURCE_2;
205*d4e6f98dSHope Wang 		else
206*d4e6f98dSHope Wang 			wval = VI075_SINK_CUR_SOURCE_3;
207*d4e6f98dSHope Wang 	} else {
208*d4e6f98dSHope Wang 		wval = VI075_SINK_CUR_SOURCE_2;
209*d4e6f98dSHope Wang 	}
210*d4e6f98dSHope Wang 
211*d4e6f98dSHope Wang 	buf[0] = 0xDC;
212*d4e6f98dSHope Wang 	buf[1] = 0xF1;
213*d4e6f98dSHope Wang 	spmi_ext_register_writel(mt6316_dev,
214*d4e6f98dSHope Wang 				 MT6316_TOP_ANA_KEY,
215*d4e6f98dSHope Wang 				 &buf[0], 2); /* unlock TOP_ANA key */
216*d4e6f98dSHope Wang 	spmi_ext_register_writel_field(mt6316_dev,
217*d4e6f98dSHope Wang 				       MT6316_PMIC_RG_VI075_SINK_CUR_ADDR, wval,
218*d4e6f98dSHope Wang 				       MT6316_PMIC_RG_VI075_SINK_CUR_MASK,
219*d4e6f98dSHope Wang 				       MT6316_PMIC_RG_VI075_SINK_CUR_SHIFT);
220*d4e6f98dSHope Wang 	buf[0] = 0;
221*d4e6f98dSHope Wang 	buf[1] = 0;
222*d4e6f98dSHope Wang 	spmi_ext_register_writel(mt6316_dev,
223*d4e6f98dSHope Wang 				 MT6316_TOP_ANA_KEY,
224*d4e6f98dSHope Wang 				 &buf[0], 2); /* lock TOP_ANA key */
225*d4e6f98dSHope Wang 	mt6316_key_lock_check(mt6316_dev, MT6316_TOP_ANA_KEY);
226*d4e6f98dSHope Wang }
227*d4e6f98dSHope Wang #endif
228*d4e6f98dSHope Wang 
pmic_shutdown_cfg_init(void)229*d4e6f98dSHope Wang static int pmic_shutdown_cfg_init(void)
230*d4e6f98dSHope Wang {
231*d4e6f98dSHope Wang 	uint8_t i, slvid;
232*d4e6f98dSHope Wang 
233*d4e6f98dSHope Wang 	for (i = 0; i < ARRAY_SIZE(cfg_arr); i++) {
234*d4e6f98dSHope Wang 		slvid = cfg_arr[i].slvid;
235*d4e6f98dSHope Wang 		if (sdev_arr[slvid] != NULL)
236*d4e6f98dSHope Wang 			continue;
237*d4e6f98dSHope Wang 		sdev_arr[slvid] = get_spmi_device(MASTER_ID, slvid);
238*d4e6f98dSHope Wang 		if (!sdev_arr[slvid])
239*d4e6f98dSHope Wang 			return -ENODEV;
240*d4e6f98dSHope Wang 	}
241*d4e6f98dSHope Wang 	return 0;
242*d4e6f98dSHope Wang }
243*d4e6f98dSHope Wang MTK_PLAT_SETUP_0_INIT(pmic_shutdown_cfg_init);
244*d4e6f98dSHope Wang 
pmic_shutdown_cfg(void)245*d4e6f98dSHope Wang int pmic_shutdown_cfg(void)
246*d4e6f98dSHope Wang {
247*d4e6f98dSHope Wang 	int ret;
248*d4e6f98dSHope Wang 	uint8_t i, slvid;
249*d4e6f98dSHope Wang 	uint32_t addr;
250*d4e6f98dSHope Wang 	uint8_t val;
251*d4e6f98dSHope Wang 
252*d4e6f98dSHope Wang 	for (i = 0; i < ARRAY_SIZE(cfg_arr); i++) {
253*d4e6f98dSHope Wang 		slvid = cfg_arr[i].slvid;
254*d4e6f98dSHope Wang 		if (!sdev_arr[slvid])
255*d4e6f98dSHope Wang 			return -ENODEV;
256*d4e6f98dSHope Wang 		/* mt6316 vio075 sink current adjustment */
257*d4e6f98dSHope Wang 		if ((slvid >= SPMI_SLAVE_6 && slvid <= SPMI_SLAVE_8) || slvid == SPMI_SLAVE_15)
258*d4e6f98dSHope Wang 			wk_vio075_sink_cur(sdev_arr[slvid], 1);
259*d4e6f98dSHope Wang 		addr = cfg_arr[i].addr;
260*d4e6f98dSHope Wang 		val = cfg_arr[i].val;
261*d4e6f98dSHope Wang 		/* Disable WDTRSTB_EN */
262*d4e6f98dSHope Wang 		if (addr) {
263*d4e6f98dSHope Wang 			ret = spmi_ext_register_writel(sdev_arr[slvid], addr, &val, 1);
264*d4e6f98dSHope Wang 			if (ret < 0)
265*d4e6f98dSHope Wang 				return ret;
266*d4e6f98dSHope Wang 		}
267*d4e6f98dSHope Wang 
268*d4e6f98dSHope Wang 		/* set RG_SHUTDOWN_SRC_SEL to 1, shutdown PMIC by SPMI command */
269*d4e6f98dSHope Wang 		spmi_ext_register_writel_field(sdev_arr[slvid],
270*d4e6f98dSHope Wang 					       cfg_arr[i].shutdown_src_addr, 1,
271*d4e6f98dSHope Wang 					       cfg_arr[i].shutdown_src_mask,
272*d4e6f98dSHope Wang 					       cfg_arr[i].shutdown_src_shift);
273*d4e6f98dSHope Wang 	}
274*d4e6f98dSHope Wang 	return 1; /* 1: use spmi_command_shutdown API */
275*d4e6f98dSHope Wang }
276*d4e6f98dSHope Wang 
277*d4e6f98dSHope Wang /* shutdown PMIC by SPMI command */
spmi_shutdown(void)278*d4e6f98dSHope Wang int spmi_shutdown(void)
279*d4e6f98dSHope Wang {
280*d4e6f98dSHope Wang 	struct spmi_device *mt6363_sdev = get_spmi_device(SPMI_MASTER_1, SPMI_SLAVE_4);
281*d4e6f98dSHope Wang 
282*d4e6f98dSHope Wang 	if (!mt6363_sdev)
283*d4e6f98dSHope Wang 		return -ENODEV;
284*d4e6f98dSHope Wang 
285*d4e6f98dSHope Wang 	/* set RG_SHUTDOWN_SRC_SEL to 1 */
286*d4e6f98dSHope Wang 	spmi_ext_register_writel_field(mt6363_sdev, 0x408, 1, 0x1, 1);
287*d4e6f98dSHope Wang 	spmi_command_shutdown(SPMI_MASTER_P_1, mt6363_sdev, 0x800);
288*d4e6f98dSHope Wang 	spmi_command_shutdown(SPMI_MASTER_1, mt6363_sdev, 0x800);
289*d4e6f98dSHope Wang 
290*d4e6f98dSHope Wang 	return 0;
291*d4e6f98dSHope Wang }
292