summaryrefslogtreecommitdiff
path: root/drivers/power/axp221.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-11-29 23:54:25 +0100
committerHans de Goede <hdegoede@redhat.com>2015-01-14 14:56:36 +0100
commitbdcdf84631746f9569a4d0b0805750574c7a353a (patch)
tree0790875ee644280a6d28f7fb8239c909c468f910 /drivers/power/axp221.c
parent66ebea06f71a85552b7339d1b03ec1a092dc6c70 (diff)
downloadu-boot-imx-bdcdf84631746f9569a4d0b0805750574c7a353a.zip
u-boot-imx-bdcdf84631746f9569a4d0b0805750574c7a353a.tar.gz
u-boot-imx-bdcdf84631746f9569a4d0b0805750574c7a353a.tar.bz2
sunxi: axp221: Add axp223 support
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 <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
Diffstat (limited to 'drivers/power/axp221.c')
-rw-r--r--drivers/power/axp221.c88
1 files changed, 67 insertions, 21 deletions
diff --git a/drivers/power/axp221.c b/drivers/power/axp221.c
index 826567a..4667579 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 <hdegoede@redhat.com>
* (C) Copyright 2013 Oliver Schinagl <oliver@schinagl.nl>
*
* SPDX-License-Identifier: GPL-2.0+
@@ -7,8 +13,50 @@
#include <common.h>
#include <errno.h>
#include <asm/arch/p2wi.h>
+#include <asm/arch/rsb.h>
#include <axp221.h>
+/*
+ * 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]);