mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 13:34:38 +08:00
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>
This commit is contained in:
parent
dc6df6e90d
commit
727f9c2dad
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user