spi/s3c64xx: Use prepare_message() and unprepare_message()
authorMark Brown <broonie@linaro.org>
Fri, 4 Oct 2013 23:42:58 +0000 (00:42 +0100)
committerMark Brown <broonie@linaro.org>
Fri, 11 Oct 2013 19:09:14 +0000 (20:09 +0100)
This is of very little value in itself but will be useful once the loop
iterating over the transfers is also factored out into the core.

Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/spi/spi-s3c64xx.c

index 512b889..27b744b 100644 (file)
@@ -862,16 +862,12 @@ static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd,
        }
 }
 
-static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
-                                           struct spi_message *msg)
+static int s3c64xx_spi_prepare_message(struct spi_master *master,
+                                      struct spi_message *msg)
 {
        struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
        struct spi_device *spi = msg->spi;
        struct s3c64xx_spi_csinfo *cs = spi->controller_data;
-       struct spi_transfer *xfer;
-       int status = 0, cs_toggle = 0;
-       u32 speed;
-       u8 bpw;
 
        /* If Master's(controller) state differs from that needed by Slave */
        if (sdd->cur_speed != spi->max_speed_hz
@@ -887,13 +883,25 @@ static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
        if (s3c64xx_spi_map_mssg(sdd, msg)) {
                dev_err(&spi->dev,
                        "Xfer: Unable to map message buffers!\n");
-               status = -ENOMEM;
-               goto out;
+               return -ENOMEM;
        }
 
        /* Configure feedback delay */
        writel(cs->fb_delay & 0x3, sdd->regs + S3C64XX_SPI_FB_CLK);
 
+       return 0;
+}
+
+static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
+                                           struct spi_message *msg)
+{
+       struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
+       struct spi_device *spi = msg->spi;
+       struct spi_transfer *xfer;
+       int status = 0, cs_toggle = 0;
+       u32 speed;
+       u8 bpw;
+
        list_for_each_entry(xfer, &msg->transfers, transfer_list) {
 
                unsigned long flags;
@@ -991,6 +999,16 @@ out:
        return 0;
 }
 
+static int s3c64xx_spi_unprepare_message(struct spi_master *master,
+                                           struct spi_message *msg)
+{
+       struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
+
+       s3c64xx_spi_unmap_mssg(sdd, msg);
+
+       return 0;
+}
+
 static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
                                struct spi_device *spi)
 {
@@ -1359,7 +1377,9 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
        master->setup = s3c64xx_spi_setup;
        master->cleanup = s3c64xx_spi_cleanup;
        master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer;
+       master->prepare_message = s3c64xx_spi_prepare_message;
        master->transfer_one_message = s3c64xx_spi_transfer_one_message;
+       master->unprepare_message = s3c64xx_spi_unprepare_message;
        master->unprepare_transfer_hardware = s3c64xx_spi_unprepare_transfer;
        master->num_chipselect = sci->num_cs;
        master->dma_alignment = 8;