From 71bf027f9966973feb305964408902678dd5ed58 Mon Sep 17 00:00:00 2001 From: Keunho Hwang Date: Mon, 13 May 2019 05:15:31 +0000 Subject: [PATCH] [RAMEN9610-15202] [COMMON] drivers: charger: add IVR isr for input curr. control Change-Id: I5cce369c57129b6153063bbc0da0a1f088664753 Signed-off-by: Keunho Hwang --- drivers/power/supply/s2mu106_charger.c | 44 +++++++++++++++++++++++++- include/linux/power/s2mu106_charger.h | 3 ++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/s2mu106_charger.c b/drivers/power/supply/s2mu106_charger.c index c0565ddf5bd5..5f5698bcdc97 100644 --- a/drivers/power/supply/s2mu106_charger.c +++ b/drivers/power/supply/s2mu106_charger.c @@ -831,6 +831,48 @@ static irqreturn_t s2mu106_event_isr(int irq, void *data) return IRQ_HANDLED; } +static irqreturn_t s2mu106_ivr_isr(int irq, void *data) +{ + struct s2mu106_charger_data *charger = data; + union power_supply_propval value; + struct power_supply *psy; + int ret = 0; + u8 sts; + int input_curr; + + s2mu106_read_reg(charger->i2c, S2MU106_CHG_STATUS5, &sts); + + pr_info("%s: IVR interrupt! STATUS5:0x%02x\n", __func__, sts); + + psy = power_supply_get_by_name("s2mu106_pmeter"); + if (!psy) + return -EINVAL; + + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ICHGIN, &value); + if (ret < 0) { + pr_err("%s: Fail to execute property\n", __func__); + return IRQ_HANDLED; + } + + input_curr = value.intval; + pr_info("%s: input_curr = %d, cable_type = %d\n", + __func__, input_curr, charger->cable_type); + + /* cable_type / status check */ + if (charger->cable_type == POWER_SUPPLY_TYPE_HV_MAINS && + (sts & IVR_STATUS_MASK)) { + input_curr = input_curr - (input_curr % 100); + input_curr -= HV_MAINS_IVR_STEP; + + if (input_curr < HV_MAINS_IVR_INPUT) + input_curr = HV_MAINS_IVR_INPUT; + + s2mu106_set_input_current_limit(charger, input_curr); + } + + return IRQ_HANDLED; +} + static irqreturn_t s2mu106_ovp_isr(int irq, void *data) { struct s2mu106_charger_data *charger = data; @@ -1039,7 +1081,7 @@ static int s2mu106_charger_probe(struct platform_device *pdev) charger->irq_ivr = pdata->irq_base + S2MU106_CHG2_IRQ_IVR; ret = request_threaded_irq(charger->irq_ivr, NULL, - s2mu106_event_isr, 0, "ivr-irq", charger); + s2mu106_ivr_isr, 0, "ivr-irq", charger); if (ret < 0) { dev_err(s2mu106->dev, "%s: Fail to request IVR in IRQ: %d: %d\n", __func__, charger->irq_ivr, ret); diff --git a/include/linux/power/s2mu106_charger.h b/include/linux/power/s2mu106_charger.h index b81913b703f6..39602820294e 100644 --- a/include/linux/power/s2mu106_charger.h +++ b/include/linux/power/s2mu106_charger.h @@ -261,6 +261,9 @@ #define FAKE_BAT_LEVEL 50 +#define HV_MAINS_IVR_INPUT 2000 +#define HV_MAINS_IVR_STEP 300 + enum { CHIP_ID = 0, }; -- 2.20.1