[U-Boot] [RFC PATCH] PMIC: add act8865 series support

Bo Shen voice.shen at atmel.com
Thu Mar 12 10:57:07 CET 2015


Add Active-Semi act8865 series PMU support.

Signed-off-by: Bo Shen <voice.shen at atmel.com>
---

 drivers/power/Makefile  |   1 +
 drivers/power/act8865.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/act8865.h       |  54 +++++++++++++++++++++++++
 3 files changed, 159 insertions(+)
 create mode 100644 drivers/power/act8865.c
 create mode 100644 include/act8865.h

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 2145652..0c2a8cf 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -5,6 +5,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
+obj-$(CONFIG_ACT8865_POWER)	+= act8865.o
 obj-$(CONFIG_AS3722_POWER)	+= as3722.o
 obj-$(CONFIG_AXP152_POWER)	+= axp152.o
 obj-$(CONFIG_AXP209_POWER)	+= axp209.o
diff --git a/drivers/power/act8865.c b/drivers/power/act8865.c
new file mode 100644
index 0000000..c36f7bd
--- /dev/null
+++ b/drivers/power/act8865.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 Atmel Corporation
+ *		      Bo Shen <voice.shen at atmel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <act8865.h>
+
+static int act8865_read(u32 reg, uchar *val)
+{
+	return i2c_read(ACT8865_I2C_ADDR, reg, 1, val, 1);
+}
+
+static int act8865_write(u32 reg, uchar val)
+{
+	return i2c_write(ACT8865_I2C_ADDR, reg, 1, &val, 1);
+}
+
+int act8865_disable_i2c_interface(void)
+{
+	uchar val;
+
+	/* Check the I2C interface is disabled or not */
+	if (act8865_read(ACT8865_SYS_CONTROL0, &val)) {
+		debug("ACT8865: i2c interface has been disabled\n");
+		return 0;
+	}
+
+	/*
+	 * As the ACT8865 don't have ID register, so we try one by one
+	 * to disable the exist chips (303, 304, 305) in this series.
+	 */
+
+	/* Try to disable ACT8865QI303 */
+	act8865_write(0x0B, 0xE9);
+	act8865_write(0x02, 0x07);
+	if (act8865_write(0x03, 0x01)) {
+		debug("ACT8865: subtype 303 has been disabled\n");
+		return 0;
+	}
+
+	/* Try to disable ACT8865QI304 */
+	act8865_write(0x0B, 0xEE);
+	act8865_write(0x02, 0x07);
+	if (act8865_write(0x03, 0x01)) {
+		debug("ACT8865: subtype 304 has been disabled\n");
+		return 0;
+	}
+
+	/* Try to disable ACT8865QI305 */
+	act8865_write(0x0B, 0xEE);
+	act8865_write(0x02, 0x07);
+	if (act8865_write(0x03, 0x01)) {
+		debug("ACT8865: subtype 305 has been disabled\n");
+		return 0;
+	}
+
+	debug("ACT8865: the chip can not be disabled\n");
+
+	return 0;
+}
+
+int act8865_enable_ldo_output(enum act8865_ldo ldo, enum act8865_volt volt)
+{
+	u32 conf_reg, ctrl_reg;
+	uchar val;
+
+	switch (ldo) {
+	case ACT8865_LDO_REG4:
+		conf_reg = ACT8865_REG4_CONFIG0;
+		ctrl_reg = ACT8865_REG4_CONTROL;
+		break;
+
+	case ACT8865_LDO_REG5:
+		conf_reg = ACT8865_REG5_CONFIG0;
+		ctrl_reg = ACT8865_REG5_CONTROL;
+		break;
+
+	case ACT8865_LDO_REG6:
+		conf_reg = ACT8865_REG6_CONFIG0;
+		ctrl_reg = ACT8865_REG6_CONTROL;
+		break;
+
+	case ACT8865_LDO_REG7:
+		conf_reg = ACT8865_REG7_CONFIG0;
+		ctrl_reg = ACT8865_REG7_CONTROL;
+		break;
+	default:
+		error("ACT8865: unsupported LDO\n");
+		return -1;
+	}
+
+	/* Set the LDO output voltage */
+	act8865_write(conf_reg, 0x18);
+	/* Enable the LDO */
+	act8865_read(ctrl_reg, &val);
+	val |= ACT8865_OUTPUT_ENABLE;
+	act8865_write(ctrl_reg, val);
+
+	return 0;
+}
diff --git a/include/act8865.h b/include/act8865.h
new file mode 100644
index 0000000..f6053ac
--- /dev/null
+++ b/include/act8865.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 Atmel Corporation
+ *		      Bo Shen <voice.shen at atmel.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#define ACT8865_SYS_CONTROL0	0x00
+#define ACT8865_SYS_CONTROL1	0x01
+
+#define ACT8865_REG1_CONFIG0	0x20
+#define ACT8865_REG1_CONFIG1	0x21
+#define ACT8865_REG1_CONTROL	0x22
+
+#define ACT8865_REG2_CONFIG0	0x30
+#define ACT8865_REG2_CONFIG1	0x31
+#define ACT8865_REG2_CONTROL	0x32
+
+#define ACT8865_REG3_CONFIG0	0x40
+#define ACT8865_REG3_CONFIG1	0x41
+#define ACT8865_REG3_CONTROL	0x42
+
+#define ACT8865_REG4_CONFIG0	0x50
+#define ACT8865_REG4_CONTROL	0x51
+
+#define ACT8865_REG5_CONFIG0	0x54
+#define ACT8865_REG5_CONTROL	0x55
+
+#define ACT8865_REG6_CONFIG0	0x60
+#define ACT8865_REG6_CONTROL	0x61
+
+#define ACT8865_REG7_CONFIG0	0x64
+#define ACT8865_REG7_CONTROL	0x65
+
+#define ACT8865_OUTPUT_ENABLE	(0x01 << 7)
+
+#define ACT8865_I2C_ADDR	0x5B
+
+enum act8865_ldo {
+	ACT8865_LDO_REG4 = 4,
+	ACT8865_LDO_REG5,
+	ACT8865_LDO_REG6,
+	ACT8865_LDO_REG7,
+};
+
+enum act8865_volt {
+	ACT8865_1V2_VOLT,
+	ACT8865_1V8_VOLT,
+	ACT8865_2V5_VOLT,
+	ACT8865_3V3_VOLT,
+};
+
+int act8865_enable_ldo_output(enum act8865_ldo ldo, enum act8865_volt volt);
+int act8865_disable_i2c_interface(void);
-- 
2.3.0



More information about the U-Boot mailing list