Re: [U-Boot] [PATCH 03/14] sunxi: axp221: Add axp223 support

2014-12-18 Thread Hans de Goede

Hi,

On 17-12-14 03:34, Chen-Yu Tsai wrote:

On Wed, Dec 17, 2014 at 4:31 AM, Hans de Goede hdego...@redhat.com 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 hdego...@redhat.com
---
  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 hdego...@redhat.com
   * (C) Copyright 2013 Oliver Schinagl oli...@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 

Re: [U-Boot] [PATCH 03/14] sunxi: axp221: Add axp223 support

2014-12-18 Thread Ian Campbell
On Tue, 2014-12-16 at 21:31 +0100, 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 hdego...@redhat.com

With the whitespace fixed:
Acked-by: Ian Campbell i...@hellion.org.uk


___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 03/14] sunxi: axp221: Add axp223 support

2014-12-16 Thread Hans de Goede
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 hdego...@redhat.com
---
 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 hdego...@redhat.com
  * (C) Copyright 2013 Oliver Schinagl oli...@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;
  

Re: [U-Boot] [PATCH 03/14] sunxi: axp221: Add axp223 support

2014-12-16 Thread Chen-Yu Tsai
On Wed, Dec 17, 2014 at 4:31 AM, Hans de Goede hdego...@redhat.com 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 hdego...@redhat.com
 ---
  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 hdego...@redhat.com
   * (C) Copyright 2013 Oliver Schinagl oli...@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