xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_suspend.c (revision b99d961c7db6558d36e08d1656662226a8481a85)
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>
32*b99d961cSJimmy Huang #include <delay_timer.h>
33*b99d961cSJimmy Huang #include <mmio.h>
34*b99d961cSJimmy Huang #include <mt8173_def.h>
357d116dccSCC Ma #include <spm.h>
367d116dccSCC Ma #include <spm_suspend.h>
377d116dccSCC Ma 
387d116dccSCC Ma /*
397d116dccSCC Ma  * System Power Manager (SPM) is a hardware module, which controls cpu or
407d116dccSCC Ma  * system power for different power scenarios using different firmware.
417d116dccSCC Ma  * This driver controls the system power in system suspend flow.
427d116dccSCC Ma  */
437d116dccSCC Ma 
447d116dccSCC Ma #define WAKE_SRC_FOR_SUSPEND					\
457d116dccSCC Ma 	(WAKE_SRC_KP | WAKE_SRC_EINT | WAKE_SRC_MD32 |		\
467d116dccSCC Ma 	WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN | WAKE_SRC_THERM |	\
4764faa0e5Skenny liang 	WAKE_SRC_SYSPWREQ | WAKE_SRC_ALL_MD32)
487d116dccSCC Ma 
497d116dccSCC Ma #define WAKE_SRC_FOR_MD32  0
507d116dccSCC Ma 
517d116dccSCC Ma #define spm_is_wakesrc_invalid(wakesrc)	\
527d116dccSCC Ma 	(!!((unsigned int)(wakesrc) & 0xc0003803))
537d116dccSCC Ma 
54*b99d961cSJimmy Huang #define ARMCA15PLL_CON0		(APMIXED_BASE + 0x200)
55*b99d961cSJimmy Huang #define ARMCA15PLL_CON1		(APMIXED_BASE + 0x204)
56*b99d961cSJimmy Huang #define ARMCA15PLL_PWR_CON0	(APMIXED_BASE + 0x20c)
57*b99d961cSJimmy Huang #define ARMCA15PLL_PWR_ON	(1U << 0)
58*b99d961cSJimmy Huang #define ARMCA15PLL_ISO_EN	(1U << 1)
59*b99d961cSJimmy Huang #define ARMCA15PLL_EN		(1U << 0)
60*b99d961cSJimmy Huang 
617d116dccSCC Ma const unsigned int spm_flags =
627d116dccSCC Ma 	SPM_DUALVCORE_PDN_DIS | SPM_PASR_DIS | SPM_DPD_DIS |
637d116dccSCC Ma 	SPM_CPU_DVS_DIS | SPM_OPT | SPM_INFRA_PDN_DIS;
647d116dccSCC Ma 
657d116dccSCC Ma enum wake_reason_t spm_wake_reason = WR_NONE;
667d116dccSCC Ma 
677d116dccSCC Ma /**********************************************************
687d116dccSCC Ma  * PCM sequence for cpu suspend
697d116dccSCC Ma  **********************************************************/
707d116dccSCC Ma static const unsigned int suspend_binary_ca7[] = {
717d116dccSCC Ma 	0x81f58407, 0x81f68407, 0x803a0400, 0x803a8400, 0x1b80001f, 0x20000000,
72cc04b843SJimmy Huang 	0x80300400, 0x80318400, 0x80328400, 0xa1d28407, 0x81f20407, 0x81009801,
73cc04b843SJimmy Huang 	0xd8000244, 0x17c07c1f, 0x18c0001f, 0x10006234, 0xc0c032e0, 0x1200041f,
747d116dccSCC Ma 	0x80310400, 0x1b80001f, 0x2000000a, 0xa0110400, 0x18c0001f, 0x100062c8,
757d116dccSCC Ma 	0xe0e00010, 0xe0e00030, 0xe0e00070, 0xe0e000f0, 0x1b80001f, 0x2000001a,
767d116dccSCC Ma 	0xe0e00ff0, 0xe8208000, 0x10006354, 0xfffe7fff, 0xe8208000, 0x10006834,
77cc04b843SJimmy Huang 	0x00000010, 0x81f00407, 0xa1dd0407, 0x81fd0407, 0xc2803800, 0x1290041f,
78cc04b843SJimmy Huang 	0x8880000c, 0x2f7be75f, 0xd8200722, 0x17c07c1f, 0xd82006a9, 0x17c07c1f,
79cc04b843SJimmy Huang 	0xe8208000, 0x10006814, 0x00000001, 0xc2803800, 0x1293841f, 0x1b00001f,
80cc04b843SJimmy Huang 	0x7fffe7ff, 0xd0000760, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xf0000000,
81cc04b843SJimmy Huang 	0x17c07c1f, 0x80880001, 0xd8000842, 0x17c07c1f, 0xd00028e0, 0x1200041f,
82cc04b843SJimmy Huang 	0xe8208000, 0x10006834, 0x00000000, 0x1b00001f, 0x3fffe7ff, 0x1b80001f,
83cc04b843SJimmy Huang 	0x20000004, 0xd8200a0c, 0x17c07c1f, 0xe8208000, 0x10006834, 0x00000010,
84cc04b843SJimmy Huang 	0xd0001280, 0x17c07c1f, 0x18c0001f, 0x10006608, 0x1910001f, 0x10006608,
85cc04b843SJimmy Huang 	0x813b0404, 0xe0c00004, 0x1880001f, 0x10006320, 0xc0c03760, 0xe080000f,
86cc04b843SJimmy Huang 	0xd8200c03, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xd0001280, 0x17c07c1f,
87cc04b843SJimmy Huang 	0xe080001f, 0xe8208000, 0x10006354, 0xffffffff, 0x18c0001f, 0x100062c8,
88cc04b843SJimmy Huang 	0xe0e000f0, 0xe0e00030, 0xe0e00000, 0x81009801, 0xd80010c4, 0x17c07c1f,
89cc04b843SJimmy Huang 	0x18c0001f, 0x10004094, 0x1910001f, 0x1020e374, 0xe0c00004, 0x18c0001f,
90cc04b843SJimmy Huang 	0x10004098, 0x1910001f, 0x1020e378, 0xe0c00004, 0x18c0001f, 0x10011094,
91cc04b843SJimmy Huang 	0x1910001f, 0x10213374, 0xe0c00004, 0x18c0001f, 0x10011098, 0x1910001f,
92cc04b843SJimmy Huang 	0x10213378, 0xe0c00004, 0x1910001f, 0x10213378, 0x18c0001f, 0x10006234,
93cc04b843SJimmy Huang 	0xc0c034a0, 0x17c07c1f, 0xc2803800, 0x1290841f, 0xa1d20407, 0x81f28407,
94cc04b843SJimmy Huang 	0xa1d68407, 0xa0128400, 0xa0118400, 0xa0100400, 0xa01a8400, 0xa01a0400,
95cc04b843SJimmy Huang 	0x19c0001f, 0x001c239f, 0x1b00001f, 0x3fffefff, 0xf0000000, 0x17c07c1f,
96cc04b843SJimmy Huang 	0x808d8001, 0xd8201502, 0x17c07c1f, 0x803d8400, 0x1b80001f, 0x2000001a,
97cc04b843SJimmy Huang 	0x80340400, 0x17c07c1f, 0x17c07c1f, 0x80310400, 0x81fa0407, 0x81f18407,
98cc04b843SJimmy Huang 	0x81f08407, 0xa1dc0407, 0x1b80001f, 0x200000b6, 0xd0002220, 0x17c07c1f,
99cc04b843SJimmy Huang 	0x1880001f, 0x20000208, 0x81011801, 0xd80016e4, 0x17c07c1f, 0xe8208000,
100cc04b843SJimmy Huang 	0x1000f600, 0xd2000000, 0x1380081f, 0x18c0001f, 0x10006240, 0xe0e00016,
101cc04b843SJimmy Huang 	0xe0e0001e, 0xe0e0000e, 0xe0e0000f, 0x80368400, 0x1380081f, 0x80370400,
102cc04b843SJimmy Huang 	0x1380081f, 0x80360400, 0x803e0400, 0x1380081f, 0x80380400, 0x803b0400,
103cc04b843SJimmy Huang 	0xa01d8400, 0x1b80001f, 0x20000034, 0x803d8400, 0x1b80001f, 0x20000152,
104cc04b843SJimmy Huang 	0x803d0400, 0x1380081f, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
105cc04b843SJimmy Huang 	0xa1000404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
106cc04b843SJimmy Huang 	0xa1000404, 0xe0c00004, 0x1910001f, 0x100125c8, 0x80340400, 0x17c07c1f,
107cc04b843SJimmy Huang 	0x17c07c1f, 0x80310400, 0xe8208000, 0x10000044, 0x00000100, 0x1b80001f,
108cc04b843SJimmy Huang 	0x20000068, 0x1b80001f, 0x2000000a, 0x18c0001f, 0x10006240, 0xe0e0000d,
109cc04b843SJimmy Huang 	0x81011801, 0xd8001f64, 0x17c07c1f, 0x18c0001f, 0x100040f4, 0x1910001f,
110cc04b843SJimmy Huang 	0x100040f4, 0xa11c8404, 0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404,
111cc04b843SJimmy Huang 	0xe0c00004, 0x18c0001f, 0x100110f4, 0x1910001f, 0x100110f4, 0xa11c8404,
112cc04b843SJimmy Huang 	0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404, 0xe0c00004, 0x1b80001f,
113cc04b843SJimmy Huang 	0x20000100, 0x81fa0407, 0x81f18407, 0x81f08407, 0xe8208000, 0x10006354,
114cc04b843SJimmy Huang 	0xfffe7b47, 0x18c0001f, 0x65930003, 0xc0c031c0, 0x17c07c1f, 0xc2803800,
115cc04b843SJimmy Huang 	0x1293041f, 0xa1d80407, 0xa1dc0407, 0x18c0001f, 0x10006608, 0x1910001f,
116cc04b843SJimmy Huang 	0x10006608, 0xa11b0404, 0xe0c00004, 0xc2803800, 0x1291041f, 0x8880000c,
117cc04b843SJimmy Huang 	0x2f7be75f, 0xd8202362, 0x17c07c1f, 0x1b00001f, 0x3fffe7ff, 0xd00023a0,
118cc04b843SJimmy Huang 	0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xf0000000, 0x17c07c1f, 0x1890001f,
119cc04b843SJimmy Huang 	0x10006608, 0x808b0801, 0xd8202642, 0x17c07c1f, 0x1880001f, 0x10006320,
120cc04b843SJimmy Huang 	0xc0c03540, 0xe080000f, 0xd80027a3, 0x17c07c1f, 0xe080001f, 0xa1da0407,
121cc04b843SJimmy Huang 	0x81fc0407, 0xa0110400, 0xa0140400, 0xa01d8400, 0xd0003100, 0x17c07c1f,
122cc04b843SJimmy Huang 	0x1b80001f, 0x20000fdf, 0x1890001f, 0x10006608, 0x80c98801, 0x810a8801,
123cc04b843SJimmy Huang 	0x10918c1f, 0xa0939002, 0x8080080d, 0xd82028e2, 0x12007c1f, 0x1b00001f,
124cc04b843SJimmy Huang 	0x3fffe7ff, 0x1b80001f, 0x20000004, 0xd800318c, 0x17c07c1f, 0x1b00001f,
125cc04b843SJimmy Huang 	0xbfffe7ff, 0xd0003180, 0x17c07c1f, 0x81f80407, 0x81fc0407, 0x18c0001f,
126cc04b843SJimmy Huang 	0x65930006, 0xc0c031c0, 0x17c07c1f, 0x18c0001f, 0x65930007, 0xc0c031c0,
127cc04b843SJimmy Huang 	0x17c07c1f, 0x1880001f, 0x10006320, 0xc0c03540, 0xe080000f, 0xd80027a3,
128cc04b843SJimmy Huang 	0x17c07c1f, 0xe080001f, 0x18c0001f, 0x65930005, 0xc0c031c0, 0x17c07c1f,
129cc04b843SJimmy Huang 	0xa1da0407, 0xe8208000, 0x10000048, 0x00000100, 0x1b80001f, 0x20000068,
130cc04b843SJimmy Huang 	0xa0110400, 0xa0140400, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
131cc04b843SJimmy Huang 	0x81200404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
132cc04b843SJimmy Huang 	0x81200404, 0xe0c00004, 0x1910001f, 0x100125c8, 0xa01d0400, 0xa01b0400,
133cc04b843SJimmy Huang 	0xa0180400, 0x803d8400, 0xa01e0400, 0xa0160400, 0xa0170400, 0xa0168400,
134cc04b843SJimmy Huang 	0x1b80001f, 0x20000104, 0x81011801, 0xd80030c4, 0x17c07c1f, 0x18c0001f,
135cc04b843SJimmy Huang 	0x10006240, 0xc0c034a0, 0x17c07c1f, 0xe8208000, 0x1000f600, 0xd2000001,
136cc04b843SJimmy Huang 	0xd8000848, 0x17c07c1f, 0xc2803800, 0x1291841f, 0x1b00001f, 0x7ffff7ff,
137cc04b843SJimmy Huang 	0xf0000000, 0x17c07c1f, 0x1900001f, 0x10006830, 0xe1000003, 0x18c0001f,
138cc04b843SJimmy Huang 	0x10006834, 0xe0e00000, 0xe0e00001, 0xf0000000, 0x17c07c1f, 0xe0f07f16,
139cc04b843SJimmy Huang 	0x1380201f, 0xe0f07f1e, 0x1380201f, 0xe0f07f0e, 0x1b80001f, 0x20000104,
140cc04b843SJimmy Huang 	0xe0f07f0c, 0xe0f07f0d, 0xe0f07e0d, 0xe0f07c0d, 0xe0f0780d, 0xf0000000,
141cc04b843SJimmy Huang 	0xe0f0700d, 0xe0f07f0d, 0xe0f07f0f, 0xe0f07f1e, 0xf0000000, 0xe0f07f12,
142cc04b843SJimmy Huang 	0x11407c1f, 0x81f08407, 0x81f18407, 0x1b80001f, 0x20000001, 0xa1d08407,
143cc04b843SJimmy Huang 	0xa1d18407, 0x1392841f, 0x812ab401, 0x80ebb401, 0xa0c00c04, 0xd8203743,
144cc04b843SJimmy Huang 	0x17c07c1f, 0x80c01403, 0xd8203563, 0x01400405, 0xf0000000, 0xa1d00407,
145cc04b843SJimmy Huang 	0x1b80001f, 0x20000208, 0x80ea3401, 0xf0000000, 0x18c0001f, 0x10006b6c,
146cc04b843SJimmy Huang 	0x1910001f, 0x10006b6c, 0xa1002804, 0xf0000000, 0xe0c00004, 0x17c07c1f,
1477d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1487d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1497d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1507d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1517d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1527d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1537d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1547d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1557d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1567d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0xa1d48407, 0x1990001f,
1577d116dccSCC Ma 	0x10006b08, 0x1a50001f, 0x10006610, 0x8246a401, 0xe8208000, 0x10006b6c,
1587d116dccSCC Ma 	0x00000000, 0x1b00001f, 0x2f7be75f, 0x81469801, 0xd8004305, 0x17c07c1f,
159cc04b843SJimmy Huang 	0x1b80001f, 0xd00f0000, 0x8880000c, 0x2f7be75f, 0xd8005fa2, 0x17c07c1f,
1607d116dccSCC Ma 	0xd0004340, 0x17c07c1f, 0x1b80001f, 0x500f0000, 0xe8208000, 0x10006354,
161cc04b843SJimmy Huang 	0xfffe7b47, 0xc0c06c00, 0x81401801, 0xd80048e5, 0x17c07c1f, 0x81f60407,
162cc04b843SJimmy Huang 	0x18c0001f, 0x10006200, 0xc0c06060, 0x12807c1f, 0xe8208000, 0x1000625c,
163cc04b843SJimmy Huang 	0x00000001, 0x1b80001f, 0x20000080, 0xc0c06060, 0x1280041f, 0x18c0001f,
164cc04b843SJimmy Huang 	0x10006204, 0xc0c06400, 0x1280041f, 0x18c0001f, 0x10006208, 0xc0c06060,
1657d116dccSCC Ma 	0x12807c1f, 0xe8208000, 0x10006244, 0x00000001, 0x1b80001f, 0x20000080,
166cc04b843SJimmy Huang 	0xc0c06060, 0x1280041f, 0x18d0001f, 0x10200200, 0x18c0001f, 0x10006290,
167cc04b843SJimmy Huang 	0xc0c06060, 0x1280041f, 0xe8208000, 0x10006404, 0x00003101, 0xc2803800,
1680ad1a9b3Syt.lee 	0x1292041f, 0x81469801, 0xd8204a45, 0x17c07c1f, 0x1b00001f, 0x2f7be75f,
169cc04b843SJimmy Huang 	0x1b80001f, 0x30000004, 0x8880000c, 0x2f7be75f, 0xd8005a02, 0x17c07c1f,
170cc04b843SJimmy Huang 	0xc0c06780, 0x17c07c1f, 0x18c0001f, 0x10006294, 0xe0f07fff, 0xe0e00fff,
1710ad1a9b3Syt.lee 	0xe0e000ff, 0x81449801, 0xd8004c85, 0x17c07c1f, 0x1a00001f, 0x10006604,
172cc04b843SJimmy Huang 	0xe2200003, 0xc0c06840, 0x17c07c1f, 0xe2200005, 0xc0c06840, 0x17c07c1f,
1730ad1a9b3Syt.lee 	0xa1d38407, 0xa1d98407, 0x1800001f, 0x00000012, 0x1800001f, 0x00000e12,
1740ad1a9b3Syt.lee 	0x1800001f, 0x03800e12, 0x1800001f, 0x038e0e12, 0xe8208000, 0x10006310,
175cc04b843SJimmy Huang 	0x0b1600f8, 0x1940001f, 0x00000000, 0x12407c1f, 0x1b00001f, 0xbfffe7ff,
176cc04b843SJimmy Huang 	0x1b80001f, 0x90100000, 0x17c07c1f, 0xd8004fc5, 0x17c07c1f, 0x8247b001,
177cc04b843SJimmy Huang 	0x1940001f, 0xffffffff, 0x80c00400, 0xd82050c3, 0xa1d58407, 0xa1dd8407,
178cc04b843SJimmy Huang 	0x1b00001f, 0x3fffefff, 0xd0004ec0, 0x17c07c1f, 0x1890001f, 0x100063e8,
179cc04b843SJimmy Huang 	0x88c0000c, 0x2f7be75f, 0xd80052e3, 0x17c07c1f, 0x80c40001, 0xd8005263,
180cc04b843SJimmy Huang 	0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xd00052a0, 0x17c07c1f, 0x1b00001f,
181cc04b843SJimmy Huang 	0x7ffff7ff, 0xd0004ec0, 0x17c07c1f, 0x80c40001, 0xd82053e3, 0x17c07c1f,
182cc04b843SJimmy Huang 	0xa1de0407, 0x1b00001f, 0x7fffe7ff, 0xd0004ec0, 0x17c07c1f, 0xe8208000,
183cc04b843SJimmy Huang 	0x10006814, 0x00000000, 0x18c0001f, 0x10006b00, 0xe0e00000, 0xe0c00009,
184cc04b843SJimmy Huang 	0x18c0001f, 0x10006294, 0xe0e001fe, 0xe0e003fc, 0xe0e007f8, 0xe0e00ff0,
185cc04b843SJimmy Huang 	0x1b80001f, 0x20000020, 0xe0f07ff0, 0xe0f07f00, 0x81449801, 0xd80057a5,
186cc04b843SJimmy Huang 	0x17c07c1f, 0x1a00001f, 0x10006604, 0xe2200002, 0xc0c06840, 0x17c07c1f,
187cc04b843SJimmy Huang 	0xe2200004, 0xc0c06840, 0x17c07c1f, 0x1b80001f, 0x200016a8, 0x1800001f,
188cc04b843SJimmy Huang 	0x03800e12, 0x1b80001f, 0x20000300, 0x1800001f, 0x00000e12, 0x1b80001f,
189cc04b843SJimmy Huang 	0x20000300, 0x1800001f, 0x00000012, 0x1b80001f, 0x20000104, 0x10007c1f,
190cc04b843SJimmy Huang 	0x81f38407, 0x81f98407, 0x81f90407, 0x81f40407, 0x1b80001f, 0x200016a8,
191cc04b843SJimmy Huang 	0x81401801, 0xd8005fa5, 0x17c07c1f, 0xe8208000, 0x10006404, 0x00002101,
192cc04b843SJimmy Huang 	0x18c0001f, 0x10006290, 0x1212841f, 0xc0c061e0, 0x12807c1f, 0xc0c061e0,
193cc04b843SJimmy Huang 	0x1280041f, 0x18c0001f, 0x10006208, 0x1212841f, 0xc0c061e0, 0x12807c1f,
194cc04b843SJimmy Huang 	0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xc0c061e0,
195cc04b843SJimmy Huang 	0x1280041f, 0xe8208000, 0x10200268, 0x000ffffe, 0x18c0001f, 0x10006204,
196cc04b843SJimmy Huang 	0x1212841f, 0xc0c065a0, 0x1280041f, 0x18c0001f, 0x10006200, 0x1212841f,
197cc04b843SJimmy Huang 	0xc0c061e0, 0x12807c1f, 0xe8208000, 0x1000625c, 0x00000000, 0x1b80001f,
198cc04b843SJimmy Huang 	0x20000080, 0xc0c061e0, 0x1280041f, 0x19c0001f, 0x01411820, 0x1ac0001f,
199cc04b843SJimmy Huang 	0x55aa55aa, 0x10007c1f, 0xf0000000, 0xd800610a, 0x17c07c1f, 0xe2e0004f,
200cc04b843SJimmy Huang 	0xe2e0006f, 0xe2e0002f, 0xd82061aa, 0x17c07c1f, 0xe2e0002e, 0xe2e0003e,
201cc04b843SJimmy Huang 	0xe2e00032, 0xf0000000, 0x17c07c1f, 0xd80062aa, 0x17c07c1f, 0xe2e00036,
202cc04b843SJimmy Huang 	0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xd82063ca, 0x17c07c1f, 0x1380201f,
203cc04b843SJimmy Huang 	0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d,
204cc04b843SJimmy Huang 	0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401, 0xd8206569,
205cc04b843SJimmy Huang 	0x17c07c1f, 0xe2e0000d, 0xe2e0000c, 0xe2e0001c, 0xe2e0001e, 0xe2e00016,
206cc04b843SJimmy Huang 	0xe2e00012, 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401,
207cc04b843SJimmy Huang 	0xd8206749, 0x17c07c1f, 0xe2e00016, 0x1380201f, 0xe2e0001e, 0x1380201f,
208cc04b843SJimmy Huang 	0xe2e0001c, 0x1380201f, 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f,
209cc04b843SJimmy Huang 	0xa1d40407, 0x1391841f, 0xa1d90407, 0x1393041f, 0xf0000000, 0x17c07c1f,
210cc04b843SJimmy Huang 	0x18d0001f, 0x10006604, 0x10cf8c1f, 0xd8206843, 0x17c07c1f, 0xf0000000,
211cc04b843SJimmy Huang 	0x17c07c1f, 0xe8208000, 0x11008014, 0x00000002, 0xe8208000, 0x11008020,
212cc04b843SJimmy Huang 	0x00000101, 0xe8208000, 0x11008004, 0x000000d0, 0x1a00001f, 0x11008000,
213cc04b843SJimmy Huang 	0xd8006b0a, 0xe220005d, 0xd8206b2a, 0xe2200000, 0xe2200001, 0xe8208000,
214cc04b843SJimmy Huang 	0x11008024, 0x00000001, 0x1b80001f, 0x20000424, 0xf0000000, 0x17c07c1f,
215cc04b843SJimmy Huang 	0xa1d10407, 0x1b80001f, 0x20000020, 0xf0000000, 0x17c07c1f
2167d116dccSCC Ma };
2177d116dccSCC Ma 
2187d116dccSCC Ma /*
2197d116dccSCC Ma  * PCM binary for suspend scenario
2207d116dccSCC Ma  */
2217d116dccSCC Ma static const struct pcm_desc suspend_pcm_ca7 = {
222cc04b843SJimmy Huang 	.version = "pcm_suspend_20150917_V4",
2237d116dccSCC Ma 	.base = suspend_binary_ca7,
224cc04b843SJimmy Huang 	.size = 869,
2257d116dccSCC Ma 	.sess = 2,
2267d116dccSCC Ma 	.replace = 0,
2277d116dccSCC Ma 	.vec0 = EVENT_VEC(11, 1, 0, 0),
228cc04b843SJimmy Huang 	.vec1 = EVENT_VEC(12, 1, 0, 61),
229cc04b843SJimmy Huang 	.vec2 = EVENT_VEC(30, 1, 0, 150),
230cc04b843SJimmy Huang 	.vec3 = EVENT_VEC(31, 1, 0, 287),
2317d116dccSCC Ma };
2327d116dccSCC Ma 
2337d116dccSCC Ma /*
2347d116dccSCC Ma  * SPM settings for suspend scenario
2357d116dccSCC Ma  */
2367d116dccSCC Ma static struct pwr_ctrl spm_ctrl = {
2377d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_SUSPEND,
2387d116dccSCC Ma 	.wake_src_md32 = WAKE_SRC_FOR_MD32,
2397d116dccSCC Ma 	.r0_ctrl_en = 1,
2407d116dccSCC Ma 	.r7_ctrl_en = 1,
2417d116dccSCC Ma 	.infra_dcm_lock = 1,
2427d116dccSCC Ma 	.wfi_op = WFI_OP_AND,
2437d116dccSCC Ma 	.pcm_apsrc_req = 0,
2447d116dccSCC Ma 	.ca7top_idle_mask = 0,
2457d116dccSCC Ma 	.ca15top_idle_mask = 0,
2467d116dccSCC Ma 	.mcusys_idle_mask = 0,
2477d116dccSCC Ma 	.disp_req_mask = 0,
2487d116dccSCC Ma 	.mfg_req_mask = 0,
2497d116dccSCC Ma 	.md32_req_mask = 1,
2507d116dccSCC Ma 	.srclkenai_mask = 1,
2517d116dccSCC Ma 	.ca7_wfi0_en = 1,
2527d116dccSCC Ma 	.ca7_wfi1_en = 1,
2537d116dccSCC Ma 	.ca7_wfi2_en = 1,
2547d116dccSCC Ma 	.ca7_wfi3_en = 1,
2557d116dccSCC Ma 	.ca15_wfi0_en = 1,
2567d116dccSCC Ma 	.ca15_wfi1_en = 1,
2577d116dccSCC Ma 	.ca15_wfi2_en = 1,
2587d116dccSCC Ma 	.ca15_wfi3_en = 1,
2597d116dccSCC Ma };
2607d116dccSCC Ma 
2617d116dccSCC Ma /*
2627d116dccSCC Ma  * go_to_sleep_before_wfi() - trigger SPM to enter suspend scenario
2637d116dccSCC Ma  */
2647d116dccSCC Ma static void go_to_sleep_before_wfi(const unsigned int spm_flags)
2657d116dccSCC Ma {
2667d116dccSCC Ma 	struct pwr_ctrl *pwrctrl;
2677d116dccSCC Ma 
2687d116dccSCC Ma 	pwrctrl = &spm_ctrl;
2697d116dccSCC Ma 
2707d116dccSCC Ma 	set_pwrctrl_pcm_flags(pwrctrl, spm_flags);
2717d116dccSCC Ma 
2727d116dccSCC Ma 	spm_set_sysclk_settle();
2737d116dccSCC Ma 
2747d116dccSCC Ma 	INFO("sec = %u, wakesrc = 0x%x (%u)(%u)\n",
2757d116dccSCC Ma 	     pwrctrl->timer_val, pwrctrl->wake_src,
2767d116dccSCC Ma 	     is_cpu_pdn(pwrctrl->pcm_flags),
2777d116dccSCC Ma 	     is_infra_pdn(pwrctrl->pcm_flags));
2787d116dccSCC Ma 
2797d116dccSCC Ma 	spm_reset_and_init_pcm();
2807d116dccSCC Ma 	spm_init_pcm_register();
2817d116dccSCC Ma 	spm_set_power_control(pwrctrl);
2827d116dccSCC Ma 	spm_set_wakeup_event(pwrctrl);
2837d116dccSCC Ma 	spm_kick_pcm_to_run(pwrctrl);
2847d116dccSCC Ma 	spm_init_event_vector(&suspend_pcm_ca7);
2857d116dccSCC Ma 	spm_kick_im_to_fetch(&suspend_pcm_ca7);
2867d116dccSCC Ma }
2877d116dccSCC Ma 
2887d116dccSCC Ma /*
2897d116dccSCC Ma  * go_to_sleep_after_wfi() - get wakeup reason after
2907d116dccSCC Ma  * leaving suspend scenario and clean up SPM settings
2917d116dccSCC Ma  */
2927d116dccSCC Ma static enum wake_reason_t go_to_sleep_after_wfi(void)
2937d116dccSCC Ma {
2947d116dccSCC Ma 	struct wake_status wakesta;
2957d116dccSCC Ma 	static enum wake_reason_t last_wr = WR_NONE;
2967d116dccSCC Ma 
2977d116dccSCC Ma 	spm_get_wakeup_status(&wakesta);
2987d116dccSCC Ma 	spm_clean_after_wakeup();
2997d116dccSCC Ma 	last_wr = spm_output_wake_reason(&wakesta);
3007d116dccSCC Ma 
3017d116dccSCC Ma 	return last_wr;
3027d116dccSCC Ma }
3037d116dccSCC Ma 
304*b99d961cSJimmy Huang static void bigcore_pll_on(void)
305*b99d961cSJimmy Huang {
306*b99d961cSJimmy Huang 	mmio_setbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_PWR_ON);
307*b99d961cSJimmy Huang 	mmio_clrbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_ISO_EN);
308*b99d961cSJimmy Huang 	mmio_setbits_32(ARMCA15PLL_CON0, ARMCA15PLL_EN);
309*b99d961cSJimmy Huang }
310*b99d961cSJimmy Huang 
311*b99d961cSJimmy Huang static void bigcore_pll_off(void)
312*b99d961cSJimmy Huang {
313*b99d961cSJimmy Huang 	mmio_clrbits_32(ARMCA15PLL_CON0, ARMCA15PLL_EN);
314*b99d961cSJimmy Huang 	mmio_setbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_ISO_EN);
315*b99d961cSJimmy Huang 	mmio_clrbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_PWR_ON);
316*b99d961cSJimmy Huang }
317*b99d961cSJimmy Huang 
3187d116dccSCC Ma void spm_system_suspend(void)
3197d116dccSCC Ma {
320*b99d961cSJimmy Huang 	bigcore_pll_off();
3217d116dccSCC Ma 	spm_lock_get();
3227d116dccSCC Ma 	go_to_sleep_before_wfi(spm_flags);
3237d116dccSCC Ma 	set_suspend_ready();
3247d116dccSCC Ma 	spm_lock_release();
3257d116dccSCC Ma }
3267d116dccSCC Ma 
3277d116dccSCC Ma void spm_system_suspend_finish(void)
3287d116dccSCC Ma {
3297d116dccSCC Ma 	spm_lock_get();
3307d116dccSCC Ma 	spm_wake_reason = go_to_sleep_after_wfi();
3317d116dccSCC Ma 	INFO("spm_wake_reason=%d\n", spm_wake_reason);
3327d116dccSCC Ma 	clear_all_ready();
3337d116dccSCC Ma 	spm_lock_release();
334*b99d961cSJimmy Huang 	bigcore_pll_on();
335*b99d961cSJimmy Huang 	/* Add 20us delay for turning on PLL*/
336*b99d961cSJimmy Huang 	udelay(20);
3377d116dccSCC Ma }
338