diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2013-01-09 03:17:11 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2013-01-09 09:30:59 -0500 |
commit | cbd65312ba6b508e994d40729e84a51301870bcc (patch) | |
tree | c41f95b7232b93b70df91d96e81c8ed5c85f242b /drivers/dma/dw_dmac.c | |
parent | 123de543414bce42da9729071962d4a9512612c8 (diff) |
dw_dmac: check for mapping errors
Otherwise we get a warning in case of CONFIG_DMA_API_DEBUG=y
[ 45.775943] WARNING: at lib/dma-debug.c:933 check_unmap+0x5d6/0x6ac()
[ 45.782369] dw_dmac dw_dmac.0: DMA-API: device driver failed to check map error[device address=0x00000000356efcc0] [size=28 bytes] [mapped as single]
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/dw_dmac.c')
-rw-r--r-- | drivers/dma/dw_dmac.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index c0c9370ddd3f..dd7a8192d5a0 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
@@ -1087,6 +1087,7 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan) | |||
1087 | struct dw_desc *desc; | 1087 | struct dw_desc *desc; |
1088 | int i; | 1088 | int i; |
1089 | unsigned long flags; | 1089 | unsigned long flags; |
1090 | int ret; | ||
1090 | 1091 | ||
1091 | dev_vdbg(chan2dev(chan), "%s\n", __func__); | 1092 | dev_vdbg(chan2dev(chan), "%s\n", __func__); |
1092 | 1093 | ||
@@ -1110,12 +1111,8 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan) | |||
1110 | spin_unlock_irqrestore(&dwc->lock, flags); | 1111 | spin_unlock_irqrestore(&dwc->lock, flags); |
1111 | 1112 | ||
1112 | desc = kzalloc(sizeof(struct dw_desc), GFP_KERNEL); | 1113 | desc = kzalloc(sizeof(struct dw_desc), GFP_KERNEL); |
1113 | if (!desc) { | 1114 | if (!desc) |
1114 | dev_info(chan2dev(chan), | 1115 | goto err_desc_alloc; |
1115 | "only allocated %d descriptors\n", i); | ||
1116 | spin_lock_irqsave(&dwc->lock, flags); | ||
1117 | break; | ||
1118 | } | ||
1119 | 1116 | ||
1120 | INIT_LIST_HEAD(&desc->tx_list); | 1117 | INIT_LIST_HEAD(&desc->tx_list); |
1121 | dma_async_tx_descriptor_init(&desc->txd, chan); | 1118 | dma_async_tx_descriptor_init(&desc->txd, chan); |
@@ -1123,6 +1120,10 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan) | |||
1123 | desc->txd.flags = DMA_CTRL_ACK; | 1120 | desc->txd.flags = DMA_CTRL_ACK; |
1124 | desc->txd.phys = dma_map_single(chan2parent(chan), &desc->lli, | 1121 | desc->txd.phys = dma_map_single(chan2parent(chan), &desc->lli, |
1125 | sizeof(desc->lli), DMA_TO_DEVICE); | 1122 | sizeof(desc->lli), DMA_TO_DEVICE); |
1123 | ret = dma_mapping_error(chan2parent(chan), desc->txd.phys); | ||
1124 | if (ret) | ||
1125 | goto err_desc_alloc; | ||
1126 | |||
1126 | dwc_desc_put(dwc, desc); | 1127 | dwc_desc_put(dwc, desc); |
1127 | 1128 | ||
1128 | spin_lock_irqsave(&dwc->lock, flags); | 1129 | spin_lock_irqsave(&dwc->lock, flags); |
@@ -1134,6 +1135,13 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan) | |||
1134 | dev_dbg(chan2dev(chan), "%s: allocated %d descriptors\n", __func__, i); | 1135 | dev_dbg(chan2dev(chan), "%s: allocated %d descriptors\n", __func__, i); |
1135 | 1136 | ||
1136 | return i; | 1137 | return i; |
1138 | |||
1139 | err_desc_alloc: | ||
1140 | kfree(desc); | ||
1141 | |||
1142 | dev_info(chan2dev(chan), "only allocated %d descriptors\n", i); | ||
1143 | |||
1144 | return i; | ||
1137 | } | 1145 | } |
1138 | 1146 | ||
1139 | static void dwc_free_chan_resources(struct dma_chan *chan) | 1147 | static void dwc_free_chan_resources(struct dma_chan *chan) |