Skip to contentSkip to conversation

sun6i: Add basic axp221 driver

PATCH Superseded Hans de Goede 3 participants 7 messages Nov 10, 2014 – Jan 5, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

--
Changes in v2:
-Rebase
Changes in v3:
-Add support for all dldo and aldo-s
-Add Kconfig option to select building AXP221 and to select voltage of
dldo and aldo-s
Changes in v4:
-Add axp221_setbits helper function
-Use symbolic names for enabled bits in CTRL1 - CTRL3 registers

---
 board/sunxi/board.c    |  26 +++++++
 drivers/power/Kconfig  |  47 +++++++++++++
 drivers/power/Makefile |   1 +
 drivers/power/axp221.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++
 include/axp221.h       |  50 +++++++++++++
 5 files changed, 310 insertions(+)
 create mode 100644 drivers/power/axp221.c
 create mode 100644 include/axp221.h
board/sunxi/board.c +26 -0
index 03890c8..e6ec5b8 100644
@@ -19,6 +19,9 @@
 #ifdef CONFIG_AXP209_POWER
 #include <axp209.h>
 #endif
+#ifdef CONFIG_AXP221_POWER
+#include <axp221.h>
+#endif
 #include <asm/arch/clock.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/dram.h>
@@ -169,6 +172,29 @@ void sunxi_board_init(void)
 	power_failed |= axp209_set_ldo3(2800);
 	power_failed |= axp209_set_ldo4(2800);
 #endif
+#ifdef CONFIG_AXP221_POWER
+	power_failed = axp221_init();
+	power_failed |= axp221_set_dcdc1(3000);
+	power_failed |= axp221_set_dcdc2(1200);
+	power_failed |= axp221_set_dcdc3(1200);
+	power_failed |= axp221_set_dcdc4(1200);
+	power_failed |= axp221_set_dcdc5(1500);
+#if CONFIG_AXP221_DLDO1_VOLT != -1
+	power_failed |= axp221_set_dldo1(CONFIG_AXP221_DLDO1_VOLT);
+#endif
+#if CONFIG_AXP221_DLDO4_VOLT != -1
+	power_failed |= axp221_set_dldo4(CONFIG_AXP221_DLDO4_VOLT);
+#endif
+#if CONFIG_AXP221_ALDO1_VOLT != -1
+	power_failed |= axp221_set_aldo1(CONFIG_AXP221_ALDO1_VOLT);
+#endif
+#if CONFIG_AXP221_ALDO2_VOLT != -1
+	power_failed |= axp221_set_aldo2(CONFIG_AXP221_ALDO2_VOLT);
+#endif
+#if CONFIG_AXP221_ALDO3_VOLT != -1
+	power_failed |= axp221_set_aldo3(CONFIG_AXP221_ALDO3_VOLT);
+#endif
+#endif
 
 	printf("DRAM:");
 	ramsize = sunxi_dram_init();
drivers/power/Kconfig +47 -0

47 lines not on this page · raw message

drivers/power/Makefile +1 -0
index dc64e4d..04bd996 100644
@@ -7,6 +7,7 @@
 
 obj-$(CONFIG_AXP152_POWER)	+= axp152.o
 obj-$(CONFIG_AXP209_POWER)	+= axp209.o
+obj-$(CONFIG_AXP221_POWER)	+= axp221.o
 obj-$(CONFIG_EXYNOS_TMU)	+= exynos-tmu.o
 obj-$(CONFIG_FTPMU010_POWER)	+= ftpmu010.o
 obj-$(CONFIG_TPS6586X_POWER)	+= tps6586x.o
drivers/power/axp221.c new file +186 -0

186 lines not on this page · raw message

include/axp221.h new file +50 -0

50 lines not on this page · raw message

Signature · 1 line
2.1.0
#2 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

Hi,

Quoted 9 lines · Ian Campbell
Quoted 6 lines · Hans de Goede

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

Thanks, I've taken the liberty to change this to:

And pushed the entire series to u-boot-sunxi/next

I'm somewhat tempted to send a PR with this to Tom, is there anything pending which we should get in first ?

Regards,

Hans

#3 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

Quoted 8 lines · Hans de Goede

Hi,

Quoted 5 lines · Ian Campbell
Quoted 4 lines · Hans de Goede

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

Thanks, I've taken the liberty to change this to:

Right, thanks. Wrong set of finger macros loaded...

Quoted 4 lines

And pushed the entire series to u-boot-sunxi/next

I'm somewhat tempted to send a PR with this to Tom, is there anything pending which we should get in first ?

I seem to have http://patchwork.ozlabs.org/patch/403231/ delegated to me, but didn't you fix that already?

Ian.

#4 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

Hi,

Quoted 20 lines · Ian Campbell
Quoted 8 lines · Hans de Goede

Hi,

Quoted 5 lines · Ian Campbell
Quoted 4 lines · Hans de Goede

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

Thanks, I've taken the liberty to change this to:

Right, thanks. Wrong set of finger macros loaded...

Quoted 7 lines
Quoted 4 lines

And pushed the entire series to u-boot-sunxi/next

I'm somewhat tempted to send a PR with this to Tom, is there anything pending which we should get in first ?

I seem to have http://patchwork.ozlabs.org/patch/403231/ delegated to me, but didn't you fix that already?

Yes that is already fixed in master, I've moved this to accepted.

Regards,

Hans

#5 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

In reply to Hans de Goede
Quoted 17 lines · On Mon, 10 Nov 2014 14:11:51 +0100 Hans de Goede <[email protected]> wrote:

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

--
Changes in v2:
-Rebase
Changes in v3:

(quoted diff) +0 -2
-Add support for all dldo and aldo-s
-Add Kconfig option to select building AXP221 and to select voltage of
 dldo and aldo-s

Changes in v4:

(quoted diff) +0 -3
-Add axp221_setbits helper function
-Use symbolic names for enabled bits in CTRL1 - CTRL3 registers
---

[...]

Quoted 31 lines
include/axp221.h new file +25 -0
new file mode 100644
index 0000000..e3b4409
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2013 Oliver Schinagl <[email protected]>
+ *
+ * X-Powers AXP221 Power Management IC driver
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#define AXP221_CHIP_ADDR 0x68
+#define AXP221_CTRL_ADDR 0x3e
+#define AXP221_INIT_DATA 0x3e
+
+#define AXP221_CHIP_ID		0x03
+#define AXP221_OUTPUT_CTRL1	0x10
+#define AXP221_OUTPUT_CTRL1_ALDO1_EN	(1 << 6)
+#define AXP221_OUTPUT_CTRL1_ALDO2_EN	(1 << 7)
+#define AXP221_OUTPUT_CTRL2	0x12
+#define AXP221_OUTPUT_CTRL2_DLDO1_EN	(1 << 3)
+#define AXP221_OUTPUT_CTRL2_DLDO2_EN	(1 << 4)
+#define AXP221_OUTPUT_CTRL2_DLDO3_EN	(1 << 5)
+#define AXP221_OUTPUT_CTRL2_DLDO4_EN	(1 << 6)
+#define AXP221_OUTPUT_CTRL2_DCDC1_EN	(1 << 7)
+#define AXP221_OUTPUT_CTRL3	0x13
+#define AXP221_OUTPUT_CTRL3_ALDO3_EN	(1 << 7)
+#define AXP221_DLDO1_CTRL	0x15

include/axp221.h line 35

Quoted 10 lines
include/axp221.h new file +10 -0
+#define AXP221_DLDO2_CTRL	0x16
+#define AXP221_DLDO3_CTRL	0x17
+#define AXP221_DLDO4_CTRL	0x18
+#define AXP221_DCDC1_CTRL	0x21
+#define AXP221_DCDC2_CTRL	0x22
+#define AXP221_DCDC3_CTRL	0x23
+#define AXP221_DCDC4_CTRL	0x24
+#define AXP221_DCDC5_CTRL	0x25
+#define AXP221_ALDO1_CTRL	0x28
+#define AXP221_ALDO2_CTRL	0x28

The register offset of ALDO2 seems to be incorrect here (same as ALDO1):

    http://linux-sunxi.org/AXP221#Reg_29h:_ALDO2_output_voltage

In the current u-boot master, ALDO2 is only used by:
configs/Mele_M9_defconfig:+S:CONFIG_AXP221_ALDO1_VOLT=3300

