blob: e0ba03750d13e8ac559da9779a9ba8c2d42f2cc7 [file] [log] [blame]
developer5f735162021-01-04 00:02:34 +08001/*
2 * Copyright (c) 2020, MediaTek Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stddef.h>
8
9#include <lib/mmio.h>
10
11#include <mt_spm_notifier.h>
12#include <mt_spm_sspm_intc.h>
13
14#define MT_SPM_SSPM_MBOX_OFF(x) (SSPM_MBOX_BASE + x)
15#define MT_SPM_MBOX(slot) MT_SPM_SSPM_MBOX_OFF((slot << 2UL))
16
17#define SSPM_MBOX_SPM_LP_LOOKUP1 MT_SPM_MBOX(0)
18#define SSPM_MBOX_SPM_LP_LOOKUP2 MT_SPM_MBOX(1)
19#define SSPM_MBOX_SPM_LP1 MT_SPM_MBOX(2)
20#define SSPM_MBOX_SPM_LP2 MT_SPM_MBOX(3)
21
22#define MCUPM_MBOX_OFFSET_LP 0x0C55FDA4
23#define MCUPM_MBOX_ENTER_LP 0x454e0000
24#define MCUPM_MBOX_LEAVE_LP 0x4c450000
25#define MCUPM_MBOX_SLEEP_MASK 0x0000FFFF
26
27int mt_spm_sspm_notify(int type, unsigned int lp_mode)
28{
29 switch (type) {
30 case MT_SPM_NOTIFY_LP_ENTER:
31 mmio_write_32(SSPM_MBOX_SPM_LP1, lp_mode);
32 mmio_write_32(MCUPM_MBOX_OFFSET_LP, MCUPM_MBOX_ENTER_LP |
33 (lp_mode & MCUPM_MBOX_SLEEP_MASK));
34 DO_SPM_SSPM_LP_SUSPEND();
35 break;
36 case MT_SPM_NOTIFY_LP_LEAVE:
37 mmio_write_32(SSPM_MBOX_SPM_LP1, lp_mode);
38 mmio_write_32(MCUPM_MBOX_OFFSET_LP, MCUPM_MBOX_LEAVE_LP |
39 (lp_mode & MCUPM_MBOX_SLEEP_MASK));
40 DO_SPM_SSPM_LP_RESUME();
41 break;
42 default:
43 break;
44 }
45
46 return 0;
47}