xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_suspend.c (revision 64faa0e5bbca7395c9ad4be1258c3b127890e814)
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 |	\
46*64faa0e5Skenny 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,
647d116dccSCC Ma 	0x80300400, 0x80318400, 0x80328400, 0xa1d28407, 0x81f20407, 0x81409801,
657d116dccSCC Ma 	0xd8000245, 0x17c07c1f, 0x18c0001f, 0x10006234, 0xc0c031a0, 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,
697d116dccSCC Ma 	0x00000010, 0x81f00407, 0xa1dd0407, 0x81fd0407, 0xc2803780, 0x1290041f,
707d116dccSCC Ma 	0x8880000c, 0x2f7be75f, 0xd8200642, 0x17c07c1f, 0x1b00001f, 0x7fffe7ff,
717d116dccSCC Ma 	0xd0000680, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xf0000000, 0x17c07c1f,
727d116dccSCC Ma 	0x80880001, 0xd8000762, 0x17c07c1f, 0xd00027a0, 0x1200041f, 0xe8208000,
737d116dccSCC Ma 	0x10006834, 0x00000000, 0x1b00001f, 0x3fffe7ff, 0x1b80001f, 0x20000004,
747d116dccSCC Ma 	0xd820092c, 0x17c07c1f, 0xe8208000, 0x10006834, 0x00000010, 0xd00011a0,
757d116dccSCC Ma 	0x17c07c1f, 0x18c0001f, 0x10006608, 0x1910001f, 0x10006608, 0x813b0404,
767d116dccSCC Ma 	0xe0c00004, 0x1880001f, 0x10006320, 0xc0c03680, 0xe080000f, 0xd8200b23,
777d116dccSCC Ma 	0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xd00011a0, 0x17c07c1f, 0xe080001f,
787d116dccSCC Ma 	0xe8208000, 0x10006354, 0xffffffff, 0x18c0001f, 0x100062c8, 0xe0e000f0,
797d116dccSCC Ma 	0xe0e00030, 0xe0e00000, 0x81409801, 0xd8000fe5, 0x17c07c1f, 0x18c0001f,
807d116dccSCC Ma 	0x10004094, 0x1910001f, 0x1020e374, 0xe0c00004, 0x18c0001f, 0x10004098,
817d116dccSCC Ma 	0x1910001f, 0x1020e378, 0xe0c00004, 0x18c0001f, 0x10011094, 0x1910001f,
827d116dccSCC Ma 	0x10213374, 0xe0c00004, 0x18c0001f, 0x10011098, 0x1910001f, 0x10213378,
837d116dccSCC Ma 	0xe0c00004, 0x1910001f, 0x10213378, 0x18c0001f, 0x10006234, 0xc0c03360,
847d116dccSCC Ma 	0x17c07c1f, 0xc2803780, 0x1290841f, 0xa1d20407, 0x81f28407, 0xa1d68407,
857d116dccSCC Ma 	0xa0128400, 0xa0118400, 0xa0100400, 0xa01a8400, 0xa01a0400, 0x19c0001f,
867d116dccSCC Ma 	0x001c239f, 0x1b00001f, 0x3fffefff, 0xf0000000, 0x17c07c1f, 0x808d8001,
877d116dccSCC Ma 	0xd8201422, 0x17c07c1f, 0x803d8400, 0x1b80001f, 0x2000001a, 0x80340400,
887d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x80310400, 0x81fa0407, 0x81f18407, 0x81f08407,
897d116dccSCC Ma 	0xa1dc0407, 0x1b80001f, 0x200000b6, 0xd00020e0, 0x17c07c1f, 0x1880001f,
907d116dccSCC Ma 	0x20000208, 0x81411801, 0xd8001605, 0x17c07c1f, 0xe8208000, 0x1000f600,
917d116dccSCC Ma 	0xd2000000, 0x1380081f, 0x18c0001f, 0x10006240, 0xe0e00016, 0xe0e0001e,
927d116dccSCC Ma 	0xe0e0000e, 0xe0e0000f, 0x80368400, 0x1380081f, 0x80370400, 0x1380081f,
937d116dccSCC Ma 	0x80360400, 0x803e0400, 0x1380081f, 0x80380400, 0x803b0400, 0xa01d8400,
947d116dccSCC Ma 	0x1b80001f, 0x20000034, 0x803d8400, 0x1b80001f, 0x20000152, 0x803d0400,
957d116dccSCC Ma 	0x1380081f, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8, 0xa1000404,
967d116dccSCC Ma 	0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8, 0xa1000404,
977d116dccSCC Ma 	0xe0c00004, 0x1910001f, 0x100125c8, 0x80340400, 0x17c07c1f, 0x17c07c1f,
987d116dccSCC Ma 	0x80310400, 0xe8208000, 0x10000044, 0x00000100, 0x1b80001f, 0x20000068,
997d116dccSCC Ma 	0x1b80001f, 0x2000000a, 0x18c0001f, 0x10006240, 0xe0e0000d, 0xd8001e65,
1007d116dccSCC Ma 	0x17c07c1f, 0x18c0001f, 0x100040f4, 0x1910001f, 0x100040f4, 0xa11c8404,
1017d116dccSCC Ma 	0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404, 0xe0c00004, 0x18c0001f,
1027d116dccSCC Ma 	0x100110f4, 0x1910001f, 0x100110f4, 0xa11c8404, 0xe0c00004, 0x1b80001f,
1037d116dccSCC Ma 	0x2000000a, 0x813c8404, 0xe0c00004, 0x1b80001f, 0x20000100, 0x81fa0407,
1047d116dccSCC Ma 	0x81f18407, 0x81f08407, 0xe8208000, 0x10006354, 0xfffe7b47, 0x18c0001f,
1057d116dccSCC Ma 	0x65930003, 0xc0c03080, 0x17c07c1f, 0xa1d80407, 0xa1dc0407, 0x18c0001f,
1067d116dccSCC Ma 	0x10006608, 0x1910001f, 0x10006608, 0xa11b0404, 0xe0c00004, 0xc2803780,
1077d116dccSCC Ma 	0x1291041f, 0x8880000c, 0x2f7be75f, 0xd8202222, 0x17c07c1f, 0x1b00001f,
1087d116dccSCC Ma 	0x3fffe7ff, 0xd0002260, 0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xf0000000,
1097d116dccSCC Ma 	0x17c07c1f, 0x1890001f, 0x10006608, 0x808b0801, 0xd8202502, 0x17c07c1f,
1107d116dccSCC Ma 	0x1880001f, 0x10006320, 0xc0c03400, 0xe080000f, 0xd8002663, 0x17c07c1f,
1117d116dccSCC Ma 	0xe080001f, 0xa1da0407, 0x81fc0407, 0xa0110400, 0xa0140400, 0xa01d8400,
1127d116dccSCC Ma 	0xd0002fc0, 0x17c07c1f, 0x1b80001f, 0x20000fdf, 0x1890001f, 0x10006608,
1137d116dccSCC Ma 	0x80c98801, 0x810a8801, 0x10918c1f, 0xa0939002, 0x8080080d, 0xd82027a2,
1147d116dccSCC Ma 	0x12007c1f, 0x1b00001f, 0x3fffe7ff, 0x1b80001f, 0x20000004, 0xd800304c,
1157d116dccSCC Ma 	0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xd0003040, 0x17c07c1f, 0x81f80407,
1167d116dccSCC Ma 	0x81fc0407, 0x18c0001f, 0x65930006, 0xc0c03080, 0x17c07c1f, 0x18c0001f,
1177d116dccSCC Ma 	0x65930007, 0xc0c03080, 0x17c07c1f, 0x1880001f, 0x10006320, 0xc0c03400,
1187d116dccSCC Ma 	0xe080000f, 0xd8002663, 0x17c07c1f, 0xe080001f, 0x18c0001f, 0x65930005,
1197d116dccSCC Ma 	0xc0c03080, 0x17c07c1f, 0xa1da0407, 0xe8208000, 0x10000048, 0x00000100,
1207d116dccSCC Ma 	0x1b80001f, 0x20000068, 0xa0110400, 0xa0140400, 0x18c0001f, 0x1000f5c8,
1217d116dccSCC Ma 	0x1910001f, 0x1000f5c8, 0x81200404, 0xe0c00004, 0x18c0001f, 0x100125c8,
1227d116dccSCC Ma 	0x1910001f, 0x100125c8, 0x81200404, 0xe0c00004, 0x1910001f, 0x100125c8,
1237d116dccSCC Ma 	0xa01d0400, 0xa01b0400, 0xa0180400, 0x803d8400, 0xa01e0400, 0xa0160400,
1247d116dccSCC Ma 	0xa0170400, 0xa0168400, 0x1b80001f, 0x20000104, 0x81411801, 0xd8002f85,
1257d116dccSCC Ma 	0x17c07c1f, 0x18c0001f, 0x10006240, 0xc0c03360, 0x17c07c1f, 0xe8208000,
1267d116dccSCC Ma 	0x1000f600, 0xd2000001, 0xd8000768, 0x17c07c1f, 0xc2803780, 0x1291841f,
1277d116dccSCC Ma 	0x1b00001f, 0x7ffff7ff, 0xf0000000, 0x17c07c1f, 0x1900001f, 0x10006830,
1287d116dccSCC Ma 	0xe1000003, 0x18c0001f, 0x10006834, 0xe0e00000, 0xe0e00001, 0xf0000000,
1297d116dccSCC Ma 	0x17c07c1f, 0xe0f07f16, 0x1380201f, 0xe0f07f1e, 0x1380201f, 0xe0f07f0e,
1307d116dccSCC Ma 	0x1b80001f, 0x20000104, 0xe0f07f0c, 0xe0f07f0d, 0xe0f07e0d, 0xe0f07c0d,
1317d116dccSCC Ma 	0xe0f0780d, 0xf0000000, 0xe0f0700d, 0xe0f07f0d, 0xe0f07f0f, 0xe0f07f1e,
1327d116dccSCC Ma 	0xf0000000, 0xe0f07f12, 0x11407c1f, 0x81f08407, 0x81f18407, 0x1b80001f,
1337d116dccSCC Ma 	0x20000001, 0xa1d08407, 0xa1d18407, 0x1392841f, 0x812ab401, 0x80ebb401,
1347d116dccSCC Ma 	0xa0c00c04, 0xd8203603, 0x17c07c1f, 0x80c01403, 0xd8203423, 0x01400405,
1357d116dccSCC Ma 	0x1900001f, 0x10006814, 0xf0000000, 0xe1000003, 0xa1d00407, 0x1b80001f,
1367d116dccSCC Ma 	0x20000208, 0x80ea3401, 0x1a00001f, 0x10006814, 0xf0000000, 0xe2000003,
1377d116dccSCC Ma 	0x18c0001f, 0x10006b6c, 0x1910001f, 0x10006b6c, 0xa1002804, 0xf0000000,
1387d116dccSCC Ma 	0xe0c00004, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 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,
1517d116dccSCC Ma 	0x1b80001f, 0xd00f0000, 0x8880000c, 0x2f7be75f, 0xd8005d62, 0x17c07c1f,
1527d116dccSCC Ma 	0xd0004340, 0x17c07c1f, 0x1b80001f, 0x500f0000, 0xe8208000, 0x10006354,
1537d116dccSCC Ma 	0xfffe7b47, 0xc0c06900, 0x81401801, 0xd80048a5, 0x17c07c1f, 0x81f60407,
1547d116dccSCC Ma 	0x18c0001f, 0x10006200, 0xc0c05e20, 0x12807c1f, 0xe8208000, 0x1000625c,
1557d116dccSCC Ma 	0x00000001, 0x1b80001f, 0x20000080, 0xc0c05e20, 0x1280041f, 0x18c0001f,
1567d116dccSCC Ma 	0x10006204, 0xc0c061c0, 0x1280041f, 0x18c0001f, 0x10006208, 0xc0c05e20,
1577d116dccSCC Ma 	0x12807c1f, 0xe8208000, 0x10006244, 0x00000001, 0x1b80001f, 0x20000080,
1587d116dccSCC Ma 	0xc0c05e20, 0x1280041f, 0x18c0001f, 0x10006290, 0xc0c05e20, 0x1280041f,
1597d116dccSCC Ma 	0xe8208000, 0x10006404, 0x00003101, 0xc2803780, 0x1292041f, 0x81469801,
1607d116dccSCC Ma 	0xd8204a05, 0x17c07c1f, 0x1b00001f, 0x2f7be75f, 0x1b80001f, 0x30000004,
1617d116dccSCC Ma 	0x8880000c, 0x2f7be75f, 0xd80057c2, 0x17c07c1f, 0xc0c06480, 0x17c07c1f,
1627d116dccSCC Ma 	0x18c0001f, 0x10006294, 0xe0f07fff, 0xe0e00fff, 0xe0e000ff, 0x81449801,
1637d116dccSCC Ma 	0xd8004c45, 0x17c07c1f, 0x1a00001f, 0x10006604, 0xe2200003, 0xc0c06540,
1647d116dccSCC Ma 	0x17c07c1f, 0xe2200005, 0xc0c06540, 0x17c07c1f, 0xa1d38407, 0xa1d98407,
1657d116dccSCC Ma 	0x1800001f, 0x00000012, 0x1800001f, 0x00000e12, 0x1800001f, 0x03800e12,
1667d116dccSCC Ma 	0x1800001f, 0x038e0e12, 0xe8208000, 0x10006310, 0x0b1600f8, 0x1b00001f,
1677d116dccSCC Ma 	0xbfffe7ff, 0x1b80001f, 0x90100000, 0x80c00400, 0xd8204f63, 0xa1d58407,
1687d116dccSCC Ma 	0xa1dd8407, 0x1b00001f, 0x3fffefff, 0xd0004e20, 0x17c07c1f, 0x1890001f,
1697d116dccSCC Ma 	0x100063e8, 0x88c0000c, 0x2f7be75f, 0xd8005183, 0x17c07c1f, 0x80c40001,
1707d116dccSCC Ma 	0xd8005103, 0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xd0005140, 0x17c07c1f,
1717d116dccSCC Ma 	0x1b00001f, 0x7ffff7ff, 0xd0004e20, 0x17c07c1f, 0x80c40001, 0xd8205283,
1727d116dccSCC Ma 	0x17c07c1f, 0xa1de0407, 0x1b00001f, 0x7fffe7ff, 0xd0004e20, 0x17c07c1f,
1737d116dccSCC Ma 	0x18c0001f, 0x10006294, 0xe0e001fe, 0xe0e003fc, 0xe0e007f8, 0xe0e00ff0,
1747d116dccSCC Ma 	0x1b80001f, 0x20000020, 0xe0f07ff0, 0xe0f07f00, 0x81449801, 0xd8005565,
1757d116dccSCC Ma 	0x17c07c1f, 0x1a00001f, 0x10006604, 0xe2200002, 0xc0c06540, 0x17c07c1f,
1767d116dccSCC Ma 	0xe2200004, 0xc0c06540, 0x17c07c1f, 0x1b80001f, 0x200016a8, 0x1800001f,
1777d116dccSCC Ma 	0x03800e12, 0x1b80001f, 0x20000300, 0x1800001f, 0x00000e12, 0x1b80001f,
1787d116dccSCC Ma 	0x20000300, 0x1800001f, 0x00000012, 0x1b80001f, 0x20000104, 0x10007c1f,
1797d116dccSCC Ma 	0x81f38407, 0x81f98407, 0x81f90407, 0x81f40407, 0x1b80001f, 0x200016a8,
1807d116dccSCC Ma 	0x81401801, 0xd8005d65, 0x17c07c1f, 0xe8208000, 0x10006404, 0x00002101,
1817d116dccSCC Ma 	0x18c0001f, 0x10006290, 0x1212841f, 0xc0c05fa0, 0x12807c1f, 0xc0c05fa0,
1827d116dccSCC Ma 	0x1280041f, 0x18c0001f, 0x10006208, 0x1212841f, 0xc0c05fa0, 0x12807c1f,
1837d116dccSCC Ma 	0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xc0c05fa0,
1847d116dccSCC Ma 	0x1280041f, 0xe8208000, 0x10200268, 0x000ffffe, 0x18c0001f, 0x10006204,
1857d116dccSCC Ma 	0x1212841f, 0xc0c06300, 0x1280041f, 0x18c0001f, 0x10006200, 0x1212841f,
1867d116dccSCC Ma 	0xc0c05fa0, 0x12807c1f, 0xe8208000, 0x1000625c, 0x00000000, 0x1b80001f,
1877d116dccSCC Ma 	0x20000080, 0xc0c05fa0, 0x1280041f, 0x19c0001f, 0x01411820, 0x1ac0001f,
1887d116dccSCC Ma 	0x55aa55aa, 0x10007c1f, 0xf0000000, 0xd8005eca, 0x17c07c1f, 0xe2e0004f,
1897d116dccSCC Ma 	0xe2e0006f, 0xe2e0002f, 0xd8205f6a, 0x17c07c1f, 0xe2e0002e, 0xe2e0003e,
1907d116dccSCC Ma 	0xe2e00032, 0xf0000000, 0x17c07c1f, 0xd800606a, 0x17c07c1f, 0xe2e00036,
1917d116dccSCC Ma 	0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xd820618a, 0x17c07c1f, 0x1380201f,
1927d116dccSCC Ma 	0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d,
1937d116dccSCC Ma 	0xf0000000, 0x17c07c1f, 0xd82062c9, 0x17c07c1f, 0xe2e0000d, 0xe2e0000c,
1947d116dccSCC Ma 	0xe2e0001c, 0xe2e0001e, 0xe2e00016, 0xe2e00012, 0xf0000000, 0x17c07c1f,
1957d116dccSCC Ma 	0xd8206449, 0x17c07c1f, 0xe2e00016, 0x1380201f, 0xe2e0001e, 0x1380201f,
1967d116dccSCC Ma 	0xe2e0001c, 0x1380201f, 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f,
1977d116dccSCC Ma 	0xa1d40407, 0x1391841f, 0xa1d90407, 0x1393041f, 0xf0000000, 0x17c07c1f,
1987d116dccSCC Ma 	0x18d0001f, 0x10006604, 0x10cf8c1f, 0xd8206543, 0x17c07c1f, 0xf0000000,
1997d116dccSCC Ma 	0x17c07c1f, 0xe8208000, 0x11008014, 0x00000002, 0xe8208000, 0x11008020,
2007d116dccSCC Ma 	0x00000101, 0xe8208000, 0x11008004, 0x000000d0, 0x1a00001f, 0x11008000,
2017d116dccSCC Ma 	0xd800680a, 0xe220005d, 0xd820682a, 0xe2200000, 0xe2200001, 0xe8208000,
2027d116dccSCC Ma 	0x11008024, 0x00000001, 0x1b80001f, 0x20000424, 0xf0000000, 0x17c07c1f,
2037d116dccSCC Ma 	0xa1d10407, 0x1b80001f, 0x20000020, 0xf0000000, 0x17c07c1f
2047d116dccSCC Ma };
2057d116dccSCC Ma 
2067d116dccSCC Ma /*
2077d116dccSCC Ma  * PCM binary for suspend scenario
2087d116dccSCC Ma  */
2097d116dccSCC Ma static const struct pcm_desc suspend_pcm_ca7 = {
2107d116dccSCC Ma 	.version = "pcm_suspend_v32.18_20140721_mt8173_v00.03_MD32_EMPTY_CA7",
2117d116dccSCC Ma 	.base = suspend_binary_ca7,
2127d116dccSCC Ma 	.size = 845,
2137d116dccSCC Ma 	.sess = 2,
2147d116dccSCC Ma 	.replace = 0,
2157d116dccSCC Ma 	.vec0 = EVENT_VEC(11, 1, 0, 0),
2167d116dccSCC Ma 	.vec1 = EVENT_VEC(12, 1, 0, 54),
2177d116dccSCC Ma 	.vec2 = EVENT_VEC(30, 1, 0, 143),
2187d116dccSCC Ma 	.vec3 = EVENT_VEC(31, 1, 0, 277),
2197d116dccSCC Ma };
2207d116dccSCC Ma 
2217d116dccSCC Ma /*
2227d116dccSCC Ma  * SPM settings for suspend scenario
2237d116dccSCC Ma  */
2247d116dccSCC Ma static struct pwr_ctrl spm_ctrl = {
2257d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_SUSPEND,
2267d116dccSCC Ma 	.wake_src_md32 = WAKE_SRC_FOR_MD32,
2277d116dccSCC Ma 	.r0_ctrl_en = 1,
2287d116dccSCC Ma 	.r7_ctrl_en = 1,
2297d116dccSCC Ma 	.infra_dcm_lock = 1,
2307d116dccSCC Ma 	.wfi_op = WFI_OP_AND,
2317d116dccSCC Ma 	.pcm_apsrc_req = 0,
2327d116dccSCC Ma 	.ca7top_idle_mask = 0,
2337d116dccSCC Ma 	.ca15top_idle_mask = 0,
2347d116dccSCC Ma 	.mcusys_idle_mask = 0,
2357d116dccSCC Ma 	.disp_req_mask = 0,
2367d116dccSCC Ma 	.mfg_req_mask = 0,
2377d116dccSCC Ma 	.md32_req_mask = 1,
2387d116dccSCC Ma 	.srclkenai_mask = 1,
2397d116dccSCC Ma 	.ca7_wfi0_en = 1,
2407d116dccSCC Ma 	.ca7_wfi1_en = 1,
2417d116dccSCC Ma 	.ca7_wfi2_en = 1,
2427d116dccSCC Ma 	.ca7_wfi3_en = 1,
2437d116dccSCC Ma 	.ca15_wfi0_en = 1,
2447d116dccSCC Ma 	.ca15_wfi1_en = 1,
2457d116dccSCC Ma 	.ca15_wfi2_en = 1,
2467d116dccSCC Ma 	.ca15_wfi3_en = 1,
2477d116dccSCC Ma };
2487d116dccSCC Ma 
2497d116dccSCC Ma /*
2507d116dccSCC Ma  * go_to_sleep_before_wfi() - trigger SPM to enter suspend scenario
2517d116dccSCC Ma  */
2527d116dccSCC Ma static void go_to_sleep_before_wfi(const unsigned int spm_flags)
2537d116dccSCC Ma {
2547d116dccSCC Ma 	struct pwr_ctrl *pwrctrl;
2557d116dccSCC Ma 
2567d116dccSCC Ma 	pwrctrl = &spm_ctrl;
2577d116dccSCC Ma 
2587d116dccSCC Ma 	set_pwrctrl_pcm_flags(pwrctrl, spm_flags);
2597d116dccSCC Ma 
2607d116dccSCC Ma 	spm_set_sysclk_settle();
2617d116dccSCC Ma 
2627d116dccSCC Ma 	INFO("sec = %u, wakesrc = 0x%x (%u)(%u)\n",
2637d116dccSCC Ma 	     pwrctrl->timer_val, pwrctrl->wake_src,
2647d116dccSCC Ma 	     is_cpu_pdn(pwrctrl->pcm_flags),
2657d116dccSCC Ma 	     is_infra_pdn(pwrctrl->pcm_flags));
2667d116dccSCC Ma 
2677d116dccSCC Ma 	spm_reset_and_init_pcm();
2687d116dccSCC Ma 	spm_init_pcm_register();
2697d116dccSCC Ma 	spm_set_power_control(pwrctrl);
2707d116dccSCC Ma 	spm_set_wakeup_event(pwrctrl);
2717d116dccSCC Ma 	spm_kick_pcm_to_run(pwrctrl);
2727d116dccSCC Ma 	spm_init_event_vector(&suspend_pcm_ca7);
2737d116dccSCC Ma 	spm_kick_im_to_fetch(&suspend_pcm_ca7);
2747d116dccSCC Ma }
2757d116dccSCC Ma 
2767d116dccSCC Ma /*
2777d116dccSCC Ma  * go_to_sleep_after_wfi() - get wakeup reason after
2787d116dccSCC Ma  * leaving suspend scenario and clean up SPM settings
2797d116dccSCC Ma  */
2807d116dccSCC Ma static enum wake_reason_t go_to_sleep_after_wfi(void)
2817d116dccSCC Ma {
2827d116dccSCC Ma 	struct wake_status wakesta;
2837d116dccSCC Ma 	static enum wake_reason_t last_wr = WR_NONE;
2847d116dccSCC Ma 
2857d116dccSCC Ma 	spm_get_wakeup_status(&wakesta);
2867d116dccSCC Ma 	spm_clean_after_wakeup();
2877d116dccSCC Ma 	last_wr = spm_output_wake_reason(&wakesta);
2887d116dccSCC Ma 
2897d116dccSCC Ma 	return last_wr;
2907d116dccSCC Ma }
2917d116dccSCC Ma 
2927d116dccSCC Ma void spm_system_suspend(void)
2937d116dccSCC Ma {
2947d116dccSCC Ma 	spm_lock_get();
2957d116dccSCC Ma 	go_to_sleep_before_wfi(spm_flags);
2967d116dccSCC Ma 	set_suspend_ready();
2977d116dccSCC Ma 	spm_lock_release();
2987d116dccSCC Ma }
2997d116dccSCC Ma 
3007d116dccSCC Ma void spm_system_suspend_finish(void)
3017d116dccSCC Ma {
3027d116dccSCC Ma 	spm_lock_get();
3037d116dccSCC Ma 	spm_wake_reason = go_to_sleep_after_wfi();
3047d116dccSCC Ma 	INFO("spm_wake_reason=%d\n", spm_wake_reason);
3057d116dccSCC Ma 	clear_all_ready();
3067d116dccSCC Ma 	spm_lock_release();
3077d116dccSCC Ma }
308