From: Fabricio Akio <[email protected]>

Nothing notifies consumers when the charging state changes on its own,
as when a charge completes, so they can keep a stale status.

Request the chg-state-change interrupt when the device tree provides
it, and notify consumers when it fires.

Fixes: 8648aeb5d7b7 ("power: supply: add Qualcomm PMI8998 SMB2 Charger driver")
Signed-off-by: Fabricio Akio <[email protected]>
---
 drivers/power/supply/qcom_smbx.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/power/supply/qcom_smbx.c b/drivers/power/supply/qcom_smbx.c
index f5557b8cc92a..3738eb8638bc 100644
--- a/drivers/power/supply/qcom_smbx.c
+++ b/drivers/power/supply/qcom_smbx.c
@@ -762,6 +762,15 @@ static irqreturn_t smb_handle_usb_icl_change(int irq, void 
*data)
        return IRQ_HANDLED;
 }
 
+static irqreturn_t smb_handle_chg_state_change(int irq, void *data)
+{
+       struct smb_chip *chip = data;
+
+       power_supply_changed(chip->chg_psy);
+
+       return IRQ_HANDLED;
+}
+
 static irqreturn_t smb_handle_wdog_bark(int irq, void *data)
 {
        struct smb_chip *chip = data;
@@ -1078,6 +1087,21 @@ static int smb_probe(struct platform_device *pdev)
        if (rc < 0)
                return rc;
 
+       /* Optional: not every device tree lists it */
+       irq = platform_get_irq_byname_optional(pdev, "chg-state-change");
+       if (irq > 0) {
+               rc = devm_request_threaded_irq(chip->dev, irq, NULL,
+                                              smb_handle_chg_state_change,
+                                              IRQF_ONESHOT, "chg-state-change",
+                                              chip);
+               if (rc < 0)
+                       return dev_err_probe(chip->dev, rc,
+                                            "Couldn't request irq 
chg-state-change\n");
+       } else if (irq != -ENXIO) {
+               return dev_err_probe(chip->dev, irq,
+                                    "Couldn't get irq chg-state-change\n");
+       }
+
        devm_device_init_wakeup(chip->dev);
 
        rc = devm_pm_set_wake_irq(chip->dev, chip->cable_irq);

-- 
2.55.0



Reply via email to