[RAMEN9610-15202] [COMMON] drivers: charger: add IVR isr for input curr. control
authorKeunho Hwang <keunho.hwang@samsung.com>
Mon, 13 May 2019 05:15:31 +0000 (05:15 +0000)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:45:34 +0000 (23:45 +0900)
Change-Id: I5cce369c57129b6153063bbc0da0a1f088664753
Signed-off-by: Keunho Hwang <keunho.hwang@samsung.com>
drivers/power/supply/s2mu106_charger.c
include/linux/power/s2mu106_charger.h

index c0565ddf5bd554822b3b4fc154f316c0b3ef8ced..5f5698bcdc97680d8d3b1cbd1e5d17d7922937c6 100644 (file)
@@ -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);
index b81913b703f6efda4c2f6d102bf0e695fa58c4f4..39602820294e43f9ee95b4c6db9d820ea1a71ba9 100644 (file)
 
 #define FAKE_BAT_LEVEL          50
 
+#define HV_MAINS_IVR_INPUT             2000
+#define HV_MAINS_IVR_STEP              300
+
 enum {
        CHIP_ID = 0,
 };