diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/spi/spi-qup.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/spi/spi-qup.c')
| -rw-r--r-- | drivers/spi/spi-qup.c | 68 | 
1 files changed, 34 insertions, 34 deletions
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index 678dc51ef017..00e5e88e72c4 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c @@ -1003,8 +1003,7 @@ static int spi_qup_probe(struct platform_device *pdev)  	int ret, irq, size;  	dev = &pdev->dev; -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	base = devm_ioremap_resource(dev, res); +	base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);  	if (IS_ERR(base))  		return PTR_ERR(base); @@ -1029,23 +1028,8 @@ static int spi_qup_probe(struct platform_device *pdev)  		return -ENXIO;  	} -	ret = clk_prepare_enable(cclk); -	if (ret) { -		dev_err(dev, "cannot enable core clock\n"); -		return ret; -	} - -	ret = clk_prepare_enable(iclk); -	if (ret) { -		clk_disable_unprepare(cclk); -		dev_err(dev, "cannot enable iface clock\n"); -		return ret; -	} -  	master = spi_alloc_master(dev, sizeof(struct spi_qup));  	if (!master) { -		clk_disable_unprepare(cclk); -		clk_disable_unprepare(iclk);  		dev_err(dev, "cannot allocate master\n");  		return -ENOMEM;  	} @@ -1093,6 +1077,19 @@ static int spi_qup_probe(struct platform_device *pdev)  	spin_lock_init(&controller->lock);  	init_completion(&controller->done); +	ret = clk_prepare_enable(cclk); +	if (ret) { +		dev_err(dev, "cannot enable core clock\n"); +		goto error_dma; +	} + +	ret = clk_prepare_enable(iclk); +	if (ret) { +		clk_disable_unprepare(cclk); +		dev_err(dev, "cannot enable iface clock\n"); +		goto error_dma; +	} +  	iomode = readl_relaxed(base + QUP_IO_M_MODES);  	size = QUP_IO_M_OUTPUT_BLOCK_SIZE(iomode); @@ -1122,7 +1119,7 @@ static int spi_qup_probe(struct platform_device *pdev)  	ret = spi_qup_set_state(controller, QUP_STATE_RESET);  	if (ret) {  		dev_err(dev, "cannot set RESET state\n"); -		goto error_dma; +		goto error_clk;  	}  	writel_relaxed(0, base + QUP_OPERATIONAL); @@ -1146,7 +1143,7 @@ static int spi_qup_probe(struct platform_device *pdev)  	ret = devm_request_irq(dev, irq, spi_qup_qup_irq,  			       IRQF_TRIGGER_HIGH, pdev->name, controller);  	if (ret) -		goto error_dma; +		goto error_clk;  	pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC);  	pm_runtime_use_autosuspend(dev); @@ -1161,11 +1158,12 @@ static int spi_qup_probe(struct platform_device *pdev)  disable_pm:  	pm_runtime_disable(&pdev->dev); +error_clk: +	clk_disable_unprepare(cclk); +	clk_disable_unprepare(iclk);  error_dma:  	spi_qup_release_dma(master);  error: -	clk_disable_unprepare(cclk); -	clk_disable_unprepare(iclk);  	spi_master_put(master);  	return ret;  } @@ -1271,29 +1269,31 @@ disable_clk:  }  #endif /* CONFIG_PM_SLEEP */ -static int spi_qup_remove(struct platform_device *pdev) +static void spi_qup_remove(struct platform_device *pdev)  {  	struct spi_master *master = dev_get_drvdata(&pdev->dev);  	struct spi_qup *controller = spi_master_get_devdata(master);  	int ret; -	ret = pm_runtime_resume_and_get(&pdev->dev); -	if (ret < 0) -		return ret; +	ret = pm_runtime_get_sync(&pdev->dev); -	ret = spi_qup_set_state(controller, QUP_STATE_RESET); -	if (ret) -		return ret; +	if (ret >= 0) { +		ret = spi_qup_set_state(controller, QUP_STATE_RESET); +		if (ret) +			dev_warn(&pdev->dev, "failed to reset controller (%pe)\n", +				 ERR_PTR(ret)); -	spi_qup_release_dma(master); +		clk_disable_unprepare(controller->cclk); +		clk_disable_unprepare(controller->iclk); +	} else { +		dev_warn(&pdev->dev, "failed to resume, skip hw disable (%pe)\n", +			 ERR_PTR(ret)); +	} -	clk_disable_unprepare(controller->cclk); -	clk_disable_unprepare(controller->iclk); +	spi_qup_release_dma(master);  	pm_runtime_put_noidle(&pdev->dev);  	pm_runtime_disable(&pdev->dev); - -	return 0;  }  static const struct of_device_id spi_qup_dt_match[] = { @@ -1318,7 +1318,7 @@ static struct platform_driver spi_qup_driver = {  		.of_match_table = spi_qup_dt_match,  	},  	.probe = spi_qup_probe, -	.remove = spi_qup_remove, +	.remove_new = spi_qup_remove,  };  module_platform_driver(spi_qup_driver);  |