]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
i2c: at91: enable probe deferring on dma channel request
authorLudovic Desroches <ludovic.desroches@atmel.com>
Fri, 21 Nov 2014 13:44:32 +0000 (14:44 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Sun, 23 Nov 2014 16:27:29 +0000 (17:27 +0100)
If dma controller is not probed, defer i2c probe.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-at91.c

index 8790f2332458cce5c551c561abf4300e46a43cea..87e2f142ae6caadaa8f6a004642811d84a76ffff 100644 (file)
@@ -650,17 +650,17 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr)
        slave_config.dst_maxburst = 1;
        slave_config.device_fc = false;
 
-       dma->chan_tx = dma_request_slave_channel(dev->dev, "tx");
-       if (!dma->chan_tx) {
-               dev_err(dev->dev, "can't get a DMA channel for tx\n");
-               ret = -EBUSY;
+       dma->chan_tx = dma_request_slave_channel_reason(dev->dev, "tx");
+       if (IS_ERR(dma->chan_tx)) {
+               ret = PTR_ERR(dma->chan_tx);
+               dma->chan_tx = NULL;
                goto error;
        }
 
-       dma->chan_rx = dma_request_slave_channel(dev->dev, "rx");
-       if (!dma->chan_rx) {
-               dev_err(dev->dev, "can't get a DMA channel for rx\n");
-               ret = -EBUSY;
+       dma->chan_rx = dma_request_slave_channel_reason(dev->dev, "rx");
+       if (IS_ERR(dma->chan_rx)) {
+               ret = PTR_ERR(dma->chan_rx);
+               dma->chan_rx = NULL;
                goto error;
        }
 
@@ -681,6 +681,7 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr)
        sg_init_table(&dma->sg, 1);
        dma->buf_mapped = false;
        dma->xfer_in_progress = false;
+       dev->use_dma = true;
 
        dev_info(dev->dev, "using %s (tx) and %s (rx) for DMA transfers\n",
                 dma_chan_name(dma->chan_tx), dma_chan_name(dma->chan_rx));
@@ -688,7 +689,8 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr)
        return ret;
 
 error:
-       dev_info(dev->dev, "can't use DMA\n");
+       if (ret != -EPROBE_DEFER)
+               dev_info(dev->dev, "can't use DMA, error %d\n", ret);
        if (dma->chan_rx)
                dma_release_channel(dma->chan_rx);
        if (dma->chan_tx)
@@ -757,8 +759,9 @@ static int at91_twi_probe(struct platform_device *pdev)
        clk_prepare_enable(dev->clk);
 
        if (dev->dev->of_node) {
-               if (at91_twi_configure_dma(dev, phy_addr) == 0)
-                       dev->use_dma = true;
+               rc = at91_twi_configure_dma(dev, phy_addr);
+               if (rc == -EPROBE_DEFER)
+                       return rc;
        }
 
        rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",