From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukasz Majewski Date: Fri, 19 Oct 2012 17:44:05 +0200 Subject: [U-Boot] [PATCH v3 18/24] pmic:max8997: Support for MAX8997 internal charger control In-Reply-To: <1350661451-1273-1-git-send-email-l.majewski@samsung.com> References: <1350661451-1273-1-git-send-email-l.majewski@samsung.com> Message-ID: <1350661451-1273-19-git-send-email-l.majewski@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Support for MAX8997 built-in charger. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- Changes for v2: - power_init_battery() method added to be called from MAX8997 struct pmic instance Changes for v3: - change code according to struct pmic redesign --- drivers/power/max8997/pmic_max8997.c | 59 +++++++++++++++++++++++++++++++++- 1 files changed, 58 insertions(+), 1 deletions(-) diff --git a/drivers/power/max8997/pmic_max8997.c b/drivers/power/max8997/pmic_max8997.c index 47ef7f6..0603d94 100644 --- a/drivers/power/max8997/pmic_max8997.c +++ b/drivers/power/max8997/pmic_max8997.c @@ -42,12 +42,68 @@ unsigned char max8997_reg_ldo(int uV) return ret; } +static int pmic_charger_state(struct pmic *p, int state, int current) +{ + unsigned char fc; + u32 val = 0; + + if (pmic_probe(p)) + return -1; + + if (state == CHARGER_DISABLE) { + puts("Disable the charger.\n"); + pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); + val &= ~(MBCHOSTEN | VCHGR_FC); + pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); + + return -1; + } + + if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) { + printf("%s: Wrong charge current: %d [mA]\n", + __func__, current); + return -1; + } + + fc = (current - CHARGER_MIN_CURRENT) / CHARGER_CURRENT_RESOLUTION; + fc = fc & 0xf; /* up to 950 mA */ + + printf("Enable the charger @ %d [mA]\n", fc * CHARGER_CURRENT_RESOLUTION + + CHARGER_MIN_CURRENT); + + val = fc | MBCICHFCSET; + pmic_reg_write(p, MAX8997_REG_MBCCTRL4, val); + + pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); + val = MBCHOSTEN | VCHGR_FC; /* enable charger & fast charge */ + pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); + + return 0; +} + +static int pmic_charger_bat_present(struct pmic *p) +{ + u32 val; + + if (pmic_probe(p)) + return -1; + + pmic_reg_read(p, MAX8997_REG_STATUS4, &val); + + return !(val & DETBAT); +} + +static struct power_chrg power_chrg_pmic_ops = { + .chrg_bat_present = pmic_charger_bat_present, + .chrg_state = pmic_charger_state, +}; + int pmic_init(unsigned char bus) { struct pmic *p = pmic_alloc(); static const char name[] = "MAX8997_PMIC"; - puts("Board PMIC init\n"); + debug("Board PMIC init\n"); p->name = name; p->interface = PMIC_I2C; @@ -56,5 +112,6 @@ int pmic_init(unsigned char bus) p->hw.i2c.tx_num = 1; p->bus = bus; + p->chrg = &power_chrg_pmic_ops; return 0; } -- 1.7.2.3