[U-Boot] [PATCH 03/10] sunxi: power: axp818: add support for axp818 driver

Hans de Goede hdegoede at redhat.com
Fri Nov 13 18:21:34 CET 2015


Hi,

On 12-11-15 19:09, Vishnu Patekar wrote:
> AXP818 is rsb based PMIC and used on Allwinner A83T H8 Homlet dev board.
> It's registers are different and calculating reg config is different than
> that of earlier axp power ICs.
>
> DCDC1, DCDC2, DCDC3 and DCDC5 is implemented at the moment.
> all other voltages can be added subsequently.
> AXP datasheet is uploaded to wiki:
> http://linux-sunxi.org/File:AXP818_datasheet_Revision1.0.pdf
>
> Signed-off-by: Vishnu Patekar <vishnupatekar0510 at gmail.com>
> ---
>   drivers/power/Kconfig  |  34 ++++++++-----
>   drivers/power/Makefile |   1 +
>   drivers/power/axp818.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++
>   include/axp818.h       |  75 ++++++++++++++++++++++++++++
>   include/axp_pmic.h     |   3 ++
>   5 files changed, 234 insertions(+), 11 deletions(-)
>   create mode 100644 drivers/power/axp818.c
>   create mode 100644 include/axp818.h
>
> diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
> index 809f8f1..d2494d4 100644
> --- a/drivers/power/Kconfig
> +++ b/drivers/power/Kconfig
> @@ -8,7 +8,8 @@ choice
>   	prompt "Select Sunxi PMIC Variant"
>   	depends on ARCH_SUNXI
>   	default AXP209_POWER if MACH_SUN4I || MACH_SUN5I || MACH_SUN7I
> -	default AXP221_POWER if MACH_SUN6I || MACH_SUN8I
> +	default AXP221_POWER if MACH_SUN6I || MACH_SUN8I && !MACH_SUN8I_A83T

This will become unmanagable once we also get support for the H3 please change this to:

	default AXP221_POWER if MACH_SUN6I || MACH_SUN8I_A23 || MACH_SUN8I_A33

> +	default AXP818_POWER if MACH_SUN8I_A83T
>
>   config SUNXI_NO_PMIC
>   	boolean "board without a pmic"
> @@ -31,16 +32,24 @@ config AXP209_POWER
>
>   config AXP221_POWER
>   	boolean "axp221 / axp223 pmic support"
> -	depends on MACH_SUN6I || MACH_SUN8I
> +	depends on MACH_SUN6I || MACH_SUN8I || !MACH_SUN8I_A83T

Idem.


>   	---help---
>   	Select this to enable support for the axp221/axp223 pmic found on most
>   	A23 and A31 boards.
>
> +config AXP818_POWER
> +	boolean "axp818 pmic support"
> +	depends on MACH_SUN8I_A83T
> +	---help---
> +	Say y here to enable support for the axp818 pmic found on
> +	A83T dev board.
> +
>   endchoice
>
>   config AXP_DCDC1_VOLT
>   	int "axp pmic dcdc1 voltage"
> -	depends on AXP221_POWER
> +	depends on AXP221_POWER || AXP818_POWER
> +	default 3300 if AXP818_POWER
>   	default 3000 if MACH_SUN6I || MACH_SUN8I
>   	---help---
>   	Set the voltage (mV) to program the axp pmic dcdc1 at, set to 0 to

Please add a comment to the --help-- what this voltage is used for (assuming
that you know). The same goes for all the other voltage settings, otherwise
this patch looks good.

Regards,

Hans



