1 Commits
v1.0 ... v1.0.1

Author SHA1 Message Date
Mario Bălănică
a834bb274c RK806: Configure shutdown pin
PWRCTRL1 on RK806 is connected to GPIO0_A2, which gets set high by PSCI
SYSTEM_OFF.

This fixes shutdown from UEFI/ACPI.

Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com>
2025-03-21 13:25:17 +02:00
25 changed files with 132 additions and 2 deletions

View File

@@ -94,6 +94,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -99,6 +99,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -143,6 +143,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -145,6 +145,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -97,6 +97,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -95,6 +95,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -94,6 +94,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -94,6 +94,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -92,6 +92,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -94,6 +94,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -104,6 +104,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -95,6 +95,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -95,6 +95,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -93,6 +93,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -96,6 +96,8 @@ Rk806Configure (
RK806Init ();
RK806PinSetFunction (MASTER, 1, 2); // rk806_dvs1_pwrdn
for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE (rk806_init_data); RegCfgIndex++) {
RK806RegulatorInit (rk806_init_data[RegCfgIndex]);
}

View File

@@ -75,6 +75,20 @@
#define RK806_RST_MODE2 0x02
#define VERSION_AB 0x01
#define RK806_SLEEP_CONFIG0 0x62
#define RK806_SLEEP_CONFIG1 0x63
#define RK806_SLEEP_GPIO 0x71
#define RK806_PWRCTRL1_DR BIT(0)
#define RK806_PWRCTRL2_DR BIT(1)
#define RK806_PWRCTRL3_DR BIT(2)
#define RK806_PWRCTRL1_DATA BIT(4)
#define RK806_PWRCTRL2_DATA BIT(5)
#define RK806_PWRCTRL3_DATA BIT(6)
#define RK806_PWRCTRL1_FUN 0x07
#define RK806_PWRCTRL2_FUN 0x70
#define RK806_PWRCTRL3_FUN 0x07
struct regulator_init_data {
const char *supply_regulator; /* or NULL for system supply */
INT32 reg_id;
@@ -94,6 +108,14 @@ struct rk8xx_reg_info {
UINT8 range_num;
};
struct rk806_pin_config {
UINT8 fun_reg;
UINT8 fun_msk;
UINT8 reg;
UINT8 dir_msk;
UINT8 val_msk;
};
#define RK8XX_DESC_COM(_name, _reg_info, _ops) \
{ \
.reg_info = (_reg_info), \
@@ -180,4 +202,11 @@ RK806RegulatorInit (
struct regulator_init_data init_data
);
RETURN_STATUS
RK806PinSetFunction (
IN UINT8 RegId,
IN UINT8 Pin,
IN UINT8 Function
);
#endif

View File

@@ -1,5 +1,6 @@
#include <Library/RockchipPlatformLib.h>
#include "Soc.h"
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/PcdLib.h>
@@ -253,6 +254,30 @@ static const struct rk8xx_reg_info rk806_pldo[] = {
{ 3400000, 0, RK806_PLDO_ON_VSEL (6), RK806_PLDO_SLP_VSEL (6), NA, RK806_PLDO_VSEL_MASK, 0xE8, },
};
static const struct rk806_pin_config rk806_gpio_cfgs[] = {
{
.fun_reg = RK806_SLEEP_CONFIG0,
.fun_msk = RK806_PWRCTRL1_FUN,
.reg = RK806_SLEEP_GPIO,
.val_msk = RK806_PWRCTRL1_DATA,
.dir_msk = RK806_PWRCTRL1_DR,
},
{
.fun_reg = RK806_SLEEP_CONFIG0,
.fun_msk = RK806_PWRCTRL2_FUN,
.reg = RK806_SLEEP_GPIO,
.val_msk = RK806_PWRCTRL2_DATA,
.dir_msk = RK806_PWRCTRL2_DR,
},
{
.fun_reg = RK806_SLEEP_CONFIG1,
.fun_msk = RK806_PWRCTRL3_FUN,
.reg = RK806_SLEEP_GPIO,
.val_msk = RK806_PWRCTRL3_DATA,
.dir_msk = RK806_PWRCTRL3_DR,
}
};
#if 0
static void
io_mem_show (
@@ -399,11 +424,11 @@ pmic_clrsetbits (
RETURN_STATUS ret;
ret = pmic_reg_read (cs_id, reg, &byte, 0x01);
if (ret < 0) {
if (ret) {
return ret;
}
byte = (ret & ~clr) | set;
byte = (byte & ~clr) | set;
pmic_reg_write (cs_id, reg, &byte, 1);
ret = pmic_reg_read (cs_id, reg, &byte, 0x01);
@@ -752,3 +777,34 @@ RK806Init (
return RETURN_SUCCESS;
}
RETURN_STATUS
RK806PinSetFunction (
IN UINT8 RegId,
IN UINT8 Pin,
IN UINT8 Function
)
{
if ((Pin < 1) || (Pin > 3) || (Function > 5)) {
ASSERT (FALSE);
return RETURN_INVALID_PARAMETER;
}
const struct rk806_pin_config *conf = &rk806_gpio_cfgs[Pin - 1];
UINT8 mask = conf->fun_msk;
UINT8 cs_id = (RegId & 0xf00) >> 8;
UINT8 val;
DEBUG ((
DEBUG_INFO,
"%a: RegId=0x%x, Pin=%u, Function=%u\n",
__func__,
RegId,
Pin,
Function
));
val = Function << LowBitSet32 (mask);
return pmic_clrsetbits (cs_id, conf->fun_reg, mask, val);
}

View File

@@ -27,6 +27,7 @@
RK806.c
[LibraryClasses]
BaseLib
DebugLib
IoLib
SpiLib