$ cat Mele_M9_defconfig 
CONFIG_SPL=y
CONFIG_SYS_EXTRA_OPTIONS="USB_EHCI,SUNXI_GMAC"
CONFIG_FDTFILE="sun6i-a31-m9.dtb"
+S:CONFIG_ARM=y
+S:CONFIG_ARCH_SUNXI=y
+S:CONFIG_MACH_SUN6I=y
+S:CONFIG_TARGET_MELE_M9=y
# Ethernet phy power
+S:CONFIG_AXP221_DLDO1_VOLT=3300
# USB hub power
+S:CONFIG_AXP221_DLDO4_VOLT=3300
# Wifi power
+S:CONFIG_AXP221_ALDO1_VOLT=3300
# HDMI power ?
+S:CONFIG_AXP221_ALDO2_VOLT=1800
+S:CONFIG_AXP221_ALDO3_VOLT=3000
# Vbus gpio for usb1
+S:CONFIG_USB1_VBUS_PIN="PC27"
# No Vbus gpio for usb2
+S:CONFIG_USB2_VBUS_PIN=""

It means that the code in "boards/sunxi/board.c" is likely to set 1.8V for ALDO1 instead of 3.3V:

#if CONFIG_AXP221_ALDO1_VOLT != -1
	power_failed |= axp221_set_aldo1(CONFIG_AXP221_ALDO1_VOLT);
#endif
#if CONFIG_AXP221_ALDO2_VOLT != -1
	power_failed |= axp221_set_aldo2(CONFIG_AXP221_ALDO2_VOLT);

#endif

Does Wifi actually work on Mele M9? And if not, then is this something that needs to be fixed in the v2015.01 release?

Also ALDO1/ALDO2 have much heavier use in the u-boot-sunxi "next" branch.

Quoted 15 lines
include/axp221.h new file +15 -0
+#define AXP221_ALDO3_CTRL	0x2a
+
+int axp221_set_dcdc1(unsigned int mvolt);
+int axp221_set_dcdc2(unsigned int mvolt);
+int axp221_set_dcdc3(unsigned int mvolt);
+int axp221_set_dcdc4(unsigned int mvolt);
+int axp221_set_dcdc5(unsigned int mvolt);
+int axp221_set_dldo1(unsigned int mvolt);
+int axp221_set_dldo2(unsigned int mvolt);
+int axp221_set_dldo3(unsigned int mvolt);
+int axp221_set_dldo4(unsigned int mvolt);
+int axp221_set_aldo1(unsigned int mvolt);
+int axp221_set_aldo2(unsigned int mvolt);
+int axp221_set_aldo3(unsigned int mvolt);
+int axp221_init(void);
Signature · 2 lines
Best regards,
Siarhei Siamashka
#6 lore raw

PATCH v4 1/1 sun6i: Add basic axp221 driver

Hi,

Quoted 66 lines · Siarhei Siamashka
Quoted 17 lines · On Mon, 10 Nov 2014 14:11:51 +0100 Hans de Goede <[email protected]> wrote:

From: Oliver Schinagl <[email protected]>

The A31 uses the AXP221 pmic for various voltages.

--
Changes in v2:
-Rebase
Changes in v3:

(quoted diff) +0 -2
-Add support for all dldo and aldo-s
-Add Kconfig option to select building AXP221 and to select voltage of
  dldo and aldo-s

Changes in v4:

(quoted diff) +0 -3
-Add axp221_setbits helper function
-Use symbolic names for enabled bits in CTRL1 - CTRL3 registers
---

[...]

Quoted 31 lines
include/axp221.h new file +25 -0
new file mode 100644
index 0000000..e3b4409
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2013 Oliver Schinagl <[email protected]>
+ *
+ * X-Powers AXP221 Power Management IC driver
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#define AXP221_CHIP_ADDR 0x68
+#define AXP221_CTRL_ADDR 0x3e
+#define AXP221_INIT_DATA 0x3e
+
+#define AXP221_CHIP_ID		0x03
+#define AXP221_OUTPUT_CTRL1	0x10
+#define AXP221_OUTPUT_CTRL1_ALDO1_EN	(1 << 6)
+#define AXP221_OUTPUT_CTRL1_ALDO2_EN	(1 << 7)
+#define AXP221_OUTPUT_CTRL2	0x12
+#define AXP221_OUTPUT_CTRL2_DLDO1_EN	(1 << 3)
+#define AXP221_OUTPUT_CTRL2_DLDO2_EN	(1 << 4)
+#define AXP221_OUTPUT_CTRL2_DLDO3_EN	(1 << 5)
+#define AXP221_OUTPUT_CTRL2_DLDO4_EN	(1 << 6)
+#define AXP221_OUTPUT_CTRL2_DCDC1_EN	(1 << 7)
+#define AXP221_OUTPUT_CTRL3	0x13
+#define AXP221_OUTPUT_CTRL3_ALDO3_EN	(1 << 7)
+#define AXP221_DLDO1_CTRL	0x15

