diff options
| -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 | } |
