]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
spi: pxa2xx: Move SSP idle waiting to cs_deassert()
authorJarkko Nikula <jarkko.nikula@linux.intel.com>
Fri, 9 Feb 2018 14:31:07 +0000 (16:31 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 12 Feb 2018 09:31:40 +0000 (09:31 +0000)
Move SSP idle waiting before CS deassert from error and end of message
handling function giveback() to cs_deassert(). This ensures idle waiting
is done also if there is CS change between transfers.

Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-pxa2xx.c

index b0822d1dba298fced70045495f48f33d49db8ca3..31117f9985ea8e90dd653f81e24cf43f4926623e 100644 (file)
@@ -415,10 +415,17 @@ static void cs_deassert(struct driver_data *drv_data)
 {
        struct chip_data *chip =
                spi_get_ctldata(drv_data->master->cur_msg->spi);
+       unsigned long timeout;
 
        if (drv_data->ssp_type == CE4100_SSP)
                return;
 
+       /* Wait until SSP becomes idle before deasserting the CS */
+       timeout = jiffies + msecs_to_jiffies(10);
+       while (pxa2xx_spi_read(drv_data, SSSR) & SSSR_BSY &&
+              !time_after(jiffies, timeout))
+               cpu_relax();
+
        if (chip->cs_control) {
                chip->cs_control(PXA2XX_CS_DEASSERT);
                return;
@@ -563,7 +570,6 @@ static void giveback(struct driver_data *drv_data)
 {
        struct spi_transfer* last_transfer;
        struct spi_message *msg;
-       unsigned long timeout;
 
        msg = drv_data->master->cur_msg;
        drv_data->cur_transfer = NULL;
@@ -575,12 +581,6 @@ static void giveback(struct driver_data *drv_data)
        if (last_transfer->delay_usecs)
                udelay(last_transfer->delay_usecs);
 
-       /* Wait until SSP becomes idle before deasserting the CS */
-       timeout = jiffies + msecs_to_jiffies(10);
-       while (pxa2xx_spi_read(drv_data, SSSR) & SSSR_BSY &&
-              !time_after(jiffies, timeout))
-               cpu_relax();
-
        /* Drop chip select UNLESS cs_change is true or we are returning
         * a message with an error, or next message is for another chip
         */