Commit aeac8103 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'spi-v3.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
 "A smattering of driver specific fixes here, including a bunch for a
  long standing common pattern in the error handling paths, and a fix
  for an embarrassing thinko in the new devm master registration code"

* tag 'spi-v3.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi/pxa2xx: Restore private register bits.
  spi/qspi: Fix qspi remove path.
  spi/qspi: cleanup pm_runtime error check.
  spi/qspi: set correct platform drvdata in ti_qspi_probe()
  spi/pxa2xx: add new ACPI IDs
  spi: core: invert success test in devm_spi_register_master
  spi: spi-mxs: fix reference leak to master in mxs_spi_remove()
  spi: bcm63xx: fix reference leak to master in bcm63xx_spi_remove()
  spi: txx9: fix reference leak to master in txx9spi_remove()
  spi: mpc512x: fix reference leak to master in mpc512x_psc_spi_do_remove()
  spi: rspi: use platform drvdata correctly in rspi_remove()
  spi: bcm2835: fix reference leak to master in bcm2835_spi_remove()
parents 5fc92de3 c18158f1
...@@ -377,7 +377,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev) ...@@ -377,7 +377,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
static int bcm2835_spi_remove(struct platform_device *pdev) static int bcm2835_spi_remove(struct platform_device *pdev)
{ {
struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); struct spi_master *master = platform_get_drvdata(pdev);
struct bcm2835_spi *bs = spi_master_get_devdata(master); struct bcm2835_spi *bs = spi_master_get_devdata(master);
free_irq(bs->irq, master); free_irq(bs->irq, master);
......
...@@ -435,7 +435,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev) ...@@ -435,7 +435,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev)
static int bcm63xx_spi_remove(struct platform_device *pdev) static int bcm63xx_spi_remove(struct platform_device *pdev)
{ {
struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); struct spi_master *master = platform_get_drvdata(pdev);
struct bcm63xx_spi *bs = spi_master_get_devdata(master); struct bcm63xx_spi *bs = spi_master_get_devdata(master);
/* reset spi block */ /* reset spi block */
......
...@@ -557,7 +557,7 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, ...@@ -557,7 +557,7 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
static int mpc512x_psc_spi_do_remove(struct device *dev) static int mpc512x_psc_spi_do_remove(struct device *dev)
{ {
struct spi_master *master = spi_master_get(dev_get_drvdata(dev)); struct spi_master *master = dev_get_drvdata(dev);
struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);
clk_disable_unprepare(mps->clk_mclk); clk_disable_unprepare(mps->clk_mclk);
......
...@@ -565,7 +565,7 @@ static int mxs_spi_remove(struct platform_device *pdev) ...@@ -565,7 +565,7 @@ static int mxs_spi_remove(struct platform_device *pdev)
struct mxs_spi *spi; struct mxs_spi *spi;
struct mxs_ssp *ssp; struct mxs_ssp *ssp;
master = spi_master_get(platform_get_drvdata(pdev)); master = platform_get_drvdata(pdev);
spi = spi_master_get_devdata(master); spi = spi_master_get_devdata(master);
ssp = &spi->ssp; ssp = &spi->ssp;
......
...@@ -1073,6 +1073,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev) ...@@ -1073,6 +1073,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev)
static struct acpi_device_id pxa2xx_spi_acpi_match[] = { static struct acpi_device_id pxa2xx_spi_acpi_match[] = {
{ "INT33C0", 0 }, { "INT33C0", 0 },
{ "INT33C1", 0 }, { "INT33C1", 0 },
{ "INT3430", 0 },
{ "INT3431", 0 },
{ "80860F0E", 0 }, { "80860F0E", 0 },
{ }, { },
}; };
...@@ -1291,6 +1293,9 @@ static int pxa2xx_spi_resume(struct device *dev) ...@@ -1291,6 +1293,9 @@ static int pxa2xx_spi_resume(struct device *dev)
/* Enable the SSP clock */ /* Enable the SSP clock */
clk_prepare_enable(ssp->clk); clk_prepare_enable(ssp->clk);
/* Restore LPSS private register bits */
lpss_ssp_setup(drv_data);
/* Start the queue running */ /* Start the queue running */
status = spi_master_resume(drv_data->master); status = spi_master_resume(drv_data->master);
if (status != 0) { if (status != 0) {
......
...@@ -885,14 +885,13 @@ static void rspi_release_dma(struct rspi_data *rspi) ...@@ -885,14 +885,13 @@ static void rspi_release_dma(struct rspi_data *rspi)
static int rspi_remove(struct platform_device *pdev) static int rspi_remove(struct platform_device *pdev)
{ {
struct rspi_data *rspi = spi_master_get(platform_get_drvdata(pdev)); struct rspi_data *rspi = platform_get_drvdata(pdev);
spi_unregister_master(rspi->master); spi_unregister_master(rspi->master);
rspi_release_dma(rspi); rspi_release_dma(rspi);
free_irq(platform_get_irq(pdev, 0), rspi); free_irq(platform_get_irq(pdev, 0), rspi);
clk_put(rspi->clk); clk_put(rspi->clk);
iounmap(rspi->addr); iounmap(rspi->addr);
spi_master_put(rspi->master);
return 0; return 0;
} }
......
...@@ -161,7 +161,7 @@ static int ti_qspi_setup(struct spi_device *spi) ...@@ -161,7 +161,7 @@ static int ti_qspi_setup(struct spi_device *spi)
qspi->spi_max_frequency, clk_div); qspi->spi_max_frequency, clk_div);
ret = pm_runtime_get_sync(qspi->dev); ret = pm_runtime_get_sync(qspi->dev);
if (ret) { if (ret < 0) {
dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");
return ret; return ret;
} }
...@@ -459,11 +459,10 @@ static int ti_qspi_probe(struct platform_device *pdev) ...@@ -459,11 +459,10 @@ static int ti_qspi_probe(struct platform_device *pdev)
if (!of_property_read_u32(np, "num-cs", &num_cs)) if (!of_property_read_u32(np, "num-cs", &num_cs))
master->num_chipselect = num_cs; master->num_chipselect = num_cs;
platform_set_drvdata(pdev, master);
qspi = spi_master_get_devdata(master); qspi = spi_master_get_devdata(master);
qspi->master = master; qspi->master = master;
qspi->dev = &pdev->dev; qspi->dev = &pdev->dev;
platform_set_drvdata(pdev, qspi);
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
...@@ -517,10 +516,26 @@ static int ti_qspi_probe(struct platform_device *pdev) ...@@ -517,10 +516,26 @@ static int ti_qspi_probe(struct platform_device *pdev)
static int ti_qspi_remove(struct platform_device *pdev) static int ti_qspi_remove(struct platform_device *pdev)
{ {
struct ti_qspi *qspi = platform_get_drvdata(pdev); struct spi_master *master;
struct ti_qspi *qspi;
int ret;
master = platform_get_drvdata(pdev);
qspi = spi_master_get_devdata(master);
ret = pm_runtime_get_sync(qspi->dev);
if (ret < 0) {
dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");
return ret;
}
ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG);
pm_runtime_put(qspi->dev);
pm_runtime_disable(&pdev->dev);
spi_unregister_master(master);
return 0; return 0;
} }
......
...@@ -425,7 +425,7 @@ static int txx9spi_probe(struct platform_device *dev) ...@@ -425,7 +425,7 @@ static int txx9spi_probe(struct platform_device *dev)
static int txx9spi_remove(struct platform_device *dev) static int txx9spi_remove(struct platform_device *dev)
{ {
struct spi_master *master = spi_master_get(platform_get_drvdata(dev)); struct spi_master *master = platform_get_drvdata(dev);
struct txx9spi *c = spi_master_get_devdata(master); struct txx9spi *c = spi_master_get_devdata(master);
destroy_workqueue(c->workqueue); destroy_workqueue(c->workqueue);
......
...@@ -1415,7 +1415,7 @@ int devm_spi_register_master(struct device *dev, struct spi_master *master) ...@@ -1415,7 +1415,7 @@ int devm_spi_register_master(struct device *dev, struct spi_master *master)
return -ENOMEM; return -ENOMEM;
ret = spi_register_master(master); ret = spi_register_master(master);
if (ret != 0) { if (!ret) {
*ptr = master; *ptr = master;
devres_add(dev, ptr); devres_add(dev, ptr);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment