From 35040765223fe31da0564592939a16bd3a4d6cbd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 30 Dec 2024 11:12:57 +0000 Subject: [PATCH] Revert "i3c: Make i3c_master_unregister() return void" This reverts commit 87e0f28eda36c7843523aa8dd0c5dab3331e9718 which is commit 0f74f8b6675cc36d689abb4d9b3d75ab4049b7d7 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ia86a905c65bddaf79dc1e8fffc0609cb2b5b115c Signed-off-by: Greg Kroah-Hartman --- drivers/i3c/master.c | 6 +++++- drivers/i3c/master/dw-i3c-master.c | 5 ++++- drivers/i3c/master/i3c-master-cdns.c | 5 ++++- drivers/i3c/master/mipi-i3c-hci/core.c | 4 +--- drivers/i3c/master/svc-i3c-master.c | 5 ++++- include/linux/i3c/master.h | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index c8aa0d27143c..2263bc066108 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2696,13 +2696,17 @@ EXPORT_SYMBOL_GPL(i3c_master_register); * @master: master used to send frames on the bus * * Basically undo everything done in i3c_master_register(). + * + * Return: 0 in case of success, a negative error code otherwise. */ -void i3c_master_unregister(struct i3c_master_controller *master) +int i3c_master_unregister(struct i3c_master_controller *master) { i3c_master_i2c_adapter_cleanup(master); i3c_master_unregister_i3c_devs(master); i3c_master_bus_cleanup(master); device_unregister(&master->dev); + + return 0; } EXPORT_SYMBOL_GPL(i3c_master_unregister); diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c index b72f6dce18b4..51a8608203de 100644 --- a/drivers/i3c/master/dw-i3c-master.c +++ b/drivers/i3c/master/dw-i3c-master.c @@ -1184,8 +1184,11 @@ err_disable_core_clk: static int dw_i3c_remove(struct platform_device *pdev) { struct dw_i3c_master *master = platform_get_drvdata(pdev); + int ret; - i3c_master_unregister(&master->base); + ret = i3c_master_unregister(&master->base); + if (ret) + return ret; reset_control_assert(master->core_rst); diff --git a/drivers/i3c/master/i3c-master-cdns.c b/drivers/i3c/master/i3c-master-cdns.c index 35b90bb686ad..b9cfda6ae9ae 100644 --- a/drivers/i3c/master/i3c-master-cdns.c +++ b/drivers/i3c/master/i3c-master-cdns.c @@ -1666,8 +1666,11 @@ err_disable_pclk: static int cdns_i3c_master_remove(struct platform_device *pdev) { struct cdns_i3c_master *master = platform_get_drvdata(pdev); + int ret; - i3c_master_unregister(&master->base); + ret = i3c_master_unregister(&master->base); + if (ret) + return ret; clk_disable_unprepare(master->sysclk); clk_disable_unprepare(master->pclk); diff --git a/drivers/i3c/master/mipi-i3c-hci/core.c b/drivers/i3c/master/mipi-i3c-hci/core.c index f9bc58366a72..6aef5ce43cc1 100644 --- a/drivers/i3c/master/mipi-i3c-hci/core.c +++ b/drivers/i3c/master/mipi-i3c-hci/core.c @@ -769,9 +769,7 @@ static int i3c_hci_remove(struct platform_device *pdev) { struct i3c_hci *hci = platform_get_drvdata(pdev); - i3c_master_unregister(&hci->master); - - return 0; + return i3c_master_unregister(&hci->master); } static const __maybe_unused struct of_device_id i3c_hci_of_match[] = { diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index 77bb7c046825..eca50705e9ce 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -1651,8 +1651,11 @@ err_disable_clks: static int svc_i3c_master_remove(struct platform_device *pdev) { struct svc_i3c_master *master = platform_get_drvdata(pdev); + int ret; - i3c_master_unregister(&master->base); + ret = i3c_master_unregister(&master->base); + if (ret) + return ret; pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_disable(&pdev->dev); diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 4b7bb43bf430..604a126b78c8 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -541,7 +541,7 @@ int i3c_master_register(struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary); -void i3c_master_unregister(struct i3c_master_controller *master); +int i3c_master_unregister(struct i3c_master_controller *master); /** * i3c_dev_get_master_data() - get master private data attached to an I3C