mirror of https://github.com/torvalds/linux.git
spi: Final fixes for v6.17
A few final driver specific fixes that have been sitting in -next for a bit, the OMAP issue is likely to come up very infrequently since mixed configuration SPI buses are rare and the Cadence issue is specific to SoCFPGA systems. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmjZIHkACgkQJNaLcl1U h9CAXQf/dTgcvdcuVlGX+Rs5NPo9/9M/n1B6sIH3TJCULU1fwht2XYu4ghUfVVmp lSkHL+NYbXSUJ9lv+ZPJUjU9mlPOAjtFHX5X8I0jaiXeC8/23LQl79TuTvCfqpOF MyoxJFEcA/nZiwn/IYybl8VMonoem5aJdXncDg70gCvQwWzxeNGAYW0NXdVk8gJz YqC9ANI4wCyBcwokFJ9eBoz79XGPM2zDNPnYQnpW8lbJ3z0ec8l9IeAloS90bSb9 CY5RgXmFdALFMcrAYsIQl4WlZocb+NQ3S6KN2hHVUJW6A+YlW0H4YREMSmp1/Okg boN54WdWHYmMFFF8Mrpi6w2ac1VCLQ== =BUvX -----END PGP SIGNATURE----- Merge tag 'spi-fix-v6.17-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi Pull spi fixes from Mark Brown: "A few final driver specific fixes that have been sitting in -next for a bit. The OMAP issue is likely to come up very infrequently since mixed configuration SPI buses are rare and the Cadence issue is specific to SoCFPGA systems" * tag 'spi-fix-v6.17-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: omap2-mcspi: drive SPI_CLK on transfer_setup() spi: cadence-qspi: defer runtime support on socfpga if reset bit is enabled
This commit is contained in:
commit
a5b2a9f505
|
|
@ -46,6 +46,7 @@ static_assert(CQSPI_MAX_CHIPSELECT <= SPI_CS_CNT_MAX);
|
||||||
#define CQSPI_DMA_SET_MASK BIT(7)
|
#define CQSPI_DMA_SET_MASK BIT(7)
|
||||||
#define CQSPI_SUPPORT_DEVICE_RESET BIT(8)
|
#define CQSPI_SUPPORT_DEVICE_RESET BIT(8)
|
||||||
#define CQSPI_DISABLE_STIG_MODE BIT(9)
|
#define CQSPI_DISABLE_STIG_MODE BIT(9)
|
||||||
|
#define CQSPI_DISABLE_RUNTIME_PM BIT(10)
|
||||||
|
|
||||||
/* Capabilities */
|
/* Capabilities */
|
||||||
#define CQSPI_SUPPORTS_OCTAL BIT(0)
|
#define CQSPI_SUPPORTS_OCTAL BIT(0)
|
||||||
|
|
@ -1468,14 +1469,17 @@ static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)
|
||||||
int ret;
|
int ret;
|
||||||
struct cqspi_st *cqspi = spi_controller_get_devdata(mem->spi->controller);
|
struct cqspi_st *cqspi = spi_controller_get_devdata(mem->spi->controller);
|
||||||
struct device *dev = &cqspi->pdev->dev;
|
struct device *dev = &cqspi->pdev->dev;
|
||||||
|
const struct cqspi_driver_platdata *ddata = of_device_get_match_data(dev);
|
||||||
|
|
||||||
if (refcount_read(&cqspi->inflight_ops) == 0)
|
if (refcount_read(&cqspi->inflight_ops) == 0)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
ret = pm_runtime_resume_and_get(dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
|
||||||
if (ret) {
|
ret = pm_runtime_resume_and_get(dev);
|
||||||
dev_err(&mem->spi->dev, "resume failed with %d\n", ret);
|
if (ret) {
|
||||||
return ret;
|
dev_err(&mem->spi->dev, "resume failed with %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!refcount_read(&cqspi->refcount))
|
if (!refcount_read(&cqspi->refcount))
|
||||||
|
|
@ -1491,7 +1495,8 @@ static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)
|
||||||
|
|
||||||
ret = cqspi_mem_process(mem, op);
|
ret = cqspi_mem_process(mem, op);
|
||||||
|
|
||||||
pm_runtime_put_autosuspend(dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
|
||||||
|
pm_runtime_put_autosuspend(dev);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(&mem->spi->dev, "operation failed with %d\n", ret);
|
dev_err(&mem->spi->dev, "operation failed with %d\n", ret);
|
||||||
|
|
@ -1985,11 +1990,12 @@ static int cqspi_probe(struct platform_device *pdev)
|
||||||
goto probe_setup_failed;
|
goto probe_setup_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_enable(dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
|
||||||
|
pm_runtime_enable(dev);
|
||||||
pm_runtime_set_autosuspend_delay(dev, CQSPI_AUTOSUSPEND_TIMEOUT);
|
pm_runtime_set_autosuspend_delay(dev, CQSPI_AUTOSUSPEND_TIMEOUT);
|
||||||
pm_runtime_use_autosuspend(dev);
|
pm_runtime_use_autosuspend(dev);
|
||||||
pm_runtime_get_noresume(dev);
|
pm_runtime_get_noresume(dev);
|
||||||
|
}
|
||||||
|
|
||||||
ret = spi_register_controller(host);
|
ret = spi_register_controller(host);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
@ -1997,12 +2003,17 @@ static int cqspi_probe(struct platform_device *pdev)
|
||||||
goto probe_setup_failed;
|
goto probe_setup_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_put_autosuspend(dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
|
||||||
|
pm_runtime_put_autosuspend(dev);
|
||||||
|
pm_runtime_mark_last_busy(dev);
|
||||||
|
pm_runtime_put_autosuspend(dev);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
probe_setup_failed:
|
probe_setup_failed:
|
||||||
cqspi_controller_enable(cqspi, 0);
|
cqspi_controller_enable(cqspi, 0);
|
||||||
pm_runtime_disable(dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
|
||||||
|
pm_runtime_disable(dev);
|
||||||
probe_reset_failed:
|
probe_reset_failed:
|
||||||
if (cqspi->is_jh7110)
|
if (cqspi->is_jh7110)
|
||||||
cqspi_jh7110_disable_clk(pdev, cqspi);
|
cqspi_jh7110_disable_clk(pdev, cqspi);
|
||||||
|
|
@ -2013,7 +2024,11 @@ static int cqspi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
static void cqspi_remove(struct platform_device *pdev)
|
static void cqspi_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
const struct cqspi_driver_platdata *ddata;
|
||||||
struct cqspi_st *cqspi = platform_get_drvdata(pdev);
|
struct cqspi_st *cqspi = platform_get_drvdata(pdev);
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
|
||||||
|
ddata = of_device_get_match_data(dev);
|
||||||
|
|
||||||
refcount_set(&cqspi->refcount, 0);
|
refcount_set(&cqspi->refcount, 0);
|
||||||
|
|
||||||
|
|
@ -2026,14 +2041,17 @@ static void cqspi_remove(struct platform_device *pdev)
|
||||||
if (cqspi->rx_chan)
|
if (cqspi->rx_chan)
|
||||||
dma_release_channel(cqspi->rx_chan);
|
dma_release_channel(cqspi->rx_chan);
|
||||||
|
|
||||||
if (pm_runtime_get_sync(&pdev->dev) >= 0)
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
|
||||||
clk_disable(cqspi->clk);
|
if (pm_runtime_get_sync(&pdev->dev) >= 0)
|
||||||
|
clk_disable(cqspi->clk);
|
||||||
|
|
||||||
if (cqspi->is_jh7110)
|
if (cqspi->is_jh7110)
|
||||||
cqspi_jh7110_disable_clk(pdev, cqspi);
|
cqspi_jh7110_disable_clk(pdev, cqspi);
|
||||||
|
|
||||||
pm_runtime_put_sync(&pdev->dev);
|
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
|
||||||
pm_runtime_disable(&pdev->dev);
|
pm_runtime_put_sync(&pdev->dev);
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cqspi_runtime_suspend(struct device *dev)
|
static int cqspi_runtime_suspend(struct device *dev)
|
||||||
|
|
@ -2112,7 +2130,8 @@ static const struct cqspi_driver_platdata socfpga_qspi = {
|
||||||
.quirks = CQSPI_DISABLE_DAC_MODE
|
.quirks = CQSPI_DISABLE_DAC_MODE
|
||||||
| CQSPI_NO_SUPPORT_WR_COMPLETION
|
| CQSPI_NO_SUPPORT_WR_COMPLETION
|
||||||
| CQSPI_SLOW_SRAM
|
| CQSPI_SLOW_SRAM
|
||||||
| CQSPI_DISABLE_STIG_MODE,
|
| CQSPI_DISABLE_STIG_MODE
|
||||||
|
| CQSPI_DISABLE_RUNTIME_PM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct cqspi_driver_platdata versal_ospi = {
|
static const struct cqspi_driver_platdata versal_ospi = {
|
||||||
|
|
|
||||||
|
|
@ -988,6 +988,7 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi,
|
||||||
else
|
else
|
||||||
l &= ~OMAP2_MCSPI_CHCONF_PHA;
|
l &= ~OMAP2_MCSPI_CHCONF_PHA;
|
||||||
|
|
||||||
|
mcspi_write_chconf0(spi, l | OMAP2_MCSPI_CHCONF_FORCE);
|
||||||
mcspi_write_chconf0(spi, l);
|
mcspi_write_chconf0(spi, l);
|
||||||
|
|
||||||
cs->mode = spi->mode;
|
cs->mode = spi->mode;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue