From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Fri, 13 Nov 2015 18:21:34 +0100 Subject: [U-Boot] [PATCH 03/10] sunxi: power: axp818: add support for axp818 driver In-Reply-To: <1447351758-10413-4-git-send-email-vishnupatekar0510@gmail.com> References: <1447351758-10413-1-git-send-email-vishnupatekar0510@gmail.com> <1447351758-10413-4-git-send-email-vishnupatekar0510@gmail.com> Message-ID: <56461C1E.6090902@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 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 > --- > 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 > + * > + * Based on axp221.c > + * (C) Copyright 2014 Hans de Goede > + * (C) Copyright 2013 Oliver Schinagl > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +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 > + * > + * 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 > #endif > +#ifdef CONFIG_AXP818_POWER > +#include > +#endif > > int axp_set_dcdc1(unsigned int mvolt); > int axp_set_dcdc2(unsigned int mvolt); >