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
This commit is contained in:
commit
8fdebc945d
|
@ -16,6 +16,7 @@
|
|||
#include <lib/coreboot.h>
|
||||
|
||||
/* Platform Includes */
|
||||
#include <emi_mpu/emi_mpu.h>
|
||||
#include <gpio/mtgpio.h>
|
||||
#include <mt_gic_v3.h>
|
||||
#include <mt_timer.h>
|
||||
|
@ -89,6 +90,9 @@ void bl31_platform_setup(void)
|
|||
ERROR("Failed to set default dcm on!!\n");
|
||||
}
|
||||
|
||||
/* MPU Init */
|
||||
emi_mpu_init();
|
||||
|
||||
/* Initialize the GIC driver, CPU and distributor interfaces */
|
||||
mt_gic_driver_init();
|
||||
mt_gic_init();
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* 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(®ion_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(®ion_info);
|
||||
|
||||
dump_emi_mpu_regions();
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* 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)
|
|||
{
|
||||
unsigned int _core;
|
||||
|
||||
if (core >= PTP3_CFG1_CPU_START_ID) {
|
||||
if (core < NR_PTP3_CFG1_CPU) {
|
||||
/* update ptp3_cfg1 */
|
||||
ptp3_write(
|
||||
ptp3_cfg1[core][PTP3_CFG_ADDR],
|
||||
ptp3_cfg1[core][PTP3_CFG_VALUE]);
|
||||
}
|
||||
/* Apply ptp3_cfg1 for core 0 to 7 */
|
||||
if (core < NR_PTP3_CFG1_CPU) {
|
||||
/* update ptp3_cfg1 */
|
||||
ptp3_write(
|
||||
ptp3_cfg1[core][PTP3_CFG_ADDR],
|
||||
ptp3_cfg1[core][PTP3_CFG_VALUE]);
|
||||
}
|
||||
|
||||
/* Apply ptp3_cfg2 for core 4 to 7 */
|
||||
if (core >= PTP3_CFG2_CPU_START_ID) {
|
||||
_core = core - PTP3_CFG2_CPU_START_ID;
|
||||
|
||||
|
@ -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) {
|
||||
_core = core - PTP3_CFG3_CPU_START_ID;
|
||||
|
||||
|
@ -73,13 +74,11 @@ void ptp3_init(unsigned int core)
|
|||
|
||||
void ptp3_deinit(unsigned int core)
|
||||
{
|
||||
if (core >= PTP3_CFG1_CPU_START_ID) {
|
||||
if (core < NR_PTP3_CFG1_CPU) {
|
||||
/* update ptp3_cfg1 */
|
||||
ptp3_write(
|
||||
ptp3_cfg1[core][PTP3_CFG_ADDR],
|
||||
ptp3_cfg1[core][PTP3_CFG_VALUE] &
|
||||
~PTP3_CFG1_MASK);
|
||||
}
|
||||
if (core < NR_PTP3_CFG1_CPU) {
|
||||
/* update ptp3_cfg1 */
|
||||
ptp3_write(
|
||||
ptp3_cfg1[core][PTP3_CFG_ADDR],
|
||||
ptp3_cfg1[core][PTP3_CFG_VALUE] &
|
||||
~PTP3_CFG1_MASK);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* 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 @@
|
|||
#define GPIO_BASE (IO_PHYS + 0x00005000)
|
||||
#define SPM_BASE (IO_PHYS + 0x00006000)
|
||||
#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_BM_BASE (IO_PHYS + 0x01D10000)
|
||||
#define IOCFG_BL_BASE (IO_PHYS + 0x01D30000)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <plat_params.h>
|
||||
#include <plat_pm.h>
|
||||
#include <pmic.h>
|
||||
#include <rtc.h>
|
||||
|
||||
/*
|
||||
* Cluster state request:
|
||||
|
@ -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 cpu = plat_my_core_pos();
|
||||
|
||||
if (aff_lvl > PLAT_MAX_PWR_LVL) {
|
||||
return PSCI_E_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
if (pstate == PSTATE_TYPE_STANDBY) {
|
||||
req_state->pwr_domain_state[0] = PLAT_MAX_RET_STATE;
|
||||
} else {
|
||||
|
@ -345,6 +342,7 @@ static void __dead2 plat_mtk_system_off(void)
|
|||
{
|
||||
INFO("MTK System Off\n");
|
||||
|
||||
rtc_power_off_sequence();
|
||||
pmic_power_off();
|
||||
|
||||
wfi();
|
||||
|
|
|
@ -11,10 +11,12 @@ PLAT_INCLUDES := -I${MTK_PLAT}/common/ \
|
|||
-I${MTK_PLAT_SOC}/include/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/dcm \
|
||||
-I${MTK_PLAT_SOC}/drivers/emi_mpu/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/gpio/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/mcdi/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/pmic/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/ptp3/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/rtc/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/spmc/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/timer/ \
|
||||
-I${MTK_PLAT_SOC}/drivers/uart/
|
||||
|
@ -38,6 +40,7 @@ BL31_SOURCES += common/desc_image_load.c \
|
|||
lib/cpus/aarch64/cortex_a76.S \
|
||||
plat/common/plat_gicv3.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/mtk_plat_common.c \
|
||||
${MTK_PLAT}/common/mtk_sip_svc.c \
|
||||
|
@ -46,6 +49,7 @@ BL31_SOURCES += common/desc_image_load.c \
|
|||
${MTK_PLAT_SOC}/aarch64/plat_helpers.S \
|
||||
${MTK_PLAT_SOC}/bl31_plat_setup.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_topology.c \
|
||||
${MTK_PLAT_SOC}/plat_mt_gic.c \
|
||||
|
@ -53,6 +57,7 @@ BL31_SOURCES += common/desc_image_load.c \
|
|||
${MTK_PLAT_SOC}/plat_sip_calls.c \
|
||||
${MTK_PLAT_SOC}/drivers/dcm/mtk_dcm.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/mcdi/mt_cpu_pm.c \
|
||||
${MTK_PLAT_SOC}/drivers/mcdi/mt_cpu_pm_cpc.c \
|
||||
|
|
Loading…
Reference in New Issue