Unverified Commit 8c0f9cd1 authored by Mark Brown's avatar Mark Brown
Browse files

spi: cadence: Probe and unbind fixes

Several fixes from Johan for issues with unbind and error handling in
probe.
parents 4f12ee0a ecea4f0e
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -741,7 +741,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
		/* Set to default valid value */
		ctlr->max_speed_hz = xspi->clk_rate / 4;
		xspi->speed_hz = ctlr->max_speed_hz;
		pm_runtime_put_autosuspend(&pdev->dev);
	} else {
		ctlr->mode_bits |= SPI_NO_CS;
		ctlr->target_abort = cdns_target_abort;
@@ -752,12 +751,17 @@ static int cdns_spi_probe(struct platform_device *pdev)
		goto clk_dis_all;
	}

	if (!spi_controller_is_target(ctlr))
		pm_runtime_put_autosuspend(&pdev->dev);

	return ret;

clk_dis_all:
	if (!spi_controller_is_target(ctlr)) {
		pm_runtime_disable(&pdev->dev);
		pm_runtime_set_suspended(&pdev->dev);
		pm_runtime_put_noidle(&pdev->dev);
		pm_runtime_dont_use_autosuspend(&pdev->dev);
	}
remove_ctlr:
	spi_controller_put(ctlr);
@@ -776,16 +780,23 @@ static void cdns_spi_remove(struct platform_device *pdev)
{
	struct spi_controller *ctlr = platform_get_drvdata(pdev);
	struct cdns_spi *xspi = spi_controller_get_devdata(ctlr);
	int ret = 0;

	if (!spi_controller_is_target(ctlr))
		ret = pm_runtime_get_sync(&pdev->dev);

	spi_controller_get(ctlr);

	spi_unregister_controller(ctlr);

	if (ret >= 0)
		cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_DISABLE);

	if (!spi_controller_is_target(ctlr)) {
		pm_runtime_disable(&pdev->dev);
		pm_runtime_set_suspended(&pdev->dev);
		pm_runtime_put_noidle(&pdev->dev);
		pm_runtime_dont_use_autosuspend(&pdev->dev);
	}

	spi_controller_put(ctlr);