mirror of
https://github.com/torvalds/linux.git
synced 2024-11-08 05:01:48 +00:00
spi: Fixes for v3.12
This is all driver updates, mostly fixes for error handling paths except for the s3c64xx and hspi fixes for trying to use runtime PM before it is enabled and the pxa2xx fix for interactions between power management and interrupt handling. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) iQIcBAABAgAGBQJSUrzyAAoJELSic+t+oim9a3AQAI720tDtS30qLnNTJCbgr8XA j9tJgQgz2I7EjUSFxa8YUXMZrTU/fDC6TyMa9KRYg9IyCjmZn/7H7I/ezLSMC6LT ilvVwoeHXMQp8/3ekalsFWSnf7Fn7rgpMlvyX6F9/OTp4fcLIS9M+DL0YkIgK218 Bg2697IM4aq+u00ocNQ2mr5KX/xhiS0GLiU2I4Z5NKABZ+pXl9syutxoye94LYEp zUl5vm74vS1lEg88xiVD8P/UbEpEWErjPhYLrz6vFAB+SbdMg0ADd07CVc2ja1nD CVyv36yzQ1izn99uJU4y+DfYqYH9g9OWEQjnbpvod+A95qgDVSaiV2oAmFJLgYwI eTxU6ona5F14LJi7aeHW4NrDHq44iLKfiVG5Vgm6XIC4G09e6sTB11RiS2WIutng cM6wRnWpA4V8QPHDwnimRWnLdrFjPkROaTcx1HeJ2aPOAMA4T7m/NWi/rFnKc2cB 8Ex2An/m5h39EflpZt0NH6sRVB1Ez9q1efZhtIXhyeeFkzSwq0Okl9F3X+/kTfLJ HQd8aEdVtSTghUSHX5ONa8SBCSuz7EOZ8vk+leye1KU3Byl1CYG4zQ9kmEXQCP2E gQ8MFAG/B6RxuZyjv7P4bDqcD8ZsXEos+zNmlsbckoKEdiAOMDSHcj2CKZQjd5Ah fe10P/DXejNARA3LwEr5 =MaXD -----END PGP SIGNATURE----- Merge tag 'spi-v3.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi Pull spi fixes from Mark Brown: "This is all driver updates, mostly fixes for error handling paths except for the s3c64xx and hspi fixes for trying to use runtime PM before it is enabled and the pxa2xx fix for interactions between power management and interrupt handling" * tag 'spi-v3.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: atmel: Fix incorrect error path spi/hspi: fixup Runtime PM enable timing spi/s3c64xx: Ensure runtime PM is enabled prior to registration spi/clps711x: drop clk_put for devm_clk_get in spi_clps711x_probe() spi: fix return value check in dspi_probe() spi: mpc512x: fix error return code in mpc512x_psc_spi_do_probe() spi: clps711x: Don't call kfree() after spi_master_put/spi_unregister_master spi/pxa2xx: check status register as well to determine if the device is off
This commit is contained in:
commit
bd7df5ad05
@ -1583,7 +1583,7 @@ static int atmel_spi_probe(struct platform_device *pdev)
|
||||
/* Initialize the hardware */
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
goto out_unmap_regs;
|
||||
goto out_free_irq;
|
||||
spi_writel(as, CR, SPI_BIT(SWRST));
|
||||
spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */
|
||||
if (as->caps.has_wdrbt) {
|
||||
@ -1614,6 +1614,7 @@ out_free_dma:
|
||||
spi_writel(as, CR, SPI_BIT(SWRST));
|
||||
spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */
|
||||
clk_disable_unprepare(clk);
|
||||
out_free_irq:
|
||||
free_irq(irq, master);
|
||||
out_unmap_regs:
|
||||
iounmap(as->regs);
|
||||
|
@ -226,7 +226,6 @@ static int spi_clps711x_probe(struct platform_device *pdev)
|
||||
dev_name(&pdev->dev), hw);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Can't request IRQ\n");
|
||||
clk_put(hw->spi_clk);
|
||||
goto clk_out;
|
||||
}
|
||||
|
||||
@ -247,7 +246,6 @@ err_out:
|
||||
gpio_free(hw->chipselect[i]);
|
||||
|
||||
spi_master_put(master);
|
||||
kfree(master);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -263,7 +261,6 @@ static int spi_clps711x_remove(struct platform_device *pdev)
|
||||
gpio_free(hw->chipselect[i]);
|
||||
|
||||
spi_unregister_master(master);
|
||||
kfree(master);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -476,15 +476,9 @@ static int dspi_probe(struct platform_device *pdev)
|
||||
master->bus_num = bus_num;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "can't get platform resource\n");
|
||||
ret = -EINVAL;
|
||||
goto out_master_put;
|
||||
}
|
||||
|
||||
dspi->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (!dspi->base) {
|
||||
ret = -EINVAL;
|
||||
if (IS_ERR(dspi->base)) {
|
||||
ret = PTR_ERR(dspi->base);
|
||||
goto out_master_put;
|
||||
}
|
||||
|
||||
|
@ -522,8 +522,10 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
|
||||
psc_num = master->bus_num;
|
||||
snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num);
|
||||
clk = devm_clk_get(dev, clk_name);
|
||||
if (IS_ERR(clk))
|
||||
if (IS_ERR(clk)) {
|
||||
ret = PTR_ERR(clk);
|
||||
goto free_irq;
|
||||
}
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
goto free_irq;
|
||||
|
@ -546,8 +546,17 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
|
||||
if (pm_runtime_suspended(&drv_data->pdev->dev))
|
||||
return IRQ_NONE;
|
||||
|
||||
sccr1_reg = read_SSCR1(reg);
|
||||
/*
|
||||
* If the device is not yet in RPM suspended state and we get an
|
||||
* interrupt that is meant for another device, check if status bits
|
||||
* are all set to one. That means that the device is already
|
||||
* powered off.
|
||||
*/
|
||||
status = read_SSSR(reg);
|
||||
if (status == ~0)
|
||||
return IRQ_NONE;
|
||||
|
||||
sccr1_reg = read_SSCR1(reg);
|
||||
|
||||
/* Ignore possible writes if we don't need to write */
|
||||
if (!(sccr1_reg & SSCR1_TIE))
|
||||
|
@ -1428,6 +1428,8 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
|
||||
S3C64XX_SPI_INT_TX_OVERRUN_EN | S3C64XX_SPI_INT_TX_UNDERRUN_EN,
|
||||
sdd->regs + S3C64XX_SPI_INT_EN);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
if (spi_register_master(master)) {
|
||||
dev_err(&pdev->dev, "cannot register SPI master\n");
|
||||
ret = -EBUSY;
|
||||
@ -1440,8 +1442,6 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
|
||||
mem_res,
|
||||
sdd->rx_dma.dmach, sdd->tx_dma.dmach);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err3:
|
||||
|
@ -296,6 +296,8 @@ static int hspi_probe(struct platform_device *pdev)
|
||||
goto error1;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
master->num_chipselect = 1;
|
||||
master->bus_num = pdev->id;
|
||||
master->setup = hspi_setup;
|
||||
@ -309,8 +311,6 @@ static int hspi_probe(struct platform_device *pdev)
|
||||
goto error1;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
error1:
|
||||
|
Loading…
Reference in New Issue
Block a user