From a6acf583b2bda5ed9e4df6c2e05b8dbe0c837712 Mon Sep 17 00:00:00 2001
From: Clark Wang <xiaoning.wang@nxp.com>
Date: Tue, 15 Jan 2019 16:08:30 +0800
Subject: [PATCH] MLK-20060-3 spi: lpspi: use the core way to implement cs-gpio
 function

Use the default implementation of transfer_one_msg/chipselect/setup
functions in spi core to implement cs-gpio control.
Use fsl_lpspi_prepare_message to init the cs_gpio pin.

Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
Acked-by: Fugang Duan <Fugang.duan@nxp.com>
(cherry picked from commit 8f0f0df824fc113eade82f929e3e78b8f4d2ac55)
---
 drivers/spi/spi-fsl-lpspi.c | 95 ++++++++++---------------------------
 1 file changed, 24 insertions(+), 71 deletions(-)

diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
index 02f6d86dbbdf09..8ec93f7a437cd6 100644
--- a/drivers/spi/spi-fsl-lpspi.c
+++ b/drivers/spi/spi-fsl-lpspi.c
@@ -30,10 +30,6 @@
 
 #define FSL_LPSPI_RPM_TIMEOUT 50 /* 50ms */
 
-#define LPSPI_CS_ACTIVE		1
-#define LPSPI_CS_INACTIVE	0
-#define LPSPI_CS_DELAY		100
-
 /* i.MX7ULP LPSPI registers */
 #define IMX7ULP_VERID	0x0
 #define IMX7ULP_PARAM	0x4
@@ -97,6 +93,7 @@ struct fsl_lpspi_data {
 	struct clk *clk_ipg;
 	struct clk *clk_per;
 	bool is_slave;
+	bool is_first_byte;
 
 	void *rx_buf;
 	const void *tx_buf;
@@ -186,43 +183,15 @@ static int lpspi_unprepare_xfer_hardware(struct spi_controller *controller)
 	return 0;
 }
 
-static void fsl_lpspi_chipselect(struct spi_device *spi, bool enable)
-{
-	struct fsl_lpspi_data *fsl_lpspi =
-				spi_controller_get_devdata(spi->controller);
-	int gpio = fsl_lpspi->chipselect[spi->chip_select];
-
-	enable = (!!(spi->mode & SPI_CS_HIGH) == enable);
-
-	if (!gpio_is_valid(gpio))
-		return;
-
-	gpio_set_value_cansleep(gpio, enable);
-}
-
-static int
-fsl_lpspi_prepare_message(struct spi_controller *controller, struct spi_message *msg)
+static int fsl_lpspi_prepare_message(struct spi_controller *controller,
+				     struct spi_message *msg)
 {
 	struct fsl_lpspi_data *fsl_lpspi = spi_controller_get_devdata(controller);
 	struct spi_device *spi = msg->spi;
 	int gpio = fsl_lpspi->chipselect[spi->chip_select];
 
-	if (gpio_is_valid(gpio)) {
-		gpio_direction_output(gpio,
-				      fsl_lpspi->config.mode & SPI_CS_HIGH ? 0 : 1);
-	}
-
-	fsl_lpspi_chipselect(spi, LPSPI_CS_ACTIVE);
-
-	return 0;
-}
-
-static int
-fsl_lpspi_unprepare_message(struct spi_controller *controller, struct spi_message *msg)
-{
-	struct spi_device *spi = msg->spi;
-
-	fsl_lpspi_chipselect(spi, LPSPI_CS_INACTIVE);
+	if (gpio_is_valid(gpio))
+		gpio_direction_output(gpio, spi->mode & SPI_CS_HIGH ? 0 : 1);
 
 	return 0;
 }
@@ -259,8 +228,7 @@ static void fsl_lpspi_read_rx_fifo(struct fsl_lpspi_data *fsl_lpspi)
 		fsl_lpspi->rx(fsl_lpspi);
 }
 
-static void fsl_lpspi_set_cmd(struct fsl_lpspi_data *fsl_lpspi,
-			      bool is_first_xfer)
+static void fsl_lpspi_set_cmd(struct fsl_lpspi_data *fsl_lpspi)
 {
 	u32 temp = 0;
 
@@ -276,7 +244,7 @@ static void fsl_lpspi_set_cmd(struct fsl_lpspi_data *fsl_lpspi,
 		 * For subsequent transfer, set TCR_CONTC to keep SS asserted.
 		 */
 		temp |= TCR_CONT;
-		if (is_first_xfer)
+		if (fsl_lpspi->is_first_byte)
 			temp &= ~TCR_CONTC;
 		else
 			temp |= TCR_CONTC;
@@ -449,8 +417,7 @@ static int fsl_lpspi_reset(struct fsl_lpspi_data *fsl_lpspi)
 	return 0;
 }
 
-static int fsl_lpspi_transfer_one(struct spi_controller *controller,
-				  struct spi_device *spi,
+static int fsl_lpspi_pio_transfer(struct spi_controller *controller,
 				  struct spi_transfer *t)
 {
 	struct fsl_lpspi_data *fsl_lpspi =
@@ -475,40 +442,27 @@ static int fsl_lpspi_transfer_one(struct spi_controller *controller,
 	return 0;
 }
 
-static int fsl_lpspi_transfer_one_msg(struct spi_controller *controller,
-				      struct spi_message *msg)
+static int fsl_lpspi_transfer_one(struct spi_controller *controller,
+				  struct spi_device *spi,
+				  struct spi_transfer *t)
 {
 	struct fsl_lpspi_data *fsl_lpspi =
 				spi_controller_get_devdata(controller);
-	struct spi_device *spi = msg->spi;
-	struct spi_transfer *xfer;
-	bool is_first_xfer = true;
-	int ret = 0;
-
-	msg->status = 0;
-	msg->actual_length = 0;
-
-	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
-		ret = fsl_lpspi_setup_transfer(spi, xfer);
-		if (ret < 0)
-			goto complete;
-
-		fsl_lpspi_set_cmd(fsl_lpspi, is_first_xfer);
-
-		is_first_xfer = false;
+	int ret;
 
-		ret = fsl_lpspi_transfer_one(controller, spi, xfer);
-		if (ret < 0)
-			goto complete;
+	fsl_lpspi->is_first_byte = true;
+	ret = fsl_lpspi_setup_transfer(spi, t);
+	if (ret < 0)
+		return ret;
 
-		msg->actual_length += xfer->len;
-	}
+	fsl_lpspi_set_cmd(fsl_lpspi);
+	fsl_lpspi->is_first_byte = false;
 
-complete:
-	msg->status = ret;
-	spi_finalize_current_message(controller);
+	ret = fsl_lpspi_pio_transfer(controller, t);
+	if (ret < 0)
+		return ret;
 
-	return ret;
+	return 0;
 }
 
 static irqreturn_t fsl_lpspi_isr(int irq, void *dev_id)
@@ -632,12 +586,11 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
 				goto out_controller_put;
 			}
 		}
-
+		controller->cs_gpios = fsl_lpspi->chipselect;
 		controller->prepare_message = fsl_lpspi_prepare_message;
-		controller->unprepare_message = fsl_lpspi_unprepare_message;
 	}
 
-	controller->transfer_one_message = fsl_lpspi_transfer_one_msg;
+	controller->transfer_one = fsl_lpspi_transfer_one;
 	controller->prepare_transfer_hardware = lpspi_prepare_xfer_hardware;
 	controller->unprepare_transfer_hardware = lpspi_unprepare_xfer_hardware;
 	controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
-- 
GitLab