Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: at91: enable probe deferring on dma channel request

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>

authored by

Ludovic Desroches and committed by
Wolfram Sang
727f9c2d dc6df6e9

+14 -11
+14 -11
drivers/i2c/busses/i2c-at91.c
··· 650 650 slave_config.dst_maxburst = 1; 651 651 slave_config.device_fc = false; 652 652 653 - dma->chan_tx = dma_request_slave_channel(dev->dev, "tx"); 654 - if (!dma->chan_tx) { 655 - dev_err(dev->dev, "can't get a DMA channel for tx\n"); 656 - ret = -EBUSY; 653 + dma->chan_tx = dma_request_slave_channel_reason(dev->dev, "tx"); 654 + if (IS_ERR(dma->chan_tx)) { 655 + ret = PTR_ERR(dma->chan_tx); 656 + dma->chan_tx = NULL; 657 657 goto error; 658 658 } 659 659 660 - dma->chan_rx = dma_request_slave_channel(dev->dev, "rx"); 661 - if (!dma->chan_rx) { 662 - dev_err(dev->dev, "can't get a DMA channel for rx\n"); 663 - ret = -EBUSY; 660 + dma->chan_rx = dma_request_slave_channel_reason(dev->dev, "rx"); 661 + if (IS_ERR(dma->chan_rx)) { 662 + ret = PTR_ERR(dma->chan_rx); 663 + dma->chan_rx = NULL; 664 664 goto error; 665 665 } 666 666 ··· 681 681 sg_init_table(&dma->sg, 1); 682 682 dma->buf_mapped = false; 683 683 dma->xfer_in_progress = false; 684 + dev->use_dma = true; 684 685 685 686 dev_info(dev->dev, "using %s (tx) and %s (rx) for DMA transfers\n", 686 687 dma_chan_name(dma->chan_tx), dma_chan_name(dma->chan_rx)); ··· 689 688 return ret; 690 689 691 690 error: 692 - dev_info(dev->dev, "can't use DMA\n"); 691 + if (ret != -EPROBE_DEFER) 692 + dev_info(dev->dev, "can't use DMA, error %d\n", ret); 693 693 if (dma->chan_rx) 694 694 dma_release_channel(dma->chan_rx); 695 695 if (dma->chan_tx) ··· 759 757 clk_prepare_enable(dev->clk); 760 758 761 759 if (dev->dev->of_node) { 762 - if (at91_twi_configure_dma(dev, phy_addr) == 0) 763 - dev->use_dma = true; 760 + rc = at91_twi_configure_dma(dev, phy_addr); 761 + if (rc == -EPROBE_DEFER) 762 + return rc; 764 763 } 765 764 766 765 rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",