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

Chen-Yu Tsai wens at csie.org
Wed Dec 17 03:34:46 CET 2014


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


ChenYu


More information about the U-Boot mailing list