diff options
Diffstat (limited to 'drivers/dma/imx-dma.c')
-rw-r--r-- | drivers/dma/imx-dma.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c index fcfeb3cd8d31..5084975d793c 100644 --- a/drivers/dma/imx-dma.c +++ b/drivers/dma/imx-dma.c | |||
@@ -172,7 +172,8 @@ struct imxdma_engine { | |||
172 | struct device_dma_parameters dma_parms; | 172 | struct device_dma_parameters dma_parms; |
173 | struct dma_device dma_device; | 173 | struct dma_device dma_device; |
174 | void __iomem *base; | 174 | void __iomem *base; |
175 | struct clk *dma_clk; | 175 | struct clk *dma_ahb; |
176 | struct clk *dma_ipg; | ||
176 | spinlock_t lock; | 177 | spinlock_t lock; |
177 | struct imx_dma_2d_config slots_2d[IMX_DMA_2D_SLOTS]; | 178 | struct imx_dma_2d_config slots_2d[IMX_DMA_2D_SLOTS]; |
178 | struct imxdma_channel channel[IMX_DMA_CHANNELS]; | 179 | struct imxdma_channel channel[IMX_DMA_CHANNELS]; |
@@ -976,10 +977,20 @@ static int __init imxdma_probe(struct platform_device *pdev) | |||
976 | return 0; | 977 | return 0; |
977 | } | 978 | } |
978 | 979 | ||
979 | imxdma->dma_clk = clk_get(NULL, "dma"); | 980 | imxdma->dma_ipg = devm_clk_get(&pdev->dev, "ipg"); |
980 | if (IS_ERR(imxdma->dma_clk)) | 981 | if (IS_ERR(imxdma->dma_ipg)) { |
981 | return PTR_ERR(imxdma->dma_clk); | 982 | ret = PTR_ERR(imxdma->dma_ipg); |
982 | clk_enable(imxdma->dma_clk); | 983 | goto err_clk; |
984 | } | ||
985 | |||
986 | imxdma->dma_ahb = devm_clk_get(&pdev->dev, "ahb"); | ||
987 | if (IS_ERR(imxdma->dma_ahb)) { | ||
988 | ret = PTR_ERR(imxdma->dma_ahb); | ||
989 | goto err_clk; | ||
990 | } | ||
991 | |||
992 | clk_prepare_enable(imxdma->dma_ipg); | ||
993 | clk_prepare_enable(imxdma->dma_ahb); | ||
983 | 994 | ||
984 | /* reset DMA module */ | 995 | /* reset DMA module */ |
985 | imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR); | 996 | imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR); |
@@ -988,16 +999,14 @@ static int __init imxdma_probe(struct platform_device *pdev) | |||
988 | ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", imxdma); | 999 | ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", imxdma); |
989 | if (ret) { | 1000 | if (ret) { |
990 | dev_warn(imxdma->dev, "Can't register IRQ for DMA\n"); | 1001 | dev_warn(imxdma->dev, "Can't register IRQ for DMA\n"); |
991 | kfree(imxdma); | 1002 | goto err_enable; |
992 | return ret; | ||
993 | } | 1003 | } |
994 | 1004 | ||
995 | ret = request_irq(MX1_DMA_ERR, imxdma_err_handler, 0, "DMA", imxdma); | 1005 | ret = request_irq(MX1_DMA_ERR, imxdma_err_handler, 0, "DMA", imxdma); |
996 | if (ret) { | 1006 | if (ret) { |
997 | dev_warn(imxdma->dev, "Can't register ERRIRQ for DMA\n"); | 1007 | dev_warn(imxdma->dev, "Can't register ERRIRQ for DMA\n"); |
998 | free_irq(MX1_DMA_INT, NULL); | 1008 | free_irq(MX1_DMA_INT, NULL); |
999 | kfree(imxdma); | 1009 | goto err_enable; |
1000 | return ret; | ||
1001 | } | 1010 | } |
1002 | } | 1011 | } |
1003 | 1012 | ||
@@ -1094,7 +1103,10 @@ err_init: | |||
1094 | free_irq(MX1_DMA_INT, NULL); | 1103 | free_irq(MX1_DMA_INT, NULL); |
1095 | free_irq(MX1_DMA_ERR, NULL); | 1104 | free_irq(MX1_DMA_ERR, NULL); |
1096 | } | 1105 | } |
1097 | 1106 | err_enable: | |
1107 | clk_disable_unprepare(imxdma->dma_ipg); | ||
1108 | clk_disable_unprepare(imxdma->dma_ahb); | ||
1109 | err_clk: | ||
1098 | kfree(imxdma); | 1110 | kfree(imxdma); |
1099 | return ret; | 1111 | return ret; |
1100 | } | 1112 | } |
@@ -1114,7 +1126,9 @@ static int __exit imxdma_remove(struct platform_device *pdev) | |||
1114 | free_irq(MX1_DMA_ERR, NULL); | 1126 | free_irq(MX1_DMA_ERR, NULL); |
1115 | } | 1127 | } |
1116 | 1128 | ||
1117 | kfree(imxdma); | 1129 | clk_disable_unprepare(imxdma->dma_ipg); |
1130 | clk_disable_unprepare(imxdma->dma_ahb); | ||
1131 | kfree(imxdma); | ||
1118 | 1132 | ||
1119 | return 0; | 1133 | return 0; |
1120 | } | 1134 | } |