Commit c06eea7d authored by Mark Brown's avatar Mark Brown

Merge branch 'spi-4.20' into spi-4.21 for bcm stuff.

parents 942779c6 e82b0b38
...@@ -155,8 +155,7 @@ static irqreturn_t bcm2835_spi_interrupt(int irq, void *dev_id) ...@@ -155,8 +155,7 @@ static irqreturn_t bcm2835_spi_interrupt(int irq, void *dev_id)
/* Write as many bytes as possible to FIFO */ /* Write as many bytes as possible to FIFO */
bcm2835_wr_fifo(bs); bcm2835_wr_fifo(bs);
/* based on flags decide if we can finish the transfer */ if (!bs->rx_len) {
if (bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_DONE) {
/* Transfer complete - reset SPI HW */ /* Transfer complete - reset SPI HW */
bcm2835_spi_reset_hw(master); bcm2835_spi_reset_hw(master);
/* wake up the framework */ /* wake up the framework */
...@@ -233,10 +232,9 @@ static void bcm2835_spi_dma_done(void *data) ...@@ -233,10 +232,9 @@ static void bcm2835_spi_dma_done(void *data)
* is called the tx-dma must have finished - can't get to this * is called the tx-dma must have finished - can't get to this
* situation otherwise... * situation otherwise...
*/ */
dmaengine_terminate_all(master->dma_tx); if (cmpxchg(&bs->dma_pending, true, false)) {
dmaengine_terminate_all(master->dma_tx);
/* mark as no longer pending */ }
bs->dma_pending = 0;
/* and mark as completed */; /* and mark as completed */;
complete(&master->xfer_completion); complete(&master->xfer_completion);
...@@ -342,6 +340,7 @@ static int bcm2835_spi_transfer_one_dma(struct spi_master *master, ...@@ -342,6 +340,7 @@ static int bcm2835_spi_transfer_one_dma(struct spi_master *master,
if (ret) { if (ret) {
/* need to reset on errors */ /* need to reset on errors */
dmaengine_terminate_all(master->dma_tx); dmaengine_terminate_all(master->dma_tx);
bs->dma_pending = false;
bcm2835_spi_reset_hw(master); bcm2835_spi_reset_hw(master);
return ret; return ret;
} }
...@@ -617,10 +616,9 @@ static void bcm2835_spi_handle_err(struct spi_master *master, ...@@ -617,10 +616,9 @@ static void bcm2835_spi_handle_err(struct spi_master *master,
struct bcm2835_spi *bs = spi_master_get_devdata(master); struct bcm2835_spi *bs = spi_master_get_devdata(master);
/* if an error occurred and we have an active dma, then terminate */ /* if an error occurred and we have an active dma, then terminate */
if (bs->dma_pending) { if (cmpxchg(&bs->dma_pending, true, false)) {
dmaengine_terminate_all(master->dma_tx); dmaengine_terminate_all(master->dma_tx);
dmaengine_terminate_all(master->dma_rx); dmaengine_terminate_all(master->dma_rx);
bs->dma_pending = 0;
} }
/* and reset */ /* and reset */
bcm2835_spi_reset_hw(master); bcm2835_spi_reset_hw(master);
......
...@@ -1540,13 +1540,26 @@ static int omap2_mcspi_remove(struct platform_device *pdev) ...@@ -1540,13 +1540,26 @@ static int omap2_mcspi_remove(struct platform_device *pdev)
/* work with hotplug and coldplug */ /* work with hotplug and coldplug */
MODULE_ALIAS("platform:omap2_mcspi"); MODULE_ALIAS("platform:omap2_mcspi");
#ifdef CONFIG_SUSPEND static int __maybe_unused omap2_mcspi_suspend(struct device *dev)
static int omap2_mcspi_suspend_noirq(struct device *dev)
{ {
return pinctrl_pm_select_sleep_state(dev); struct spi_master *master = dev_get_drvdata(dev);
struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
int error;
error = pinctrl_pm_select_sleep_state(dev);
if (error)
dev_warn(mcspi->dev, "%s: failed to set pins: %i\n",
__func__, error);
error = spi_master_suspend(master);
if (error)
dev_warn(mcspi->dev, "%s: master suspend failed: %i\n",
__func__, error);
return pm_runtime_force_suspend(dev);
} }
static int omap2_mcspi_resume_noirq(struct device *dev) static int __maybe_unused omap2_mcspi_resume(struct device *dev)
{ {
struct spi_master *master = dev_get_drvdata(dev); struct spi_master *master = dev_get_drvdata(dev);
struct omap2_mcspi *mcspi = spi_master_get_devdata(master); struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
...@@ -1557,17 +1570,17 @@ static int omap2_mcspi_resume_noirq(struct device *dev) ...@@ -1557,17 +1570,17 @@ static int omap2_mcspi_resume_noirq(struct device *dev)
dev_warn(mcspi->dev, "%s: failed to set pins: %i\n", dev_warn(mcspi->dev, "%s: failed to set pins: %i\n",
__func__, error); __func__, error);
return 0; error = spi_master_resume(master);
} if (error)
dev_warn(mcspi->dev, "%s: master resume failed: %i\n",
__func__, error);
#else return pm_runtime_force_resume(dev);
#define omap2_mcspi_suspend_noirq NULL }
#define omap2_mcspi_resume_noirq NULL
#endif
static const struct dev_pm_ops omap2_mcspi_pm_ops = { static const struct dev_pm_ops omap2_mcspi_pm_ops = {
.suspend_noirq = omap2_mcspi_suspend_noirq, SET_SYSTEM_SLEEP_PM_OPS(omap2_mcspi_suspend,
.resume_noirq = omap2_mcspi_resume_noirq, omap2_mcspi_resume)
.runtime_resume = omap_mcspi_runtime_resume, .runtime_resume = omap_mcspi_runtime_resume,
}; };
......
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