mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
spi: axiado: spi: axiado: fix runtime pm imbalance on probe failure
Johan Hovold <johan@kernel.org> says: The series fixes some runtime PM related issues in the axiado driver. Included is also a couple of related cleanups.
This commit is contained in:
commit
ad50f7bc5a
|
|
@ -751,9 +751,9 @@ static const struct spi_controller_mem_ops ax_spi_mem_ops = {
|
|||
*/
|
||||
static int ax_spi_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0, irq;
|
||||
struct spi_controller *ctlr;
|
||||
struct ax_spi *xspi;
|
||||
int ret, irq;
|
||||
u32 num_cs;
|
||||
|
||||
ctlr = devm_spi_alloc_host(&pdev->dev, sizeof(*xspi));
|
||||
|
|
@ -785,7 +785,7 @@ static int ax_spi_probe(struct platform_device *pdev)
|
|||
ret = clk_prepare_enable(xspi->ref_clk);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Unable to enable device clock.\n");
|
||||
goto clk_dis_apb;
|
||||
goto err_disable_apb;
|
||||
}
|
||||
|
||||
pm_runtime_use_autosuspend(&pdev->dev);
|
||||
|
|
@ -815,7 +815,7 @@ static int ax_spi_probe(struct platform_device *pdev)
|
|||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq <= 0) {
|
||||
ret = -ENXIO;
|
||||
goto clk_dis_all;
|
||||
goto err_disable_rpm;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, irq, ax_spi_irq,
|
||||
|
|
@ -823,7 +823,7 @@ static int ax_spi_probe(struct platform_device *pdev)
|
|||
if (ret != 0) {
|
||||
ret = -ENXIO;
|
||||
dev_err(&pdev->dev, "request_irq failed\n");
|
||||
goto clk_dis_all;
|
||||
goto err_disable_rpm;
|
||||
}
|
||||
|
||||
ctlr->use_gpio_descriptors = true;
|
||||
|
|
@ -842,23 +842,26 @@ static int ax_spi_probe(struct platform_device *pdev)
|
|||
|
||||
ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||
|
||||
pm_runtime_put_autosuspend(&pdev->dev);
|
||||
|
||||
ctlr->mem_ops = &ax_spi_mem_ops;
|
||||
|
||||
ret = spi_register_controller(ctlr);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "spi_register_controller failed\n");
|
||||
goto clk_dis_all;
|
||||
goto err_disable_rpm;
|
||||
}
|
||||
|
||||
return ret;
|
||||
pm_runtime_put_autosuspend(&pdev->dev);
|
||||
|
||||
clk_dis_all:
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
return 0;
|
||||
|
||||
err_disable_rpm:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
|
||||
clk_disable_unprepare(xspi->ref_clk);
|
||||
clk_dis_apb:
|
||||
err_disable_apb:
|
||||
clk_disable_unprepare(xspi->pclk);
|
||||
|
||||
return ret;
|
||||
|
|
@ -877,10 +880,14 @@ static void ax_spi_remove(struct platform_device *pdev)
|
|||
struct spi_controller *ctlr = platform_get_drvdata(pdev);
|
||||
struct ax_spi *xspi = spi_controller_get_devdata(ctlr);
|
||||
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
spi_unregister_controller(ctlr);
|
||||
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
|
||||
clk_disable_unprepare(xspi->ref_clk);
|
||||
clk_disable_unprepare(xspi->pclk);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user