summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorDilip Kota <dkota@codeaurora.org>2017-12-14 20:51:19 +0530
committerDilip Kota <dkota@codeaurora.org>2018-01-30 14:10:07 +0530
commit4ac5f8ab03ae1616d2f6a96319cdec5230b334d0 (patch)
tree897682397b9fa70e858fba09f0b3e1a324a52e5b /drivers/spi
parent04b6b652ac86f10c6f22c7de575be5e4ebcc48ea (diff)
spi_qsd: Reset SPI core for transaction failure
Reset SPI core for transaction failure. Remove the code configuring IO_CONTROL register for SPI slave. Change-Id: I3819269a9f2b7815ccfaf96713943eb04b36e137 Signed-off-by: Dilip Kota <dkota@codeaurora.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/spi_qsd.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index 5c56001e36db..b8826b59ca23 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -55,6 +55,7 @@ static int get_local_resources(struct msm_spi *dd);
static void put_local_resources(struct msm_spi *dd);
static void msm_spi_slv_setup(struct msm_spi *dd);
static inline int msm_spi_wait_valid(struct msm_spi *dd);
+static int reset_core(struct msm_spi *dd);
static inline int msm_spi_configure_gsbi(struct msm_spi *dd,
struct platform_device *pdev)
@@ -1491,6 +1492,10 @@ static int msm_spi_process_transfer(struct msm_spi *dd)
}
} while (msm_spi_dma_send_next(dd));
+ if (status && dd->pdata->is_slv_ctrl) {
+ if (reset_core(dd))
+ dev_err(dd->dev, "Reset failed\n");
+ }
msm_spi_udelay(dd->xfrs_delay_usec);
transfer_end:
@@ -1578,14 +1583,15 @@ static int reset_core(struct msm_spi *dd)
* bit.
*/
msm_spi_enable_error_flags(dd);
-
- spi_ioc = readl_relaxed(dd->base + SPI_IO_CONTROL);
- spi_ioc |= SPI_IO_C_NO_TRI_STATE;
- writel_relaxed(spi_ioc , dd->base + SPI_IO_CONTROL);
- /*
- * Ensure that the IO control is written to before returning.
- */
- mb();
+ if (!dd->pdata->is_slv_ctrl) {
+ spi_ioc = readl_relaxed(dd->base + SPI_IO_CONTROL);
+ spi_ioc |= SPI_IO_C_NO_TRI_STATE;
+ writel_relaxed(spi_ioc, dd->base + SPI_IO_CONTROL);
+ /*
+ * Ensure that the IO control is written to before returning.
+ */
+ mb();
+ }
msm_spi_set_state(dd, SPI_OP_STATE_RESET);
return 0;
}
@@ -2471,7 +2477,9 @@ static int init_resources(struct platform_device *pdev)
*/
msm_spi_enable_error_flags(dd);
- writel_relaxed(SPI_IO_C_NO_TRI_STATE, dd->base + SPI_IO_CONTROL);
+ if (dd->pdata && !dd->pdata->is_slv_ctrl)
+ writel_relaxed(SPI_IO_C_NO_TRI_STATE,
+ dd->base + SPI_IO_CONTROL);
rc = msm_spi_set_state(dd, SPI_OP_STATE_RESET);
if (rc)
goto err_spi_state;