bms: unregister psy notifier on module removal and shutdown
Bug: 327835739
Change-Id: I0d2e6fa73f578487fe65b46782b18ff36dc2903b
Signed-off-by: Prasanna Prapancham <[email protected]>
diff --git a/google_battery.c b/google_battery.c
index 988a396..c0323b8 100644
--- a/google_battery.c
+++ b/google_battery.c
@@ -11425,6 +11425,8 @@
if (!batt_drv)
return 0;
+ power_supply_unreg_notifier(&batt_drv->fg_nb);
+
if (batt_drv->ssoc_log)
logbuffer_unregister(batt_drv->ssoc_log);
if (batt_drv->ttf_stats.ttf_log)
@@ -11458,6 +11460,16 @@
return 0;
}
+static void google_battery_shutdown(struct platform_device *pdev)
+{
+ struct batt_drv *batt_drv = platform_get_drvdata(pdev);
+
+ if (!batt_drv)
+ return;
+
+ power_supply_unreg_notifier(&batt_drv->fg_nb);
+}
+
#ifdef SUPPORT_PM_SLEEP
static int gbatt_pm_suspend(struct device *dev)
{
@@ -11511,6 +11523,7 @@
},
.probe = google_battery_probe,
.remove = google_battery_remove,
+ .shutdown = google_battery_shutdown,
};
module_platform_driver(google_battery_driver);
diff --git a/google_charger.c b/google_charger.c
index b8b9ead..fd44c10 100644
--- a/google_charger.c
+++ b/google_charger.c
@@ -5915,6 +5915,8 @@
struct chg_drv *chg_drv = (struct chg_drv *)platform_get_drvdata(pdev);
if (chg_drv) {
+ power_supply_unreg_notifier(&chg_drv->psy_nb);
+
if (chg_drv->chg_term.enable) {
alarm_cancel(&chg_drv->chg_term.alarm);
cancel_work_sync(&chg_drv->chg_term.work);
@@ -5949,6 +5951,14 @@
return 0;
}
+static void google_charger_shutdown(struct platform_device *pdev)
+{
+ struct chg_drv *chg_drv = (struct chg_drv *)platform_get_drvdata(pdev);
+
+ if (chg_drv)
+ power_supply_unreg_notifier(&chg_drv->psy_nb);
+}
+
#ifdef SUPPORT_PM_SLEEP
static int chg_pm_suspend(struct device *dev)
{
@@ -5990,6 +6000,7 @@
},
.probe = google_charger_probe,
.remove = google_charger_remove,
+ .shutdown = google_charger_shutdown,
};
module_platform_driver(google_charger_driver);
diff --git a/google_cpm.c b/google_cpm.c
index 1836848..82a290a 100644
--- a/google_cpm.c
+++ b/google_cpm.c
@@ -4700,6 +4700,8 @@
if (!gcpm)
return 0;
+ power_supply_unreg_notifier(&gcpm->chg_nb);
+
gvotable_destroy_election(gcpm->dc_fcc_votable);
for (i = 0; i < gcpm->chg_psy_count; i++) {
@@ -4723,6 +4725,16 @@
return 0;
}
+static void google_cpm_shutdown(struct platform_device *pdev)
+{
+ struct gcpm_drv *gcpm = platform_get_drvdata(pdev);
+
+ if (!gcpm)
+ return;
+
+ power_supply_unreg_notifier(&gcpm->chg_nb);
+}
+
static int __maybe_unused gcpm_pm_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
@@ -4772,6 +4784,7 @@
},
.probe = google_cpm_probe,
.remove = google_cpm_remove,
+ .shutdown = google_cpm_shutdown,
};
module_platform_driver(google_cpm_driver);
diff --git a/google_dock.c b/google_dock.c
index c897aa7..649910a 100644
--- a/google_dock.c
+++ b/google_dock.c
@@ -671,6 +671,10 @@
{
struct dock_drv *dock = platform_get_drvdata(pdev);
+ if (!dock)
+ return 0;
+
+ power_supply_unreg_notifier(&dock->nb);
cancel_delayed_work(&dock->init_work);
cancel_delayed_work(&dock->notifier_work);
cancel_delayed_work(&dock->icl_ramp_work);
@@ -681,6 +685,16 @@
return 0;
}
+static void google_dock_shutdown(struct platform_device *pdev)
+{
+ struct dock_drv *dock = platform_get_drvdata(pdev);
+
+ if (!dock)
+ return;
+
+ power_supply_unreg_notifier(&dock->nb);
+}
+
static const struct of_device_id google_dock_of_match[] = {
{.compatible = "google,dock"},
{},
@@ -696,6 +710,7 @@
},
.probe = google_dock_probe,
.remove = google_dock_remove,
+ .shutdown = google_dock_shutdown,
};
module_platform_driver(google_dock_driver);
diff --git a/google_dual_batt_gauge.c b/google_dual_batt_gauge.c
index ec07ebd..c83ad27 100644
--- a/google_dual_batt_gauge.c
+++ b/google_dual_batt_gauge.c
@@ -1219,6 +1219,10 @@
{
struct dual_fg_drv *dual_fg_drv = platform_get_drvdata(pdev);
+ if (!dual_fg_drv)
+ return 0;
+
+ power_supply_unreg_notifier(&dual_fg_drv->fg_nb);
gbms_free_chg_profile(&dual_fg_drv->chg_profile);
kfree(dual_fg_drv->base_profile.cccm_limits);
kfree(dual_fg_drv->sec_profile.cccm_limits);
@@ -1229,6 +1233,16 @@
return 0;
}
+static void google_dual_batt_gauge_shutdown(struct platform_device *pdev)
+{
+ struct dual_fg_drv *dual_fg_drv = platform_get_drvdata(pdev);
+
+ if (!dual_fg_drv)
+ return;
+
+ power_supply_unreg_notifier(&dual_fg_drv->fg_nb);
+}
+
static int __maybe_unused google_dual_batt_pm_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
@@ -1273,6 +1287,7 @@
},
.probe = google_dual_batt_gauge_probe,
.remove = google_dual_batt_gauge_remove,
+ .shutdown = google_dual_batt_gauge_shutdown,
};
module_platform_driver(google_dual_batt_gauge_driver);
diff --git a/p9221_charger.c b/p9221_charger.c
index d90872e..62b3919 100644
--- a/p9221_charger.c
+++ b/p9221_charger.c
@@ -8267,6 +8267,7 @@
{
struct p9221_charger_data *charger = i2c_get_clientdata(client);
+ power_supply_unreg_notifier(&charger->nb);
cancel_delayed_work_sync(&charger->dcin_work);
cancel_delayed_work_sync(&charger->stop_online_spoof_work);
cancel_delayed_work_sync(&charger->change_det_status_work);
@@ -8293,7 +8294,6 @@
disable_irq_wake(charger->pdata->irq_int);
device_init_wakeup(charger->dev, false);
cancel_delayed_work_sync(&charger->notifier_work);
- power_supply_unreg_notifier(&charger->nb);
if (!IS_ERR_OR_NULL(charger->batt_psy))
power_supply_put(charger->batt_psy);
mutex_destroy(&charger->io_lock);
@@ -8316,6 +8316,14 @@
kfree(charger->i2c_txdebug_buf);
}
+static void p9221_charger_shutdown(struct i2c_client *client)
+{
+ struct p9221_charger_data *charger = i2c_get_clientdata(client);
+
+ if (charger)
+ power_supply_unreg_notifier(&charger->nb);
+}
+
static const struct i2c_device_id p9221_charger_id_table[] = {
{ "p9221", 0 },
{ "p9382", 0 },
@@ -8379,6 +8387,7 @@
},
.probe = p9221_charger_probe,
.remove = p9221_charger_remove,
+ .shutdown = p9221_charger_shutdown,
.id_table = p9221_charger_id_table,
};
module_i2c_driver(p9221_charger_driver);