Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36f8c42c authored by Ashish Kori's avatar Ashish Kori Committed by Aniket Randive
Browse files

spi: spi-msm-geni: Propagate a change from 4.14 to 5.4



Propagate following change from 4.14 to 5.4 for SPI driver.
'commit 60dc9d0568e31 ("spi: spi-geni-qcom: Suspend SPI slave
after timeout")'.

Change-Id: I08c7c2a861285ce45a28ea1aab1db9a99016a35e
Signed-off-by: default avatarAshish Kori <akori@codeaurora.org>
parent c759cdb5
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <linux/interrupt.h>
#include <linux/ipc_logging.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_platform.h>
@@ -1044,7 +1045,7 @@ static int spi_geni_unprepare_message(struct spi_master *spi_mas,
				GENI_SE_ERR(mas->ipc, false, NULL,
					"suspend usage count mismatch:%d",
								count);
		} else {
		} else if (!pm_runtime_suspended(mas->dev)) {
			pm_runtime_mark_last_busy(mas->dev);
			pm_runtime_put_autosuspend(mas->dev);
		}
@@ -1477,14 +1478,21 @@ static int setup_fifo_xfer(struct spi_transfer *xfer,
	return ret;
}

static void handle_fifo_timeout(struct spi_geni_master *mas,
static void handle_fifo_timeout(struct spi_master *spi,
					struct spi_transfer *xfer)
{
	struct spi_geni_master *mas = spi_master_get_devdata(spi);
	unsigned long timeout;
	u32 rx_fifo_status;
	int rx_wc, i;

	geni_se_dump_dbg_regs(&mas->spi_rsc, mas->base, mas->ipc);

	if (mas->cur_xfer_mode == FIFO_MODE)
		geni_write_reg(0, mas->base, SE_GENI_TX_WATERMARK_REG);
	if (spi->slave)
		goto dma_unprep;

	reinit_completion(&mas->xfer_done);

	/* Dummy read the rx fifo for any spurious data*/
@@ -1495,10 +1503,8 @@ static void handle_fifo_timeout(struct spi_geni_master *mas,
		for (i = 0; i < rx_wc; i++)
			geni_read_reg(mas->base, SE_GENI_RX_FIFOn);
	}

	geni_cancel_m_cmd(mas->base);
	if (mas->cur_xfer_mode == FIFO_MODE)
		geni_write_reg(0, mas->base, SE_GENI_TX_WATERMARK_REG);

	/* Ensure cmd cancel is written */
	mb();
	timeout = wait_for_completion_timeout(&mas->xfer_done, HZ);
@@ -1513,6 +1519,7 @@ static void handle_fifo_timeout(struct spi_geni_master *mas,
			dev_err(mas->dev,
				"Failed to cancel/abort m_cmd\n");
	}
dma_unprep:
	if (mas->cur_xfer_mode == SE_DMA) {
		if (xfer->tx_buf && xfer->tx_dma) {
			reinit_completion(&mas->xfer_done);
@@ -1539,6 +1546,8 @@ static void handle_fifo_timeout(struct spi_geni_master *mas,
				xfer->rx_dma, xfer->len);
		}
	}
	if (spi->slave && !mas->dis_autosuspend)
		pm_runtime_put_sync_suspend(mas->dev);

}

@@ -1663,8 +1672,7 @@ static int spi_geni_transfer_one(struct spi_master *spi,
	}
	return ret;
err_fifo_geni_transfer_one:
	if (!spi->slave)
		handle_fifo_timeout(mas, xfer);
	handle_fifo_timeout(spi, xfer);
	return ret;
}

@@ -2106,6 +2114,7 @@ static int spi_geni_runtime_suspend(struct device *dev)
	struct spi_master *spi = get_spi_master(dev);
	struct spi_geni_master *geni_mas = spi_master_get_devdata(spi);

	disable_irq(geni_mas->irq);
	if (geni_mas->is_le_vm) {
		spi_geni_unlock_bus(spi);
		return 0;
@@ -2167,6 +2176,7 @@ static int spi_geni_runtime_resume(struct device *dev)

exit_rt_resume:
	ret = se_geni_resources_on(&geni_mas->spi_rsc);
	enable_irq(geni_mas->irq);
	return ret;
}