mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-30 10:41:50 +00:00
821 lines
27 KiB
Diff
821 lines
27 KiB
Diff
From 15d68b2115b24dcf3a20f67942db867e5887b624 Mon Sep 17 00:00:00 2001
|
|
From: Icenowy Zheng <icenowy@aosc.xyz>
|
|
Date: Mon, 27 Mar 2017 19:22:34 +0200
|
|
Subject: [PATCH] sunxi: add AXP803 support
|
|
|
|
The A64 uses the AXP803 as its PMIC.
|
|
|
|
Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz>
|
|
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
---
|
|
arch/arm/mach-sunxi/Makefile | 3 +
|
|
arch/arm/mach-sunxi/pmic_bus.c | 6 +-
|
|
arch/arm/mach-sunxi/rsb.c | 2 +-
|
|
board/sunxi/board.c | 31 ++---
|
|
drivers/power/Kconfig | 85 +++++++++-----
|
|
drivers/power/Makefile | 1 +
|
|
drivers/power/axp803.c | 259 +++++++++++++++++++++++++++++++++++++++++
|
|
drivers/power/axp818.c | 2 +-
|
|
include/axp803.h | 73 ++++++++++++
|
|
include/axp_pmic.h | 3 +
|
|
10 files changed, 415 insertions(+), 50 deletions(-)
|
|
create mode 100644 drivers/power/axp803.c
|
|
create mode 100644 include/axp803.h
|
|
|
|
diff --git a/arch/arm/mach-sunxi/Makefile b/arch/arm/mach-sunxi/Makefile
|
|
index 2a3c379b72..0bbfda9364 100644
|
|
--- a/arch/arm/mach-sunxi/Makefile
|
|
+++ b/arch/arm/mach-sunxi/Makefile
|
|
@@ -19,9 +19,11 @@ endif
|
|
obj-$(CONFIG_MACH_SUN6I) += prcm.o
|
|
obj-$(CONFIG_MACH_SUN8I) += prcm.o
|
|
obj-$(CONFIG_MACH_SUN9I) += prcm.o
|
|
+obj-$(CONFIG_MACH_SUN50I) += prcm.o
|
|
obj-$(CONFIG_MACH_SUN6I) += p2wi.o
|
|
obj-$(CONFIG_MACH_SUN8I) += rsb.o
|
|
obj-$(CONFIG_MACH_SUN9I) += rsb.o
|
|
+obj-$(CONFIG_MACH_SUN50I) += rsb.o
|
|
obj-$(CONFIG_MACH_SUN4I) += clock_sun4i.o
|
|
obj-$(CONFIG_MACH_SUN5I) += clock_sun4i.o
|
|
obj-$(CONFIG_MACH_SUN6I) += clock_sun6i.o
|
|
@@ -37,6 +39,7 @@ obj-$(CONFIG_MACH_SUN9I) += clock_sun9i.o gtbus_sun9i.o
|
|
obj-$(CONFIG_AXP152_POWER) += pmic_bus.o
|
|
obj-$(CONFIG_AXP209_POWER) += pmic_bus.o
|
|
obj-$(CONFIG_AXP221_POWER) += pmic_bus.o
|
|
+obj-$(CONFIG_AXP803_POWER) += pmic_bus.o
|
|
obj-$(CONFIG_AXP809_POWER) += pmic_bus.o
|
|
obj-$(CONFIG_AXP818_POWER) += pmic_bus.o
|
|
|
|
diff --git a/arch/arm/mach-sunxi/pmic_bus.c b/arch/arm/mach-sunxi/pmic_bus.c
|
|
index f917c3e070..e021b58b60 100644
|
|
--- a/arch/arm/mach-sunxi/pmic_bus.c
|
|
+++ b/arch/arm/mach-sunxi/pmic_bus.c
|
|
@@ -36,7 +36,7 @@ int pmic_bus_init(void)
|
|
if (!needs_init)
|
|
return 0;
|
|
|
|
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
# ifdef CONFIG_MACH_SUN6I
|
|
p2wi_init();
|
|
ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR,
|
|
@@ -65,7 +65,7 @@ int pmic_bus_read(u8 reg, u8 *data)
|
|
return i2c_read(AXP152_I2C_ADDR, reg, 1, data, 1);
|
|
#elif defined CONFIG_AXP209_POWER
|
|
return i2c_read(AXP209_I2C_ADDR, reg, 1, data, 1);
|
|
-#elif defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
+#elif defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
# ifdef CONFIG_MACH_SUN6I
|
|
return p2wi_read(reg, data);
|
|
# elif defined CONFIG_MACH_SUN8I_R40
|
|
@@ -82,7 +82,7 @@ int pmic_bus_write(u8 reg, u8 data)
|
|
return i2c_write(AXP152_I2C_ADDR, reg, 1, &data, 1);
|
|
#elif defined CONFIG_AXP209_POWER
|
|
return i2c_write(AXP209_I2C_ADDR, reg, 1, &data, 1);
|
|
-#elif defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
+#elif defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
# ifdef CONFIG_MACH_SUN6I
|
|
return p2wi_write(reg, data);
|
|
# elif defined CONFIG_MACH_SUN8I_R40
|
|
diff --git a/arch/arm/mach-sunxi/rsb.c b/arch/arm/mach-sunxi/rsb.c
|
|
index 6fd11f1529..28d05e962a 100644
|
|
--- a/arch/arm/mach-sunxi/rsb.c
|
|
+++ b/arch/arm/mach-sunxi/rsb.c
|
|
@@ -20,7 +20,7 @@ static int rsb_set_device_mode(void);
|
|
|
|
static void rsb_cfg_io(void)
|
|
{
|
|
-#ifdef CONFIG_MACH_SUN8I
|
|
+#if defined CONFIG_MACH_SUN8I || defined CONFIG_MACH_SUN50I
|
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(0), SUN8I_GPL_R_RSB);
|
|
sunxi_gpio_set_cfgpin(SUNXI_GPL(1), SUN8I_GPL_R_RSB);
|
|
sunxi_gpio_set_pull(SUNXI_GPL(0), 1);
|
|
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
|
index 70e01437c4..192cf8ca45 100644
|
|
--- a/board/sunxi/board.c
|
|
+++ b/board/sunxi/board.c
|
|
@@ -519,26 +519,27 @@ void sunxi_board_init(void)
|
|
#endif
|
|
|
|
#if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER || \
|
|
- defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
|
|
- defined CONFIG_AXP818_POWER
|
|
+ defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || \
|
|
+ defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
power_failed = axp_init();
|
|
|
|
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
|
|
- defined CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || \
|
|
+ defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_dcdc1(CONFIG_AXP_DCDC1_VOLT);
|
|
#endif
|
|
power_failed |= axp_set_dcdc2(CONFIG_AXP_DCDC2_VOLT);
|
|
power_failed |= axp_set_dcdc3(CONFIG_AXP_DCDC3_VOLT);
|
|
-#if !defined(CONFIG_AXP209_POWER) && !defined(CONFIG_AXP818_POWER)
|
|
+#if !defined(CONFIG_AXP209_POWER) && !defined(CONFIG_AXP803_POWER) && \
|
|
+ !defined(CONFIG_AXP818_POWER)
|
|
power_failed |= axp_set_dcdc4(CONFIG_AXP_DCDC4_VOLT);
|
|
#endif
|
|
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
|
|
- defined CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || \
|
|
+ defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_dcdc5(CONFIG_AXP_DCDC5_VOLT);
|
|
#endif
|
|
|
|
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
|
|
- defined CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP803_POWER || \
|
|
+ defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_aldo1(CONFIG_AXP_ALDO1_VOLT);
|
|
#endif
|
|
power_failed |= axp_set_aldo2(CONFIG_AXP_ALDO2_VOLT);
|
|
@@ -549,8 +550,8 @@ void sunxi_board_init(void)
|
|
power_failed |= axp_set_aldo4(CONFIG_AXP_ALDO4_VOLT);
|
|
#endif
|
|
|
|
-#if defined(CONFIG_AXP221_POWER) || defined(CONFIG_AXP809_POWER) || \
|
|
- defined(CONFIG_AXP818_POWER)
|
|
+#if defined(CONFIG_AXP221_POWER) || defined(CONFIG_AXP803_POWER) || \
|
|
+ defined(CONFIG_AXP809_POWER) || defined(CONFIG_AXP818_POWER)
|
|
power_failed |= axp_set_dldo(1, CONFIG_AXP_DLDO1_VOLT);
|
|
power_failed |= axp_set_dldo(2, CONFIG_AXP_DLDO2_VOLT);
|
|
#if !defined CONFIG_AXP809_POWER
|
|
@@ -562,13 +563,17 @@ void sunxi_board_init(void)
|
|
power_failed |= axp_set_eldo(3, CONFIG_AXP_ELDO3_VOLT);
|
|
#endif
|
|
|
|
-#ifdef CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP803_POWER || defined CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_fldo(1, CONFIG_AXP_FLDO1_VOLT);
|
|
power_failed |= axp_set_fldo(2, CONFIG_AXP_FLDO2_VOLT);
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_fldo(3, CONFIG_AXP_FLDO3_VOLT);
|
|
#endif
|
|
|
|
-#if defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
|
|
+#if defined CONFIG_AXP803_POWER || defined CONFIG_AXP809_POWER || \
|
|
+ defined CONFIG_AXP818_POWER
|
|
power_failed |= axp_set_sw(IS_ENABLED(CONFIG_AXP_SW_ON));
|
|
#endif
|
|
#endif
|
|
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
|
|
index d8c107e206..2da80ae04b 100644
|
|
--- a/drivers/power/Kconfig
|
|
+++ b/drivers/power/Kconfig
|
|
@@ -11,8 +11,9 @@ choice
|
|
depends on ARCH_SUNXI
|
|
default AXP209_POWER if MACH_SUN4I || MACH_SUN5I || MACH_SUN7I
|
|
default AXP221_POWER if MACH_SUN6I || MACH_SUN8I_A23 || MACH_SUN8I_A33 || MACH_SUN8I_R40
|
|
+ default AXP803_POWER if MACH_SUN50I
|
|
default AXP818_POWER if MACH_SUN8I_A83T
|
|
- default SUNXI_NO_PMIC if MACH_SUNXI_H3_H5 || MACH_SUN50I
|
|
+ default SUNXI_NO_PMIC if MACH_SUNXI_H3_H5
|
|
|
|
config SUNXI_NO_PMIC
|
|
bool "board without a pmic"
|
|
@@ -43,6 +44,13 @@ config AXP221_POWER
|
|
Select this to enable support for the axp221/axp223 pmic found on most
|
|
A23 and A31 boards.
|
|
|
|
+config AXP803_POWER
|
|
+ bool "axp803 pmic support"
|
|
+ depends on MACH_SUN50I
|
|
+ select CMD_POWEROFF
|
|
+ ---help---
|
|
+ Say y here to enable support for the axp803 pmic found on A64 boards.
|
|
+
|
|
config AXP809_POWER
|
|
bool "axp809 pmic support"
|
|
depends on MACH_SUN9I
|
|
@@ -69,25 +77,25 @@ endchoice
|
|
|
|
config AXP_DCDC1_VOLT
|
|
int "axp pmic dcdc1 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
- default 3300 if AXP818_POWER || MACH_SUN8I_R40
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
+ default 3300 if AXP818_POWER || MACH_SUN8I_R40 || MACH_SUN50I
|
|
default 3000 if MACH_SUN6I || MACH_SUN8I || MACH_SUN9I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dcdc1 at, set to 0 to
|
|
disable dcdc1. On A23 / A31 / A33 (axp221) boards dcdc1 is used for
|
|
generic 3.3V IO voltage for external devices like the lcd-panal and
|
|
sdcard interfaces, etc. On most boards dcdc1 is undervolted to 3.0V to
|
|
- save battery. On A31 devices dcdc1 is also used for VCC-IO. On A83T
|
|
- dcdc1 is used for VCC-IO, nand, usb0, sd , etc. On A80 dcdc1 normally
|
|
- powers some of the pingroups, NAND/eMMC, SD/MMC, and USB OTG.
|
|
+ save battery. On A31 devices dcdc1 is also used for VCC-IO. On A83T and
|
|
+ A64 dcdc1 is used for VCC-IO, nand, usb0, sd , etc. On A80 dcdc1
|
|
+ normally powers some of the pingroups, NAND/eMMC, SD/MMC, and USB OTG.
|
|
|
|
config AXP_DCDC2_VOLT
|
|
int "axp pmic dcdc2 voltage"
|
|
- depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP803_POWER || AXP809_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
|
|
+ default 1100 if MACH_SUN8I || MACH_SUN50I
|
|
default 0 if MACH_SUN9I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dcdc2 at, set to 0 to
|
|
@@ -98,14 +106,15 @@ config AXP_DCDC2_VOLT
|
|
On A80 boards dcdc2 powers the GPU and can be left off.
|
|
On A83T boards dcdc2 is used for VDD-CPUA(cluster 0) and should be 0.9V.
|
|
On R40 boards dcdc2 is VDD-CPU and should be 1.1V
|
|
+ On A64 boards dcdc2 is used with dcdc3 for VDD-CPU and should be 1.1V.
|
|
|
|
config AXP_DCDC3_VOLT
|
|
int "axp pmic dcdc3 voltage"
|
|
- depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 900 if AXP809_POWER || AXP818_POWER
|
|
default 1500 if AXP152_POWER
|
|
default 1250 if AXP209_POWER
|
|
- default 1100 if MACH_SUN8I_R40
|
|
+ default 1100 if MACH_SUN8I_R40 || MACH_SUN50I
|
|
default 1200 if MACH_SUN6I || MACH_SUN8I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dcdc3 at, set to 0 to
|
|
@@ -117,39 +126,42 @@ config AXP_DCDC3_VOLT
|
|
On A80 boards dcdc3 is used for VDD-CPUA(cluster 0) and should be 0.9V.
|
|
On A83T boards dcdc3 is used for VDD-CPUB(cluster 1) and should be 0.9V.
|
|
On R40 boards dcdc3 is VDD-SYS and VDD-GPU and should be 1.1V.
|
|
+ On A64 boards dcdc3 is used with dcdc2 for VDD-CPU and should be 1.1V.
|
|
|
|
config AXP_DCDC4_VOLT
|
|
int "axp pmic dcdc4 voltage"
|
|
- depends on AXP152_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP152_POWER || AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 1250 if AXP152_POWER
|
|
default 1200 if MACH_SUN6I
|
|
- default 0 if MACH_SUN8I
|
|
+ default 0 if MACH_SUN8I || MACH_SUN50I
|
|
default 900 if MACH_SUN9I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dcdc4 at, set to 0 to
|
|
disable dcdc4.
|
|
On A10s boards with an axp152 dcdc4 is VDD-INT-DLL and should be 1.25V.
|
|
On A31 boards dcdc4 is used for VDD-SYS and should be 1.2V.
|
|
- On A23 / A33 boards dcdc4 is unused and should be disabled.
|
|
+ On A23 / A33 / A64 boards dcdc4 is unused and should be disabled.
|
|
On A80 boards dcdc4 powers VDD-SYS, HDMI, USB OTG and should be 0.9V.
|
|
On A83T boards dcdc4 is used for VDD-GPU.
|
|
|
|
config AXP_DCDC5_VOLT
|
|
int "axp pmic dcdc5 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 1500 if MACH_SUN6I || MACH_SUN8I || MACH_SUN9I
|
|
+ default 1350 if MACH_SUN50I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dcdc5 at, set to 0 to
|
|
disable dcdc5.
|
|
- On A23 / A31 / A33 / A80 / A83T / R40 boards dcdc5 is VCC-DRAM and
|
|
+ On A23 / A31 / A33 / A64 / A80 / A83T / R40 boards dcdc5 is VCC-DRAM and
|
|
should be 1.5V, 1.35V if DDR3L is used.
|
|
|
|
config AXP_ALDO1_VOLT
|
|
int "axp pmic (a)ldo1 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 0 if MACH_SUN6I || MACH_SUN8I_R40
|
|
default 1800 if MACH_SUN8I_A83T
|
|
default 3000 if MACH_SUN8I || MACH_SUN9I
|
|
+ default 2800 if MACH_SUN50I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic aldo1 at, set to 0 to
|
|
disable aldo1.
|
|
@@ -158,14 +170,16 @@ config AXP_ALDO1_VOLT
|
|
On A80 boards aldo1 powers the USB hosts and should be 3.0V.
|
|
On A83T / H8 boards aldo1 is used for MIPI CSI, DSI, HDMI, EFUSE, and
|
|
should be 1.8V.
|
|
+ On A64 boards aldo1 powers PE pingroup and CSI and should be 2.8V.
|
|
|
|
config AXP_ALDO2_VOLT
|
|
int "axp pmic (a)ldo2 voltage"
|
|
- depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 3000 if AXP152_POWER || AXP209_POWER
|
|
default 0 if MACH_SUN6I || MACH_SUN9I
|
|
default 1800 if MACH_SUN8I_A83T
|
|
default 2500 if MACH_SUN8I
|
|
+ default 1800 if MACH_SUN50I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic aldo2 at, set to 0 to
|
|
disable aldo2.
|
|
@@ -176,17 +190,18 @@ config AXP_ALDO2_VOLT
|
|
On A80 boards aldo2 powers PB pingroup and camera IO and can be left off.
|
|
On A83T / H8 boards aldo2 powers VDD-DLL, VCC18-PLL, CPVDD, VDD18-ADC,
|
|
LPDDR2, and the codec. It should be 1.8V.
|
|
+ On A64 boards aldo2 powers PL pingroup and should be 1.8V.
|
|
|
|
config AXP_ALDO3_VOLT
|
|
int "axp pmic (a)ldo3 voltage"
|
|
- depends on AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP209_POWER || AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 0 if AXP209_POWER || MACH_SUN9I
|
|
- default 3000 if MACH_SUN6I || MACH_SUN8I
|
|
+ default 3000 if MACH_SUN6I || MACH_SUN8I || MACH_SUN50I
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic aldo3 at, set to 0 to
|
|
disable aldo3.
|
|
On A10(s) / A13 / A20 boards aldo3 should be 2.8V.
|
|
- On A23 / A31 / A33 / R40 boards aldo3 is VCC-PLL and AVCC and should
|
|
+ On A23 / A31 / A33 / A64 / R40 boards aldo3 is VCC-PLL and AVCC and should
|
|
be 3.0V.
|
|
On A80 boards aldo3 is normally not used.
|
|
On A83T / H8 boards aldo3 is AVCC, VCC-PL, and VCC-LED, and should be
|
|
@@ -203,17 +218,19 @@ config AXP_ALDO4_VOLT
|
|
|
|
config AXP_DLDO1_VOLT
|
|
int "axp pmic dldo1 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
+ default 3300 if MACH_SUN50I
|
|
default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dldo1 at, set to 0 to
|
|
disable dldo1. On sun6i (A31) boards with ethernet dldo1 is often used
|
|
to power the ethernet phy. On A23, A33 and A80 boards this is often
|
|
- used to power the wifi.
|
|
+ used to power the wifi. On A64 boards this is often used to power the
|
|
+ HDMI.
|
|
|
|
config AXP_DLDO2_VOLT
|
|
int "axp pmic dldo2 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 3000 if MACH_SUN9I
|
|
default 0
|
|
---help---
|
|
@@ -223,7 +240,7 @@ config AXP_DLDO2_VOLT
|
|
|
|
config AXP_DLDO3_VOLT
|
|
int "axp pmic dldo3 voltage"
|
|
- depends on AXP221_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP818_POWER
|
|
default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dldo3 at, set to 0 to
|
|
@@ -231,7 +248,7 @@ config AXP_DLDO3_VOLT
|
|
|
|
config AXP_DLDO4_VOLT
|
|
int "axp pmic dldo4 voltage"
|
|
- depends on AXP221_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP818_POWER
|
|
default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic dldo4 at, set to 0 to
|
|
@@ -239,15 +256,17 @@ config AXP_DLDO4_VOLT
|
|
|
|
config AXP_ELDO1_VOLT
|
|
int "axp pmic eldo1 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
+ default 1800 if MACH_SUN50I
|
|
default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic eldo1 at, set to 0 to
|
|
disable eldo1.
|
|
+ On A64 boards it's used for the codec and should be 1.8V.
|
|
|
|
config AXP_ELDO2_VOLT
|
|
int "axp pmic eldo2 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic eldo2 at, set to 0 to
|
|
@@ -255,7 +274,7 @@ config AXP_ELDO2_VOLT
|
|
|
|
config AXP_ELDO3_VOLT
|
|
int "axp pmic eldo3 voltage"
|
|
- depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP221_POWER || AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default 3000 if MACH_SUN9I
|
|
default 0
|
|
---help---
|
|
@@ -267,8 +286,8 @@ config AXP_ELDO3_VOLT
|
|
|
|
config AXP_FLDO1_VOLT
|
|
int "axp pmic fldo1 voltage"
|
|
- depends on AXP818_POWER
|
|
- default 0 if MACH_SUN8I_A83T
|
|
+ depends on AXP803_POWER || AXP818_POWER
|
|
+ default 0
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic fldo1 at, set to 0 to
|
|
disable fldo1.
|
|
@@ -277,11 +296,13 @@ config AXP_FLDO1_VOLT
|
|
|
|
config AXP_FLDO2_VOLT
|
|
int "axp pmic fldo2 voltage"
|
|
- depends on AXP818_POWER
|
|
+ depends on AXP803_POWER || AXP818_POWER
|
|
+ default 1100 if MACH_SUN50I
|
|
default 900 if MACH_SUN8I_A83T
|
|
---help---
|
|
Set the voltage (mV) to program the axp pmic fldo2 at, set to 0 to
|
|
disable fldo2.
|
|
+ On A64 boards fldo2 is VCC-CPUS and should be 1.1V.
|
|
On A83T / H8 boards fldo2 is VCC-CPUS and should be 0.9V.
|
|
|
|
config AXP_FLDO3_VOLT
|
|
@@ -294,7 +315,7 @@ config AXP_FLDO3_VOLT
|
|
|
|
config AXP_SW_ON
|
|
bool "axp pmic sw on"
|
|
- depends on AXP809_POWER || AXP818_POWER
|
|
+ depends on AXP803_POWER || AXP809_POWER || AXP818_POWER
|
|
default n
|
|
---help---
|
|
Enable to turn on axp pmic sw.
|
|
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
|
|
index 90a3b00a7c..55413a66d2 100644
|
|
--- a/drivers/power/Makefile
|
|
+++ b/drivers/power/Makefile
|
|
@@ -8,6 +8,7 @@
|
|
obj-$(CONFIG_AXP152_POWER) += axp152.o
|
|
obj-$(CONFIG_AXP209_POWER) += axp209.o
|
|
obj-$(CONFIG_AXP221_POWER) += axp221.o
|
|
+obj-$(CONFIG_AXP803_POWER) += axp803.o
|
|
obj-$(CONFIG_AXP809_POWER) += axp809.o
|
|
obj-$(CONFIG_AXP818_POWER) += axp818.o
|
|
obj-$(CONFIG_EXYNOS_TMU) += exynos-tmu.o
|
|
diff --git a/drivers/power/axp803.c b/drivers/power/axp803.c
|
|
new file mode 100644
|
|
index 0000000000..af20fce8b1
|
|
--- /dev/null
|
|
+++ b/drivers/power/axp803.c
|
|
@@ -0,0 +1,259 @@
|
|
+/*
|
|
+ * AXP803 driver based on AXP818 driver
|
|
+ *
|
|
+ * Based on axp818.c
|
|
+ * (C) Copyright 2015 Vishnu Patekar <vishnuptekar0510@gmail.com>
|
|
+ *
|
|
+ * Based on axp221.c
|
|
+ * (C) Copyright 2014 Hans de Goede <hdegoede@redhat.com>
|
|
+ * (C) Copyright 2013 Oliver Schinagl <oliver@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 axp803_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 = axp803_mvolt_to_cfg(mvolt, 1600, 3400, 100);
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC1_EN);
|
|
+
|
|
+ ret = pmic_bus_write(AXP803_DCDC1_CTRL, cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC1_EN);
|
|
+}
|
|
+
|
|
+int axp_set_dcdc2(unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (mvolt >= 1220)
|
|
+ cfg = 70 + axp803_mvolt_to_cfg(mvolt, 1220, 1300, 20);
|
|
+ else
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 500, 1200, 10);
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC2_EN);
|
|
+
|
|
+ ret = pmic_bus_write(AXP803_DCDC2_CTRL, cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC2_EN);
|
|
+}
|
|
+
|
|
+int axp_set_dcdc3(unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (mvolt >= 1220)
|
|
+ cfg = 70 + axp803_mvolt_to_cfg(mvolt, 1220, 1300, 20);
|
|
+ else
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 500, 1200, 10);
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC3_EN);
|
|
+
|
|
+ ret = pmic_bus_write(AXP803_DCDC3_CTRL, cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC3_EN);
|
|
+}
|
|
+
|
|
+int axp_set_dcdc5(unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (mvolt >= 1140)
|
|
+ cfg = 32 + axp803_mvolt_to_cfg(mvolt, 1140, 1840, 20);
|
|
+ else
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 800, 1120, 10);
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC5_EN);
|
|
+
|
|
+ ret = pmic_bus_write(AXP803_DCDC5_CTRL, cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL1,
|
|
+ AXP803_OUTPUT_CTRL1_DCDC5_EN);
|
|
+}
|
|
+
|
|
+int axp_set_aldo(int aldo_num, unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (aldo_num < 1 || aldo_num > 3)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL3,
|
|
+ AXP803_OUTPUT_CTRL3_ALDO1_EN << (aldo_num - 1));
|
|
+
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 700, 3300, 100);
|
|
+ ret = pmic_bus_write(AXP803_ALDO1_CTRL + (aldo_num - 1), cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL3,
|
|
+ AXP803_OUTPUT_CTRL3_ALDO1_EN << (aldo_num - 1));
|
|
+}
|
|
+
|
|
+/* TODO: re-work other AXP drivers to consolidate ALDO functions. */
|
|
+int axp_set_aldo1(unsigned int mvolt)
|
|
+{
|
|
+ return axp_set_aldo(1, mvolt);
|
|
+}
|
|
+
|
|
+int axp_set_aldo2(unsigned int mvolt)
|
|
+{
|
|
+ return axp_set_aldo(2, mvolt);
|
|
+}
|
|
+
|
|
+int axp_set_aldo3(unsigned int mvolt)
|
|
+{
|
|
+ return axp_set_aldo(3, mvolt);
|
|
+}
|
|
+
|
|
+int axp_set_dldo(int dldo_num, unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (dldo_num < 1 || dldo_num > 4)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
|
|
+
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 700, 3300, 100);
|
|
+ if (dldo_num == 2 && mvolt > 3300)
|
|
+ cfg += 1 + axp803_mvolt_to_cfg(mvolt, 3400, 4200, 200);
|
|
+ ret = pmic_bus_write(AXP803_DLDO1_CTRL + (dldo_num - 1), cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
|
|
+}
|
|
+
|
|
+int axp_set_eldo(int eldo_num, unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (eldo_num < 1 || eldo_num > 3)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
|
|
+
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 700, 1900, 50);
|
|
+ ret = pmic_bus_write(AXP803_ELDO1_CTRL + (eldo_num - 1), cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
|
|
+}
|
|
+
|
|
+int axp_set_fldo(int fldo_num, unsigned int mvolt)
|
|
+{
|
|
+ int ret;
|
|
+ u8 cfg;
|
|
+
|
|
+ if (fldo_num < 1 || fldo_num > 2)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (mvolt == 0)
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL3,
|
|
+ AXP803_OUTPUT_CTRL3_FLDO1_EN << (fldo_num - 1));
|
|
+
|
|
+ cfg = axp803_mvolt_to_cfg(mvolt, 700, 1450, 50);
|
|
+ ret = pmic_bus_write(AXP803_FLDO1_CTRL + (fldo_num - 1), cfg);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL3,
|
|
+ AXP803_OUTPUT_CTRL3_FLDO1_EN << (fldo_num - 1));
|
|
+}
|
|
+
|
|
+int axp_set_sw(bool on)
|
|
+{
|
|
+ if (on)
|
|
+ return pmic_bus_setbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_SW_EN);
|
|
+
|
|
+ return pmic_bus_clrbits(AXP803_OUTPUT_CTRL2,
|
|
+ AXP803_OUTPUT_CTRL2_SW_EN);
|
|
+}
|
|
+
|
|
+int axp_init(void)
|
|
+{
|
|
+ u8 axp_chip_id;
|
|
+ int ret;
|
|
+
|
|
+ ret = pmic_bus_init();
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = pmic_bus_read(AXP803_CHIP_ID, &axp_chip_id);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ if (!(axp_chip_id == 0x51))
|
|
+ return -ENODEV;
|
|
+ else
|
|
+ return ret;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* ARM64 has its own poweroff implementation using PSCI */
|
|
+#ifndef CONFIG_ARM64
|
|
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
+{
|
|
+ pmic_bus_write(AXP803_SHUTDOWN, AXP803_SHUTDOWN_POWEROFF);
|
|
+
|
|
+ /* infinite loop during shutdown */
|
|
+ while (1)
|
|
+ ;
|
|
+
|
|
+ /* not reached */
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
diff --git a/drivers/power/axp818.c b/drivers/power/axp818.c
|
|
index af4d7a6903..ad0c330ca5 100644
|
|
--- a/drivers/power/axp818.c
|
|
+++ b/drivers/power/axp818.c
|
|
@@ -162,7 +162,7 @@ int axp_set_dldo(int dldo_num, unsigned int mvolt)
|
|
cfg = axp818_mvolt_to_cfg(mvolt, 700, 3300, 100);
|
|
if (dldo_num == 2 && mvolt > 3300)
|
|
cfg += 1 + axp818_mvolt_to_cfg(mvolt, 3400, 4200, 200);
|
|
- ret = pmic_bus_write(AXP818_ELDO1_CTRL + (dldo_num - 1), cfg);
|
|
+ ret = pmic_bus_write(AXP818_DLDO1_CTRL + (dldo_num - 1), cfg);
|
|
if (ret)
|
|
return ret;
|
|
|
|
diff --git a/include/axp803.h b/include/axp803.h
|
|
new file mode 100644
|
|
index 0000000000..b382f3a5ec
|
|
--- /dev/null
|
|
+++ b/include/axp803.h
|
|
@@ -0,0 +1,73 @@
|
|
+/*
|
|
+ * (C) Copyright 2016 Icenowy Zheng <icenowy@aosc.xyz>
|
|
+ *
|
|
+ * Based on axp818.h, which is:
|
|
+ * (C) Copyright 2015 Vishnu Patekar <vishnupatekar0510@gmail.com>
|
|
+ *
|
|
+ * X-Powers AXP803 Power Management IC driver
|
|
+ *
|
|
+ * SPDX-License-Identifier: GPL-2.0+
|
|
+ */
|
|
+
|
|
+#define AXP803_CHIP_ID 0x03
|
|
+
|
|
+#define AXP803_OUTPUT_CTRL1 0x10
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC1_EN (1 << 0)
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC2_EN (1 << 1)
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC3_EN (1 << 2)
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC4_EN (1 << 3)
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC5_EN (1 << 4)
|
|
+#define AXP803_OUTPUT_CTRL1_DCDC6_EN (1 << 5)
|
|
+#define AXP803_OUTPUT_CTRL2 0x12
|
|
+#define AXP803_OUTPUT_CTRL2_ELDO1_EN (1 << 0)
|
|
+#define AXP803_OUTPUT_CTRL2_ELDO2_EN (1 << 1)
|
|
+#define AXP803_OUTPUT_CTRL2_ELDO3_EN (1 << 2)
|
|
+#define AXP803_OUTPUT_CTRL2_DLDO1_EN (1 << 3)
|
|
+#define AXP803_OUTPUT_CTRL2_DLDO2_EN (1 << 4)
|
|
+#define AXP803_OUTPUT_CTRL2_DLDO3_EN (1 << 5)
|
|
+#define AXP803_OUTPUT_CTRL2_DLDO4_EN (1 << 6)
|
|
+#define AXP803_OUTPUT_CTRL2_SW_EN (1 << 7)
|
|
+#define AXP803_OUTPUT_CTRL3 0x13
|
|
+#define AXP803_OUTPUT_CTRL3_FLDO1_EN (1 << 2)
|
|
+#define AXP803_OUTPUT_CTRL3_FLDO2_EN (1 << 3)
|
|
+#define AXP803_OUTPUT_CTRL3_ALDO1_EN (1 << 5)
|
|
+#define AXP803_OUTPUT_CTRL3_ALDO2_EN (1 << 6)
|
|
+#define AXP803_OUTPUT_CTRL3_ALDO3_EN (1 << 7)
|
|
+
|
|
+#define AXP803_DLDO1_CTRL 0x15
|
|
+#define AXP803_DLDO2_CTRL 0x16
|
|
+#define AXP803_DLDO3_CTRL 0x17
|
|
+#define AXP803_DLDO4_CTRL 0x18
|
|
+#define AXP803_ELDO1_CTRL 0x19
|
|
+#define AXP803_ELDO2_CTRL 0x1a
|
|
+#define AXP803_ELDO3_CTRL 0x1b
|
|
+#define AXP803_FLDO1_CTRL 0x1c
|
|
+#define AXP803_FLDO2_CTRL 0x1d
|
|
+#define AXP803_DCDC1_CTRL 0x20
|
|
+#define AXP803_DCDC2_CTRL 0x21
|
|
+#define AXP803_DCDC3_CTRL 0x22
|
|
+#define AXP803_DCDC4_CTRL 0x23
|
|
+#define AXP803_DCDC5_CTRL 0x24
|
|
+#define AXP803_DCDC6_CTRL 0x25
|
|
+
|
|
+#define AXP803_ALDO1_CTRL 0x28
|
|
+#define AXP803_ALDO2_CTRL 0x29
|
|
+#define AXP803_ALDO3_CTRL 0x2a
|
|
+
|
|
+#define AXP803_SHUTDOWN 0x32
|
|
+#define AXP803_SHUTDOWN_POWEROFF (1 << 7)
|
|
+
|
|
+/* For axp_gpio.c */
|
|
+#define AXP_POWER_STATUS 0x00
|
|
+#define AXP_POWER_STATUS_VBUS_PRESENT (1 << 5)
|
|
+#define AXP_VBUS_IPSOUT 0x30
|
|
+#define AXP_VBUS_IPSOUT_DRIVEBUS (1 << 2)
|
|
+#define AXP_MISC_CTRL 0x8f
|
|
+#define AXP_MISC_CTRL_N_VBUSEN_FUNC (1 << 4)
|
|
+#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 d789ad8086..8cb4d5763c 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_AXP803_POWER
|
|
+#include <axp803.h>
|
|
+#endif
|
|
#ifdef CONFIG_AXP809_POWER
|
|
#include <axp809.h>
|
|
#endif
|