sunxi: power: add support for sy8106a driver
authorJelle van der Waa <jelle@vdwaa.nl>
Tue, 23 Feb 2016 17:47:19 +0000 (18:47 +0100)
committerHans de Goede <hdegoede@redhat.com>
Tue, 23 Feb 2016 19:50:07 +0000 (20:50 +0100)
SY8106A is a PMIC which is used on the Allwinner
H3 Orange Pi Pc and Plus board. The VOUT1_SEL register is
implemented to set the default V-CPU voltage to 1200 mV.

This driver is required to ensure the SY8106A V-CPU
voltage is set to 1200 mV after a software reset. On cold
boot the default SY8106A output voltage is selected to be
1200 mV by a pair of resistors on the Orange Pi PC and Plus.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
Tested-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Acked-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
board/sunxi/Kconfig
board/sunxi/board.c
configs/orangepi_pc_defconfig
configs/orangepi_plus_defconfig
drivers/power/Kconfig
drivers/power/Makefile
drivers/power/sy8106a.c [new file with mode: 0644]
include/configs/sunxi-common.h
include/sy8106a.h [new file with mode: 0644]

index a334aa336d14c18af8e5447ae1b16d6ee4810b4a..5e9d3af336e1b7fea403cd30642d3748a30dc7e9 100644 (file)
@@ -372,11 +372,14 @@ config I2C3_ENABLE
        See I2C0_ENABLE help text.
 endif
 
+if SUNXI_GEN_SUN6I
 config R_I2C_ENABLE
        bool "Enable the PRCM I2C/TWI controller"
-       default n
+       # This is used for the pmic on H3
+       default y if SY8106A_POWER
        ---help---
        Set this to y to enable the I2C controller which is part of the PRCM.
+endif
 
 if MACH_SUN7I
 config I2C4_ENABLE
index 420481a9fb849797bf97c1681d96480a45991801..15b7af634cb275b48bd308e0b52c433407624bac 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/io.h>
 #include <nand.h>
 #include <net.h>
+#include <sy8106a.h>
 
 #if defined CONFIG_VIDEO_LCD_PANEL_I2C && !(defined CONFIG_SPL_BUILD)
 /* So that we can use pin names in Kconfig and sunxi_name_to_gpio() */
@@ -436,6 +437,10 @@ void sunxi_board_init(void)
        int power_failed = 0;
        unsigned long ramsize;
 
+#ifdef CONFIG_SY8106A_POWER
+       power_failed = sy8106a_set_vout1(CONFIG_SY8106A_VOUT1_VOLT);
+#endif
+
 #if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER || \
        defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
        power_failed = axp_init();
index ea9ed874e8f968fb58e01943305da8a9b609271e..29a8da6661a11f7c58bd0892b1cac49ab983b0d6 100644 (file)
@@ -12,4 +12,4 @@ CONFIG_SPL=y
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
 CONFIG_CMD_GPIO=y
-CONFIG_R_I2C_ENABLE=y
+CONFIG_SY8106A_POWER=y
index 003a9c6c03cccb1ce8876a89694daf981c098040..d65b828606392060f54dcb7d8293e4b830bac523 100644 (file)
@@ -12,3 +12,4 @@ CONFIG_SPL=y
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
 CONFIG_CMD_GPIO=y
+CONFIG_SY8106A_POWER=y
index 10683a21d971eb9a06e817aa6437f6f9689315f4..adc64552e74ae75086a00ed1ffde3321f273d4f6 100644 (file)
@@ -48,6 +48,13 @@ config AXP818_POWER
        Say y here to enable support for the axp818 pmic found on
        A83T dev board.
 
+config SY8106A_POWER
+       boolean "SY8106A pmic support"
+       depends on MACH_SUN8I_H3
+       ---help---
+       Select this to enable support for the SY8106A pmic found on some
+       H3 boards.
+
 endchoice
 
 config AXP_DCDC1_VOLT
@@ -232,4 +239,13 @@ config AXP_ELDO3_VOLT
        1.2V for the SSD2828 chip (converter of parallel LCD interface
        into MIPI DSI).
 
+config SY8106A_VOUT1_VOLT
+       int "SY8106A pmic VOUT1 voltage"
+       depends on SY8106A_POWER
+       default 1200
+       ---help---
+       Set the voltage (mV) to program the SY8106A pmic VOUT1. This
+       is typically used to power the VDD-CPU and should be 1200mV.
+       Values can range from 680mV till 1950mV.
+
 endmenu
index 0fdbca3c35e2355f6eb302118ee2923ee31af7db..690faa0f5e4786f0ce62247408dcf266fe0c7c90 100644 (file)
@@ -12,6 +12,7 @@ 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_SY8106A_POWER)    += sy8106a.o
 obj-$(CONFIG_TPS6586X_POWER)   += tps6586x.o
 obj-$(CONFIG_TWL4030_POWER)    += twl4030.o
 obj-$(CONFIG_TWL6030_POWER)    += twl6030.o
diff --git a/drivers/power/sy8106a.c b/drivers/power/sy8106a.c
new file mode 100644 (file)
index 0000000..bbf116f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * (C) Copyright 2016
+ * Jelle van der Waa <jelle@vdwaa.nl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <i2c.h>
+#include <sy8106a.h>
+
+#define SY8106A_I2C_ADDR 0x65
+#define SY8106A_VOUT1_SEL 1
+#define SY8106A_VOUT1_SEL_ENABLE (1 << 7)
+
+static u8 sy8106a_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 sy8106a_set_vout1(unsigned int mvolt)
+{
+       u8 data = sy8106a_mvolt_to_cfg(mvolt, 680, 1950, 10) | SY8106A_VOUT1_SEL_ENABLE;
+       return i2c_write(SY8106A_I2C_ADDR, SY8106A_VOUT1_SEL, 1, &data, 1);
+}
index b4dfb3cc47c7d9f29c2d005de17a7f494db87202..40850e5d99d6c4ead4fed0bd8026b030a50eaacc 100644 (file)
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 /* I2C */
-#if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER
+#if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER || \
+    defined CONFIG_SY8106A_POWER
 #define CONFIG_SPL_I2C_SUPPORT
 #endif
 
@@ -240,7 +241,8 @@ extern int soft_i2c_gpio_scl;
 
 /* PMU */
 #if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER || \
-    defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
+    defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER || \
+    defined CONFIG_SY8106A_POWER
 #define CONFIG_SPL_POWER_SUPPORT
 #endif
 
diff --git a/include/sy8106a.h b/include/sy8106a.h
new file mode 100644 (file)
index 0000000..32e8c43
--- /dev/null
@@ -0,0 +1,11 @@
+/*
+ * (C) Copyright 2016
+ * Jelle van der Waa <jelle@vdwaa.nl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef _SY8106A_PMIC_H_
+
+int sy8106a_set_vout1(unsigned int mvolt);
+
+#endif