| From: Tobias Jordan <Tobias.Jordan@elektrobit.com> |
| Date: Mon, 30 Apr 2018 16:30:06 +0200 |
| Subject: spi: pxa2xx: check clk_prepare_enable() return value |
| |
| commit 62bbc864d1946c715063bd481bff3641fd1324e2 upstream. |
| |
| clk_prepare_enable() can fail, so its return value should be checked and |
| acted upon. |
| |
| Found by Linux Driver Verification project (linuxtesting.org). |
| |
| Fixes: 3343b7a6d2cd ("spi/pxa2xx: convert to the common clk framework") |
| Signed-off-by: Tobias Jordan <Tobias.Jordan@elektrobit.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/spi/spi-pxa2xx.c | 18 +++++++++++++----- |
| 1 file changed, 13 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/spi/spi-pxa2xx.c |
| +++ b/drivers/spi/spi-pxa2xx.c |
| @@ -1182,7 +1182,9 @@ static int pxa2xx_spi_probe(struct platf |
| } |
| |
| /* Enable SOC clock */ |
| - clk_prepare_enable(ssp->clk); |
| + status = clk_prepare_enable(ssp->clk); |
| + if (status) |
| + goto out_error_dma_irq_alloc; |
| |
| drv_data->max_clk_rate = clk_get_rate(ssp->clk); |
| |
| @@ -1221,6 +1223,8 @@ static int pxa2xx_spi_probe(struct platf |
| |
| out_error_clock_enabled: |
| clk_disable_unprepare(ssp->clk); |
| + |
| +out_error_dma_irq_alloc: |
| pxa2xx_spi_dma_release(drv_data); |
| free_irq(ssp->irq, drv_data); |
| |
| @@ -1296,8 +1300,11 @@ static int pxa2xx_spi_resume(struct devi |
| pxa2xx_spi_dma_resume(drv_data); |
| |
| /* Enable the SSP clock */ |
| - if (!pm_runtime_suspended(dev)) |
| - clk_prepare_enable(ssp->clk); |
| + if (!pm_runtime_suspended(dev)) { |
| + status = clk_prepare_enable(ssp->clk); |
| + if (status) |
| + return status; |
| + } |
| |
| /* Restore LPSS private register bits */ |
| lpss_ssp_setup(drv_data); |
| @@ -1325,9 +1332,10 @@ static int pxa2xx_spi_runtime_suspend(st |
| static int pxa2xx_spi_runtime_resume(struct device *dev) |
| { |
| struct driver_data *drv_data = dev_get_drvdata(dev); |
| + int status; |
| |
| - clk_prepare_enable(drv_data->ssp->clk); |
| - return 0; |
| + status = clk_prepare_enable(drv_data->ssp->clk); |
| + return status; |
| } |
| #endif |
| |