]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/spi/spi-s3c64xx.c
Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb...
[karo-tx-linux.git] / drivers / spi / spi-s3c64xx.c
index 8f492ed317cc3ca8ac2b6298686c7c2f5e341b54..e862ab8853aa1f9ff242cdde3bf741dc2a257dd2 100644 (file)
@@ -134,7 +134,6 @@ struct s3c64xx_spi_dma_data {
        unsigned                ch;
        enum dma_transfer_direction direction;
        enum dma_ch     dmach;
-       struct property         *dma_prop;
 };
 
 /**
@@ -319,16 +318,15 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma,
 static int acquire_dma(struct s3c64xx_spi_driver_data *sdd)
 {
        struct samsung_dma_req req;
+       struct device *dev = &sdd->pdev->dev;
 
        sdd->ops = samsung_dma_get_ops();
 
        req.cap = DMA_SLAVE;
        req.client = &s3c64xx_spi_dma_client;
 
-       req.dt_dmach_prop = sdd->rx_dma.dma_prop;
-       sdd->rx_dma.ch = sdd->ops->request(sdd->rx_dma.dmach, &req);
-       req.dt_dmach_prop = sdd->tx_dma.dma_prop;
-       sdd->tx_dma.ch = sdd->ops->request(sdd->tx_dma.dmach, &req);
+       sdd->rx_dma.ch = sdd->ops->request(sdd->rx_dma.dmach, &req, dev, "rx");
+       sdd->tx_dma.ch = sdd->ops->request(sdd->tx_dma.dmach, &req, dev, "tx");
 
        return 1;
 }
@@ -1053,49 +1051,6 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
        flush_fifo(sdd);
 }
 
-static int s3c64xx_spi_get_dmares(
-                       struct s3c64xx_spi_driver_data *sdd, bool tx)
-{
-       struct platform_device *pdev = sdd->pdev;
-       struct s3c64xx_spi_dma_data *dma_data;
-       struct property *prop;
-       struct resource *res;
-       char prop_name[15], *chan_str;
-
-       if (tx) {
-               dma_data = &sdd->tx_dma;
-               dma_data->direction = DMA_MEM_TO_DEV;
-               chan_str = "tx";
-       } else {
-               dma_data = &sdd->rx_dma;
-               dma_data->direction = DMA_DEV_TO_MEM;
-               chan_str = "rx";
-       }
-
-       if (!sdd->pdev->dev.of_node) {
-               res = platform_get_resource(pdev, IORESOURCE_DMA, tx ? 0 : 1);
-               if (!res) {
-                       dev_err(&pdev->dev, "Unable to get SPI-%s dma resource\n",
-                               chan_str);
-                       return -ENXIO;
-               }
-               dma_data->dmach = res->start;
-               return 0;
-       }
-
-       sprintf(prop_name, "%s-dma-channel", chan_str);
-       prop = of_find_property(pdev->dev.of_node, prop_name, NULL);
-       if (!prop) {
-               dev_err(&pdev->dev, "%s dma channel property not specified\n",
-                                       chan_str);
-               return -ENXIO;
-       }
-
-       dma_data->dmach = DMACH_DT_PROP;
-       dma_data->dma_prop = prop;
-       return 0;
-}
-
 #ifdef CONFIG_OF
 static int s3c64xx_spi_parse_dt_gpio(struct s3c64xx_spi_driver_data *sdd)
 {
@@ -1194,6 +1149,7 @@ static inline struct s3c64xx_spi_port_config *s3c64xx_spi_get_port_config(
 static int s3c64xx_spi_probe(struct platform_device *pdev)
 {
        struct resource *mem_res;
+       struct resource *res;
        struct s3c64xx_spi_driver_data *sdd;
        struct s3c64xx_spi_info *sci = pdev->dev.platform_data;
        struct spi_master *master;
@@ -1252,13 +1208,26 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
 
        sdd->cur_bpw = 8;
 
-       ret = s3c64xx_spi_get_dmares(sdd, true);
-       if (ret)
-               goto err0;
+       if (!sdd->pdev->dev.of_node) {
+               res = platform_get_resource(pdev, IORESOURCE_DMA,  0);
+               if (!res) {
+                       dev_err(&pdev->dev, "Unable to get SPI tx dma "
+                                       "resource\n");
+                       return -ENXIO;
+               }
+               sdd->tx_dma.dmach = res->start;
 
-       ret = s3c64xx_spi_get_dmares(sdd, false);
-       if (ret)
-               goto err0;
+               res = platform_get_resource(pdev, IORESOURCE_DMA,  1);
+               if (!res) {
+                       dev_err(&pdev->dev, "Unable to get SPI rx dma "
+                                       "resource\n");
+                       return -ENXIO;
+               }
+               sdd->rx_dma.dmach = res->start;
+       }
+
+       sdd->tx_dma.direction = DMA_MEM_TO_DEV;
+       sdd->rx_dma.direction = DMA_DEV_TO_MEM;
 
        master->dev.of_node = pdev->dev.of_node;
        master->bus_num = sdd->port_id;
@@ -1272,10 +1241,9 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
        /* the spi->mode bits understood by this driver: */
        master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
 
-       sdd->regs = devm_request_and_ioremap(&pdev->dev, mem_res);
-       if (sdd->regs == NULL) {
-               dev_err(&pdev->dev, "Unable to remap IO\n");
-               ret = -ENXIO;
+       sdd->regs = devm_ioremap_resource(&pdev->dev, mem_res);
+       if (IS_ERR(sdd->regs)) {
+               ret = PTR_ERR(sdd->regs);
                goto err0;
        }