From 3ad71a8681214a654ffac13037707403c5462afb Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Wed, 2 Mar 2016 15:28:18 +0530 Subject: [PATCH] power: smb135x-charger: report icl status in parallel mode Report the input current limited status via the power supply in parallel mode in order to better optimize for HVDCP usecases. Change-Id: Ibd3865828ccbfa44b36839f5d11e7a60b7ada77d Signed-off-by: Ashay Jaiswal --- drivers/power/smb135x-charger.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/power/smb135x-charger.c b/drivers/power/smb135x-charger.c index 818928dd8271..65d4ae56ff83 100644 --- a/drivers/power/smb135x-charger.c +++ b/drivers/power/smb135x-charger.c @@ -185,6 +185,9 @@ #define USING_USB_BIT BIT(1) #define USING_DC_BIT BIT(0) +#define STATUS_2_REG 0x48 +#define HARD_LIMIT_STS_BIT BIT(6) + #define STATUS_4_REG 0x4A #define BATT_NET_CHG_CURRENT_BIT BIT(7) #define BATT_LESS_THAN_2V BIT(4) @@ -1728,8 +1731,23 @@ static enum power_supply_property smb135x_parallel_properties[] = { POWER_SUPPLY_PROP_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_MAX, POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED, }; +static bool smb135x_is_input_current_limited(struct smb135x_chg *chip) +{ + int rc; + u8 reg; + + rc = smb135x_read(chip, STATUS_2_REG, ®); + if (rc) { + pr_debug("Couldn't read _REG for ICL status rc = %d\n", rc); + return false; + } + + return !!(reg & HARD_LIMIT_STS_BIT); +} + static int smb135x_parallel_set_chg_present(struct smb135x_chg *chip, int present) { @@ -1967,6 +1985,12 @@ static int smb135x_parallel_get_property(struct power_supply *psy, else val->intval = POWER_SUPPLY_STATUS_DISCHARGING; break; + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED: + if (chip->parallel_charger_present) + val->intval = smb135x_is_input_current_limited(chip); + else + val->intval = 0; + break; default: return -EINVAL; }