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);