xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_suspend.c (revision cc04b843baa8162cb39204533f42f22a47e1f5b8)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
47d116dccSCC Ma  * Redistribution and use in source and binary forms, with or without
57d116dccSCC Ma  * modification, are permitted provided that the following conditions are met:
67d116dccSCC Ma  *
77d116dccSCC Ma  * Redistributions of source code must retain the above copyright notice, this
87d116dccSCC Ma  * list of conditions and the following disclaimer.
97d116dccSCC Ma  *
107d116dccSCC Ma  * Redistributions in binary form must reproduce the above copyright notice,
117d116dccSCC Ma  * this list of conditions and the following disclaimer in the documentation
127d116dccSCC Ma  * and/or other materials provided with the distribution.
137d116dccSCC Ma  *
147d116dccSCC Ma  * Neither the name of ARM nor the names of its contributors may be used
157d116dccSCC Ma  * to endorse or promote products derived from this software without specific
167d116dccSCC Ma  * prior written permission.
177d116dccSCC Ma  *
187d116dccSCC Ma  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
197d116dccSCC Ma  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
207d116dccSCC Ma  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
217d116dccSCC Ma  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
227d116dccSCC Ma  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
237d116dccSCC Ma  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
247d116dccSCC Ma  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
257d116dccSCC Ma  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
267d116dccSCC Ma  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
277d116dccSCC Ma  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
287d116dccSCC Ma  * POSSIBILITY OF SUCH DAMAGE.
297d116dccSCC Ma  */
307d116dccSCC Ma #include <bakery_lock.h>
317d116dccSCC Ma #include <debug.h>
327d116dccSCC Ma #include <spm.h>
337d116dccSCC Ma #include <spm_suspend.h>
347d116dccSCC Ma 
357d116dccSCC Ma /*
367d116dccSCC Ma  * System Power Manager (SPM) is a hardware module, which controls cpu or
377d116dccSCC Ma  * system power for different power scenarios using different firmware.
387d116dccSCC Ma  * This driver controls the system power in system suspend flow.
397d116dccSCC Ma  */
407d116dccSCC Ma 
417d116dccSCC Ma #define WAIT_UART_ACK_TIMES     80	/* 80 * 10us */
427d116dccSCC Ma 
437d116dccSCC Ma #define WAKE_SRC_FOR_SUSPEND					\
447d116dccSCC Ma 	(WAKE_SRC_KP | WAKE_SRC_EINT | WAKE_SRC_MD32 |		\
457d116dccSCC Ma 	WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN | WAKE_SRC_THERM |	\
4664faa0e5Skenny liang 	WAKE_SRC_SYSPWREQ | WAKE_SRC_ALL_MD32)
477d116dccSCC Ma 
487d116dccSCC Ma #define WAKE_SRC_FOR_MD32  0
497d116dccSCC Ma 
507d116dccSCC Ma #define spm_is_wakesrc_invalid(wakesrc)	\
517d116dccSCC Ma 	(!!((unsigned int)(wakesrc) & 0xc0003803))
527d116dccSCC Ma 
537d116dccSCC Ma const unsigned int spm_flags =
547d116dccSCC Ma 	SPM_DUALVCORE_PDN_DIS | SPM_PASR_DIS | SPM_DPD_DIS |
557d116dccSCC Ma 	SPM_CPU_DVS_DIS | SPM_OPT | SPM_INFRA_PDN_DIS;
567d116dccSCC Ma 
577d116dccSCC Ma enum wake_reason_t spm_wake_reason = WR_NONE;
587d116dccSCC Ma 
597d116dccSCC Ma /**********************************************************
607d116dccSCC Ma  * PCM sequence for cpu suspend
617d116dccSCC Ma  **********************************************************/
627d116dccSCC Ma static const unsigned int suspend_binary_ca7[] = {
637d116dccSCC Ma 	0x81f58407, 0x81f68407, 0x803a0400, 0x803a8400, 0x1b80001f, 0x20000000,
64*cc04b843SJimmy Huang 	0x80300400, 0x80318400, 0x80328400, 0xa1d28407, 0x81f20407, 0x81009801,
65*cc04b843SJimmy Huang 	0xd8000244, 0x17c07c1f, 0x18c0001f, 0x10006234, 0xc0c032e0, 0x1200041f,
667d116dccSCC Ma 	0x80310400, 0x1b80001f, 0x2000000a, 0xa0110400, 0x18c0001f, 0x100062c8,
677d116dccSCC Ma 	0xe0e00010, 0xe0e00030, 0xe0e00070, 0xe0e000f0, 0x1b80001f, 0x2000001a,
687d116dccSCC Ma 	0xe0e00ff0, 0xe8208000, 0x10006354, 0xfffe7fff, 0xe8208000, 0x10006834,
69*cc04b843SJimmy Huang 	0x00000010, 0x81f00407, 0xa1dd0407, 0x81fd0407, 0xc2803800, 0x1290041f,
70*cc04b843SJimmy Huang 	0x8880000c, 0x2f7be75f, 0xd8200722, 0x17c07c1f, 0xd82006a9, 0x17c07c1f,
71*cc04b843SJimmy Huang 	0xe8208000, 0x10006814, 0x00000001, 0xc2803800, 0x1293841f, 0x1b00001f,
72*cc04b843SJimmy Huang 	0x7fffe7ff, 0xd0000760, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xf0000000,
73*cc04b843SJimmy Huang 	0x17c07c1f, 0x80880001, 0xd8000842, 0x17c07c1f, 0xd00028e0, 0x1200041f,
74*cc04b843SJimmy Huang 	0xe8208000, 0x10006834, 0x00000000, 0x1b00001f, 0x3fffe7ff, 0x1b80001f,
75*cc04b843SJimmy Huang 	0x20000004, 0xd8200a0c, 0x17c07c1f, 0xe8208000, 0x10006834, 0x00000010,
76*cc04b843SJimmy Huang 	0xd0001280, 0x17c07c1f, 0x18c0001f, 0x10006608, 0x1910001f, 0x10006608,
77*cc04b843SJimmy Huang 	0x813b0404, 0xe0c00004, 0x1880001f, 0x10006320, 0xc0c03760, 0xe080000f,
78*cc04b843SJimmy Huang 	0xd8200c03, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xd0001280, 0x17c07c1f,
79*cc04b843SJimmy Huang 	0xe080001f, 0xe8208000, 0x10006354, 0xffffffff, 0x18c0001f, 0x100062c8,
80*cc04b843SJimmy Huang 	0xe0e000f0, 0xe0e00030, 0xe0e00000, 0x81009801, 0xd80010c4, 0x17c07c1f,
81*cc04b843SJimmy Huang 	0x18c0001f, 0x10004094, 0x1910001f, 0x1020e374, 0xe0c00004, 0x18c0001f,
82*cc04b843SJimmy Huang 	0x10004098, 0x1910001f, 0x1020e378, 0xe0c00004, 0x18c0001f, 0x10011094,
83*cc04b843SJimmy Huang 	0x1910001f, 0x10213374, 0xe0c00004, 0x18c0001f, 0x10011098, 0x1910001f,
84*cc04b843SJimmy Huang 	0x10213378, 0xe0c00004, 0x1910001f, 0x10213378, 0x18c0001f, 0x10006234,
85*cc04b843SJimmy Huang 	0xc0c034a0, 0x17c07c1f, 0xc2803800, 0x1290841f, 0xa1d20407, 0x81f28407,
86*cc04b843SJimmy Huang 	0xa1d68407, 0xa0128400, 0xa0118400, 0xa0100400, 0xa01a8400, 0xa01a0400,
87*cc04b843SJimmy Huang 	0x19c0001f, 0x001c239f, 0x1b00001f, 0x3fffefff, 0xf0000000, 0x17c07c1f,
88*cc04b843SJimmy Huang 	0x808d8001, 0xd8201502, 0x17c07c1f, 0x803d8400, 0x1b80001f, 0x2000001a,
89*cc04b843SJimmy Huang 	0x80340400, 0x17c07c1f, 0x17c07c1f, 0x80310400, 0x81fa0407, 0x81f18407,
90*cc04b843SJimmy Huang 	0x81f08407, 0xa1dc0407, 0x1b80001f, 0x200000b6, 0xd0002220, 0x17c07c1f,
91*cc04b843SJimmy Huang 	0x1880001f, 0x20000208, 0x81011801, 0xd80016e4, 0x17c07c1f, 0xe8208000,
92*cc04b843SJimmy Huang 	0x1000f600, 0xd2000000, 0x1380081f, 0x18c0001f, 0x10006240, 0xe0e00016,
93*cc04b843SJimmy Huang 	0xe0e0001e, 0xe0e0000e, 0xe0e0000f, 0x80368400, 0x1380081f, 0x80370400,
94*cc04b843SJimmy Huang 	0x1380081f, 0x80360400, 0x803e0400, 0x1380081f, 0x80380400, 0x803b0400,
95*cc04b843SJimmy Huang 	0xa01d8400, 0x1b80001f, 0x20000034, 0x803d8400, 0x1b80001f, 0x20000152,
96*cc04b843SJimmy Huang 	0x803d0400, 0x1380081f, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
97*cc04b843SJimmy Huang 	0xa1000404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
98*cc04b843SJimmy Huang 	0xa1000404, 0xe0c00004, 0x1910001f, 0x100125c8, 0x80340400, 0x17c07c1f,
99*cc04b843SJimmy Huang 	0x17c07c1f, 0x80310400, 0xe8208000, 0x10000044, 0x00000100, 0x1b80001f,
100*cc04b843SJimmy Huang 	0x20000068, 0x1b80001f, 0x2000000a, 0x18c0001f, 0x10006240, 0xe0e0000d,
101*cc04b843SJimmy Huang 	0x81011801, 0xd8001f64, 0x17c07c1f, 0x18c0001f, 0x100040f4, 0x1910001f,
102*cc04b843SJimmy Huang 	0x100040f4, 0xa11c8404, 0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404,
103*cc04b843SJimmy Huang 	0xe0c00004, 0x18c0001f, 0x100110f4, 0x1910001f, 0x100110f4, 0xa11c8404,
104*cc04b843SJimmy Huang 	0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404, 0xe0c00004, 0x1b80001f,
105*cc04b843SJimmy Huang 	0x20000100, 0x81fa0407, 0x81f18407, 0x81f08407, 0xe8208000, 0x10006354,
106*cc04b843SJimmy Huang 	0xfffe7b47, 0x18c0001f, 0x65930003, 0xc0c031c0, 0x17c07c1f, 0xc2803800,
107*cc04b843SJimmy Huang 	0x1293041f, 0xa1d80407, 0xa1dc0407, 0x18c0001f, 0x10006608, 0x1910001f,
108*cc04b843SJimmy Huang 	0x10006608, 0xa11b0404, 0xe0c00004, 0xc2803800, 0x1291041f, 0x8880000c,
109*cc04b843SJimmy Huang 	0x2f7be75f, 0xd8202362, 0x17c07c1f, 0x1b00001f, 0x3fffe7ff, 0xd00023a0,
110*cc04b843SJimmy Huang 	0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xf0000000, 0x17c07c1f, 0x1890001f,
111*cc04b843SJimmy Huang 	0x10006608, 0x808b0801, 0xd8202642, 0x17c07c1f, 0x1880001f, 0x10006320,
112*cc04b843SJimmy Huang 	0xc0c03540, 0xe080000f, 0xd80027a3, 0x17c07c1f, 0xe080001f, 0xa1da0407,
113*cc04b843SJimmy Huang 	0x81fc0407, 0xa0110400, 0xa0140400, 0xa01d8400, 0xd0003100, 0x17c07c1f,
114*cc04b843SJimmy Huang 	0x1b80001f, 0x20000fdf, 0x1890001f, 0x10006608, 0x80c98801, 0x810a8801,
115*cc04b843SJimmy Huang 	0x10918c1f, 0xa0939002, 0x8080080d, 0xd82028e2, 0x12007c1f, 0x1b00001f,
116*cc04b843SJimmy Huang 	0x3fffe7ff, 0x1b80001f, 0x20000004, 0xd800318c, 0x17c07c1f, 0x1b00001f,
117*cc04b843SJimmy Huang 	0xbfffe7ff, 0xd0003180, 0x17c07c1f, 0x81f80407, 0x81fc0407, 0x18c0001f,
118*cc04b843SJimmy Huang 	0x65930006, 0xc0c031c0, 0x17c07c1f, 0x18c0001f, 0x65930007, 0xc0c031c0,
119*cc04b843SJimmy Huang 	0x17c07c1f, 0x1880001f, 0x10006320, 0xc0c03540, 0xe080000f, 0xd80027a3,
120*cc04b843SJimmy Huang 	0x17c07c1f, 0xe080001f, 0x18c0001f, 0x65930005, 0xc0c031c0, 0x17c07c1f,
121*cc04b843SJimmy Huang 	0xa1da0407, 0xe8208000, 0x10000048, 0x00000100, 0x1b80001f, 0x20000068,
122*cc04b843SJimmy Huang 	0xa0110400, 0xa0140400, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
123*cc04b843SJimmy Huang 	0x81200404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
124*cc04b843SJimmy Huang 	0x81200404, 0xe0c00004, 0x1910001f, 0x100125c8, 0xa01d0400, 0xa01b0400,
125*cc04b843SJimmy Huang 	0xa0180400, 0x803d8400, 0xa01e0400, 0xa0160400, 0xa0170400, 0xa0168400,
126*cc04b843SJimmy Huang 	0x1b80001f, 0x20000104, 0x81011801, 0xd80030c4, 0x17c07c1f, 0x18c0001f,
127*cc04b843SJimmy Huang 	0x10006240, 0xc0c034a0, 0x17c07c1f, 0xe8208000, 0x1000f600, 0xd2000001,
128*cc04b843SJimmy Huang 	0xd8000848, 0x17c07c1f, 0xc2803800, 0x1291841f, 0x1b00001f, 0x7ffff7ff,
129*cc04b843SJimmy Huang 	0xf0000000, 0x17c07c1f, 0x1900001f, 0x10006830, 0xe1000003, 0x18c0001f,
130*cc04b843SJimmy Huang 	0x10006834, 0xe0e00000, 0xe0e00001, 0xf0000000, 0x17c07c1f, 0xe0f07f16,
131*cc04b843SJimmy Huang 	0x1380201f, 0xe0f07f1e, 0x1380201f, 0xe0f07f0e, 0x1b80001f, 0x20000104,
132*cc04b843SJimmy Huang 	0xe0f07f0c, 0xe0f07f0d, 0xe0f07e0d, 0xe0f07c0d, 0xe0f0780d, 0xf0000000,
133*cc04b843SJimmy Huang 	0xe0f0700d, 0xe0f07f0d, 0xe0f07f0f, 0xe0f07f1e, 0xf0000000, 0xe0f07f12,
134*cc04b843SJimmy Huang 	0x11407c1f, 0x81f08407, 0x81f18407, 0x1b80001f, 0x20000001, 0xa1d08407,
135*cc04b843SJimmy Huang 	0xa1d18407, 0x1392841f, 0x812ab401, 0x80ebb401, 0xa0c00c04, 0xd8203743,
136*cc04b843SJimmy Huang 	0x17c07c1f, 0x80c01403, 0xd8203563, 0x01400405, 0xf0000000, 0xa1d00407,
137*cc04b843SJimmy Huang 	0x1b80001f, 0x20000208, 0x80ea3401, 0xf0000000, 0x18c0001f, 0x10006b6c,
138*cc04b843SJimmy Huang 	0x1910001f, 0x10006b6c, 0xa1002804, 0xf0000000, 0xe0c00004, 0x17c07c1f,
1397d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1407d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1417d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1427d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1437d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1447d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1457d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1467d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1477d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1487d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0xa1d48407, 0x1990001f,
1497d116dccSCC Ma 	0x10006b08, 0x1a50001f, 0x10006610, 0x8246a401, 0xe8208000, 0x10006b6c,
1507d116dccSCC Ma 	0x00000000, 0x1b00001f, 0x2f7be75f, 0x81469801, 0xd8004305, 0x17c07c1f,
151*cc04b843SJimmy Huang 	0x1b80001f, 0xd00f0000, 0x8880000c, 0x2f7be75f, 0xd8005fa2, 0x17c07c1f,
1527d116dccSCC Ma 	0xd0004340, 0x17c07c1f, 0x1b80001f, 0x500f0000, 0xe8208000, 0x10006354,
153*cc04b843SJimmy Huang 	0xfffe7b47, 0xc0c06c00, 0x81401801, 0xd80048e5, 0x17c07c1f, 0x81f60407,
154*cc04b843SJimmy Huang 	0x18c0001f, 0x10006200, 0xc0c06060, 0x12807c1f, 0xe8208000, 0x1000625c,
155*cc04b843SJimmy Huang 	0x00000001, 0x1b80001f, 0x20000080, 0xc0c06060, 0x1280041f, 0x18c0001f,
156*cc04b843SJimmy Huang 	0x10006204, 0xc0c06400, 0x1280041f, 0x18c0001f, 0x10006208, 0xc0c06060,
1577d116dccSCC Ma 	0x12807c1f, 0xe8208000, 0x10006244, 0x00000001, 0x1b80001f, 0x20000080,
158*cc04b843SJimmy Huang 	0xc0c06060, 0x1280041f, 0x18d0001f, 0x10200200, 0x18c0001f, 0x10006290,
159*cc04b843SJimmy Huang 	0xc0c06060, 0x1280041f, 0xe8208000, 0x10006404, 0x00003101, 0xc2803800,
1600ad1a9b3Syt.lee 	0x1292041f, 0x81469801, 0xd8204a45, 0x17c07c1f, 0x1b00001f, 0x2f7be75f,
161*cc04b843SJimmy Huang 	0x1b80001f, 0x30000004, 0x8880000c, 0x2f7be75f, 0xd8005a02, 0x17c07c1f,
162*cc04b843SJimmy Huang 	0xc0c06780, 0x17c07c1f, 0x18c0001f, 0x10006294, 0xe0f07fff, 0xe0e00fff,
1630ad1a9b3Syt.lee 	0xe0e000ff, 0x81449801, 0xd8004c85, 0x17c07c1f, 0x1a00001f, 0x10006604,
164*cc04b843SJimmy Huang 	0xe2200003, 0xc0c06840, 0x17c07c1f, 0xe2200005, 0xc0c06840, 0x17c07c1f,
1650ad1a9b3Syt.lee 	0xa1d38407, 0xa1d98407, 0x1800001f, 0x00000012, 0x1800001f, 0x00000e12,
1660ad1a9b3Syt.lee 	0x1800001f, 0x03800e12, 0x1800001f, 0x038e0e12, 0xe8208000, 0x10006310,
167*cc04b843SJimmy Huang 	0x0b1600f8, 0x1940001f, 0x00000000, 0x12407c1f, 0x1b00001f, 0xbfffe7ff,
168*cc04b843SJimmy Huang 	0x1b80001f, 0x90100000, 0x17c07c1f, 0xd8004fc5, 0x17c07c1f, 0x8247b001,
169*cc04b843SJimmy Huang 	0x1940001f, 0xffffffff, 0x80c00400, 0xd82050c3, 0xa1d58407, 0xa1dd8407,
170*cc04b843SJimmy Huang 	0x1b00001f, 0x3fffefff, 0xd0004ec0, 0x17c07c1f, 0x1890001f, 0x100063e8,
171*cc04b843SJimmy Huang 	0x88c0000c, 0x2f7be75f, 0xd80052e3, 0x17c07c1f, 0x80c40001, 0xd8005263,
172*cc04b843SJimmy Huang 	0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xd00052a0, 0x17c07c1f, 0x1b00001f,
173*cc04b843SJimmy Huang 	0x7ffff7ff, 0xd0004ec0, 0x17c07c1f, 0x80c40001, 0xd82053e3, 0x17c07c1f,
174*cc04b843SJimmy Huang 	0xa1de0407, 0x1b00001f, 0x7fffe7ff, 0xd0004ec0, 0x17c07c1f, 0xe8208000,
175*cc04b843SJimmy Huang 	0x10006814, 0x00000000, 0x18c0001f, 0x10006b00, 0xe0e00000, 0xe0c00009,
176*cc04b843SJimmy Huang 	0x18c0001f, 0x10006294, 0xe0e001fe, 0xe0e003fc, 0xe0e007f8, 0xe0e00ff0,
177*cc04b843SJimmy Huang 	0x1b80001f, 0x20000020, 0xe0f07ff0, 0xe0f07f00, 0x81449801, 0xd80057a5,
178*cc04b843SJimmy Huang 	0x17c07c1f, 0x1a00001f, 0x10006604, 0xe2200002, 0xc0c06840, 0x17c07c1f,
179*cc04b843SJimmy Huang 	0xe2200004, 0xc0c06840, 0x17c07c1f, 0x1b80001f, 0x200016a8, 0x1800001f,
180*cc04b843SJimmy Huang 	0x03800e12, 0x1b80001f, 0x20000300, 0x1800001f, 0x00000e12, 0x1b80001f,
181*cc04b843SJimmy Huang 	0x20000300, 0x1800001f, 0x00000012, 0x1b80001f, 0x20000104, 0x10007c1f,
182*cc04b843SJimmy Huang 	0x81f38407, 0x81f98407, 0x81f90407, 0x81f40407, 0x1b80001f, 0x200016a8,
183*cc04b843SJimmy Huang 	0x81401801, 0xd8005fa5, 0x17c07c1f, 0xe8208000, 0x10006404, 0x00002101,
184*cc04b843SJimmy Huang 	0x18c0001f, 0x10006290, 0x1212841f, 0xc0c061e0, 0x12807c1f, 0xc0c061e0,
185*cc04b843SJimmy Huang 	0x1280041f, 0x18c0001f, 0x10006208, 0x1212841f, 0xc0c061e0, 0x12807c1f,
186*cc04b843SJimmy Huang 	0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xc0c061e0,
187*cc04b843SJimmy Huang 	0x1280041f, 0xe8208000, 0x10200268, 0x000ffffe, 0x18c0001f, 0x10006204,
188*cc04b843SJimmy Huang 	0x1212841f, 0xc0c065a0, 0x1280041f, 0x18c0001f, 0x10006200, 0x1212841f,
189*cc04b843SJimmy Huang 	0xc0c061e0, 0x12807c1f, 0xe8208000, 0x1000625c, 0x00000000, 0x1b80001f,
190*cc04b843SJimmy Huang 	0x20000080, 0xc0c061e0, 0x1280041f, 0x19c0001f, 0x01411820, 0x1ac0001f,
191*cc04b843SJimmy Huang 	0x55aa55aa, 0x10007c1f, 0xf0000000, 0xd800610a, 0x17c07c1f, 0xe2e0004f,
192*cc04b843SJimmy Huang 	0xe2e0006f, 0xe2e0002f, 0xd82061aa, 0x17c07c1f, 0xe2e0002e, 0xe2e0003e,
193*cc04b843SJimmy Huang 	0xe2e00032, 0xf0000000, 0x17c07c1f, 0xd80062aa, 0x17c07c1f, 0xe2e00036,
194*cc04b843SJimmy Huang 	0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xd82063ca, 0x17c07c1f, 0x1380201f,
195*cc04b843SJimmy Huang 	0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d,
196*cc04b843SJimmy Huang 	0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401, 0xd8206569,
197*cc04b843SJimmy Huang 	0x17c07c1f, 0xe2e0000d, 0xe2e0000c, 0xe2e0001c, 0xe2e0001e, 0xe2e00016,
198*cc04b843SJimmy Huang 	0xe2e00012, 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401,
199*cc04b843SJimmy Huang 	0xd8206749, 0x17c07c1f, 0xe2e00016, 0x1380201f, 0xe2e0001e, 0x1380201f,
200*cc04b843SJimmy Huang 	0xe2e0001c, 0x1380201f, 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f,
201*cc04b843SJimmy Huang 	0xa1d40407, 0x1391841f, 0xa1d90407, 0x1393041f, 0xf0000000, 0x17c07c1f,
202*cc04b843SJimmy Huang 	0x18d0001f, 0x10006604, 0x10cf8c1f, 0xd8206843, 0x17c07c1f, 0xf0000000,
203*cc04b843SJimmy Huang 	0x17c07c1f, 0xe8208000, 0x11008014, 0x00000002, 0xe8208000, 0x11008020,
204*cc04b843SJimmy Huang 	0x00000101, 0xe8208000, 0x11008004, 0x000000d0, 0x1a00001f, 0x11008000,
205*cc04b843SJimmy Huang 	0xd8006b0a, 0xe220005d, 0xd8206b2a, 0xe2200000, 0xe2200001, 0xe8208000,
206*cc04b843SJimmy Huang 	0x11008024, 0x00000001, 0x1b80001f, 0x20000424, 0xf0000000, 0x17c07c1f,
207*cc04b843SJimmy Huang 	0xa1d10407, 0x1b80001f, 0x20000020, 0xf0000000, 0x17c07c1f
2087d116dccSCC Ma };
2097d116dccSCC Ma 
2107d116dccSCC Ma /*
2117d116dccSCC Ma  * PCM binary for suspend scenario
2127d116dccSCC Ma  */
2137d116dccSCC Ma static const struct pcm_desc suspend_pcm_ca7 = {
214*cc04b843SJimmy Huang 	.version = "pcm_suspend_20150917_V4",
2157d116dccSCC Ma 	.base = suspend_binary_ca7,
216*cc04b843SJimmy Huang 	.size = 869,
2177d116dccSCC Ma 	.sess = 2,
2187d116dccSCC Ma 	.replace = 0,
2197d116dccSCC Ma 	.vec0 = EVENT_VEC(11, 1, 0, 0),
220*cc04b843SJimmy Huang 	.vec1 = EVENT_VEC(12, 1, 0, 61),
221*cc04b843SJimmy Huang 	.vec2 = EVENT_VEC(30, 1, 0, 150),
222*cc04b843SJimmy Huang 	.vec3 = EVENT_VEC(31, 1, 0, 287),
2237d116dccSCC Ma };
2247d116dccSCC Ma 
2257d116dccSCC Ma /*
2267d116dccSCC Ma  * SPM settings for suspend scenario
2277d116dccSCC Ma  */
2287d116dccSCC Ma static struct pwr_ctrl spm_ctrl = {
2297d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_SUSPEND,
2307d116dccSCC Ma 	.wake_src_md32 = WAKE_SRC_FOR_MD32,
2317d116dccSCC Ma 	.r0_ctrl_en = 1,
2327d116dccSCC Ma 	.r7_ctrl_en = 1,
2337d116dccSCC Ma 	.infra_dcm_lock = 1,
2347d116dccSCC Ma 	.wfi_op = WFI_OP_AND,
2357d116dccSCC Ma 	.pcm_apsrc_req = 0,
2367d116dccSCC Ma 	.ca7top_idle_mask = 0,
2377d116dccSCC Ma 	.ca15top_idle_mask = 0,
2387d116dccSCC Ma 	.mcusys_idle_mask = 0,
2397d116dccSCC Ma 	.disp_req_mask = 0,
2407d116dccSCC Ma 	.mfg_req_mask = 0,
2417d116dccSCC Ma 	.md32_req_mask = 1,
2427d116dccSCC Ma 	.srclkenai_mask = 1,
2437d116dccSCC Ma 	.ca7_wfi0_en = 1,
2447d116dccSCC Ma 	.ca7_wfi1_en = 1,
2457d116dccSCC Ma 	.ca7_wfi2_en = 1,
2467d116dccSCC Ma 	.ca7_wfi3_en = 1,
2477d116dccSCC Ma 	.ca15_wfi0_en = 1,
2487d116dccSCC Ma 	.ca15_wfi1_en = 1,
2497d116dccSCC Ma 	.ca15_wfi2_en = 1,
2507d116dccSCC Ma 	.ca15_wfi3_en = 1,
2517d116dccSCC Ma };
2527d116dccSCC Ma 
2537d116dccSCC Ma /*
2547d116dccSCC Ma  * go_to_sleep_before_wfi() - trigger SPM to enter suspend scenario
2557d116dccSCC Ma  */
2567d116dccSCC Ma static void go_to_sleep_before_wfi(const unsigned int spm_flags)
2577d116dccSCC Ma {
2587d116dccSCC Ma 	struct pwr_ctrl *pwrctrl;
2597d116dccSCC Ma 
2607d116dccSCC Ma 	pwrctrl = &spm_ctrl;
2617d116dccSCC Ma 
2627d116dccSCC Ma 	set_pwrctrl_pcm_flags(pwrctrl, spm_flags);
2637d116dccSCC Ma 
2647d116dccSCC Ma 	spm_set_sysclk_settle();
2657d116dccSCC Ma 
2667d116dccSCC Ma 	INFO("sec = %u, wakesrc = 0x%x (%u)(%u)\n",
2677d116dccSCC Ma 	     pwrctrl->timer_val, pwrctrl->wake_src,
2687d116dccSCC Ma 	     is_cpu_pdn(pwrctrl->pcm_flags),
2697d116dccSCC Ma 	     is_infra_pdn(pwrctrl->pcm_flags));
2707d116dccSCC Ma 
2717d116dccSCC Ma 	spm_reset_and_init_pcm();
2727d116dccSCC Ma 	spm_init_pcm_register();
2737d116dccSCC Ma 	spm_set_power_control(pwrctrl);
2747d116dccSCC Ma 	spm_set_wakeup_event(pwrctrl);
2757d116dccSCC Ma 	spm_kick_pcm_to_run(pwrctrl);
2767d116dccSCC Ma 	spm_init_event_vector(&suspend_pcm_ca7);
2777d116dccSCC Ma 	spm_kick_im_to_fetch(&suspend_pcm_ca7);
2787d116dccSCC Ma }
2797d116dccSCC Ma 
2807d116dccSCC Ma /*
2817d116dccSCC Ma  * go_to_sleep_after_wfi() - get wakeup reason after
2827d116dccSCC Ma  * leaving suspend scenario and clean up SPM settings
2837d116dccSCC Ma  */
2847d116dccSCC Ma static enum wake_reason_t go_to_sleep_after_wfi(void)
2857d116dccSCC Ma {
2867d116dccSCC Ma 	struct wake_status wakesta;
2877d116dccSCC Ma 	static enum wake_reason_t last_wr = WR_NONE;
2887d116dccSCC Ma 
2897d116dccSCC Ma 	spm_get_wakeup_status(&wakesta);
2907d116dccSCC Ma 	spm_clean_after_wakeup();
2917d116dccSCC Ma 	last_wr = spm_output_wake_reason(&wakesta);
2927d116dccSCC Ma 
2937d116dccSCC Ma 	return last_wr;
2947d116dccSCC Ma }
2957d116dccSCC Ma 
2967d116dccSCC Ma void spm_system_suspend(void)
2977d116dccSCC Ma {
2987d116dccSCC Ma 	spm_lock_get();
2997d116dccSCC Ma 	go_to_sleep_before_wfi(spm_flags);
3007d116dccSCC Ma 	set_suspend_ready();
3017d116dccSCC Ma 	spm_lock_release();
3027d116dccSCC Ma }
3037d116dccSCC Ma 
3047d116dccSCC Ma void spm_system_suspend_finish(void)
3057d116dccSCC Ma {
3067d116dccSCC Ma 	spm_lock_get();
3077d116dccSCC Ma 	spm_wake_reason = go_to_sleep_after_wfi();
3087d116dccSCC Ma 	INFO("spm_wake_reason=%d\n", spm_wake_reason);
3097d116dccSCC Ma 	clear_all_ready();
3107d116dccSCC Ma 	spm_lock_release();
3117d116dccSCC Ma }
312