From 4470298333d0e453d5ac2f9beb73b6a3787edcce Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Sun, 13 Dec 2020 22:43:15 -0600 Subject: [PATCH] allwinner: Return the PMIC to I2C mode after use This gives the rich OS the flexibility to choose between I2C and RSB communication. Since a runtime address can only be assigned once after entering RSB mode, it also lets the rich OS choose any runtime address. Signed-off-by: Samuel Holland Change-Id: Id49c124c5e925985fc31c0ba38c7fb6c941aafa8 --- include/drivers/allwinner/axp.h | 4 ++++ plat/allwinner/sun50i_a64/sunxi_power.c | 12 +++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/drivers/allwinner/axp.h b/include/drivers/allwinner/axp.h index 9c0035f96..222820b12 100644 --- a/include/drivers/allwinner/axp.h +++ b/include/drivers/allwinner/axp.h @@ -9,6 +9,10 @@ #include +#define AXP20X_MODE_REG 0x3e +#define AXP20X_MODE_I2C 0x00 +#define AXP20X_MODE_RSB 0x7c + #define NA 0xff enum { diff --git a/plat/allwinner/sun50i_a64/sunxi_power.c b/plat/allwinner/sun50i_a64/sunxi_power.c index 8aa610cc3..80a69c340 100644 --- a/plat/allwinner/sun50i_a64/sunxi_power.c +++ b/plat/allwinner/sun50i_a64/sunxi_power.c @@ -97,11 +97,8 @@ static int rsb_init(void) if (ret) return ret; - /* - * Initiate an I2C transaction to write 0x7c into register 0x3e, - * switching the PMIC to RSB mode. - */ - ret = rsb_set_device_mode(0x7c3e00); + /* Initiate an I2C transaction to switch the PMIC to RSB mode. */ + ret = rsb_set_device_mode(AXP20X_MODE_RSB << 16 | AXP20X_MODE_REG << 8); if (ret) return ret; @@ -151,6 +148,11 @@ int sunxi_pmic_setup(uint16_t socid, const void *fdt) pmic = AXP803_RSB; axp_setup_regulators(fdt); + /* Switch the PMIC back to I2C mode. */ + ret = axp_write(AXP20X_MODE_REG, AXP20X_MODE_I2C); + if (ret) + return ret; + break; default: return -ENODEV;