summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThadeu Lima de Souza Cascardo <cascardo@igalia.com>2024-07-26 15:12:35 -0300
committerTzung-Bi Shih <tzungbi@kernel.org>2024-08-09 20:55:09 +0800
commita1927fbbf74f9f61eb5c6d1414037c97a8d942ab (patch)
treeb0f08bbb3a27bb5fc1870d08b3ca8c298d0e0b98
parent62be134abf4250474a7a694837064bc783d2b291 (diff)
platform/chrome: cros_ec_typec: add remove driver hook
This allows the driver to be unbound and bound again. Otherwise, when unbinding the driver, there will be leftover sysfs entries. When rebinding the driver, it also ends up touching freed memory when adding to the notifier chain as the old one was not removed and ends up being traversed. Add a remove_new driver hook, which removes the notifier from the chain and unregisters the typec ports. Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com> Link: https://lore.kernel.org/r/20240726181235.920335-1-cascardo@igalia.com Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
-rw-r--r--drivers/platform/chrome/cros_ec_typec.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
index 4d305876ec08..c7781aea0b88 100644
--- a/drivers/platform/chrome/cros_ec_typec.c
+++ b/drivers/platform/chrome/cros_ec_typec.c
@@ -1285,6 +1285,15 @@ unregister_ports:
return ret;
}
+static void cros_typec_remove(struct platform_device *pdev)
+{
+ struct cros_typec_data *typec = platform_get_drvdata(pdev);
+
+ cros_usbpd_unregister_notify(&typec->nb);
+ cancel_work_sync(&typec->port_work);
+ cros_unregister_ports(typec);
+}
+
static int __maybe_unused cros_typec_suspend(struct device *dev)
{
struct cros_typec_data *typec = dev_get_drvdata(dev);
@@ -1316,6 +1325,7 @@ static struct platform_driver cros_typec_driver = {
.pm = &cros_typec_pm_ops,
},
.probe = cros_typec_probe,
+ .remove_new = cros_typec_remove,
};
module_platform_driver(cros_typec_driver);