spi/s3c64xx: Add the use of DMA config operation
authorBoojin Kim <boojin.kim@samsung.com>
Tue, 19 Jun 2012 04:27:03 +0000 (13:27 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Tue, 19 Jun 2012 23:08:35 +0000 (08:08 +0900)
Config operation is separated from request operation in
DMA common operation. Because spi driver can change the
DMA config for every transfer. So this patch is using the
separated DMA config operation.

Signed-off-by: Boojin Kim <boojin.kim@samsung.com>
Signed-off-by: Kyoungil Kim <ki0351.kim@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
drivers/spi/spi-s3c64xx.c

index 972a94c58be3be01315af2f40aad90a067d4643d..3c36cfaa1b9309aa5e3eff32d9b613b6e6cda4fd 100644 (file)
@@ -262,14 +262,24 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma,
                                        unsigned len, dma_addr_t buf)
 {
        struct s3c64xx_spi_driver_data *sdd;
-       struct samsung_dma_prep_info info;
+       struct samsung_dma_prep info;
+       struct samsung_dma_config config;
 
-       if (dma->direction == DMA_DEV_TO_MEM)
+       if (dma->direction == DMA_DEV_TO_MEM) {
                sdd = container_of((void *)dma,
                        struct s3c64xx_spi_driver_data, rx_dma);
-       else
+               config.direction = sdd->rx_dma.direction;
+               config.fifo = sdd->sfr_start + S3C64XX_SPI_RX_DATA;
+               config.width = sdd->cur_bpw / 8;
+               sdd->ops->config(sdd->rx_dma.ch, &config);
+       } else {
                sdd = container_of((void *)dma,
                        struct s3c64xx_spi_driver_data, tx_dma);
+               config.direction =  sdd->tx_dma.direction;
+               config.fifo = sdd->sfr_start + S3C64XX_SPI_TX_DATA;
+               config.width = sdd->cur_bpw / 8;
+               sdd->ops->config(sdd->tx_dma.ch, &config);
+       }
 
        info.cap = DMA_SLAVE;
        info.len = len;
@@ -284,20 +294,15 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma,
 
 static int acquire_dma(struct s3c64xx_spi_driver_data *sdd)
 {
-       struct samsung_dma_info info;
+       struct samsung_dma_req req;
 
        sdd->ops = samsung_dma_get_ops();
 
-       info.cap = DMA_SLAVE;
-       info.client = &s3c64xx_spi_dma_client;
-       info.width = sdd->cur_bpw / 8;
-
-       info.direction = sdd->rx_dma.direction;
-       info.fifo = sdd->sfr_start + S3C64XX_SPI_RX_DATA;
-       sdd->rx_dma.ch = sdd->ops->request(sdd->rx_dma.dmach, &info);
-       info.direction =  sdd->tx_dma.direction;
-       info.fifo = sdd->sfr_start + S3C64XX_SPI_TX_DATA;
-       sdd->tx_dma.ch = sdd->ops->request(sdd->tx_dma.dmach, &info);
+       req.cap = DMA_SLAVE;
+       req.client = &s3c64xx_spi_dma_client;
+
+       sdd->rx_dma.ch = sdd->ops->request(sdd->rx_dma.dmach, &req);
+       sdd->tx_dma.ch = sdd->ops->request(sdd->tx_dma.dmach, &req);
 
        return 1;
 }