17d116dccSCC Ma /*
2*b7f6525dSJustin Chadwell * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
57d116dccSCC Ma */
609d40e0eSAntonio Nino Diaz
709d40e0eSAntonio Nino Diaz #include <common/debug.h>
809d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h>
909d40e0eSAntonio Nino Diaz #include <lib/bakery_lock.h>
1009d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
1109d40e0eSAntonio Nino Diaz
12b99d961cSJimmy Huang #include <mt8173_def.h>
137d116dccSCC Ma #include <spm.h>
147d116dccSCC Ma #include <spm_suspend.h>
157d116dccSCC Ma
167d116dccSCC Ma /*
177d116dccSCC Ma * System Power Manager (SPM) is a hardware module, which controls cpu or
187d116dccSCC Ma * system power for different power scenarios using different firmware.
197d116dccSCC Ma * This driver controls the system power in system suspend flow.
207d116dccSCC Ma */
217d116dccSCC Ma
227d116dccSCC Ma #define WAKE_SRC_FOR_SUSPEND \
237d116dccSCC Ma (WAKE_SRC_KP | WAKE_SRC_EINT | WAKE_SRC_MD32 | \
247d116dccSCC Ma WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN | WAKE_SRC_THERM | \
2564faa0e5Skenny liang WAKE_SRC_SYSPWREQ | WAKE_SRC_ALL_MD32)
267d116dccSCC Ma
277d116dccSCC Ma #define WAKE_SRC_FOR_MD32 0
287d116dccSCC Ma
297d116dccSCC Ma #define spm_is_wakesrc_invalid(wakesrc) \
307d116dccSCC Ma (!!((unsigned int)(wakesrc) & 0xc0003803))
317d116dccSCC Ma
32b99d961cSJimmy Huang #define ARMCA15PLL_CON0 (APMIXED_BASE + 0x200)
33b99d961cSJimmy Huang #define ARMCA15PLL_CON1 (APMIXED_BASE + 0x204)
34b99d961cSJimmy Huang #define ARMCA15PLL_PWR_CON0 (APMIXED_BASE + 0x20c)
35b99d961cSJimmy Huang #define ARMCA15PLL_PWR_ON (1U << 0)
36b99d961cSJimmy Huang #define ARMCA15PLL_ISO_EN (1U << 1)
37b99d961cSJimmy Huang #define ARMCA15PLL_EN (1U << 0)
38b99d961cSJimmy Huang
397d116dccSCC Ma const unsigned int spm_flags =
407d116dccSCC Ma SPM_DUALVCORE_PDN_DIS | SPM_PASR_DIS | SPM_DPD_DIS |
417d116dccSCC Ma SPM_CPU_DVS_DIS | SPM_OPT | SPM_INFRA_PDN_DIS;
427d116dccSCC Ma
437d116dccSCC Ma enum wake_reason_t spm_wake_reason = WR_NONE;
447d116dccSCC Ma
457d116dccSCC Ma /**********************************************************
467d116dccSCC Ma * PCM sequence for cpu suspend
477d116dccSCC Ma **********************************************************/
487d116dccSCC Ma static const unsigned int suspend_binary_ca7[] = {
497d116dccSCC Ma 0x81f58407, 0x81f68407, 0x803a0400, 0x803a8400, 0x1b80001f, 0x20000000,
50cc04b843SJimmy Huang 0x80300400, 0x80318400, 0x80328400, 0xa1d28407, 0x81f20407, 0x81009801,
51cc04b843SJimmy Huang 0xd8000244, 0x17c07c1f, 0x18c0001f, 0x10006234, 0xc0c032e0, 0x1200041f,
527d116dccSCC Ma 0x80310400, 0x1b80001f, 0x2000000a, 0xa0110400, 0x18c0001f, 0x100062c8,
537d116dccSCC Ma 0xe0e00010, 0xe0e00030, 0xe0e00070, 0xe0e000f0, 0x1b80001f, 0x2000001a,
547d116dccSCC Ma 0xe0e00ff0, 0xe8208000, 0x10006354, 0xfffe7fff, 0xe8208000, 0x10006834,
55cc04b843SJimmy Huang 0x00000010, 0x81f00407, 0xa1dd0407, 0x81fd0407, 0xc2803800, 0x1290041f,
56cc04b843SJimmy Huang 0x8880000c, 0x2f7be75f, 0xd8200722, 0x17c07c1f, 0xd82006a9, 0x17c07c1f,
57cc04b843SJimmy Huang 0xe8208000, 0x10006814, 0x00000001, 0xc2803800, 0x1293841f, 0x1b00001f,
58cc04b843SJimmy Huang 0x7fffe7ff, 0xd0000760, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xf0000000,
59cc04b843SJimmy Huang 0x17c07c1f, 0x80880001, 0xd8000842, 0x17c07c1f, 0xd00028e0, 0x1200041f,
60cc04b843SJimmy Huang 0xe8208000, 0x10006834, 0x00000000, 0x1b00001f, 0x3fffe7ff, 0x1b80001f,
61cc04b843SJimmy Huang 0x20000004, 0xd8200a0c, 0x17c07c1f, 0xe8208000, 0x10006834, 0x00000010,
62cc04b843SJimmy Huang 0xd0001280, 0x17c07c1f, 0x18c0001f, 0x10006608, 0x1910001f, 0x10006608,
63cc04b843SJimmy Huang 0x813b0404, 0xe0c00004, 0x1880001f, 0x10006320, 0xc0c03760, 0xe080000f,
64cc04b843SJimmy Huang 0xd8200c03, 0x17c07c1f, 0x1b00001f, 0x7ffff7ff, 0xd0001280, 0x17c07c1f,
65cc04b843SJimmy Huang 0xe080001f, 0xe8208000, 0x10006354, 0xffffffff, 0x18c0001f, 0x100062c8,
66cc04b843SJimmy Huang 0xe0e000f0, 0xe0e00030, 0xe0e00000, 0x81009801, 0xd80010c4, 0x17c07c1f,
67cc04b843SJimmy Huang 0x18c0001f, 0x10004094, 0x1910001f, 0x1020e374, 0xe0c00004, 0x18c0001f,
68cc04b843SJimmy Huang 0x10004098, 0x1910001f, 0x1020e378, 0xe0c00004, 0x18c0001f, 0x10011094,
69cc04b843SJimmy Huang 0x1910001f, 0x10213374, 0xe0c00004, 0x18c0001f, 0x10011098, 0x1910001f,
70cc04b843SJimmy Huang 0x10213378, 0xe0c00004, 0x1910001f, 0x10213378, 0x18c0001f, 0x10006234,
71cc04b843SJimmy Huang 0xc0c034a0, 0x17c07c1f, 0xc2803800, 0x1290841f, 0xa1d20407, 0x81f28407,
72cc04b843SJimmy Huang 0xa1d68407, 0xa0128400, 0xa0118400, 0xa0100400, 0xa01a8400, 0xa01a0400,
73cc04b843SJimmy Huang 0x19c0001f, 0x001c239f, 0x1b00001f, 0x3fffefff, 0xf0000000, 0x17c07c1f,
74cc04b843SJimmy Huang 0x808d8001, 0xd8201502, 0x17c07c1f, 0x803d8400, 0x1b80001f, 0x2000001a,
75cc04b843SJimmy Huang 0x80340400, 0x17c07c1f, 0x17c07c1f, 0x80310400, 0x81fa0407, 0x81f18407,
76cc04b843SJimmy Huang 0x81f08407, 0xa1dc0407, 0x1b80001f, 0x200000b6, 0xd0002220, 0x17c07c1f,
77cc04b843SJimmy Huang 0x1880001f, 0x20000208, 0x81011801, 0xd80016e4, 0x17c07c1f, 0xe8208000,
78cc04b843SJimmy Huang 0x1000f600, 0xd2000000, 0x1380081f, 0x18c0001f, 0x10006240, 0xe0e00016,
79cc04b843SJimmy Huang 0xe0e0001e, 0xe0e0000e, 0xe0e0000f, 0x80368400, 0x1380081f, 0x80370400,
80cc04b843SJimmy Huang 0x1380081f, 0x80360400, 0x803e0400, 0x1380081f, 0x80380400, 0x803b0400,
81cc04b843SJimmy Huang 0xa01d8400, 0x1b80001f, 0x20000034, 0x803d8400, 0x1b80001f, 0x20000152,
82cc04b843SJimmy Huang 0x803d0400, 0x1380081f, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
83cc04b843SJimmy Huang 0xa1000404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
84cc04b843SJimmy Huang 0xa1000404, 0xe0c00004, 0x1910001f, 0x100125c8, 0x80340400, 0x17c07c1f,
85cc04b843SJimmy Huang 0x17c07c1f, 0x80310400, 0xe8208000, 0x10000044, 0x00000100, 0x1b80001f,
86cc04b843SJimmy Huang 0x20000068, 0x1b80001f, 0x2000000a, 0x18c0001f, 0x10006240, 0xe0e0000d,
87cc04b843SJimmy Huang 0x81011801, 0xd8001f64, 0x17c07c1f, 0x18c0001f, 0x100040f4, 0x1910001f,
88cc04b843SJimmy Huang 0x100040f4, 0xa11c8404, 0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404,
89cc04b843SJimmy Huang 0xe0c00004, 0x18c0001f, 0x100110f4, 0x1910001f, 0x100110f4, 0xa11c8404,
90cc04b843SJimmy Huang 0xe0c00004, 0x1b80001f, 0x2000000a, 0x813c8404, 0xe0c00004, 0x1b80001f,
91cc04b843SJimmy Huang 0x20000100, 0x81fa0407, 0x81f18407, 0x81f08407, 0xe8208000, 0x10006354,
92cc04b843SJimmy Huang 0xfffe7b47, 0x18c0001f, 0x65930003, 0xc0c031c0, 0x17c07c1f, 0xc2803800,
93cc04b843SJimmy Huang 0x1293041f, 0xa1d80407, 0xa1dc0407, 0x18c0001f, 0x10006608, 0x1910001f,
94cc04b843SJimmy Huang 0x10006608, 0xa11b0404, 0xe0c00004, 0xc2803800, 0x1291041f, 0x8880000c,
95cc04b843SJimmy Huang 0x2f7be75f, 0xd8202362, 0x17c07c1f, 0x1b00001f, 0x3fffe7ff, 0xd00023a0,
96cc04b843SJimmy Huang 0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xf0000000, 0x17c07c1f, 0x1890001f,
97cc04b843SJimmy Huang 0x10006608, 0x808b0801, 0xd8202642, 0x17c07c1f, 0x1880001f, 0x10006320,
98cc04b843SJimmy Huang 0xc0c03540, 0xe080000f, 0xd80027a3, 0x17c07c1f, 0xe080001f, 0xa1da0407,
99cc04b843SJimmy Huang 0x81fc0407, 0xa0110400, 0xa0140400, 0xa01d8400, 0xd0003100, 0x17c07c1f,
100cc04b843SJimmy Huang 0x1b80001f, 0x20000fdf, 0x1890001f, 0x10006608, 0x80c98801, 0x810a8801,
101cc04b843SJimmy Huang 0x10918c1f, 0xa0939002, 0x8080080d, 0xd82028e2, 0x12007c1f, 0x1b00001f,
102cc04b843SJimmy Huang 0x3fffe7ff, 0x1b80001f, 0x20000004, 0xd800318c, 0x17c07c1f, 0x1b00001f,
103cc04b843SJimmy Huang 0xbfffe7ff, 0xd0003180, 0x17c07c1f, 0x81f80407, 0x81fc0407, 0x18c0001f,
104cc04b843SJimmy Huang 0x65930006, 0xc0c031c0, 0x17c07c1f, 0x18c0001f, 0x65930007, 0xc0c031c0,
105cc04b843SJimmy Huang 0x17c07c1f, 0x1880001f, 0x10006320, 0xc0c03540, 0xe080000f, 0xd80027a3,
106cc04b843SJimmy Huang 0x17c07c1f, 0xe080001f, 0x18c0001f, 0x65930005, 0xc0c031c0, 0x17c07c1f,
107cc04b843SJimmy Huang 0xa1da0407, 0xe8208000, 0x10000048, 0x00000100, 0x1b80001f, 0x20000068,
108cc04b843SJimmy Huang 0xa0110400, 0xa0140400, 0x18c0001f, 0x1000f5c8, 0x1910001f, 0x1000f5c8,
109cc04b843SJimmy Huang 0x81200404, 0xe0c00004, 0x18c0001f, 0x100125c8, 0x1910001f, 0x100125c8,
110cc04b843SJimmy Huang 0x81200404, 0xe0c00004, 0x1910001f, 0x100125c8, 0xa01d0400, 0xa01b0400,
111cc04b843SJimmy Huang 0xa0180400, 0x803d8400, 0xa01e0400, 0xa0160400, 0xa0170400, 0xa0168400,
112cc04b843SJimmy Huang 0x1b80001f, 0x20000104, 0x81011801, 0xd80030c4, 0x17c07c1f, 0x18c0001f,
113cc04b843SJimmy Huang 0x10006240, 0xc0c034a0, 0x17c07c1f, 0xe8208000, 0x1000f600, 0xd2000001,
114cc04b843SJimmy Huang 0xd8000848, 0x17c07c1f, 0xc2803800, 0x1291841f, 0x1b00001f, 0x7ffff7ff,
115cc04b843SJimmy Huang 0xf0000000, 0x17c07c1f, 0x1900001f, 0x10006830, 0xe1000003, 0x18c0001f,
116cc04b843SJimmy Huang 0x10006834, 0xe0e00000, 0xe0e00001, 0xf0000000, 0x17c07c1f, 0xe0f07f16,
117cc04b843SJimmy Huang 0x1380201f, 0xe0f07f1e, 0x1380201f, 0xe0f07f0e, 0x1b80001f, 0x20000104,
118cc04b843SJimmy Huang 0xe0f07f0c, 0xe0f07f0d, 0xe0f07e0d, 0xe0f07c0d, 0xe0f0780d, 0xf0000000,
119cc04b843SJimmy Huang 0xe0f0700d, 0xe0f07f0d, 0xe0f07f0f, 0xe0f07f1e, 0xf0000000, 0xe0f07f12,
120cc04b843SJimmy Huang 0x11407c1f, 0x81f08407, 0x81f18407, 0x1b80001f, 0x20000001, 0xa1d08407,
121cc04b843SJimmy Huang 0xa1d18407, 0x1392841f, 0x812ab401, 0x80ebb401, 0xa0c00c04, 0xd8203743,
122cc04b843SJimmy Huang 0x17c07c1f, 0x80c01403, 0xd8203563, 0x01400405, 0xf0000000, 0xa1d00407,
123cc04b843SJimmy Huang 0x1b80001f, 0x20000208, 0x80ea3401, 0xf0000000, 0x18c0001f, 0x10006b6c,
124cc04b843SJimmy Huang 0x1910001f, 0x10006b6c, 0xa1002804, 0xf0000000, 0xe0c00004, 0x17c07c1f,
1257d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1267d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1277d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1287d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1297d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1307d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1317d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1327d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1337d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1347d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0xa1d48407, 0x1990001f,
1357d116dccSCC Ma 0x10006b08, 0x1a50001f, 0x10006610, 0x8246a401, 0xe8208000, 0x10006b6c,
1367d116dccSCC Ma 0x00000000, 0x1b00001f, 0x2f7be75f, 0x81469801, 0xd8004305, 0x17c07c1f,
137cc04b843SJimmy Huang 0x1b80001f, 0xd00f0000, 0x8880000c, 0x2f7be75f, 0xd8005fa2, 0x17c07c1f,
1387d116dccSCC Ma 0xd0004340, 0x17c07c1f, 0x1b80001f, 0x500f0000, 0xe8208000, 0x10006354,
139cc04b843SJimmy Huang 0xfffe7b47, 0xc0c06c00, 0x81401801, 0xd80048e5, 0x17c07c1f, 0x81f60407,
140cc04b843SJimmy Huang 0x18c0001f, 0x10006200, 0xc0c06060, 0x12807c1f, 0xe8208000, 0x1000625c,
141cc04b843SJimmy Huang 0x00000001, 0x1b80001f, 0x20000080, 0xc0c06060, 0x1280041f, 0x18c0001f,
142cc04b843SJimmy Huang 0x10006204, 0xc0c06400, 0x1280041f, 0x18c0001f, 0x10006208, 0xc0c06060,
1437d116dccSCC Ma 0x12807c1f, 0xe8208000, 0x10006244, 0x00000001, 0x1b80001f, 0x20000080,
144cc04b843SJimmy Huang 0xc0c06060, 0x1280041f, 0x18d0001f, 0x10200200, 0x18c0001f, 0x10006290,
145cc04b843SJimmy Huang 0xc0c06060, 0x1280041f, 0xe8208000, 0x10006404, 0x00003101, 0xc2803800,
1460ad1a9b3Syt.lee 0x1292041f, 0x81469801, 0xd8204a45, 0x17c07c1f, 0x1b00001f, 0x2f7be75f,
147cc04b843SJimmy Huang 0x1b80001f, 0x30000004, 0x8880000c, 0x2f7be75f, 0xd8005a02, 0x17c07c1f,
148cc04b843SJimmy Huang 0xc0c06780, 0x17c07c1f, 0x18c0001f, 0x10006294, 0xe0f07fff, 0xe0e00fff,
1490ad1a9b3Syt.lee 0xe0e000ff, 0x81449801, 0xd8004c85, 0x17c07c1f, 0x1a00001f, 0x10006604,
150cc04b843SJimmy Huang 0xe2200003, 0xc0c06840, 0x17c07c1f, 0xe2200005, 0xc0c06840, 0x17c07c1f,
1510ad1a9b3Syt.lee 0xa1d38407, 0xa1d98407, 0x1800001f, 0x00000012, 0x1800001f, 0x00000e12,
1520ad1a9b3Syt.lee 0x1800001f, 0x03800e12, 0x1800001f, 0x038e0e12, 0xe8208000, 0x10006310,
153cc04b843SJimmy Huang 0x0b1600f8, 0x1940001f, 0x00000000, 0x12407c1f, 0x1b00001f, 0xbfffe7ff,
154cc04b843SJimmy Huang 0x1b80001f, 0x90100000, 0x17c07c1f, 0xd8004fc5, 0x17c07c1f, 0x8247b001,
155cc04b843SJimmy Huang 0x1940001f, 0xffffffff, 0x80c00400, 0xd82050c3, 0xa1d58407, 0xa1dd8407,
156cc04b843SJimmy Huang 0x1b00001f, 0x3fffefff, 0xd0004ec0, 0x17c07c1f, 0x1890001f, 0x100063e8,
157cc04b843SJimmy Huang 0x88c0000c, 0x2f7be75f, 0xd80052e3, 0x17c07c1f, 0x80c40001, 0xd8005263,
158cc04b843SJimmy Huang 0x17c07c1f, 0x1b00001f, 0xbfffe7ff, 0xd00052a0, 0x17c07c1f, 0x1b00001f,
159cc04b843SJimmy Huang 0x7ffff7ff, 0xd0004ec0, 0x17c07c1f, 0x80c40001, 0xd82053e3, 0x17c07c1f,
160cc04b843SJimmy Huang 0xa1de0407, 0x1b00001f, 0x7fffe7ff, 0xd0004ec0, 0x17c07c1f, 0xe8208000,
161cc04b843SJimmy Huang 0x10006814, 0x00000000, 0x18c0001f, 0x10006b00, 0xe0e00000, 0xe0c00009,
162cc04b843SJimmy Huang 0x18c0001f, 0x10006294, 0xe0e001fe, 0xe0e003fc, 0xe0e007f8, 0xe0e00ff0,
163cc04b843SJimmy Huang 0x1b80001f, 0x20000020, 0xe0f07ff0, 0xe0f07f00, 0x81449801, 0xd80057a5,
164cc04b843SJimmy Huang 0x17c07c1f, 0x1a00001f, 0x10006604, 0xe2200002, 0xc0c06840, 0x17c07c1f,
165cc04b843SJimmy Huang 0xe2200004, 0xc0c06840, 0x17c07c1f, 0x1b80001f, 0x200016a8, 0x1800001f,
166cc04b843SJimmy Huang 0x03800e12, 0x1b80001f, 0x20000300, 0x1800001f, 0x00000e12, 0x1b80001f,
167cc04b843SJimmy Huang 0x20000300, 0x1800001f, 0x00000012, 0x1b80001f, 0x20000104, 0x10007c1f,
168cc04b843SJimmy Huang 0x81f38407, 0x81f98407, 0x81f90407, 0x81f40407, 0x1b80001f, 0x200016a8,
169cc04b843SJimmy Huang 0x81401801, 0xd8005fa5, 0x17c07c1f, 0xe8208000, 0x10006404, 0x00002101,
170cc04b843SJimmy Huang 0x18c0001f, 0x10006290, 0x1212841f, 0xc0c061e0, 0x12807c1f, 0xc0c061e0,
171cc04b843SJimmy Huang 0x1280041f, 0x18c0001f, 0x10006208, 0x1212841f, 0xc0c061e0, 0x12807c1f,
172cc04b843SJimmy Huang 0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xc0c061e0,
173cc04b843SJimmy Huang 0x1280041f, 0xe8208000, 0x10200268, 0x000ffffe, 0x18c0001f, 0x10006204,
174cc04b843SJimmy Huang 0x1212841f, 0xc0c065a0, 0x1280041f, 0x18c0001f, 0x10006200, 0x1212841f,
175cc04b843SJimmy Huang 0xc0c061e0, 0x12807c1f, 0xe8208000, 0x1000625c, 0x00000000, 0x1b80001f,
176cc04b843SJimmy Huang 0x20000080, 0xc0c061e0, 0x1280041f, 0x19c0001f, 0x01411820, 0x1ac0001f,
177cc04b843SJimmy Huang 0x55aa55aa, 0x10007c1f, 0xf0000000, 0xd800610a, 0x17c07c1f, 0xe2e0004f,
178cc04b843SJimmy Huang 0xe2e0006f, 0xe2e0002f, 0xd82061aa, 0x17c07c1f, 0xe2e0002e, 0xe2e0003e,
179cc04b843SJimmy Huang 0xe2e00032, 0xf0000000, 0x17c07c1f, 0xd80062aa, 0x17c07c1f, 0xe2e00036,
180cc04b843SJimmy Huang 0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xd82063ca, 0x17c07c1f, 0x1380201f,
181cc04b843SJimmy Huang 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d,
182cc04b843SJimmy Huang 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401, 0xd8206569,
183cc04b843SJimmy Huang 0x17c07c1f, 0xe2e0000d, 0xe2e0000c, 0xe2e0001c, 0xe2e0001e, 0xe2e00016,
184cc04b843SJimmy Huang 0xe2e00012, 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x10006610, 0x8246a401,
185cc04b843SJimmy Huang 0xd8206749, 0x17c07c1f, 0xe2e00016, 0x1380201f, 0xe2e0001e, 0x1380201f,
186cc04b843SJimmy Huang 0xe2e0001c, 0x1380201f, 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f,
187cc04b843SJimmy Huang 0xa1d40407, 0x1391841f, 0xa1d90407, 0x1393041f, 0xf0000000, 0x17c07c1f,
188cc04b843SJimmy Huang 0x18d0001f, 0x10006604, 0x10cf8c1f, 0xd8206843, 0x17c07c1f, 0xf0000000,
189cc04b843SJimmy Huang 0x17c07c1f, 0xe8208000, 0x11008014, 0x00000002, 0xe8208000, 0x11008020,
190cc04b843SJimmy Huang 0x00000101, 0xe8208000, 0x11008004, 0x000000d0, 0x1a00001f, 0x11008000,
191cc04b843SJimmy Huang 0xd8006b0a, 0xe220005d, 0xd8206b2a, 0xe2200000, 0xe2200001, 0xe8208000,
192cc04b843SJimmy Huang 0x11008024, 0x00000001, 0x1b80001f, 0x20000424, 0xf0000000, 0x17c07c1f,
193cc04b843SJimmy Huang 0xa1d10407, 0x1b80001f, 0x20000020, 0xf0000000, 0x17c07c1f
1947d116dccSCC Ma };
1957d116dccSCC Ma
1967d116dccSCC Ma /*
1977d116dccSCC Ma * PCM binary for suspend scenario
1987d116dccSCC Ma */
1997d116dccSCC Ma static const struct pcm_desc suspend_pcm_ca7 = {
200cc04b843SJimmy Huang .version = "pcm_suspend_20150917_V4",
2017d116dccSCC Ma .base = suspend_binary_ca7,
202cc04b843SJimmy Huang .size = 869,
2037d116dccSCC Ma .sess = 2,
2047d116dccSCC Ma .replace = 0,
2057d116dccSCC Ma .vec0 = EVENT_VEC(11, 1, 0, 0),
206cc04b843SJimmy Huang .vec1 = EVENT_VEC(12, 1, 0, 61),
207cc04b843SJimmy Huang .vec2 = EVENT_VEC(30, 1, 0, 150),
208cc04b843SJimmy Huang .vec3 = EVENT_VEC(31, 1, 0, 287),
2097d116dccSCC Ma };
2107d116dccSCC Ma
2117d116dccSCC Ma /*
2127d116dccSCC Ma * SPM settings for suspend scenario
2137d116dccSCC Ma */
2147d116dccSCC Ma static struct pwr_ctrl spm_ctrl = {
2157d116dccSCC Ma .wake_src = WAKE_SRC_FOR_SUSPEND,
2167d116dccSCC Ma .wake_src_md32 = WAKE_SRC_FOR_MD32,
2177d116dccSCC Ma .r0_ctrl_en = 1,
2187d116dccSCC Ma .r7_ctrl_en = 1,
2197d116dccSCC Ma .infra_dcm_lock = 1,
2207d116dccSCC Ma .wfi_op = WFI_OP_AND,
2217d116dccSCC Ma .pcm_apsrc_req = 0,
2227d116dccSCC Ma .ca7top_idle_mask = 0,
2237d116dccSCC Ma .ca15top_idle_mask = 0,
2247d116dccSCC Ma .mcusys_idle_mask = 0,
2257d116dccSCC Ma .disp_req_mask = 0,
2267d116dccSCC Ma .mfg_req_mask = 0,
2277d116dccSCC Ma .md32_req_mask = 1,
2287d116dccSCC Ma .srclkenai_mask = 1,
2297d116dccSCC Ma .ca7_wfi0_en = 1,
2307d116dccSCC Ma .ca7_wfi1_en = 1,
2317d116dccSCC Ma .ca7_wfi2_en = 1,
2327d116dccSCC Ma .ca7_wfi3_en = 1,
2337d116dccSCC Ma .ca15_wfi0_en = 1,
2347d116dccSCC Ma .ca15_wfi1_en = 1,
2357d116dccSCC Ma .ca15_wfi2_en = 1,
2367d116dccSCC Ma .ca15_wfi3_en = 1,
2377d116dccSCC Ma };
2387d116dccSCC Ma
2397d116dccSCC Ma /*
2407d116dccSCC Ma * go_to_sleep_before_wfi() - trigger SPM to enter suspend scenario
2417d116dccSCC Ma */
go_to_sleep_before_wfi(const unsigned int flags_spm)242*b7f6525dSJustin Chadwell static void go_to_sleep_before_wfi(const unsigned int flags_spm)
2437d116dccSCC Ma {
2447d116dccSCC Ma struct pwr_ctrl *pwrctrl;
2457d116dccSCC Ma
2467d116dccSCC Ma pwrctrl = &spm_ctrl;
2477d116dccSCC Ma
248*b7f6525dSJustin Chadwell set_pwrctrl_pcm_flags(pwrctrl, flags_spm);
2497d116dccSCC Ma
2507d116dccSCC Ma spm_set_sysclk_settle();
2517d116dccSCC Ma
2527d116dccSCC Ma INFO("sec = %u, wakesrc = 0x%x (%u)(%u)\n",
2537d116dccSCC Ma pwrctrl->timer_val, pwrctrl->wake_src,
2547d116dccSCC Ma is_cpu_pdn(pwrctrl->pcm_flags),
2557d116dccSCC Ma is_infra_pdn(pwrctrl->pcm_flags));
2567d116dccSCC Ma
2577d116dccSCC Ma spm_reset_and_init_pcm();
2587d116dccSCC Ma spm_init_pcm_register();
2597d116dccSCC Ma spm_set_power_control(pwrctrl);
2607d116dccSCC Ma spm_set_wakeup_event(pwrctrl);
2617d116dccSCC Ma spm_kick_pcm_to_run(pwrctrl);
2627d116dccSCC Ma spm_init_event_vector(&suspend_pcm_ca7);
2637d116dccSCC Ma spm_kick_im_to_fetch(&suspend_pcm_ca7);
2647d116dccSCC Ma }
2657d116dccSCC Ma
2667d116dccSCC Ma /*
2677d116dccSCC Ma * go_to_sleep_after_wfi() - get wakeup reason after
2687d116dccSCC Ma * leaving suspend scenario and clean up SPM settings
2697d116dccSCC Ma */
go_to_sleep_after_wfi(void)2707d116dccSCC Ma static enum wake_reason_t go_to_sleep_after_wfi(void)
2717d116dccSCC Ma {
2727d116dccSCC Ma struct wake_status wakesta;
2737d116dccSCC Ma static enum wake_reason_t last_wr = WR_NONE;
2747d116dccSCC Ma
2757d116dccSCC Ma spm_get_wakeup_status(&wakesta);
2767d116dccSCC Ma spm_clean_after_wakeup();
2777d116dccSCC Ma last_wr = spm_output_wake_reason(&wakesta);
2787d116dccSCC Ma
2797d116dccSCC Ma return last_wr;
2807d116dccSCC Ma }
2817d116dccSCC Ma
bigcore_pll_on(void)282b99d961cSJimmy Huang static void bigcore_pll_on(void)
283b99d961cSJimmy Huang {
284b99d961cSJimmy Huang mmio_setbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_PWR_ON);
285b99d961cSJimmy Huang mmio_clrbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_ISO_EN);
286b99d961cSJimmy Huang mmio_setbits_32(ARMCA15PLL_CON0, ARMCA15PLL_EN);
287b99d961cSJimmy Huang }
288b99d961cSJimmy Huang
bigcore_pll_off(void)289b99d961cSJimmy Huang static void bigcore_pll_off(void)
290b99d961cSJimmy Huang {
291b99d961cSJimmy Huang mmio_clrbits_32(ARMCA15PLL_CON0, ARMCA15PLL_EN);
292b99d961cSJimmy Huang mmio_setbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_ISO_EN);
293b99d961cSJimmy Huang mmio_clrbits_32(ARMCA15PLL_PWR_CON0, ARMCA15PLL_PWR_ON);
294b99d961cSJimmy Huang }
295b99d961cSJimmy Huang
spm_system_suspend(void)2967d116dccSCC Ma void spm_system_suspend(void)
2977d116dccSCC Ma {
298b99d961cSJimmy Huang bigcore_pll_off();
2997d116dccSCC Ma spm_lock_get();
3007d116dccSCC Ma go_to_sleep_before_wfi(spm_flags);
3017d116dccSCC Ma set_suspend_ready();
3027d116dccSCC Ma spm_lock_release();
3037d116dccSCC Ma }
3047d116dccSCC Ma
spm_system_suspend_finish(void)3057d116dccSCC Ma void spm_system_suspend_finish(void)
3067d116dccSCC Ma {
3077d116dccSCC Ma spm_lock_get();
3087d116dccSCC Ma spm_wake_reason = go_to_sleep_after_wfi();
3097d116dccSCC Ma INFO("spm_wake_reason=%d\n", spm_wake_reason);
3107d116dccSCC Ma clear_all_ready();
3117d116dccSCC Ma spm_lock_release();
312b99d961cSJimmy Huang bigcore_pll_on();
313b99d961cSJimmy Huang /* Add 20us delay for turning on PLL*/
314b99d961cSJimmy Huang udelay(20);
3157d116dccSCC Ma }
316