sunxi: pmic_bus: Use the DM PMIC interface when possible

The pmic_bus functions are used in both SPL (for regulator setup) and
U-Boot proper (for regulator setup, SID access, GPIO, and poweroff).

Currently, pmic_bus conflicts with DM_I2C because it uses the legacy I2C
interface. This commit makes pmic_bus dual-compatible with either the
legacy I2C functions or the newly-added PMIC_AXP driver (which uses
DM_I2C). In turn, this allows platforms to start transitioning to DM_I2C
in U-Boot proper, without breaking boards that still depend on the
legacy I2C interface for other reasons.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
This commit is contained in:
Samuel Holland 2021-10-08 00:17:23 -05:00 committed by Andre Przywara
parent d3b02987cb
commit 8b0eacdf2b
2 changed files with 21 additions and 0 deletions

View File

@ -96,6 +96,8 @@ config SUN6I_PRCM
config AXP_PMIC_BUS config AXP_PMIC_BUS
bool bool
select DM_PMIC if DM_I2C
select PMIC_AXP if DM_I2C
help help
Select this PMIC bus access helpers for Sunxi platform PRCM or other Select this PMIC bus access helpers for Sunxi platform PRCM or other
AXP family PMIC devices. AXP family PMIC devices.

View File

@ -10,9 +10,11 @@
#include <axp_pmic.h> #include <axp_pmic.h>
#include <common.h> #include <common.h>
#include <dm.h>
#include <asm/arch/p2wi.h> #include <asm/arch/p2wi.h>
#include <asm/arch/rsb.h> #include <asm/arch/rsb.h>
#include <i2c.h> #include <i2c.h>
#include <power/pmic.h>
#include <asm/arch/pmic_bus.h> #include <asm/arch/pmic_bus.h>
#define AXP152_I2C_ADDR 0x30 #define AXP152_I2C_ADDR 0x30
@ -23,6 +25,9 @@
#define AXP221_CHIP_ADDR 0x68 #define AXP221_CHIP_ADDR 0x68
#if CONFIG_IS_ENABLED(PMIC_AXP)
static struct udevice *pmic;
#else
static int pmic_i2c_address(void) static int pmic_i2c_address(void)
{ {
if (IS_ENABLED(CONFIG_AXP152_POWER)) if (IS_ENABLED(CONFIG_AXP152_POWER))
@ -33,6 +38,7 @@ static int pmic_i2c_address(void)
/* Other AXP2xx and AXP8xx variants */ /* Other AXP2xx and AXP8xx variants */
return AXP209_I2C_ADDR; return AXP209_I2C_ADDR;
} }
#endif
int pmic_bus_init(void) int pmic_bus_init(void)
{ {
@ -43,6 +49,10 @@ int pmic_bus_init(void)
if (!needs_init) if (!needs_init)
return 0; return 0;
#if CONFIG_IS_ENABLED(PMIC_AXP)
ret = uclass_get_device_by_driver(UCLASS_PMIC, DM_DRIVER_GET(axp_pmic),
&pmic);
#else
if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI)) { if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI)) {
p2wi_init(); p2wi_init();
ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR,
@ -56,6 +66,7 @@ int pmic_bus_init(void)
ret = rsb_set_device_address(AXP_PMIC_PRI_DEVICE_ADDR, ret = rsb_set_device_address(AXP_PMIC_PRI_DEVICE_ADDR,
AXP_PMIC_PRI_RUNTIME_ADDR); AXP_PMIC_PRI_RUNTIME_ADDR);
} }
#endif
needs_init = ret; needs_init = ret;
@ -64,22 +75,30 @@ int pmic_bus_init(void)
int pmic_bus_read(u8 reg, u8 *data) int pmic_bus_read(u8 reg, u8 *data)
{ {
#if CONFIG_IS_ENABLED(PMIC_AXP)
return pmic_read(pmic, reg, data, 1);
#else
if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI)) if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI))
return p2wi_read(reg, data); return p2wi_read(reg, data);
if (IS_ENABLED(CONFIG_SYS_I2C_SUN8I_RSB)) if (IS_ENABLED(CONFIG_SYS_I2C_SUN8I_RSB))
return rsb_read(AXP_PMIC_PRI_RUNTIME_ADDR, reg, data); return rsb_read(AXP_PMIC_PRI_RUNTIME_ADDR, reg, data);
return i2c_read(pmic_i2c_address(), reg, 1, data, 1); return i2c_read(pmic_i2c_address(), reg, 1, data, 1);
#endif
} }
int pmic_bus_write(u8 reg, u8 data) int pmic_bus_write(u8 reg, u8 data)
{ {
#if CONFIG_IS_ENABLED(PMIC_AXP)
return pmic_write(pmic, reg, &data, 1);
#else
if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI)) if (IS_ENABLED(CONFIG_SYS_I2C_SUN6I_P2WI))
return p2wi_write(reg, data); return p2wi_write(reg, data);
if (IS_ENABLED(CONFIG_SYS_I2C_SUN8I_RSB)) if (IS_ENABLED(CONFIG_SYS_I2C_SUN8I_RSB))
return rsb_write(AXP_PMIC_PRI_RUNTIME_ADDR, reg, data); return rsb_write(AXP_PMIC_PRI_RUNTIME_ADDR, reg, data);
return i2c_write(pmic_i2c_address(), reg, 1, &data, 1); return i2c_write(pmic_i2c_address(), reg, 1, &data, 1);
#endif
} }
int pmic_bus_setbits(u8 reg, u8 bits) int pmic_bus_setbits(u8 reg, u8 bits)