GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2022, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef PMIC_WRAP_INIT_H
|
||||
#define PMIC_WRAP_INIT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "platform_def.h"
|
||||
#include <pmic_wrap_init_common.h>
|
||||
|
||||
static struct mt8188_pmic_wrap_regs *const mtk_pwrap = (void *)PMIC_WRAP_BASE;
|
||||
|
||||
/* PMIC_WRAP registers */
|
||||
struct mt8188_pmic_wrap_regs {
|
||||
uint32_t init_done;
|
||||
uint32_t reserved[543];
|
||||
uint32_t wacs2_cmd;
|
||||
uint32_t wacs2_wdata;
|
||||
uint32_t reserved1[3];
|
||||
uint32_t wacs2_rdata;
|
||||
uint32_t reserved2[3];
|
||||
uint32_t wacs2_vldclr;
|
||||
uint32_t wacs2_sta;
|
||||
};
|
||||
|
||||
#endif /* PMIC_WRAP_INIT_H */
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* Copyright (c) 2019-2022, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <platform_def.h>
|
||||
#include <pmic_wrap_init.h>
|
||||
|
||||
/* pmic wrap module wait_idle and read polling interval (in microseconds) */
|
||||
enum {
|
||||
WAIT_IDLE_POLLING_DELAY_US = 1,
|
||||
READ_POLLING_DELAY_US = 2
|
||||
};
|
||||
|
||||
static inline uint32_t wait_for_state_idle(uint32_t timeout_us,
|
||||
void *wacs_register,
|
||||
void *wacs_vldclr_register,
|
||||
uint32_t *read_reg)
|
||||
{
|
||||
uint32_t reg_rdata;
|
||||
uint32_t retry;
|
||||
|
||||
retry = (timeout_us + WAIT_IDLE_POLLING_DELAY_US) /
|
||||
WAIT_IDLE_POLLING_DELAY_US;
|
||||
|
||||
do {
|
||||
udelay(WAIT_IDLE_POLLING_DELAY_US);
|
||||
reg_rdata = mmio_read_32((uintptr_t)wacs_register);
|
||||
/* if last read command timeout,clear vldclr bit
|
||||
* read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;
|
||||
* write:FSM_REQ-->idle
|
||||
*/
|
||||
switch (((reg_rdata >> RDATA_WACS_FSM_SHIFT) &
|
||||
RDATA_WACS_FSM_MASK)) {
|
||||
case WACS_FSM_WFVLDCLR:
|
||||
mmio_write_32((uintptr_t)wacs_vldclr_register, 1);
|
||||
ERROR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
|
||||
break;
|
||||
case WACS_FSM_WFDLE:
|
||||
ERROR("WACS_FSM = WACS_FSM_WFDLE\n");
|
||||
break;
|
||||
case WACS_FSM_REQ:
|
||||
ERROR("WACS_FSM = WACS_FSM_REQ\n");
|
||||
break;
|
||||
case WACS_FSM_IDLE:
|
||||
goto done;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
retry--;
|
||||
} while (retry);
|
||||
|
||||
done:
|
||||
if (!retry) /* timeout */
|
||||
return E_PWR_WAIT_IDLE_TIMEOUT;
|
||||
|
||||
if (read_reg)
|
||||
*read_reg = reg_rdata;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t wait_for_state_ready(uint32_t timeout_us,
|
||||
void *wacs_register,
|
||||
uint32_t *read_reg)
|
||||
{
|
||||
uint32_t reg_rdata;
|
||||
uint32_t retry;
|
||||
|
||||
retry = (timeout_us + READ_POLLING_DELAY_US) / READ_POLLING_DELAY_US;
|
||||
|
||||
do {
|
||||
udelay(READ_POLLING_DELAY_US);
|
||||
reg_rdata = mmio_read_32((uintptr_t)wacs_register);
|
||||
|
||||
if (((reg_rdata >> RDATA_WACS_FSM_SHIFT) & RDATA_WACS_FSM_MASK)
|
||||
== WACS_FSM_WFVLDCLR)
|
||||
break;
|
||||
|
||||
retry--;
|
||||
} while (retry);
|
||||
|
||||
if (!retry) { /* timeout */
|
||||
ERROR("timeout when waiting for idle\n");
|
||||
return E_PWR_WAIT_IDLE_TIMEOUT_READ;
|
||||
}
|
||||
|
||||
if (read_reg)
|
||||
*read_reg = reg_rdata;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t pwrap_wacs2(uint32_t write,
|
||||
uint32_t adr,
|
||||
uint32_t wdata,
|
||||
uint32_t *rdata,
|
||||
uint32_t init_check)
|
||||
{
|
||||
uint32_t reg_rdata = 0;
|
||||
uint32_t wacs_write = 0;
|
||||
uint32_t wacs_adr = 0;
|
||||
uint32_t wacs_cmd = 0;
|
||||
uint32_t return_value = 0;
|
||||
|
||||
if (init_check) {
|
||||
reg_rdata = mmio_read_32((uintptr_t)&mtk_pwrap->wacs2_rdata);
|
||||
/* Prevent someone to used pwrap before pwrap init */
|
||||
if (((reg_rdata >> RDATA_INIT_DONE_SHIFT) &
|
||||
RDATA_INIT_DONE_MASK) != WACS_INIT_DONE) {
|
||||
ERROR("initialization isn't finished\n");
|
||||
return E_PWR_NOT_INIT_DONE;
|
||||
}
|
||||
}
|
||||
reg_rdata = 0;
|
||||
/* Check IDLE in advance */
|
||||
return_value = wait_for_state_idle(TIMEOUT_WAIT_IDLE,
|
||||
&mtk_pwrap->wacs2_rdata,
|
||||
&mtk_pwrap->wacs2_vldclr,
|
||||
0);
|
||||
if (return_value != 0) {
|
||||
ERROR("wait_for_fsm_idle fail,return_value=%d\n", return_value);
|
||||
goto FAIL;
|
||||
}
|
||||
wacs_write = write << 31;
|
||||
wacs_adr = (adr >> 1) << 16;
|
||||
wacs_cmd = wacs_write | wacs_adr | wdata;
|
||||
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_cmd, wacs_cmd);
|
||||
if (write == 0) {
|
||||
if (rdata == NULL) {
|
||||
ERROR("rdata is a NULL pointer\n");
|
||||
return_value = E_PWR_INVALID_ARG;
|
||||
goto FAIL;
|
||||
}
|
||||
return_value = wait_for_state_ready(TIMEOUT_READ,
|
||||
&mtk_pwrap->wacs2_rdata,
|
||||
®_rdata);
|
||||
if (return_value != 0) {
|
||||
ERROR("wait_for_fsm_vldclr fail,return_value=%d\n",
|
||||
return_value);
|
||||
goto FAIL;
|
||||
}
|
||||
*rdata = ((reg_rdata >> RDATA_WACS_RDATA_SHIFT)
|
||||
& RDATA_WACS_RDATA_MASK);
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_vldclr, 1);
|
||||
}
|
||||
FAIL:
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/* external API for pmic_wrap user */
|
||||
|
||||
int32_t pwrap_read(uint32_t adr, uint32_t *rdata)
|
||||
{
|
||||
return pwrap_wacs2(0, adr, 0, rdata, 1);
|
||||
}
|
||||
|
||||
int32_t pwrap_write(uint32_t adr, uint32_t wdata)
|
||||
{
|
||||
return pwrap_wacs2(1, adr, wdata, 0, 1);
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2022, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef PMIC_WRAP_INIT_COMMON_H
|
||||
#define PMIC_WRAP_INIT_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "platform_def.h"
|
||||
|
||||
/* external API */
|
||||
int32_t pwrap_read(uint32_t adr, uint32_t *rdata);
|
||||
int32_t pwrap_write(uint32_t adr, uint32_t wdata);
|
||||
|
||||
#define GET_WACS_FSM(x) ((x >> 1) & 0x7)
|
||||
|
||||
/* macro for SWINF_FSM */
|
||||
#define SWINF_FSM_IDLE (0x00)
|
||||
#define SWINF_FSM_REQ (0x02)
|
||||
#define SWINF_FSM_WFDLE (0x04)
|
||||
#define SWINF_FSM_WFVLDCLR (0x06)
|
||||
#define SWINF_INIT_DONE (0x01)
|
||||
|
||||
/* timeout setting */
|
||||
#define PWRAP_READ_US (1000)
|
||||
#define PWRAP_WAIT_IDLE_US (1000)
|
||||
|
||||
/* error information flag */
|
||||
enum pwrap_errno {
|
||||
E_PWR_INVALID_ARG = 1,
|
||||
E_PWR_INVALID_RW = 2,
|
||||
E_PWR_INVALID_ADDR = 3,
|
||||
E_PWR_INVALID_WDAT = 4,
|
||||
E_PWR_INVALID_OP_MANUAL = 5,
|
||||
E_PWR_NOT_IDLE_STATE = 6,
|
||||
E_PWR_NOT_INIT_DONE = 7,
|
||||
E_PWR_NOT_INIT_DONE_READ = 8,
|
||||
E_PWR_WAIT_IDLE_TIMEOUT = 9,
|
||||
E_PWR_WAIT_IDLE_TIMEOUT_READ = 10,
|
||||
E_PWR_INIT_SIDLY_FAIL = 11,
|
||||
E_PWR_RESET_TIMEOUT = 12,
|
||||
E_PWR_TIMEOUT = 13,
|
||||
E_PWR_INIT_RESET_SPI = 20,
|
||||
E_PWR_INIT_SIDLY = 21,
|
||||
E_PWR_INIT_REG_CLOCK = 22,
|
||||
E_PWR_INIT_ENABLE_PMIC = 23,
|
||||
E_PWR_INIT_DIO = 24,
|
||||
E_PWR_INIT_CIPHER = 25,
|
||||
E_PWR_INIT_WRITE_TEST = 26,
|
||||
E_PWR_INIT_ENABLE_CRC = 27,
|
||||
E_PWR_INIT_ENABLE_DEWRAP = 28,
|
||||
E_PWR_INIT_ENABLE_EVENT = 29,
|
||||
E_PWR_READ_TEST_FAIL = 30,
|
||||
E_PWR_WRITE_TEST_FAIL = 31,
|
||||
E_PWR_SWITCH_DIO = 32,
|
||||
};
|
||||
|
||||
#endif /* PMIC_WRAP_INIT_COMMON_H */
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (c) 2020-2022, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <lib/mmio.h>
|
||||
|
||||
#include "platform_def.h"
|
||||
#include "pmic_wrap_init.h"
|
||||
|
||||
/* pmic wrap module wait_idle and read polling interval (in microseconds) */
|
||||
enum pwrap_polling_interval {
|
||||
WAIT_IDLE_POLLING_DELAY_US = 1,
|
||||
READ_POLLING_DELAY_US = 2
|
||||
};
|
||||
|
||||
static uint32_t pwrap_check_idle(void *wacs_register, uint32_t timeout_us)
|
||||
{
|
||||
uint32_t reg_rdata = 0U, retry;
|
||||
|
||||
retry = (timeout_us + WAIT_IDLE_POLLING_DELAY_US) /
|
||||
WAIT_IDLE_POLLING_DELAY_US;
|
||||
while (retry != 0) {
|
||||
udelay(WAIT_IDLE_POLLING_DELAY_US);
|
||||
reg_rdata = mmio_read_32((uintptr_t)wacs_register);
|
||||
/* if last read command timeout,clear vldclr bit
|
||||
* read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;
|
||||
* write:FSM_REQ-->idle
|
||||
*/
|
||||
switch (GET_WACS_FSM(reg_rdata)) {
|
||||
case SWINF_FSM_WFVLDCLR:
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_vldclr, 0x1);
|
||||
INFO("WACS_FSM = SWINF_FSM_WFVLDCLR\n");
|
||||
break;
|
||||
case SWINF_FSM_WFDLE:
|
||||
INFO("WACS_FSM = SWINF_FSM_WFDLE\n");
|
||||
break;
|
||||
case SWINF_FSM_REQ:
|
||||
INFO("WACS_FSM = SWINF_FSM_REQ\n");
|
||||
break;
|
||||
case SWINF_FSM_IDLE:
|
||||
goto done;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
retry--;
|
||||
};
|
||||
|
||||
done:
|
||||
if (retry == 0) {
|
||||
/* timeout */
|
||||
return E_PWR_WAIT_IDLE_TIMEOUT;
|
||||
}
|
||||
|
||||
return 0U;
|
||||
}
|
||||
|
||||
static uint32_t pwrap_check_vldclr(void *wacs_register, uint32_t timeout_us)
|
||||
{
|
||||
uint32_t reg_rdata = 0U, retry;
|
||||
|
||||
retry = (timeout_us + READ_POLLING_DELAY_US) / READ_POLLING_DELAY_US;
|
||||
while (retry != 0) {
|
||||
udelay(READ_POLLING_DELAY_US);
|
||||
reg_rdata = mmio_read_32((uintptr_t)wacs_register);
|
||||
if (GET_WACS_FSM(reg_rdata) == SWINF_FSM_WFVLDCLR) {
|
||||
break;
|
||||
}
|
||||
retry--;
|
||||
};
|
||||
|
||||
if (retry == 0) {
|
||||
/* timeout */
|
||||
return E_PWR_WAIT_IDLE_TIMEOUT;
|
||||
}
|
||||
|
||||
return 0U;
|
||||
}
|
||||
|
||||
static int32_t pwrap_wacs2(uint32_t write, uint32_t adr, uint32_t wdata,
|
||||
uint32_t *rdata, uint32_t init_check)
|
||||
{
|
||||
uint32_t reg_rdata, return_value;
|
||||
|
||||
if (init_check != 0) {
|
||||
if ((mmio_read_32((uintptr_t)&mtk_pwrap->init_done) & 0x1) == 0) {
|
||||
ERROR("initialization isn't finished\n");
|
||||
return E_PWR_NOT_INIT_DONE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wait for Software Interface FSM state to be IDLE. */
|
||||
return_value = pwrap_check_idle(&mtk_pwrap->wacs2_sta,
|
||||
PWRAP_WAIT_IDLE_US);
|
||||
if (return_value != 0) {
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/* Set the write data */
|
||||
if (write == 1) {
|
||||
/* Set the write data. */
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_wdata, wdata);
|
||||
}
|
||||
|
||||
/* Send the command. */
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_cmd, (write << 29) | adr);
|
||||
|
||||
if (write == 0) {
|
||||
/*
|
||||
* Wait for Software Interface FSM state to be WFVLDCLR,
|
||||
* read the data and clear the valid flag.
|
||||
*/
|
||||
return_value = pwrap_check_vldclr(&mtk_pwrap->wacs2_sta,
|
||||
PWRAP_READ_US);
|
||||
if (return_value != 0) {
|
||||
return return_value;
|
||||
}
|
||||
|
||||
if (rdata == NULL) {
|
||||
return E_PWR_INVALID_ARG;
|
||||
}
|
||||
|
||||
reg_rdata = mmio_read_32((uintptr_t)&mtk_pwrap->wacs2_rdata);
|
||||
*rdata = reg_rdata;
|
||||
mmio_write_32((uintptr_t)&mtk_pwrap->wacs2_vldclr, 0x1);
|
||||
}
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/* external API for pmic_wrap user */
|
||||
int32_t pwrap_read(uint32_t adr, uint32_t *rdata)
|
||||
{
|
||||
return pwrap_wacs2(0, adr, 0, rdata, 1);
|
||||
}
|
||||
|
||||
int32_t pwrap_write(uint32_t adr, uint32_t wdata)
|
||||
{
|
||||
return pwrap_wacs2(1, adr, wdata, 0, 1);
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# Copyright (c) 2022, MediaTek Inc. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
||||
LOCAL_DIR := $(call GET_LOCAL_DIR)
|
||||
|
||||
MODULE := pmic_wrap
|
||||
|
||||
ifeq (${USE_PMIC_WRAP_INIT_V2}, 1)
|
||||
LOCAL_SRCS-y += ${LOCAL_DIR}/pmic_wrap_init_v2.c
|
||||
else
|
||||
LOCAL_SRCS-y += ${LOCAL_DIR}/pmic_wrap_init.c
|
||||
endif
|
||||
|
||||
PLAT_INCLUDES += -I${LOCAL_DIR}/
|
||||
PLAT_INCLUDES += -I${LOCAL_DIR}/${MTK_SOC}
|
||||
|
||||
$(eval $(call MAKE_MODULE,$(MODULE),$(LOCAL_SRCS-y),$(MTK_BL)))
|
||||
Reference in New Issue
Block a user