diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2015-07-29 20:03:49 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2015-08-20 01:22:12 -0400 |
commit | b93edcdd037f713e9b62cc76fb2064282af01aec (patch) | |
tree | c8ea5015389652097cb056e8634a40f520b0a688 /drivers/dma | |
parent | b096c1377d1e50cea91d1db13bca8e7802199a67 (diff) |
dmaengine: imx-sdma: Check for clk_enable() errors
clk_enable() may fail, so we should better check the return value and
propagate it in the case of error.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r-- | drivers/dma/imx-sdma.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index acf1e2f0c23c..9d375bc7590a 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
@@ -1093,16 +1093,20 @@ static int sdma_alloc_chan_resources(struct dma_chan *chan) | |||
1093 | sdmac->event_id0 = data->dma_request; | 1093 | sdmac->event_id0 = data->dma_request; |
1094 | sdmac->event_id1 = data->dma_request2; | 1094 | sdmac->event_id1 = data->dma_request2; |
1095 | 1095 | ||
1096 | clk_enable(sdmac->sdma->clk_ipg); | 1096 | ret = clk_enable(sdmac->sdma->clk_ipg); |
1097 | clk_enable(sdmac->sdma->clk_ahb); | 1097 | if (ret) |
1098 | return ret; | ||
1099 | ret = clk_enable(sdmac->sdma->clk_ahb); | ||
1100 | if (ret) | ||
1101 | goto disable_clk_ipg; | ||
1098 | 1102 | ||
1099 | ret = sdma_request_channel(sdmac); | 1103 | ret = sdma_request_channel(sdmac); |
1100 | if (ret) | 1104 | if (ret) |
1101 | return ret; | 1105 | goto disable_clk_ahb; |
1102 | 1106 | ||
1103 | ret = sdma_set_channel_priority(sdmac, prio); | 1107 | ret = sdma_set_channel_priority(sdmac, prio); |
1104 | if (ret) | 1108 | if (ret) |
1105 | return ret; | 1109 | goto disable_clk_ahb; |
1106 | 1110 | ||
1107 | dma_async_tx_descriptor_init(&sdmac->desc, chan); | 1111 | dma_async_tx_descriptor_init(&sdmac->desc, chan); |
1108 | sdmac->desc.tx_submit = sdma_tx_submit; | 1112 | sdmac->desc.tx_submit = sdma_tx_submit; |
@@ -1110,6 +1114,12 @@ static int sdma_alloc_chan_resources(struct dma_chan *chan) | |||
1110 | sdmac->desc.flags = DMA_CTRL_ACK; | 1114 | sdmac->desc.flags = DMA_CTRL_ACK; |
1111 | 1115 | ||
1112 | return 0; | 1116 | return 0; |
1117 | |||
1118 | disable_clk_ahb: | ||
1119 | clk_disable(sdmac->sdma->clk_ahb); | ||
1120 | disable_clk_ipg: | ||
1121 | clk_disable(sdmac->sdma->clk_ipg); | ||
1122 | return ret; | ||
1113 | } | 1123 | } |
1114 | 1124 | ||
1115 | static void sdma_free_chan_resources(struct dma_chan *chan) | 1125 | static void sdma_free_chan_resources(struct dma_chan *chan) |
@@ -1533,8 +1543,12 @@ static int sdma_init(struct sdma_engine *sdma) | |||
1533 | int i, ret; | 1543 | int i, ret; |
1534 | dma_addr_t ccb_phys; | 1544 | dma_addr_t ccb_phys; |
1535 | 1545 | ||
1536 | clk_enable(sdma->clk_ipg); | 1546 | ret = clk_enable(sdma->clk_ipg); |
1537 | clk_enable(sdma->clk_ahb); | 1547 | if (ret) |
1548 | return ret; | ||
1549 | ret = clk_enable(sdma->clk_ahb); | ||
1550 | if (ret) | ||
1551 | goto disable_clk_ipg; | ||
1538 | 1552 | ||
1539 | /* Be sure SDMA has not started yet */ | 1553 | /* Be sure SDMA has not started yet */ |
1540 | writel_relaxed(0, sdma->regs + SDMA_H_C0PTR); | 1554 | writel_relaxed(0, sdma->regs + SDMA_H_C0PTR); |
@@ -1590,8 +1604,9 @@ static int sdma_init(struct sdma_engine *sdma) | |||
1590 | return 0; | 1604 | return 0; |
1591 | 1605 | ||
1592 | err_dma_alloc: | 1606 | err_dma_alloc: |
1593 | clk_disable(sdma->clk_ipg); | ||
1594 | clk_disable(sdma->clk_ahb); | 1607 | clk_disable(sdma->clk_ahb); |
1608 | disable_clk_ipg: | ||
1609 | clk_disable(sdma->clk_ipg); | ||
1595 | dev_err(sdma->dev, "initialisation failed with %d\n", ret); | 1610 | dev_err(sdma->dev, "initialisation failed with %d\n", ret); |
1596 | return ret; | 1611 | return ret; |
1597 | } | 1612 | } |