diff options
| -rw-r--r-- | drivers/dma/amba-pl08x.c | 14 | ||||
| -rw-r--r-- | drivers/dma/at_hdmac.c | 184 | ||||
| -rw-r--r-- | drivers/dma/at_hdmac_regs.h | 7 | ||||
| -rw-r--r-- | drivers/dma/dw/platform.c | 5 | ||||
| -rw-r--r-- | drivers/dma/imx-sdma.c | 7 |
5 files changed, 137 insertions, 80 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c index 4a5fd245014e..83aa55d6fa5d 100644 --- a/drivers/dma/amba-pl08x.c +++ b/drivers/dma/amba-pl08x.c | |||
| @@ -97,6 +97,12 @@ | |||
| 97 | 97 | ||
| 98 | #define DRIVER_NAME "pl08xdmac" | 98 | #define DRIVER_NAME "pl08xdmac" |
| 99 | 99 | ||
| 100 | #define PL80X_DMA_BUSWIDTHS \ | ||
| 101 | BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) | \ | ||
| 102 | BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \ | ||
| 103 | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \ | ||
| 104 | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | ||
| 105 | |||
| 100 | static struct amba_driver pl08x_amba_driver; | 106 | static struct amba_driver pl08x_amba_driver; |
| 101 | struct pl08x_driver_data; | 107 | struct pl08x_driver_data; |
| 102 | 108 | ||
| @@ -2070,6 +2076,10 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 2070 | pl08x->memcpy.device_pause = pl08x_pause; | 2076 | pl08x->memcpy.device_pause = pl08x_pause; |
| 2071 | pl08x->memcpy.device_resume = pl08x_resume; | 2077 | pl08x->memcpy.device_resume = pl08x_resume; |
| 2072 | pl08x->memcpy.device_terminate_all = pl08x_terminate_all; | 2078 | pl08x->memcpy.device_terminate_all = pl08x_terminate_all; |
| 2079 | pl08x->memcpy.src_addr_widths = PL80X_DMA_BUSWIDTHS; | ||
| 2080 | pl08x->memcpy.dst_addr_widths = PL80X_DMA_BUSWIDTHS; | ||
| 2081 | pl08x->memcpy.directions = BIT(DMA_MEM_TO_MEM); | ||
| 2082 | pl08x->memcpy.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; | ||
| 2073 | 2083 | ||
| 2074 | /* Initialize slave engine */ | 2084 | /* Initialize slave engine */ |
| 2075 | dma_cap_set(DMA_SLAVE, pl08x->slave.cap_mask); | 2085 | dma_cap_set(DMA_SLAVE, pl08x->slave.cap_mask); |
| @@ -2086,6 +2096,10 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 2086 | pl08x->slave.device_pause = pl08x_pause; | 2096 | pl08x->slave.device_pause = pl08x_pause; |
| 2087 | pl08x->slave.device_resume = pl08x_resume; | 2097 | pl08x->slave.device_resume = pl08x_resume; |
| 2088 | pl08x->slave.device_terminate_all = pl08x_terminate_all; | 2098 | pl08x->slave.device_terminate_all = pl08x_terminate_all; |
| 2099 | pl08x->slave.src_addr_widths = PL80X_DMA_BUSWIDTHS; | ||
| 2100 | pl08x->slave.dst_addr_widths = PL80X_DMA_BUSWIDTHS; | ||
| 2101 | pl08x->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); | ||
| 2102 | pl08x->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; | ||
| 2089 | 2103 | ||
| 2090 | /* Get the platform data */ | 2104 | /* Get the platform data */ |
| 2091 | pl08x->pd = dev_get_platdata(&adev->dev); | 2105 | pl08x->pd = dev_get_platdata(&adev->dev); |
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 1e1a4c567542..0b4fc6fb48ce 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c | |||
| @@ -238,93 +238,126 @@ static void atc_dostart(struct at_dma_chan *atchan, struct at_desc *first) | |||
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | /* | 240 | /* |
| 241 | * atc_get_current_descriptors - | 241 | * atc_get_desc_by_cookie - get the descriptor of a cookie |
| 242 | * locate the descriptor which equal to physical address in DSCR | 242 | * @atchan: the DMA channel |
| 243 | * @atchan: the channel we want to start | 243 | * @cookie: the cookie to get the descriptor for |
| 244 | * @dscr_addr: physical descriptor address in DSCR | ||
| 245 | */ | 244 | */ |
| 246 | static struct at_desc *atc_get_current_descriptors(struct at_dma_chan *atchan, | 245 | static struct at_desc *atc_get_desc_by_cookie(struct at_dma_chan *atchan, |
| 247 | u32 dscr_addr) | 246 | dma_cookie_t cookie) |
| 248 | { | 247 | { |
| 249 | struct at_desc *desc, *_desc, *child, *desc_cur = NULL; | 248 | struct at_desc *desc, *_desc; |
| 250 | 249 | ||
| 251 | list_for_each_entry_safe(desc, _desc, &atchan->active_list, desc_node) { | 250 | list_for_each_entry_safe(desc, _desc, &atchan->queue, desc_node) { |
| 252 | if (desc->lli.dscr == dscr_addr) { | 251 | if (desc->txd.cookie == cookie) |
| 253 | desc_cur = desc; | 252 | return desc; |
| 254 | break; | 253 | } |
| 255 | } | ||
| 256 | 254 | ||
| 257 | list_for_each_entry(child, &desc->tx_list, desc_node) { | 255 | list_for_each_entry_safe(desc, _desc, &atchan->active_list, desc_node) { |
| 258 | if (child->lli.dscr == dscr_addr) { | 256 | if (desc->txd.cookie == cookie) |
| 259 | desc_cur = child; | 257 | return desc; |
| 260 | break; | ||
| 261 | } | ||
| 262 | } | ||
| 263 | } | 258 | } |
| 264 | 259 | ||
| 265 | return desc_cur; | 260 | return NULL; |
| 266 | } | 261 | } |
| 267 | 262 | ||
| 268 | /* | 263 | /** |
| 269 | * atc_get_bytes_left - | 264 | * atc_calc_bytes_left - calculates the number of bytes left according to the |
| 270 | * Get the number of bytes residue in dma buffer, | 265 | * value read from CTRLA. |
| 271 | * @chan: the channel we want to start | 266 | * |
| 267 | * @current_len: the number of bytes left before reading CTRLA | ||
| 268 | * @ctrla: the value of CTRLA | ||
| 269 | * @desc: the descriptor containing the transfer width | ||
| 270 | */ | ||
| 271 | static inline int atc_calc_bytes_left(int current_len, u32 ctrla, | ||
| 272 | struct at_desc *desc) | ||
| 273 | { | ||
| 274 | return current_len - ((ctrla & ATC_BTSIZE_MAX) << desc->tx_width); | ||
| 275 | } | ||
| 276 | |||
| 277 | /** | ||
| 278 | * atc_calc_bytes_left_from_reg - calculates the number of bytes left according | ||
| 279 | * to the current value of CTRLA. | ||
| 280 | * | ||
| 281 | * @current_len: the number of bytes left before reading CTRLA | ||
| 282 | * @atchan: the channel to read CTRLA for | ||
| 283 | * @desc: the descriptor containing the transfer width | ||
| 284 | */ | ||
| 285 | static inline int atc_calc_bytes_left_from_reg(int current_len, | ||
| 286 | struct at_dma_chan *atchan, struct at_desc *desc) | ||
| 287 | { | ||
| 288 | u32 ctrla = channel_readl(atchan, CTRLA); | ||
| 289 | |||
| 290 | return atc_calc_bytes_left(current_len, ctrla, desc); | ||
| 291 | } | ||
| 292 | |||
| 293 | /** | ||
| 294 | * atc_get_bytes_left - get the number of bytes residue for a cookie | ||
| 295 | * @chan: DMA channel | ||
| 296 | * @cookie: transaction identifier to check status of | ||
| 272 | */ | 297 | */ |
| 273 | static int atc_get_bytes_left(struct dma_chan *chan) | 298 | static int atc_get_bytes_left(struct dma_chan *chan, dma_cookie_t cookie) |
| 274 | { | 299 | { |
| 275 | struct at_dma_chan *atchan = to_at_dma_chan(chan); | 300 | struct at_dma_chan *atchan = to_at_dma_chan(chan); |
| 276 | struct at_dma *atdma = to_at_dma(chan->device); | ||
| 277 | int chan_id = atchan->chan_common.chan_id; | ||
| 278 | struct at_desc *desc_first = atc_first_active(atchan); | 301 | struct at_desc *desc_first = atc_first_active(atchan); |
| 279 | struct at_desc *desc_cur; | 302 | struct at_desc *desc; |
| 280 | int ret = 0, count = 0; | 303 | int ret; |
| 304 | u32 ctrla, dscr; | ||
| 281 | 305 | ||
| 282 | /* | 306 | /* |
| 283 | * Initialize necessary values in the first time. | 307 | * If the cookie doesn't match to the currently running transfer then |
| 284 | * remain_desc record remain desc length. | 308 | * we can return the total length of the associated DMA transfer, |
| 309 | * because it is still queued. | ||
| 285 | */ | 310 | */ |
| 286 | if (atchan->remain_desc == 0) | 311 | desc = atc_get_desc_by_cookie(atchan, cookie); |
| 287 | /* First descriptor embedds the transaction length */ | 312 | if (desc == NULL) |
| 288 | atchan->remain_desc = desc_first->len; | 313 | return -EINVAL; |
| 314 | else if (desc != desc_first) | ||
| 315 | return desc->total_len; | ||
| 289 | 316 | ||
| 290 | /* | 317 | /* cookie matches to the currently running transfer */ |
| 291 | * This happens when current descriptor transfer complete. | 318 | ret = desc_first->total_len; |
| 292 | * The residual buffer size should reduce current descriptor length. | ||
| 293 | */ | ||
| 294 | if (unlikely(test_bit(ATC_IS_BTC, &atchan->status))) { | ||
| 295 | clear_bit(ATC_IS_BTC, &atchan->status); | ||
| 296 | desc_cur = atc_get_current_descriptors(atchan, | ||
| 297 | channel_readl(atchan, DSCR)); | ||
| 298 | if (!desc_cur) { | ||
| 299 | ret = -EINVAL; | ||
| 300 | goto out; | ||
| 301 | } | ||
| 302 | 319 | ||
| 303 | count = (desc_cur->lli.ctrla & ATC_BTSIZE_MAX) | 320 | if (desc_first->lli.dscr) { |
| 304 | << desc_first->tx_width; | 321 | /* hardware linked list transfer */ |
| 305 | if (atchan->remain_desc < count) { | 322 | |
| 306 | ret = -EINVAL; | 323 | /* |
| 307 | goto out; | 324 | * Calculate the residue by removing the length of the child |
| 325 | * descriptors already transferred from the total length. | ||
| 326 | * To get the current child descriptor we can use the value of | ||
| 327 | * the channel's DSCR register and compare it against the value | ||
| 328 | * of the hardware linked list structure of each child | ||
| 329 | * descriptor. | ||
| 330 | */ | ||
| 331 | |||
| 332 | ctrla = channel_readl(atchan, CTRLA); | ||
| 333 | rmb(); /* ensure CTRLA is read before DSCR */ | ||
| 334 | dscr = channel_readl(atchan, DSCR); | ||
| 335 | |||
| 336 | /* for the first descriptor we can be more accurate */ | ||
| 337 | if (desc_first->lli.dscr == dscr) | ||
| 338 | return atc_calc_bytes_left(ret, ctrla, desc_first); | ||
| 339 | |||
| 340 | ret -= desc_first->len; | ||
| 341 | list_for_each_entry(desc, &desc_first->tx_list, desc_node) { | ||
| 342 | if (desc->lli.dscr == dscr) | ||
| 343 | break; | ||
| 344 | |||
| 345 | ret -= desc->len; | ||
| 308 | } | 346 | } |
| 309 | 347 | ||
| 310 | atchan->remain_desc -= count; | ||
| 311 | ret = atchan->remain_desc; | ||
| 312 | } else { | ||
| 313 | /* | 348 | /* |
| 314 | * Get residual bytes when current | 349 | * For the last descriptor in the chain we can calculate |
| 315 | * descriptor transfer in progress. | 350 | * the remaining bytes using the channel's register. |
| 351 | * Note that the transfer width of the first and last | ||
| 352 | * descriptor may differ. | ||
| 316 | */ | 353 | */ |
| 317 | count = (channel_readl(atchan, CTRLA) & ATC_BTSIZE_MAX) | 354 | if (!desc->lli.dscr) |
| 318 | << (desc_first->tx_width); | 355 | ret = atc_calc_bytes_left_from_reg(ret, atchan, desc); |
| 319 | ret = atchan->remain_desc - count; | 356 | } else { |
| 357 | /* single transfer */ | ||
| 358 | ret = atc_calc_bytes_left_from_reg(ret, atchan, desc_first); | ||
| 320 | } | 359 | } |
| 321 | /* | ||
| 322 | * Check fifo empty. | ||
| 323 | */ | ||
| 324 | if (!(dma_readl(atdma, CHSR) & AT_DMA_EMPT(chan_id))) | ||
| 325 | atc_issue_pending(chan); | ||
| 326 | 360 | ||
| 327 | out: | ||
| 328 | return ret; | 361 | return ret; |
| 329 | } | 362 | } |
| 330 | 363 | ||
| @@ -539,8 +572,6 @@ static irqreturn_t at_dma_interrupt(int irq, void *dev_id) | |||
| 539 | /* Give information to tasklet */ | 572 | /* Give information to tasklet */ |
| 540 | set_bit(ATC_IS_ERROR, &atchan->status); | 573 | set_bit(ATC_IS_ERROR, &atchan->status); |
| 541 | } | 574 | } |
| 542 | if (pending & AT_DMA_BTC(i)) | ||
| 543 | set_bit(ATC_IS_BTC, &atchan->status); | ||
| 544 | tasklet_schedule(&atchan->tasklet); | 575 | tasklet_schedule(&atchan->tasklet); |
| 545 | ret = IRQ_HANDLED; | 576 | ret = IRQ_HANDLED; |
| 546 | } | 577 | } |
| @@ -653,14 +684,18 @@ atc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, | |||
| 653 | desc->lli.ctrlb = ctrlb; | 684 | desc->lli.ctrlb = ctrlb; |
| 654 | 685 | ||
| 655 | desc->txd.cookie = 0; | 686 | desc->txd.cookie = 0; |
| 687 | desc->len = xfer_count << src_width; | ||
| 656 | 688 | ||
| 657 | atc_desc_chain(&first, &prev, desc); | 689 | atc_desc_chain(&first, &prev, desc); |
| 658 | } | 690 | } |
| 659 | 691 | ||
| 660 | /* First descriptor of the chain embedds additional information */ | 692 | /* First descriptor of the chain embedds additional information */ |
| 661 | first->txd.cookie = -EBUSY; | 693 | first->txd.cookie = -EBUSY; |
| 662 | first->len = len; | 694 | first->total_len = len; |
| 695 | |||
| 696 | /* set transfer width for the calculation of the residue */ | ||
| 663 | first->tx_width = src_width; | 697 | first->tx_width = src_width; |
| 698 | prev->tx_width = src_width; | ||
| 664 | 699 | ||
| 665 | /* set end-of-link to the last link descriptor of list*/ | 700 | /* set end-of-link to the last link descriptor of list*/ |
| 666 | set_desc_eol(desc); | 701 | set_desc_eol(desc); |
| @@ -752,6 +787,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 752 | | ATC_SRC_WIDTH(mem_width) | 787 | | ATC_SRC_WIDTH(mem_width) |
| 753 | | len >> mem_width; | 788 | | len >> mem_width; |
| 754 | desc->lli.ctrlb = ctrlb; | 789 | desc->lli.ctrlb = ctrlb; |
| 790 | desc->len = len; | ||
| 755 | 791 | ||
| 756 | atc_desc_chain(&first, &prev, desc); | 792 | atc_desc_chain(&first, &prev, desc); |
| 757 | total_len += len; | 793 | total_len += len; |
| @@ -792,6 +828,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 792 | | ATC_DST_WIDTH(mem_width) | 828 | | ATC_DST_WIDTH(mem_width) |
| 793 | | len >> reg_width; | 829 | | len >> reg_width; |
| 794 | desc->lli.ctrlb = ctrlb; | 830 | desc->lli.ctrlb = ctrlb; |
| 831 | desc->len = len; | ||
| 795 | 832 | ||
| 796 | atc_desc_chain(&first, &prev, desc); | 833 | atc_desc_chain(&first, &prev, desc); |
| 797 | total_len += len; | 834 | total_len += len; |
| @@ -806,8 +843,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 806 | 843 | ||
| 807 | /* First descriptor of the chain embedds additional information */ | 844 | /* First descriptor of the chain embedds additional information */ |
| 808 | first->txd.cookie = -EBUSY; | 845 | first->txd.cookie = -EBUSY; |
| 809 | first->len = total_len; | 846 | first->total_len = total_len; |
| 847 | |||
| 848 | /* set transfer width for the calculation of the residue */ | ||
| 810 | first->tx_width = reg_width; | 849 | first->tx_width = reg_width; |
| 850 | prev->tx_width = reg_width; | ||
| 811 | 851 | ||
| 812 | /* first link descriptor of list is responsible of flags */ | 852 | /* first link descriptor of list is responsible of flags */ |
| 813 | first->txd.flags = flags; /* client is in control of this ack */ | 853 | first->txd.flags = flags; /* client is in control of this ack */ |
| @@ -872,6 +912,7 @@ atc_dma_cyclic_fill_desc(struct dma_chan *chan, struct at_desc *desc, | |||
| 872 | | ATC_FC_MEM2PER | 912 | | ATC_FC_MEM2PER |
| 873 | | ATC_SIF(atchan->mem_if) | 913 | | ATC_SIF(atchan->mem_if) |
| 874 | | ATC_DIF(atchan->per_if); | 914 | | ATC_DIF(atchan->per_if); |
| 915 | desc->len = period_len; | ||
| 875 | break; | 916 | break; |
| 876 | 917 | ||
| 877 | case DMA_DEV_TO_MEM: | 918 | case DMA_DEV_TO_MEM: |
| @@ -883,6 +924,7 @@ atc_dma_cyclic_fill_desc(struct dma_chan *chan, struct at_desc *desc, | |||
| 883 | | ATC_FC_PER2MEM | 924 | | ATC_FC_PER2MEM |
| 884 | | ATC_SIF(atchan->per_if) | 925 | | ATC_SIF(atchan->per_if) |
| 885 | | ATC_DIF(atchan->mem_if); | 926 | | ATC_DIF(atchan->mem_if); |
| 927 | desc->len = period_len; | ||
| 886 | break; | 928 | break; |
| 887 | 929 | ||
| 888 | default: | 930 | default: |
| @@ -964,7 +1006,7 @@ atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, | |||
| 964 | 1006 | ||
| 965 | /* First descriptor of the chain embedds additional information */ | 1007 | /* First descriptor of the chain embedds additional information */ |
| 966 | first->txd.cookie = -EBUSY; | 1008 | first->txd.cookie = -EBUSY; |
| 967 | first->len = buf_len; | 1009 | first->total_len = buf_len; |
| 968 | first->tx_width = reg_width; | 1010 | first->tx_width = reg_width; |
| 969 | 1011 | ||
| 970 | return &first->txd; | 1012 | return &first->txd; |
| @@ -1118,7 +1160,7 @@ atc_tx_status(struct dma_chan *chan, | |||
| 1118 | spin_lock_irqsave(&atchan->lock, flags); | 1160 | spin_lock_irqsave(&atchan->lock, flags); |
| 1119 | 1161 | ||
| 1120 | /* Get number of bytes left in the active transactions */ | 1162 | /* Get number of bytes left in the active transactions */ |
| 1121 | bytes = atc_get_bytes_left(chan); | 1163 | bytes = atc_get_bytes_left(chan, cookie); |
| 1122 | 1164 | ||
| 1123 | spin_unlock_irqrestore(&atchan->lock, flags); | 1165 | spin_unlock_irqrestore(&atchan->lock, flags); |
| 1124 | 1166 | ||
| @@ -1214,7 +1256,6 @@ static int atc_alloc_chan_resources(struct dma_chan *chan) | |||
| 1214 | 1256 | ||
| 1215 | spin_lock_irqsave(&atchan->lock, flags); | 1257 | spin_lock_irqsave(&atchan->lock, flags); |
| 1216 | atchan->descs_allocated = i; | 1258 | atchan->descs_allocated = i; |
| 1217 | atchan->remain_desc = 0; | ||
| 1218 | list_splice(&tmp_list, &atchan->free_list); | 1259 | list_splice(&tmp_list, &atchan->free_list); |
| 1219 | dma_cookie_init(chan); | 1260 | dma_cookie_init(chan); |
| 1220 | spin_unlock_irqrestore(&atchan->lock, flags); | 1261 | spin_unlock_irqrestore(&atchan->lock, flags); |
| @@ -1257,7 +1298,6 @@ static void atc_free_chan_resources(struct dma_chan *chan) | |||
| 1257 | list_splice_init(&atchan->free_list, &list); | 1298 | list_splice_init(&atchan->free_list, &list); |
| 1258 | atchan->descs_allocated = 0; | 1299 | atchan->descs_allocated = 0; |
| 1259 | atchan->status = 0; | 1300 | atchan->status = 0; |
| 1260 | atchan->remain_desc = 0; | ||
| 1261 | 1301 | ||
| 1262 | dev_vdbg(chan2dev(chan), "free_chan_resources: done\n"); | 1302 | dev_vdbg(chan2dev(chan), "free_chan_resources: done\n"); |
| 1263 | } | 1303 | } |
diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h index d6bba6c636c2..2727ca560572 100644 --- a/drivers/dma/at_hdmac_regs.h +++ b/drivers/dma/at_hdmac_regs.h | |||
| @@ -181,8 +181,9 @@ struct at_lli { | |||
| 181 | * @at_lli: hardware lli structure | 181 | * @at_lli: hardware lli structure |
| 182 | * @txd: support for the async_tx api | 182 | * @txd: support for the async_tx api |
| 183 | * @desc_node: node on the channed descriptors list | 183 | * @desc_node: node on the channed descriptors list |
| 184 | * @len: total transaction bytecount | 184 | * @len: descriptor byte count |
| 185 | * @tx_width: transfer width | 185 | * @tx_width: transfer width |
| 186 | * @total_len: total transaction byte count | ||
| 186 | */ | 187 | */ |
| 187 | struct at_desc { | 188 | struct at_desc { |
| 188 | /* FIRST values the hardware uses */ | 189 | /* FIRST values the hardware uses */ |
| @@ -194,6 +195,7 @@ struct at_desc { | |||
| 194 | struct list_head desc_node; | 195 | struct list_head desc_node; |
| 195 | size_t len; | 196 | size_t len; |
| 196 | u32 tx_width; | 197 | u32 tx_width; |
| 198 | size_t total_len; | ||
| 197 | }; | 199 | }; |
| 198 | 200 | ||
| 199 | static inline struct at_desc * | 201 | static inline struct at_desc * |
| @@ -213,7 +215,6 @@ txd_to_at_desc(struct dma_async_tx_descriptor *txd) | |||
| 213 | enum atc_status { | 215 | enum atc_status { |
| 214 | ATC_IS_ERROR = 0, | 216 | ATC_IS_ERROR = 0, |
| 215 | ATC_IS_PAUSED = 1, | 217 | ATC_IS_PAUSED = 1, |
| 216 | ATC_IS_BTC = 2, | ||
| 217 | ATC_IS_CYCLIC = 24, | 218 | ATC_IS_CYCLIC = 24, |
| 218 | }; | 219 | }; |
| 219 | 220 | ||
| @@ -231,7 +232,6 @@ enum atc_status { | |||
| 231 | * @save_cfg: configuration register that is saved on suspend/resume cycle | 232 | * @save_cfg: configuration register that is saved on suspend/resume cycle |
| 232 | * @save_dscr: for cyclic operations, preserve next descriptor address in | 233 | * @save_dscr: for cyclic operations, preserve next descriptor address in |
| 233 | * the cyclic list on suspend/resume cycle | 234 | * the cyclic list on suspend/resume cycle |
| 234 | * @remain_desc: to save remain desc length | ||
| 235 | * @dma_sconfig: configuration for slave transfers, passed via | 235 | * @dma_sconfig: configuration for slave transfers, passed via |
| 236 | * .device_config | 236 | * .device_config |
| 237 | * @lock: serializes enqueue/dequeue operations to descriptors lists | 237 | * @lock: serializes enqueue/dequeue operations to descriptors lists |
| @@ -251,7 +251,6 @@ struct at_dma_chan { | |||
| 251 | struct tasklet_struct tasklet; | 251 | struct tasklet_struct tasklet; |
| 252 | u32 save_cfg; | 252 | u32 save_cfg; |
| 253 | u32 save_dscr; | 253 | u32 save_dscr; |
| 254 | u32 remain_desc; | ||
| 255 | struct dma_slave_config dma_sconfig; | 254 | struct dma_slave_config dma_sconfig; |
| 256 | 255 | ||
| 257 | spinlock_t lock; | 256 | spinlock_t lock; |
diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c index 6565a361e7e5..b2c3ae071429 100644 --- a/drivers/dma/dw/platform.c +++ b/drivers/dma/dw/platform.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | #include "internal.h" | 27 | #include "internal.h" |
| 28 | 28 | ||
| 29 | #define DRV_NAME "dw_dmac" | ||
| 30 | |||
| 29 | static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec, | 31 | static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec, |
| 30 | struct of_dma *ofdma) | 32 | struct of_dma *ofdma) |
| 31 | { | 33 | { |
| @@ -284,7 +286,7 @@ static struct platform_driver dw_driver = { | |||
| 284 | .remove = dw_remove, | 286 | .remove = dw_remove, |
| 285 | .shutdown = dw_shutdown, | 287 | .shutdown = dw_shutdown, |
| 286 | .driver = { | 288 | .driver = { |
| 287 | .name = "dw_dmac", | 289 | .name = DRV_NAME, |
| 288 | .pm = &dw_dev_pm_ops, | 290 | .pm = &dw_dev_pm_ops, |
| 289 | .of_match_table = of_match_ptr(dw_dma_of_id_table), | 291 | .of_match_table = of_match_ptr(dw_dma_of_id_table), |
| 290 | .acpi_match_table = ACPI_PTR(dw_dma_acpi_id_table), | 292 | .acpi_match_table = ACPI_PTR(dw_dma_acpi_id_table), |
| @@ -305,3 +307,4 @@ module_exit(dw_exit); | |||
| 305 | 307 | ||
| 306 | MODULE_LICENSE("GPL v2"); | 308 | MODULE_LICENSE("GPL v2"); |
| 307 | MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller platform driver"); | 309 | MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller platform driver"); |
| 310 | MODULE_ALIAS("platform:" DRV_NAME); | ||
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index 18c0a131e4e4..66a0efb9651d 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
| @@ -531,6 +531,10 @@ static int sdma_run_channel0(struct sdma_engine *sdma) | |||
| 531 | dev_err(sdma->dev, "Timeout waiting for CH0 ready\n"); | 531 | dev_err(sdma->dev, "Timeout waiting for CH0 ready\n"); |
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | /* Set bits of CONFIG register with dynamic context switching */ | ||
| 535 | if (readl(sdma->regs + SDMA_H_CONFIG) == 0) | ||
| 536 | writel_relaxed(SDMA_H_CONFIG_CSM, sdma->regs + SDMA_H_CONFIG); | ||
| 537 | |||
| 534 | return ret ? 0 : -ETIMEDOUT; | 538 | return ret ? 0 : -ETIMEDOUT; |
| 535 | } | 539 | } |
| 536 | 540 | ||
| @@ -1394,9 +1398,6 @@ static int sdma_init(struct sdma_engine *sdma) | |||
| 1394 | 1398 | ||
| 1395 | writel_relaxed(ccb_phys, sdma->regs + SDMA_H_C0PTR); | 1399 | writel_relaxed(ccb_phys, sdma->regs + SDMA_H_C0PTR); |
| 1396 | 1400 | ||
| 1397 | /* Set bits of CONFIG register with given context switching mode */ | ||
| 1398 | writel_relaxed(SDMA_H_CONFIG_CSM, sdma->regs + SDMA_H_CONFIG); | ||
| 1399 | |||
| 1400 | /* Initializes channel's priorities */ | 1401 | /* Initializes channel's priorities */ |
| 1401 | sdma_set_channel_priority(&sdma->channel[0], 7); | 1402 | sdma_set_channel_priority(&sdma->channel[0], 7); |
| 1402 | 1403 | ||
