FAILED: patch "[PATCH] spi: sun4i: fix controller deregistration" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 42108a2f03e0fdeabe9d02d085bdb058baa1189f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026051252-unproven-faculty-80e7@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 42108a2f03e0fdeabe9d02d085bdb058baa1189f Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Fri, 10 Apr 2026 10:17:48 +0200
Subject: [PATCH] spi: sun4i: fix controller deregistration
Make sure to deregister the controller before disabling underlying resources like clocks during driver unbind.
drivers/spi/spi-sun4i.c +9 -1
@@ -504,7 +504,7 @@ static int sun4i_spi_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev);pm_runtime_idle (&pdev->dev); - ret =devm_spi_register_controller (&pdev->dev, host); + ret =spi_register_controller (host);if (ret) {dev_err (&pdev->dev,"cannot register SPI host\n" ); goto err_pm_disable;
@@ -522,7 +522,15 @@ static int sun4i_spi_probe(struct platform_device *pdev)static void sun4i_spi_remove (struct platform_device *pdev) { +struct spi_controller *host =platform_get_drvdata (pdev); + +spi_controller_get (host); + +spi_unregister_controller (host); +pm_runtime_force_suspend (&pdev->dev); + +spi_controller_put (host); }static const struct of_device_id sun4i_spi_match[] = {
Sasha Levin
maintainerPATCH 1/3 spi: sun4i: Convert to platform remove callback returning void
From: Uwe Kleine-König <[email protected]>
[ Upstream commit b7b949458ac391963e56ae354b73fee63016dcee ]
The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is (mostly) ignored and this typically results in resource leaks. To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new() which already returns void.
Trivially convert this driver from always returning zero in the remove callback to the void returning variant.
Stable-dep-of: 42108a2f03e0 ("spi: sun4i: fix controller deregistration")
--- drivers/spi/spi-sun4i.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/spi/spi-sun4i.c +2 -4
@@ -519,11 +519,9 @@ static int sun4i_spi_probe(struct platform_device *pdev)return ret; } -static int sun4i_spi_remove (struct platform_device *pdev) +static void sun4i_spi_remove (struct platform_device *pdev) {pm_runtime_force_suspend (&pdev->dev); - -return 0 ; }static const struct of_device_id sun4i_spi_match[] = {
@@ -539,7 +537,7 @@ static const struct dev_pm_ops sun4i_spi_pm_ops = {static struct platform_driver sun4i_spi_driver = { .probe = sun4i_spi_probe, - .remove = sun4i_spi_remove, + .remove_new = sun4i_spi_remove, .driver = { .name ="sun4i-spi" , .of_match_table = sun4i_spi_match,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/3 spi: sun4i: switch to use modern name
From: Yang Yingliang <[email protected]>
[ Upstream commit 6d232cc8a7e59af0c083319827541966a68817a0 ]
Change legacy name master to modern name host or controller.
No functional changed.
Stable-dep-of: 42108a2f03e0 ("spi: sun4i: fix controller deregistration")
--- drivers/spi/spi-sun4i.c | 72 ++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-)
drivers/spi/spi-sun4i.c +36 -36
@@ -75,7 +75,7 @@#define SUN4I_FIFO_STA_TF_CNT_BITS 16struct sun4i_spi { -struct spi_master *master; +struct spi_controller *host;void __iomem *base_addr;struct clk *hclk;struct clk *mclk;
@@ -161,7 +161,7 @@ static inline void sun4i_spi_fill_fifo(struct sun4i_spi *sspi, int len)static void sun4i_spi_set_cs (struct spi_device *spi,bool enable) { -struct sun4i_spi *sspi =spi_master_get_devdata (spi->master); +struct sun4i_spi *sspi =spi_controller_get_devdata (spi->controller);u32 reg; reg =sun4i_spi_read (sspi,SUN4I_CTL_REG );
@@ -201,11 +201,11 @@ static size_t sun4i_spi_max_transfer_size(struct spi_device *spi)return SUN4I_MAX_XFER_SIZE -1 ; } -static int sun4i_spi_transfer_one (struct spi_master *master, +static int sun4i_spi_transfer_one (struct spi_controller *host,struct spi_device *spi,struct spi_transfer *tfr) { -struct sun4i_spi *sspi =spi_master_get_devdata (master); +struct sun4i_spi *sspi =spi_controller_get_devdata (host);unsigned int mclk_rate, div, timeout;unsigned int start, end, tx_time;unsigned int tx_len =0 ;
@@ -334,7 +334,7 @@ static int sun4i_spi_transfer_one(struct spi_master *master, msecs_to_jiffies(tx_time)); end = jiffies;if (!timeout) { -dev_warn (&master->dev, +dev_warn (&host->dev,"%s: timeout transferring %u bytes@%iHz for %i(%i)ms" ,dev_name (&spi->dev), tfr->len, tfr->speed_hz,jiffies_to_msecs (end - start), tx_time);
@@ -389,8 +389,8 @@ static irqreturn_t sun4i_spi_handler(int irq, void *dev_id)static int sun4i_spi_runtime_resume (struct device *dev) { -struct spi_master *master =dev_get_drvdata (dev); -struct sun4i_spi *sspi =spi_master_get_devdata (master); +struct spi_controller *host =dev_get_drvdata (dev); +struct sun4i_spi *sspi =spi_controller_get_devdata (host);int ret; ret =clk_prepare_enable (sspi->hclk);
@@ -418,8 +418,8 @@ static int sun4i_spi_runtime_resume(struct device *dev)static int sun4i_spi_runtime_suspend (struct device *dev) { -struct spi_master *master =dev_get_drvdata (dev); -struct sun4i_spi *sspi =spi_master_get_devdata (master); +struct spi_controller *host =dev_get_drvdata (dev); +struct sun4i_spi *sspi =spi_controller_get_devdata (host);clk_disable_unprepare (sspi->mclk);clk_disable_unprepare (sspi->hclk);
@@ -429,62 +429,62 @@ static int sun4i_spi_runtime_suspend(struct device *dev)static int sun4i_spi_probe (struct platform_device *pdev) { -struct spi_master *master; +struct spi_controller *host;struct sun4i_spi *sspi;int ret =0 , irq; - master =spi_alloc_master (&pdev->dev,sizeof (struct sun4i_spi )); -if (!master) { -dev_err (&pdev->dev,"Unable to allocate SPI Master\n" ); + host =spi_alloc_host (&pdev->dev,sizeof (struct sun4i_spi )); +if (!host) { +dev_err (&pdev->dev,"Unable to allocate SPI Host\n" );return -ENOMEM ; } -platform_set_drvdata (pdev, master); - sspi =spi_master_get_devdata (master); +platform_set_drvdata (pdev, host); + sspi =spi_controller_get_devdata (host); sspi->base_addr =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (sspi->base_addr)) { ret =PTR_ERR (sspi->base_addr); - goto err_free_master; + goto err_free_host; } irq =platform_get_irq (pdev,0 );if (irq <0 ) { ret = -ENXIO ; - goto err_free_master; + goto err_free_host; } ret =devm_request_irq (&pdev->dev, irq, sun4i_spi_handler,0 ,"sun4i-spi" , sspi);if (ret) {dev_err (&pdev->dev,"Cannot request IRQ\n" ); - goto err_free_master; + goto err_free_host; } - sspi->master = master; - master->max_speed_hz =100 *1000 *1000 ; - master->min_speed_hz =3 *1000 ; - master->set_cs = sun4i_spi_set_cs; - master->transfer_one = sun4i_spi_transfer_one; - master->num_chipselect =4 ; - master->mode_bits =SPI_CPOL |SPI_CPHA |SPI_CS_HIGH |SPI_LSB_FIRST ; - master->bits_per_word_mask =SPI_BPW_MASK (8 ); - master->dev.of_node = pdev->dev.of_node; - master->auto_runtime_pm = true; - master->max_transfer_size = sun4i_spi_max_transfer_size; + sspi->host = host; + host->max_speed_hz =100 *1000 *1000 ; + host->min_speed_hz =3 *1000 ; + host->set_cs = sun4i_spi_set_cs; + host->transfer_one = sun4i_spi_transfer_one; + host->num_chipselect =4 ; + host->mode_bits =SPI_CPOL |SPI_CPHA |SPI_CS_HIGH |SPI_LSB_FIRST ; + host->bits_per_word_mask =SPI_BPW_MASK (8 ); + host->dev.of_node = pdev->dev.of_node; + host->auto_runtime_pm = true; + host->max_transfer_size = sun4i_spi_max_transfer_size; sspi->hclk =devm_clk_get (&pdev->dev,"ahb" );if (IS_ERR (sspi->hclk)) {dev_err (&pdev->dev,"Unable to acquire AHB clock\n" ); ret =PTR_ERR (sspi->hclk); - goto err_free_master; + goto err_free_host; } sspi->mclk =devm_clk_get (&pdev->dev,"mod" );if (IS_ERR (sspi->mclk)) {dev_err (&pdev->dev,"Unable to acquire module clock\n" ); ret =PTR_ERR (sspi->mclk); - goto err_free_master; + goto err_free_host; }init_completion (&sspi->done);
@@ -496,16 +496,16 @@ static int sun4i_spi_probe(struct platform_device *pdev) ret =sun4i_spi_runtime_resume (&pdev->dev);if (ret) {dev_err (&pdev->dev,"Couldn't resume the device\n" ); - goto err_free_master; + goto err_free_host; }pm_runtime_set_active (&pdev->dev);pm_runtime_enable (&pdev->dev);pm_runtime_idle (&pdev->dev); - ret =devm_spi_register_master (&pdev->dev, master); + ret =devm_spi_register_controller (&pdev->dev, host);if (ret) { -dev_err (&pdev->dev,"cannot register SPI master\n" ); +dev_err (&pdev->dev,"cannot register SPI host\n" ); goto err_pm_disable; }
@@ -514,8 +514,8 @@ static int sun4i_spi_probe(struct platform_device *pdev) err_pm_disable:pm_runtime_disable (&pdev->dev);sun4i_spi_runtime_suspend (&pdev->dev); -err_free_master: -spi_master_put (master); +err_free_host: +spi_controller_put (host);return ret; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/3 spi: sun4i: fix controller deregistration
In reply to Sasha LevinFrom: Johan Hovold <[email protected]>
[ Upstream commit 42108a2f03e0fdeabe9d02d085bdb058baa1189f ]
Make sure to deregister the controller before disabling underlying resources like clocks during driver unbind.
--- drivers/spi/spi-sun4i.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/spi/spi-sun4i.c +9 -1
@@ -503,7 +503,7 @@ static int sun4i_spi_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev);pm_runtime_idle (&pdev->dev); - ret =devm_spi_register_controller (&pdev->dev, host); + ret =spi_register_controller (host);if (ret) {dev_err (&pdev->dev,"cannot register SPI host\n" ); goto err_pm_disable;
@@ -521,7 +521,15 @@ static int sun4i_spi_probe(struct platform_device *pdev)static void sun4i_spi_remove (struct platform_device *pdev) { +struct spi_controller *host =platform_get_drvdata (pdev); + +spi_controller_get (host); + +spi_unregister_controller (host); +pm_runtime_force_suspend (&pdev->dev); + +spi_controller_put (host); }static const struct of_device_id sun4i_spi_match[] = {
Signature · 1 line
2.53.0