> @@ -51,7 +60,8 @@ config AXP_DCDC1_VOLT
>
>   config AXP_DCDC2_VOLT
>   	int "axp pmic dcdc2 voltage"
> -	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER
> +	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP818_POWER
> +	default 900 if AXP818_POWER
>   	default 1400 if AXP152_POWER || AXP209_POWER
>   	default 1200 if MACH_SUN6I
>   	default 1100 if MACH_SUN8I
> @@ -64,7 +74,8 @@ config AXP_DCDC2_VOLT
>
>   config AXP_DCDC3_VOLT
>   	int "axp pmic dcdc3 voltage"
> -	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER
> +	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP818_POWER
> +	default 900 if AXP818_POWER
>   	default 1500 if AXP152_POWER
>   	default 1250 if AXP209_POWER
>   	default 1200 if MACH_SUN6I || MACH_SUN8I
> @@ -78,7 +89,7 @@ config AXP_DCDC3_VOLT
>
>   config AXP_DCDC4_VOLT
>   	int "axp pmic dcdc4 voltage"
> -	depends on AXP152_POWER || AXP221_POWER
> +	depends on AXP152_POWER || AXP221_POWER || AXP818_POWER
>   	default 1250 if AXP152_POWER
>   	default 1200 if MACH_SUN6I
>   	default 0 if MACH_SUN8I
> @@ -91,7 +102,8 @@ config AXP_DCDC4_VOLT
>
>   config AXP_DCDC5_VOLT
>   	int "axp pmic dcdc5 voltage"
> -	depends on AXP221_POWER
> +	depends on AXP221_POWER || AXP818_POWER
> +	default 1800 if AXP818_POWER
>   	default 1500 if MACH_SUN6I || MACH_SUN8I
>   	---help---
>   	Set the voltage (mV) to program the axp pmic dcdc5 at, set to 0 to
> @@ -111,7 +123,7 @@ config AXP_ALDO1_VOLT
>
>   config AXP_ALDO2_VOLT
>   	int "axp pmic (a)ldo2 voltage"
> -	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER
> +	depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP818_POWER
>   	default 3000 if AXP152_POWER || AXP209_POWER
>   	default 0 if MACH_SUN6I
>   	default 2500 if MACH_SUN8I
> @@ -125,8 +137,8 @@ config AXP_ALDO2_VOLT
>
>   config AXP_ALDO3_VOLT
>   	int "axp pmic (a)ldo3 voltage"
> -	depends on AXP209_POWER || AXP221_POWER
> -	default 0 if AXP209_POWER
> +	depends on AXP209_POWER || AXP221_POWER || AXP818_POWER
> +	default 0 if AXP209_POWER || AXP818_POWER
>   	default 3000 if MACH_SUN6I || MACH_SUN8I
>   	---help---
>   	Set the voltage (mV) to program the axp pmic aldo3 at, set to 0 to
> @@ -171,7 +183,7 @@ config AXP_DLDO3_VOLT
>
>   config AXP_DLDO4_VOLT
>   	int "axp pmic dldo4 voltage"
> -	depends on AXP221_POWER
> +	depends on AXP221_POWER || AXP818_POWER
>   	default 0
>   	---help---
>   	Set the voltage (mV) to program the axp pmic dldo4 at, set to 0 to
> diff --git a/drivers/power/Makefile b/drivers/power/Makefile
> index a2d3c04..0fdbca3 100644
> --- a/drivers/power/Makefile
> +++ b/drivers/power/Makefile
> @@ -9,6 +9,7 @@ obj-$(CONFIG_AS3722_POWER)	+= as3722.o
>   obj-$(CONFIG_AXP152_POWER)	+= axp152.o
>   obj-$(CONFIG_AXP209_POWER)	+= axp209.o
>   obj-$(CONFIG_AXP221_POWER)	+= axp221.o
> +obj-$(CONFIG_AXP818_POWER)	+= axp818.o
>   obj-$(CONFIG_EXYNOS_TMU)	+= exynos-tmu.o
>   obj-$(CONFIG_FTPMU010_POWER)	+= ftpmu010.o
>   obj-$(CONFIG_TPS6586X_POWER)	+= tps6586x.o
> diff --git a/drivers/power/axp818.c b/drivers/power/axp818.c
> new file mode 100644
> index 0000000..4b21a83
> --- /dev/null
> +++ b/drivers/power/axp818.c
> @@ -0,0 +1,132 @@
> +/*
> + * AXP818 driver based on AXP221 driver
> + *
> + *
> + * (C) Copyright 2015 Vishnu Patekar <vishnuptekar0510 at gmail.com>
> + *
> + * Based on axp221.c
> + * (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+
> + */
> +
> +#include <common.h>
> +#include <errno.h>
> +#include <asm/arch/gpio.h>
> +#include <asm/arch/pmic_bus.h>
> +#include <axp_pmic.h>
> +
> +static u8 axp818_mvolt_to_cfg(int mvolt, int min, int max, int div)
> +{
> +	if (mvolt < min)
> +		mvolt = min;
> +	else if (mvolt > max)
> +		mvolt = max;
> +
> +	return  (mvolt - min) / div;
> +}
> +
> +int axp_set_dcdc1(unsigned int mvolt)
> +{
> +	int ret;
> +	u8 cfg = axp818_mvolt_to_cfg(mvolt, 1600, 3400, 100);
> +
> +	if (mvolt == 0)
> +		return pmic_bus_clrbits(AXP818_OUTPUT_CTRL1,
> +					AXP818_OUTPUT_CTRL1_DCDC1_EN);
> +
> +	ret = pmic_bus_write(AXP818_DCDC1_CTRL, cfg);
> +	if (ret)
> +		return ret;
> +
> +	return pmic_bus_setbits(AXP818_OUTPUT_CTRL1,
> +				AXP818_OUTPUT_CTRL1_DCDC1_EN);
> +}
> +
> +int axp_set_dcdc2(unsigned int mvolt)
> +{
> +	int ret;
> +	u8 cfg;
> +
> +	if (mvolt >= 1220)
> +		cfg = 70 + axp818_mvolt_to_cfg(mvolt, 1220, 1300, 20);
> +	else
> +		cfg = axp818_mvolt_to_cfg(mvolt, 500, 1200, 10);
> +
> +	if (mvolt == 0)
> +		return pmic_bus_clrbits(AXP818_OUTPUT_CTRL1,
> +					AXP818_OUTPUT_CTRL1_DCDC2_EN);
> +
> +	ret = pmic_bus_write(AXP818_DCDC2_CTRL, cfg);
> +	if (ret)
> +		return ret;
> +
> +	return pmic_bus_setbits(AXP818_OUTPUT_CTRL1,
> +				AXP818_OUTPUT_CTRL1_DCDC2_EN);
> +}
> +
> +int axp_set_dcdc3(unsigned int mvolt)
> +{
> +	int ret;
> +	u8 cfg;
> +
> +	if (mvolt >= 1220)
> +		cfg = 70 + axp818_mvolt_to_cfg(mvolt, 1220, 1300, 20);
> +	else
> +		cfg = axp818_mvolt_to_cfg(mvolt, 500, 1200, 10);
> +
> +	if (mvolt == 0)
> +		return pmic_bus_clrbits(AXP818_OUTPUT_CTRL1,
> +					AXP818_OUTPUT_CTRL1_DCDC3_EN);
> +
> +	ret = pmic_bus_write(AXP818_DCDC3_CTRL, cfg);
> +	if (ret)
> +		return ret;
> +
> +	return pmic_bus_setbits(AXP818_OUTPUT_CTRL1,
> +				AXP818_OUTPUT_CTRL1_DCDC3_EN);
> +}
> +
> +int axp_set_dcdc5(unsigned int mvolt)
> +{
> +	int ret;
> +	u8 cfg;
> +
> +	if (mvolt >= 1140)
> +		cfg = 32 + axp818_mvolt_to_cfg(mvolt, 1140, 1840, 20);
> +	else
> +		cfg = axp818_mvolt_to_cfg(mvolt, 800, 1120, 10);
> +
> +	if (mvolt == 0)
> +		return pmic_bus_clrbits(AXP818_OUTPUT_CTRL1,
> +					AXP818_OUTPUT_CTRL1_DCDC5_EN);
> +
> +	ret = pmic_bus_write(AXP818_DCDC5_CTRL, cfg);
> +	if (ret)
> +		return ret;
> +
> +	return pmic_bus_setbits(AXP818_OUTPUT_CTRL1,
> +				AXP818_OUTPUT_CTRL1_DCDC5_EN);
> +}
> +
> +int axp_init(void)
> +{
> +	u8 axp_chip_id;
> +	int ret;
> +
> +	ret = pmic_bus_init();
> +	if (ret)
> +		return ret;
> +
> +	ret = pmic_bus_read(AXP818_CHIP_ID, &axp_chip_id);
> +	if (ret)
> +		return ret;
> +
> +	if (!(axp_chip_id == 0x51))
> +		return -ENODEV;
> +	else
> +		return ret;
> +
> +	return 0;
> +}
> diff --git a/include/axp818.h b/include/axp818.h
> new file mode 100644
> index 0000000..1dc6456
> --- /dev/null
> +++ b/include/axp818.h
> @@ -0,0 +1,75 @@
> +/*
> + * (C) Copyright 2015 Vishnu Patekar <vishnupatekar0510 at gmail.com>
> + *
> + * X-Powers AXP818 Power Management IC driver
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#define AXP818_CHIP_ID		0x03
> +
> +#define AXP818_OUTPUT_CTRL1	0x10
> +#define AXP818_OUTPUT_CTRL1_DCDC1_EN	(1 << 0)
> +#define AXP818_OUTPUT_CTRL1_DCDC2_EN	(1 << 1)
> +#define AXP818_OUTPUT_CTRL1_DCDC3_EN	(1 << 2)
> +#define AXP818_OUTPUT_CTRL1_DCDC4_EN	(1 << 3)
> +#define AXP818_OUTPUT_CTRL1_DCDC5_EN	(1 << 4)
> +#define AXP818_OUTPUT_CTRL1_DCDC6_EN	(1 << 5)
> +#define AXP818_OUTPUT_CTRL1_DCDC7_EN	(1 << 6)
> +#define AXP818_OUTPUT_CTRL2	0x12
> +#define AXP818_OUTPUT_CTRL2_ELDO1_EN	(1 << 0)
> +#define AXP818_OUTPUT_CTRL2_ELDO2_EN	(1 << 1)
> +#define AXP818_OUTPUT_CTRL2_ELDO3_EN	(1 << 2)
> +#define AXP818_OUTPUT_CTRL2_DLDO1_EN	(1 << 3)
> +#define AXP818_OUTPUT_CTRL2_DLDO2_EN	(1 << 4)
> +#define AXP818_OUTPUT_CTRL2_DLDO3_EN	(1 << 5)
> +#define AXP818_OUTPUT_CTRL2_DLDO4_EN	(1 << 6)
> +#define AXP818_OUTPUT_CTRL3	0x13
> +#define AXP818_OUTPUT_CTRL3_FLDO1_EN	(1 << 2)
> +#define AXP818_OUTPUT_CTRL3_FLDO2_EN	(1 << 3)
> +#define AXP818_OUTPUT_CTRL3_FLDO3_EN	(1 << 4)
> +#define AXP818_OUTPUT_CTRL3_ALDO1_EN	(1 << 5)
> +#define AXP818_OUTPUT_CTRL3_ALDO2_EN	(1 << 6)
> +#define AXP818_OUTPUT_CTRL3_ALDO3_EN	(1 << 7)
> +
> +#define AXP818_DCDC1_CTRL	0x20
> +#define AXP818_DCDC2_CTRL	0x21
> +#define AXP818_DCDC3_CTRL	0x22
> +#define AXP818_DCDC4_CTRL	0x23
> +#define AXP818_DCDC5_CTRL	0x24
> +#define AXP818_DCDC6_CTRL	0x25
> +
> +#define AXP818_DLDO1_CTRL	0x15
> +#define AXP818_DLDO2_CTRL	0x16
> +#define AXP818_DLDO3_CTRL	0x17
> +#define AXP818_DLDO4_CTRL	0x18
> +#define AXP818_ELDO1_CTRL	0x19
> +#define AXP818_ELDO2_CTRL	0x1a
> +#define AXP818_ELDO3_CTRL	0x1b
> +#define AXP818_ELDO3_CTRL	0x1b
> +#define AXP818_FLDO1_CTRL	0x1c
> +#define AXP818_FLDO2_3_CTRL	0x1d
> +#define AXP818_DCDC1_CTRL	0x20
> +#define AXP818_DCDC2_CTRL	0x21
> +#define AXP818_DCDC3_CTRL	0x22
> +#define AXP818_DCDC4_CTRL	0x23
> +#define AXP818_DCDC5_CTRL	0x24
> +#define AXP818_DCDC6_CTRL	0x25
> +#define AXP818_DCDC7_CTRL	0x26
> +
> +#define AXP818_ALDO1_CTRL	0x28
> +#define AXP818_ALDO2_CTRL	0x29
> +#define AXP818_ALDO3_CTRL	0x2a
> +
> +int axp818_init(void);
> +
> +/* For axp_gpio.c */
> +#define AXP_POWER_STATUS		0x00
> +#define AXP_POWER_STATUS_VBUS_PRESENT	(1 << 5)
> +#define AXP_GPIO0_CTRL			0x90
> +#define AXP_GPIO1_CTRL			0x92
> +#define AXP_GPIO_CTRL_OUTPUT_LOW	0x00 /* Drive pin low */
> +#define AXP_GPIO_CTRL_OUTPUT_HIGH	0x01 /* Drive pin high */
> +#define AXP_GPIO_CTRL_INPUT		0x02 /* Input */
> +#define AXP_GPIO_STATE			0x94
> +#define AXP_GPIO_STATE_OFFSET		0
> diff --git a/include/axp_pmic.h b/include/axp_pmic.h
> index ef339c4..3b01c49 100644
> --- a/include/axp_pmic.h
> +++ b/include/axp_pmic.h
> @@ -16,6 +16,9 @@
>   #ifdef CONFIG_AXP221_POWER
>   #include <axp221.h>
>   #endif
> +#ifdef CONFIG_AXP818_POWER
> +#include <axp818.h>
> +#endif
>
>   int axp_set_dcdc1(unsigned int mvolt);
>   int axp_set_dcdc2(unsigned int mvolt);
>


More information about the U-Boot mailing list