From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Thu, 18 Dec 2014 11:44:38 +0100 Subject: [U-Boot] [PATCH 03/14] sunxi: axp221: Add axp223 support In-Reply-To: References: <1418761900-14035-1-git-send-email-hdegoede@redhat.com> <1418761900-14035-3-git-send-email-hdegoede@redhat.com> Message-ID: <5492B016.9010902@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 17-12-14 03:34, Chen-Yu Tsai wrote: > On Wed, Dec 17, 2014 at 4:31 AM, Hans de Goede wrote: >> The axp223 appears to be the same as the axp221, except that it uses the >> rsb to communicate rather then the p2wi. At least all the registers we use >> are 100% the same. >> >> Signed-off-by: Hans de Goede >> --- >> arch/arm/cpu/armv7/sunxi/cpu_info.c | 2 +- >> drivers/power/Kconfig | 8 ++-- >> drivers/power/axp221.c | 88 ++++++++++++++++++++++++++++--------- >> include/axp221.h | 4 ++ >> 4 files changed, 76 insertions(+), 26 deletions(-) >> >> diff --git a/arch/arm/cpu/armv7/sunxi/cpu_info.c b/arch/arm/cpu/armv7/sunxi/cpu_info.c >> index 7a3a4ca..b6cb9de 100644 >> --- a/arch/arm/cpu/armv7/sunxi/cpu_info.c >> +++ b/arch/arm/cpu/armv7/sunxi/cpu_info.c >> @@ -76,7 +76,7 @@ int print_cpuinfo(void) >> >> int sunxi_get_sid(unsigned int *sid) >> { >> -#ifdef CONFIG_MACH_SUN6I >> +#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I >> #ifdef CONFIG_AXP221_POWER >> return axp221_get_sid(sid); >> #else >> diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig >> index 1ec7c0e..7373a79 100644 >> --- a/drivers/power/Kconfig >> +++ b/drivers/power/Kconfig >> @@ -1,10 +1,10 @@ >> config AXP221_POWER >> - boolean "axp221 pmic support" >> - depends on MACH_SUN6I >> + boolean "axp221 / axp223 pmic support" >> + depends on MACH_SUN6I || MACH_SUN8I >> default y >> ---help--- >> - Say y here to enable support for the axp221 pmic found on most sun6i >> - (A31) boards. >> + Say y here to enable support for the axp221 / axp223 pmic found on most >> + sun6i (A31) / sun8i (A23) boards. >> >> config AXP221_DLDO1_VOLT >> int "axp221 dldo1 voltage" >> diff --git a/drivers/power/axp221.c b/drivers/power/axp221.c >> index 826567a..717adad 100644 >> --- a/drivers/power/axp221.c >> +++ b/drivers/power/axp221.c >> @@ -1,4 +1,10 @@ >> /* >> + * AXP221 and AXP223 driver >> + * >> + * IMPORTANT when making changes to this file check that the registers >> + * used are the same for the axp221 and axp223. >> + * >> + * (C) Copyright 2014 Hans de Goede >> * (C) Copyright 2013 Oliver Schinagl >> * >> * SPDX-License-Identifier: GPL-2.0+ >> @@ -7,8 +13,50 @@ >> #include >> #include >> #include >> +#include >> #include >> >> +/* >> + * The axp221 uses the p2wi bus, the axp223 is identical (for all registers >> + * used sofar) but uses the rsb bus. These functions abstract this. >> + */ >> +static int pmic_bus_init(void) >> +{ >> +#ifdef CONFIG_MACH_SUN6I >> + p2wi_init(); >> + return p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR, >> + AXP221_INIT_DATA); >> +#else >> + int ret; >> + >> + rsb_init(); >> + >> + ret = rsb_set_device_mode(AXP223_DEVICE_MODE_DATA); >> + if (ret) >> + return ret; >> + >> + return rsb_set_device_address(AXP223_DEVICE_ADDR, AXP223_RUNTIME_ADDR); >> +#endif >> +} >> + >> +static int pmic_bus_read(const u8 addr, u8 *data) >> +{ >> +#ifdef CONFIG_MACH_SUN6I >> + return p2wi_read(addr, data); >> +#else >> + return rsb_read(AXP223_RUNTIME_ADDR, addr, data); >> +#endif >> +} >> + >> +static int pmic_bus_write(const u8 addr, u8 data) >> +{ >> +#ifdef CONFIG_MACH_SUN6I >> + return p2wi_write(addr, data); >> +#else >> + return rsb_write(AXP223_RUNTIME_ADDR, addr, data); >> +#endif >> +} >> + >> static u8 axp221_mvolt_to_cfg(int mvolt, int min, int max, int div) >> { >> if (mvolt < min) >> @@ -24,12 +72,12 @@ static int axp221_setbits(u8 reg, u8 bits) >> int ret; >> u8 val; >> >> - ret = p2wi_read(reg, &val); >> + ret = pmic_bus_read(reg, &val); >> if (ret) >> return ret; >> >> val |= bits; >> - return p2wi_write(reg, val); >> + return pmic_bus_write(reg, val); >> } >> >> int axp221_set_dcdc1(unsigned int mvolt) >> @@ -37,7 +85,7 @@ int axp221_set_dcdc1(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 1600, 3400, 100); >> >> - ret = p2wi_write(AXP221_DCDC1_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_DCDC1_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -49,28 +97,28 @@ int axp221_set_dcdc2(unsigned int mvolt) >> { >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20); >> >> - return p2wi_write(AXP221_DCDC2_CTRL, cfg); >> + return pmic_bus_write(AXP221_DCDC2_CTRL, cfg); >> } >> >> int axp221_set_dcdc3(unsigned int mvolt) >> { >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1860, 20); >> >> - return p2wi_write(AXP221_DCDC3_CTRL, cfg); >> + return pmic_bus_write(AXP221_DCDC3_CTRL, cfg); >> } >> >> int axp221_set_dcdc4(unsigned int mvolt) >> { >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20); >> >> - return p2wi_write(AXP221_DCDC4_CTRL, cfg); >> + return pmic_bus_write(AXP221_DCDC4_CTRL, cfg); >> } >> >> int axp221_set_dcdc5(unsigned int mvolt) >> { >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 1000, 2550, 50); >> >> - return p2wi_write(AXP221_DCDC5_CTRL, cfg); >> + return pmic_bus_write(AXP221_DCDC5_CTRL, cfg); >> } >> >> int axp221_set_dldo1(unsigned int mvolt) >> @@ -78,7 +126,7 @@ int axp221_set_dldo1(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_DLDO1_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_DLDO1_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -91,7 +139,7 @@ int axp221_set_dldo2(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_DLDO2_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_DLDO2_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -104,7 +152,7 @@ int axp221_set_dldo3(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_DLDO3_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_DLDO3_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -117,7 +165,7 @@ int axp221_set_dldo4(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_DLDO4_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_DLDO4_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -130,7 +178,7 @@ int axp221_set_aldo1(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_ALDO1_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_ALDO1_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -143,7 +191,7 @@ int axp221_set_aldo2(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_ALDO2_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_ALDO2_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -156,7 +204,7 @@ int axp221_set_aldo3(unsigned int mvolt) >> int ret; >> u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100); >> >> - ret = p2wi_write(AXP221_ALDO3_CTRL, cfg); >> + ret = pmic_bus_write(AXP221_ALDO3_CTRL, cfg); >> if (ret) >> return ret; >> >> @@ -169,13 +217,11 @@ int axp221_init(void) >> u8 axp_chip_id; >> int ret; >> >> - p2wi_init(); >> - ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR, >> - AXP221_INIT_DATA); >> + ret = pmic_bus_init(); >> if (ret) >> return ret; >> >> - ret = p2wi_read(AXP221_CHIP_ID, &axp_chip_id); >> + ret = pmic_bus_read(AXP221_CHIP_ID, &axp_chip_id); >> if (ret) >> return ret; >> >> @@ -194,17 +240,17 @@ int axp221_get_sid(unsigned int *sid) >> if (ret) >> return ret; >> >> - ret = p2wi_write(AXP221_PAGE, 1); >> + ret = pmic_bus_write(AXP221_PAGE, 1); >> if (ret) >> return ret; >> >> for (i = 0; i < 16; i++) { >> - ret = p2wi_read(AXP221_SID + i, &dest[i]); >> + ret = pmic_bus_read(AXP221_SID + i, &dest[i]); >> if (ret) >> return ret; >> } >> >> - p2wi_write(AXP221_PAGE, 0); >> + pmic_bus_write(AXP221_PAGE, 0); >> >> for (i = 0; i < 4; i++) >> sid[i] = be32_to_cpu(sid[i]); >> diff --git a/include/axp221.h b/include/axp221.h >> index db219c6..10d35e1 100644 >> --- a/include/axp221.h >> +++ b/include/axp221.h >> @@ -10,6 +10,10 @@ >> #define AXP221_CTRL_ADDR 0x3e >> #define AXP221_INIT_DATA 0x3e >> >> +#define AXP223_DEVICE_ADDR 0x3a3 >> +#define AXP223_RUNTIME_ADDR 0x2d >> +#define AXP223_DEVICE_MODE_DATA 0x7c3e00 >> + >> /* Page 0 addresses */ >> #define AXP221_CHIP_ID 0x03 >> #define AXP221_OUTPUT_CTRL1 0x10 >> -- >> 2.1.0 >> > > git am reports: > > Applying patch #422068 using 'git am' > Description: [U-Boot,03/14] sunxi: axp221: Add axp223 support > Applying: sunxi: axp221: Add axp223 support > /home/wens/sunxi/u-boot/.git/rebase-apply/patch:50: trailing whitespace. > * > /home/wens/sunxi/u-boot/.git/rebase-apply/patch:76: trailing whitespace. > > warning: 2 lines add whitespace errors. Fixed in my personal tree. Regards, Hans