include/axp221.h line 35

Quoted 10 lines
include/axp221.h new file +10 -0
+#define AXP221_DLDO2_CTRL	0x16
+#define AXP221_DLDO3_CTRL	0x17
+#define AXP221_DLDO4_CTRL	0x18
+#define AXP221_DCDC1_CTRL	0x21
+#define AXP221_DCDC2_CTRL	0x22
+#define AXP221_DCDC3_CTRL	0x23
+#define AXP221_DCDC4_CTRL	0x24
+#define AXP221_DCDC5_CTRL	0x25
+#define AXP221_ALDO1_CTRL	0x28
+#define AXP221_ALDO2_CTRL	0x28

The register offset of ALDO2 seems to be incorrect here (same as ALDO1):

Quoted 4 lines
     http://linux-sunxi.org/AXP221#Reg_29h:_ALDO2_output_voltage

In the current u-boot master, ALDO2 is only used by:
configs/Mele_M9_defconfig:+S:CONFIG_AXP221_ALDO1_VOLT=3300

Ouch, good catch, I'll send a fix out right away and I'll try to get this included in v2015.01.

Regards,

Hans

Quoted 55 lines
$ cat Mele_M9_defconfig
CONFIG_SPL=y
CONFIG_SYS_EXTRA_OPTIONS="USB_EHCI,SUNXI_GMAC"
CONFIG_FDTFILE="sun6i-a31-m9.dtb"
(quoted diff) +4 -0
+S:CONFIG_ARM=y
+S:CONFIG_ARCH_SUNXI=y
+S:CONFIG_MACH_SUN6I=y
+S:CONFIG_TARGET_MELE_M9=y

# Ethernet phy power
+S:CONFIG_AXP221_DLDO1_VOLT=3300
# USB hub power
+S:CONFIG_AXP221_DLDO4_VOLT=3300
# Wifi power
+S:CONFIG_AXP221_ALDO1_VOLT=3300
# HDMI power ?

(quoted diff) +2 -0
+S:CONFIG_AXP221_ALDO2_VOLT=1800
+S:CONFIG_AXP221_ALDO3_VOLT=3000

# Vbus gpio for usb1
+S:CONFIG_USB1_VBUS_PIN="PC27"
# No Vbus gpio for usb2
+S:CONFIG_USB2_VBUS_PIN=""

It means that the code in "boards/sunxi/board.c" is likely to set 1.8V for ALDO1 instead of 3.3V:

#if CONFIG_AXP221_ALDO1_VOLT != -1
	power_failed |= axp221_set_aldo1(CONFIG_AXP221_ALDO1_VOLT);
#endif
#if CONFIG_AXP221_ALDO2_VOLT != -1
	power_failed |= axp221_set_aldo2(CONFIG_AXP221_ALDO2_VOLT);

#endif

Does Wifi actually work on Mele M9? And if not, then is this something that needs to be fixed in the v2015.01 release?

Also ALDO1/ALDO2 have much heavier use in the u-boot-sunxi "next" branch.

Quoted 15 lines
include/axp221.h new file +15 -0
+#define AXP221_ALDO3_CTRL	0x2a
+
+int axp221_set_dcdc1(unsigned int mvolt);
+int axp221_set_dcdc2(unsigned int mvolt);
+int axp221_set_dcdc3(unsigned int mvolt);
+int axp221_set_dcdc4(unsigned int mvolt);
+int axp221_set_dcdc5(unsigned int mvolt);
+int axp221_set_dldo1(unsigned int mvolt);
+int axp221_set_dldo2(unsigned int mvolt);
+int axp221_set_dldo3(unsigned int mvolt);
+int axp221_set_dldo4(unsigned int mvolt);
+int axp221_set_aldo1(unsigned int mvolt);
+int axp221_set_aldo2(unsigned int mvolt);
+int axp221_set_aldo3(unsigned int mvolt);
+int axp221_init(void);