summaryrefslogtreecommitdiff
path: root/common/pmu_tps65090.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/pmu_tps65090.c')
-rw-r--r--common/pmu_tps65090.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/common/pmu_tps65090.c b/common/pmu_tps65090.c
index 3198e1eae4..ba75d82235 100644
--- a/common/pmu_tps65090.c
+++ b/common/pmu_tps65090.c
@@ -30,10 +30,18 @@
#define CG_CTRL5 0x09
#define CG_STATUS1 0x0a
#define CG_STATUS2 0x0b
+#define TPSCHROME_VER 0x19
/* Charger control */
#define CG_CTRL0_EN 1
+/* Charger termination voltage/current */
+#define CG_VSET_SHIFT 3
+#define CG_VSET_MASK (3 << CG_VSET_SHIFT)
+#define CG_ISET_SHIFT 0
+#define CG_ISET_MASK (7 << CG_ISET_SHIFT)
+#define CG_NOITERM (1 << 5)
+
/* IRQ events */
#define EVENT_VACG (1 << 1)
#define EVENT_VBATG (1 << 3)
@@ -84,6 +92,16 @@ int pmu_write(int reg, int value)
return i2c_write8(I2C_PORT_CHARGER, TPS65090_I2C_ADDR, reg, value);
}
+/**
+ * Read tpschrome version
+ *
+ * @param version output value of tpschrome version
+ */
+int pmu_version(int *version)
+{
+ return pmu_read(TPSCHROME_VER, version);
+}
+
int pmu_is_charger_alarm(void)
{
int status;
@@ -129,6 +147,74 @@ int pmu_enable_charger(int enable)
(reg & ~CG_CTRL0));
}
+/**
+ * Set termination current for temperature ranges
+ *
+ * @param range T01 T12 T23 T34 T40
+ * @param current enum termination current, I0250 == 25.0%:
+ * I0000 I0250 I0375 I0500 I0625 I0750 I0875 I1000
+ */
+int pmu_set_term_current(enum TPS_TEMPERATURE_RANGE range,
+ enum TPS_TERMINATION_CURRENT current)
+{
+ int rv;
+ int reg_val;
+
+ rv = pmu_read(CG_CTRL1 + range, &reg_val);
+ if (rv)
+ return rv;
+
+ reg_val &= ~CG_ISET_MASK;
+ reg_val |= current << CG_ISET_SHIFT;
+
+ return pmu_write(CG_CTRL1 + range, reg_val);
+}
+
+/**
+ * Set termination voltage for temperature ranges
+ *
+ * @param range T01 T12 T23 T34 T40
+ * @param voltage enum termination voltage, V2050 == 2.05V:
+ * V2000 V2050 V2075 V2100
+ */
+int pmu_set_term_voltage(enum TPS_TEMPERATURE_RANGE range,
+ enum TPS_TERMINATION_VOLTAGE voltage)
+{
+ int rv;
+ int reg_val;
+
+ rv = pmu_read(CG_CTRL1 + range, &reg_val);
+ if (rv)
+ return rv;
+
+ reg_val &= ~CG_VSET_MASK;
+ reg_val |= voltage << CG_VSET_SHIFT;
+
+ return pmu_write(CG_CTRL1 + range, reg_val);
+}
+
+/**
+ * Enable low current charging
+ *
+ * @param enable enable/disable low current charging
+ */
+int pmu_low_current_charging(int enable)
+{
+ int rv;
+ int reg_val;
+
+ rv = pmu_read(CG_CTRL5, &reg_val);
+ if (rv)
+ return rv;
+
+ if (enable)
+ reg_val |= CG_NOITERM;
+ else
+ reg_val &= ~CG_NOITERM;
+
+ return pmu_write(CG_CTRL5, reg_val);
+}
+
void pmu_init(void)
{
#ifdef CONFIG_PMU_BOARD_INIT