Commit 8fdebc94 authored by Madhukar Pappireddy's avatar Madhukar Pappireddy Committed by TrustedFirmware Code Review
Browse files

Merge changes I65450c63,I71d0aa82,Ia395eb32,I4aaed371 into integration

* changes:
  mediatek: mt8192: add rtc power off sequence
  mediatek: mt8192: Fix non-MISRA compliant code
  mediatek: mt8192: Fix non-MISRA compliant code
  mediatek: mt8192: Add MPU support
parents fe7366ab b686d330
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <lib/coreboot.h> #include <lib/coreboot.h>
/* Platform Includes */ /* Platform Includes */
#include <emi_mpu/emi_mpu.h>
#include <gpio/mtgpio.h> #include <gpio/mtgpio.h>
#include <mt_gic_v3.h> #include <mt_gic_v3.h>
#include <mt_timer.h> #include <mt_timer.h>
...@@ -89,6 +90,9 @@ void bl31_platform_setup(void) ...@@ -89,6 +90,9 @@ void bl31_platform_setup(void)
ERROR("Failed to set default dcm on!!\n"); ERROR("Failed to set default dcm on!!\n");
} }
/* MPU Init */
emi_mpu_init();
/* Initialize the GIC driver, CPU and distributor interfaces */ /* Initialize the GIC driver, CPU and distributor interfaces */
mt_gic_driver_init(); mt_gic_driver_init();
mt_gic_init(); mt_gic_init();
......
/*
* Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common/debug.h>
#include <emi_mpu.h>
#include <lib/mmio.h>
/*
* emi_mpu_set_region_protection: protect a region.
* @start: start address of the region
* @end: end address of the region
* @access_permission: EMI MPU access permission
* Return 0 for success, otherwise negative status code.
*/
static int _emi_mpu_set_protection(
unsigned long start, unsigned long end,
unsigned int apc)
{
unsigned int dgroup;
unsigned int region;
region = (start >> 24) & 0xFF;
start &= 0x00FFFFFF;
dgroup = (end >> 24) & 0xFF;
end &= 0x00FFFFFF;
if ((region >= EMI_MPU_REGION_NUM) || (dgroup > EMI_MPU_DGROUP_NUM)) {
WARN("Region:%u or dgroup:%u is wrong!\n", region, dgroup);
return -1;
}
apc &= 0x80FFFFFF;
if ((start >= DRAM_OFFSET) && (end >= start)) {
start -= DRAM_OFFSET;
end -= DRAM_OFFSET;
} else {
WARN("start:0x%lx or end:0x%lx address is wrong!\n",
start, end);
return -2;
}
mmio_write_32(EMI_MPU_SA(region), start);
mmio_write_32(EMI_MPU_EA(region), end);
mmio_write_32(EMI_MPU_APC(region, dgroup), apc);
return 0;
}
void dump_emi_mpu_regions(void)
{
unsigned long apc[EMI_MPU_DGROUP_NUM], sa, ea;
int region, i;
/* Only dump 8 regions(max: EMI_MPU_REGION_NUM --> 32) */
for (region = 0; region < 8; ++region) {
for (i = 0; i < EMI_MPU_DGROUP_NUM; ++i)
apc[i] = mmio_read_32(EMI_MPU_APC(region, i));
sa = mmio_read_32(EMI_MPU_SA(region));
ea = mmio_read_32(EMI_MPU_EA(region));
WARN("region %d:\n", region);
WARN("\tsa:0x%lx, ea:0x%lx, apc0: 0x%lx apc1: 0x%lx\n",
sa, ea, apc[0], apc[1]);
}
}
int emi_mpu_set_protection(struct emi_region_info_t *region_info)
{
unsigned long start, end;
int i;
if (region_info->region >= EMI_MPU_REGION_NUM)
return -1;
start = (unsigned long)(region_info->start >> EMI_MPU_ALIGN_BITS) |
(region_info->region << 24);
for (i = EMI_MPU_DGROUP_NUM - 1; i >= 0; i--) {
end = (unsigned long)(region_info->end >> EMI_MPU_ALIGN_BITS) |
(i << 24);
_emi_mpu_set_protection(start, end, region_info->apc[i]);
}
return 0;
}
void emi_mpu_init(void)
{
/* Set permission */
struct emi_region_info_t region_info;
/* PCE-e protect address(TODO) */
region_info.start = 0x80000000ULL;
region_info.end = 0x83FF0000ULL;
region_info.region = 1;
SET_ACCESS_PERMISSION(region_info.apc, 1,
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,
FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,
FORBIDDEN, FORBIDDEN, NO_PROT,
NO_PROT /*FORBIDDEN*/);
emi_mpu_set_protection(&region_info);
/* Forbidden All */
region_info.start = 0x40000000ULL; /* dram base addr */
region_info.end = 0x1FFFF0000ULL;
region_info.region = 2;
SET_ACCESS_PERMISSION(region_info.apc, 1,
NO_PROT, NO_PROT, NO_PROT, NO_PROT,
NO_PROT, NO_PROT, NO_PROT, NO_PROT,
NO_PROT, NO_PROT, NO_PROT, NO_PROT,
NO_PROT, FORBIDDEN, NO_PROT, NO_PROT);
emi_mpu_set_protection(&region_info);
dump_emi_mpu_regions();
}
/*
* Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef EMI_MPU_H
#define EMI_MPU_H
#include <platform_def.h>
#define EMI_MPUP (EMI_BASE + 0x01D8)
#define EMI_MPUQ (EMI_BASE + 0x01E0)
#define EMI_MPUR (EMI_BASE + 0x01E8)
#define EMI_MPUS (EMI_BASE + 0x01F0)
#define EMI_MPUT (EMI_BASE + 0x01F8)
#define EMI_MPUY (EMI_BASE + 0x0220)
#define EMI_MPU_CTRL (EMI_MPU_BASE + 0x0000)
#define EMI_MPUD0_ST (EMI_BASE + 0x0160)
#define EMI_MPUD1_ST (EMI_BASE + 0x0164)
#define EMI_MPUD2_ST (EMI_BASE + 0x0168)
#define EMI_MPUD3_ST (EMI_BASE + 0x016C)
#define EMI_MPUD0_ST2 (EMI_BASE + 0x0200)
#define EMI_MPUD1_ST2 (EMI_BASE + 0x0204)
#define EMI_MPUD2_ST2 (EMI_BASE + 0x0208)
#define EMI_MPUD3_ST2 (EMI_BASE + 0x020C)
#define EMI_PHY_OFFSET (0x40000000UL)
#define NO_PROT (0)
#define SEC_RW (1)
#define SEC_RW_NSEC_R (2)
#define SEC_RW_NSEC_W (3)
#define SEC_R_NSEC_R (4)
#define FORBIDDEN (5)
#define SEC_R_NSEC_RW (6)
#define SECURE_OS_MPU_REGION_ID (0)
#define ATF_MPU_REGION_ID (1)
#define EMI_MPU_SA0 (EMI_MPU_BASE + 0x100)
#define EMI_MPU_EA0 (EMI_MPU_BASE + 0x200)
#define EMI_MPU_SA(region) (EMI_MPU_SA0 + (region) * 4)
#define EMI_MPU_EA(region) (EMI_MPU_EA0 + (region) * 4)
#define EMI_MPU_APC0 (EMI_MPU_BASE + 0x300)
#define EMI_MPU_APC(region, dgroup) (EMI_MPU_APC0 + (region) * 4 + \
(dgroup) * 0x100)
#define EMI_MPU_CTRL_D0 (EMI_MPU_BASE + 0x800)
#define EMI_MPU_CTRL_D(domain) (EMI_MPU_CTRL_D0 + domain * 4)
#define EMI_RG_MASK_D0 (EMI_MPU_BASE + 0x900)
#define EMI_RG_MASK_D(domain) (EMI_RG_MASK_D0 + domain * 4)
#define EMI_MPU_DOMAIN_NUM 16
#define EMI_MPU_REGION_NUM 32
#define EMI_MPU_ALIGN_BITS 16
#define DRAM_OFFSET (0x40000000 >> EMI_MPU_ALIGN_BITS)
#define EMI_MPU_DGROUP_NUM (EMI_MPU_DOMAIN_NUM / 8)
#if (EMI_MPU_DGROUP_NUM == 1)
#define SET_ACCESS_PERMISSION(apc_ary, lock, d7, d6, d5, d4, d3, d2, d1, d0) \
do { \
apc_ary[0] = 0; \
apc_ary[0] = \
(((unsigned int) d7) << 21) | (((unsigned int) d6) << 18) \
| (((unsigned int) d5) << 15) | (((unsigned int) d4) << 12) \
| (((unsigned int) d3) << 9) | (((unsigned int) d2) << 6) \
| (((unsigned int) d1) << 3) | ((unsigned int) d0) \
| (((unsigned int) lock) << 31); \
} while (0)
#elif (EMI_MPU_DGROUP_NUM == 2)
#define SET_ACCESS_PERMISSION(apc_ary, lock, d15, d14, d13, d12, d11, d10, \
d9, d8, d7, d6, d5, d4, d3, d2, d1, d0) \
do { \
apc_ary[1] = \
(((unsigned int) d15) << 21) | (((unsigned int) d14) << 18) \
| (((unsigned int) d13) << 15) | (((unsigned int) d12) << 12) \
| (((unsigned int) d11) << 9) | (((unsigned int) d10) << 6) \
| (((unsigned int) d9) << 3) | ((unsigned int) d8); \
apc_ary[0] = \
(((unsigned int) d7) << 21) | (((unsigned int) d6) << 18) \
| (((unsigned int) d5) << 15) | (((unsigned int) d4) << 12) \
| (((unsigned int) d3) << 9) | (((unsigned int) d2) << 6) \
| (((unsigned int) d1) << 3) | ((unsigned int) d0) \
| (((unsigned int) lock) << 31); \
} while (0)
#endif
struct emi_region_info_t {
unsigned long long start;
unsigned long long end;
unsigned int region;
unsigned long apc[EMI_MPU_DGROUP_NUM];
};
void emi_mpu_init(void);
int emi_mpu_set_protection(struct emi_region_info_t *region_info);
void dump_emi_mpu_regions(void);
#endif /* __EMI_MPU_H */
...@@ -39,15 +39,15 @@ void ptp3_init(unsigned int core) ...@@ -39,15 +39,15 @@ void ptp3_init(unsigned int core)
{ {
unsigned int _core; unsigned int _core;
if (core >= PTP3_CFG1_CPU_START_ID) { /* Apply ptp3_cfg1 for core 0 to 7 */
if (core < NR_PTP3_CFG1_CPU) { if (core < NR_PTP3_CFG1_CPU) {
/* update ptp3_cfg1 */ /* update ptp3_cfg1 */
ptp3_write( ptp3_write(
ptp3_cfg1[core][PTP3_CFG_ADDR], ptp3_cfg1[core][PTP3_CFG_ADDR],
ptp3_cfg1[core][PTP3_CFG_VALUE]); ptp3_cfg1[core][PTP3_CFG_VALUE]);
} }
}
/* Apply ptp3_cfg2 for core 4 to 7 */
if (core >= PTP3_CFG2_CPU_START_ID) { if (core >= PTP3_CFG2_CPU_START_ID) {
_core = core - PTP3_CFG2_CPU_START_ID; _core = core - PTP3_CFG2_CPU_START_ID;
...@@ -59,6 +59,7 @@ void ptp3_init(unsigned int core) ...@@ -59,6 +59,7 @@ void ptp3_init(unsigned int core)
} }
} }
/* Apply ptp3_cfg3 for core 4 to 7 */
if (core >= PTP3_CFG3_CPU_START_ID) { if (core >= PTP3_CFG3_CPU_START_ID) {
_core = core - PTP3_CFG3_CPU_START_ID; _core = core - PTP3_CFG3_CPU_START_ID;
...@@ -73,7 +74,6 @@ void ptp3_init(unsigned int core) ...@@ -73,7 +74,6 @@ void ptp3_init(unsigned int core)
void ptp3_deinit(unsigned int core) void ptp3_deinit(unsigned int core)
{ {
if (core >= PTP3_CFG1_CPU_START_ID) {
if (core < NR_PTP3_CFG1_CPU) { if (core < NR_PTP3_CFG1_CPU) {
/* update ptp3_cfg1 */ /* update ptp3_cfg1 */
ptp3_write( ptp3_write(
...@@ -81,5 +81,4 @@ void ptp3_deinit(unsigned int core) ...@@ -81,5 +81,4 @@ void ptp3_deinit(unsigned int core)
ptp3_cfg1[core][PTP3_CFG_VALUE] & ptp3_cfg1[core][PTP3_CFG_VALUE] &
~PTP3_CFG1_MASK); ~PTP3_CFG1_MASK);
} }
}
} }
/*
* Copyright (c) 2020, MediaTek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common/debug.h>
#include <drivers/delay_timer.h>
#include <rtc.h>
static void RTC_Config_Interface(uint32_t addr, uint16_t data,
uint16_t mask, uint16_t shift)
{
uint16_t pmic_reg;
pmic_reg = RTC_Read(addr);
pmic_reg &= ~(mask << shift);
pmic_reg |= (data << shift);
RTC_Write(addr, pmic_reg);
}
static int32_t rtc_disable_2sec_reboot(void)
{
uint16_t reboot;
reboot = (RTC_Read(RTC_AL_SEC) & ~RTC_BBPU_2SEC_EN) &
~RTC_BBPU_AUTO_PDN_SEL;
RTC_Write(RTC_AL_SEC, reboot);
return RTC_Write_Trigger();
}
static int32_t rtc_enable_k_eosc(void)
{
uint16_t alm_dow, alm_sec;
int16_t ret;
/* Turning on eosc cali mode clock */
RTC_Config_Interface(PMIC_RG_SCK_TOP_CKPDN_CON0_CLR, 1,
PMIC_RG_RTC_EOSC32_CK_PDN_MASK,
PMIC_RG_RTC_EOSC32_CK_PDN_SHIFT);
alm_sec = RTC_Read(RTC_AL_SEC) & (~RTC_LPD_OPT_MASK);
RTC_Write(RTC_AL_SEC, alm_sec);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
RTC_Write(RTC_CON, RTC_LPD_EN);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
RTC_Write(RTC_CON, RTC_LPD_RST);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
RTC_Write(RTC_CON, RTC_LPD_EN);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
RTC_Write(RTC_POWERKEY1, RTC_POWERKEY1_KEY);
RTC_Write(RTC_POWERKEY2, RTC_POWERKEY2_KEY);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
/* set RTC EOSC calibration period = 8sec */
alm_dow = (RTC_Read(RTC_AL_DOW) & (~RTC_RG_EOSC_CALI_TD_MASK)) |
RTC_RG_EOSC_CALI_TD_8SEC;
RTC_Write(RTC_AL_DOW, alm_dow);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
RTC_Write(RTC_BBPU,
RTC_Read(RTC_BBPU) | RTC_BBPU_KEY | RTC_BBPU_RELOAD);
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
/* Enable K EOSC mode :use solution1 of eosc cali to fix mt6359p 32K*/
RTC_Write(RTC_AL_YEA, (((RTC_Read(RTC_AL_YEA) | RTC_K_EOSC_RSV_0)
& (~RTC_K_EOSC_RSV_1)) | (RTC_K_EOSC_RSV_2)));
ret = RTC_Write_Trigger();
if (ret == 0) {
return 0;
}
INFO("[RTC] RTC_enable_k_eosc\n");
return 1;
}
void rtc_power_off_sequence(void)
{
uint16_t bbpu;
int16_t ret;
ret = rtc_disable_2sec_reboot();
if (ret == 0) {
return;
}
ret = rtc_enable_k_eosc();
if (ret == 0) {
return;
}
bbpu = RTC_BBPU_KEY | RTC_BBPU_PWREN;
if (Writeif_unlock() != 0) {
RTC_Write(RTC_BBPU,
bbpu | RTC_BBPU_RESET_ALARM | RTC_BBPU_RESET_SPAR);
RTC_Write(RTC_AL_MASK, RTC_AL_MASK_DOW);
ret = RTC_Write_Trigger();
if (ret == 0) {
return;
}
mdelay(1);
bbpu = RTC_Read(RTC_BBPU);
if (((bbpu & RTC_BBPU_RESET_ALARM) > 0) ||
((bbpu & RTC_BBPU_RESET_SPAR) > 0)) {
INFO("[RTC] timeout\n");
}
bbpu = RTC_Read(RTC_BBPU) | RTC_BBPU_KEY | RTC_BBPU_RELOAD;
RTC_Write(RTC_BBPU, bbpu);
ret = RTC_Write_Trigger();
if (ret == 0) {
return;
}
}
}
/*
* Copyright (c) 2020, MediaTek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef RTC_H
#define RTC_H
/* RTC registers */
enum {
RTC_BBPU = 0x0588,
RTC_IRQ_STA = 0x058A,
RTC_IRQ_EN = 0x058C,
RTC_CII_EN = 0x058E
};
enum {
RTC_AL_SEC = 0x05A0,
RTC_AL_MIN = 0x05A2,
RTC_AL_HOU = 0x05A4,
RTC_AL_DOM = 0x05A6,
RTC_AL_DOW = 0x05A8,
RTC_AL_MTH = 0x05AA,
RTC_AL_YEA = 0x05AC,
RTC_AL_MASK = 0x0590
};
enum {
RTC_OSC32CON = 0x05AE,
RTC_CON = 0x05C4,
RTC_WRTGR = 0x05C2
};
enum {
RTC_POWERKEY1 = 0x05B0,
RTC_POWERKEY2 = 0x05B2
};
enum {
RTC_POWERKEY1_KEY = 0xA357,
RTC_POWERKEY2_KEY = 0x67D2
};
enum {
RTC_PDN1 = 0x05B4,
RTC_PDN2 = 0x05B6,
RTC_SPAR0 = 0x05B8,
RTC_SPAR1 = 0x05BA,
RTC_PROT = 0x05BC,
RTC_DIFF = 0x05BE,
RTC_CALI = 0x05C0
};
enum {
RTC_OSC32CON_UNLOCK1 = 0x1A57,
RTC_OSC32CON_UNLOCK2 = 0x2B68
};
enum {
RTC_LPD_EN = 0x0406,
RTC_LPD_RST = 0x040E
};
enum {
RTC_LPD_OPT_XOSC_AND_EOSC_LPD = 0U << 13,
RTC_LPD_OPT_EOSC_LPD = 1U << 13,
RTC_LPD_OPT_XOSC_LPD = 2U << 13,
RTC_LPD_OPT_F32K_CK_ALIVE = 3U << 13,
};
#define RTC_LPD_OPT_MASK (3U << 13)
enum {
RTC_PROT_UNLOCK1 = 0x586A,
RTC_PROT_UNLOCK2 = 0x9136
};
enum {
RTC_BBPU_PWREN = 1U << 0,
RTC_BBPU_SPAR_SW = 1U << 1,
RTC_BBPU_RESET_SPAR = 1U << 2,
RTC_BBPU_RESET_ALARM = 1U << 3,
RTC_BBPU_CLRPKY = 1U << 4,
RTC_BBPU_RELOAD = 1U << 5,
RTC_BBPU_CBUSY = 1U << 6
};
enum {
RTC_AL_MASK_SEC = 1U << 0,
RTC_AL_MASK_MIN = 1U << 1,
RTC_AL_MASK_HOU = 1U << 2,
RTC_AL_MASK_DOM = 1U << 3,
RTC_AL_MASK_DOW = 1U << 4,
RTC_AL_MASK_MTH = 1U << 5,
RTC_AL_MASK_YEA = 1U << 6
};
enum {
RTC_BBPU_AUTO_PDN_SEL = 1U << 6,
RTC_BBPU_2SEC_CK_SEL = 1U << 7,
RTC_BBPU_2SEC_EN = 1U << 8,
RTC_BBPU_2SEC_MODE = 0x3 << 9,
RTC_BBPU_2SEC_STAT_CLEAR = 1U << 11,
RTC_BBPU_2SEC_STAT_STA = 1U << 12
};
enum {
RTC_BBPU_KEY = 0x43 << 8
};
enum {
RTC_EMBCK_SRC_SEL = 1 << 8,
RTC_EMBCK_SEL_MODE = 3 << 6,
RTC_XOSC32_ENB = 1 << 5,
RTC_REG_XOSC32_ENB = 1 << 15
};
enum {
RTC_K_EOSC_RSV_0 = 1 << 8,
RTC_K_EOSC_RSV_1 = 1 << 9,
RTC_K_EOSC_RSV_2 = 1 << 10
};
enum {
RTC_RG_EOSC_CALI_TD_1SEC = 3 << 5,
RTC_RG_EOSC_CALI_TD_2SEC = 4 << 5,
RTC_RG_EOSC_CALI_TD_4SEC = 5 << 5,
RTC_RG_EOSC_CALI_TD_8SEC = 6 << 5,
RTC_RG_EOSC_CALI_TD_16SEC = 7 << 5,
RTC_RG_EOSC_CALI_TD_MASK = 7 << 5
};
/* PMIC TOP Register Definition */
enum {
PMIC_RG_TOP_CON = 0x0020,
PMIC_RG_TOP_CKPDN_CON1 = 0x0112,
PMIC_RG_TOP_CKPDN_CON1_SET = 0x0114,
PMIC_RG_TOP_CKPDN_CON1_CLR = 0x0116,
PMIC_RG_TOP_CKSEL_CON0 = 0x0118,
PMIC_RG_TOP_CKSEL_CON0_SET = 0x011A,
PMIC_RG_TOP_CKSEL_CON0_CLR = 0x011C
};
/* PMIC SCK Register Definition */
enum {
PMIC_RG_SCK_TOP_CKPDN_CON0 = 0x0514,
PMIC_RG_SCK_TOP_CKPDN_CON0_SET = 0x0516,
PMIC_RG_SCK_TOP_CKPDN_CON0_CLR = 0x0518,
PMIC_RG_EOSC_CALI_CON0 = 0x53A
};
enum {
PMIC_EOSC_CALI_START_ADDR = 0x53A
};
enum {
PMIC_EOSC_CALI_START_MASK = 0x1,
PMIC_EOSC_CALI_START_SHIFT = 0
};
/* PMIC DCXO Register Definition */
enum {
PMIC_RG_DCXO_CW00 = 0x0788,
PMIC_RG_DCXO_CW02 = 0x0790,
PMIC_RG_DCXO_CW08 = 0x079C,
PMIC_RG_DCXO_CW09 = 0x079E,
PMIC_RG_DCXO_CW09_CLR = 0x07A2,
PMIC_RG_DCXO_CW10 = 0x07A4,
PMIC_RG_DCXO_CW12 = 0x07A8,
PMIC_RG_DCXO_CW13 = 0x07AA,
PMIC_RG_DCXO_CW15 = 0x07AE,
PMIC_RG_DCXO_CW19 = 0x07B6,
};
enum {
PMIC_RG_SRCLKEN_IN0_HW_MODE_MASK = 0x1,
PMIC_RG_SRCLKEN_IN0_HW_MODE_SHIFT = 1,
PMIC_RG_SRCLKEN_IN1_HW_MODE_MASK = 0x1,
PMIC_RG_SRCLKEN_IN1_HW_MODE_SHIFT = 3,
PMIC_RG_RTC_EOSC32_CK_PDN_MASK = 0x1,
PMIC_RG_RTC_EOSC32_CK_PDN_SHIFT = 2,
PMIC_RG_EOSC_CALI_TD_MASK = 0x7,
PMIC_RG_EOSC_CALI_TD_SHIFT = 5,
PMIC_RG_XO_EN32K_MAN_MASK = 0x1,
PMIC_RG_XO_EN32K_MAN_SHIFT = 0
};
/* external API */
uint16_t RTC_Read(uint32_t addr);
void RTC_Write(uint32_t addr, uint16_t data);
int32_t rtc_busy_wait(void);
int32_t RTC_Write_Trigger(void);
int32_t Writeif_unlock(void);
void rtc_power_off_sequence(void);
#endif /* RTC_H */
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#define GPIO_BASE (IO_PHYS + 0x00005000) #define GPIO_BASE (IO_PHYS + 0x00005000)
#define SPM_BASE (IO_PHYS + 0x00006000) #define SPM_BASE (IO_PHYS + 0x00006000)
#define PMIC_WRAP_BASE (IO_PHYS + 0x00026000) #define PMIC_WRAP_BASE (IO_PHYS + 0x00026000)
#define EMI_BASE (IO_PHYS + 0x00219000)
#define EMI_MPU_BASE (IO_PHYS + 0x00226000)
#define IOCFG_RM_BASE (IO_PHYS + 0x01C20000) #define IOCFG_RM_BASE (IO_PHYS + 0x01C20000)
#define IOCFG_BM_BASE (IO_PHYS + 0x01D10000) #define IOCFG_BM_BASE (IO_PHYS + 0x01D10000)
#define IOCFG_BL_BASE (IO_PHYS + 0x01D30000) #define IOCFG_BL_BASE (IO_PHYS + 0x01D30000)
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <plat_params.h> #include <plat_params.h>
#include <plat_pm.h> #include <plat_pm.h>
#include <pmic.h> #include <pmic.h>
#include <rtc.h>
/* /*
* Cluster state request: * Cluster state request:
...@@ -297,10 +298,6 @@ static int plat_validate_power_state(unsigned int power_state, ...@@ -297,10 +298,6 @@ static int plat_validate_power_state(unsigned int power_state,
unsigned int aff_lvl = psci_get_pstate_pwrlvl(power_state); unsigned int aff_lvl = psci_get_pstate_pwrlvl(power_state);
unsigned int cpu = plat_my_core_pos(); unsigned int cpu = plat_my_core_pos();
if (aff_lvl > PLAT_MAX_PWR_LVL) {
return PSCI_E_INVALID_PARAMS;
}
if (pstate == PSTATE_TYPE_STANDBY) { if (pstate == PSTATE_TYPE_STANDBY) {
req_state->pwr_domain_state[0] = PLAT_MAX_RET_STATE; req_state->pwr_domain_state[0] = PLAT_MAX_RET_STATE;
} else { } else {
...@@ -345,6 +342,7 @@ static void __dead2 plat_mtk_system_off(void) ...@@ -345,6 +342,7 @@ static void __dead2 plat_mtk_system_off(void)
{ {
INFO("MTK System Off\n"); INFO("MTK System Off\n");
rtc_power_off_sequence();
pmic_power_off(); pmic_power_off();
wfi(); wfi();
......
...@@ -11,10 +11,12 @@ PLAT_INCLUDES := -I${MTK_PLAT}/common/ \ ...@@ -11,10 +11,12 @@ PLAT_INCLUDES := -I${MTK_PLAT}/common/ \
-I${MTK_PLAT_SOC}/include/ \ -I${MTK_PLAT_SOC}/include/ \
-I${MTK_PLAT_SOC}/drivers/ \ -I${MTK_PLAT_SOC}/drivers/ \
-I${MTK_PLAT_SOC}/drivers/dcm \ -I${MTK_PLAT_SOC}/drivers/dcm \
-I${MTK_PLAT_SOC}/drivers/emi_mpu/ \
-I${MTK_PLAT_SOC}/drivers/gpio/ \ -I${MTK_PLAT_SOC}/drivers/gpio/ \
-I${MTK_PLAT_SOC}/drivers/mcdi/ \ -I${MTK_PLAT_SOC}/drivers/mcdi/ \
-I${MTK_PLAT_SOC}/drivers/pmic/ \ -I${MTK_PLAT_SOC}/drivers/pmic/ \
-I${MTK_PLAT_SOC}/drivers/ptp3/ \ -I${MTK_PLAT_SOC}/drivers/ptp3/ \
-I${MTK_PLAT_SOC}/drivers/rtc/ \
-I${MTK_PLAT_SOC}/drivers/spmc/ \ -I${MTK_PLAT_SOC}/drivers/spmc/ \
-I${MTK_PLAT_SOC}/drivers/timer/ \ -I${MTK_PLAT_SOC}/drivers/timer/ \
-I${MTK_PLAT_SOC}/drivers/uart/ -I${MTK_PLAT_SOC}/drivers/uart/
...@@ -38,6 +40,7 @@ BL31_SOURCES += common/desc_image_load.c \ ...@@ -38,6 +40,7 @@ BL31_SOURCES += common/desc_image_load.c \
lib/cpus/aarch64/cortex_a76.S \ lib/cpus/aarch64/cortex_a76.S \
plat/common/plat_gicv3.c \ plat/common/plat_gicv3.c \
${MTK_PLAT}/common/drivers/pmic_wrap/pmic_wrap_init_v2.c \ ${MTK_PLAT}/common/drivers/pmic_wrap/pmic_wrap_init_v2.c \
${MTK_PLAT}/common/drivers/rtc/rtc_common.c \
${MTK_PLAT}/common/drivers/uart/uart.c \ ${MTK_PLAT}/common/drivers/uart/uart.c \
${MTK_PLAT}/common/mtk_plat_common.c \ ${MTK_PLAT}/common/mtk_plat_common.c \
${MTK_PLAT}/common/mtk_sip_svc.c \ ${MTK_PLAT}/common/mtk_sip_svc.c \
...@@ -46,6 +49,7 @@ BL31_SOURCES += common/desc_image_load.c \ ...@@ -46,6 +49,7 @@ BL31_SOURCES += common/desc_image_load.c \
${MTK_PLAT_SOC}/aarch64/plat_helpers.S \ ${MTK_PLAT_SOC}/aarch64/plat_helpers.S \
${MTK_PLAT_SOC}/bl31_plat_setup.c \ ${MTK_PLAT_SOC}/bl31_plat_setup.c \
${MTK_PLAT_SOC}/drivers/pmic/pmic.c \ ${MTK_PLAT_SOC}/drivers/pmic/pmic.c \
${MTK_PLAT_SOC}/drivers/rtc/rtc.c \
${MTK_PLAT_SOC}/plat_pm.c \ ${MTK_PLAT_SOC}/plat_pm.c \
${MTK_PLAT_SOC}/plat_topology.c \ ${MTK_PLAT_SOC}/plat_topology.c \
${MTK_PLAT_SOC}/plat_mt_gic.c \ ${MTK_PLAT_SOC}/plat_mt_gic.c \
...@@ -53,6 +57,7 @@ BL31_SOURCES += common/desc_image_load.c \ ...@@ -53,6 +57,7 @@ BL31_SOURCES += common/desc_image_load.c \
${MTK_PLAT_SOC}/plat_sip_calls.c \ ${MTK_PLAT_SOC}/plat_sip_calls.c \
${MTK_PLAT_SOC}/drivers/dcm/mtk_dcm.c \ ${MTK_PLAT_SOC}/drivers/dcm/mtk_dcm.c \
${MTK_PLAT_SOC}/drivers/dcm/mtk_dcm_utils.c \ ${MTK_PLAT_SOC}/drivers/dcm/mtk_dcm_utils.c \
${MTK_PLAT_SOC}/drivers/emi_mpu/emi_mpu.c \
${MTK_PLAT_SOC}/drivers/gpio/mtgpio.c \ ${MTK_PLAT_SOC}/drivers/gpio/mtgpio.c \
${MTK_PLAT_SOC}/drivers/mcdi/mt_cpu_pm.c \ ${MTK_PLAT_SOC}/drivers/mcdi/mt_cpu_pm.c \
${MTK_PLAT_SOC}/drivers/mcdi/mt_cpu_pm_cpc.c \ ${MTK_PLAT_SOC}/drivers/mcdi/mt_cpu_pm_cpc.c \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment