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