diff options
Diffstat (limited to 'drivers/dma/sirf-dma.c')
-rw-r--r-- | drivers/dma/sirf-dma.c | 59 |
1 files changed, 16 insertions, 43 deletions
diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c index 3492a5f91d31..d0086e9f2082 100644 --- a/drivers/dma/sirf-dma.c +++ b/drivers/dma/sirf-dma.c | |||
@@ -281,9 +281,10 @@ static dma_cookie_t sirfsoc_dma_tx_submit(struct dma_async_tx_descriptor *txd) | |||
281 | return cookie; | 281 | return cookie; |
282 | } | 282 | } |
283 | 283 | ||
284 | static int sirfsoc_dma_slave_config(struct sirfsoc_dma_chan *schan, | 284 | static int sirfsoc_dma_slave_config(struct dma_chan *chan, |
285 | struct dma_slave_config *config) | 285 | struct dma_slave_config *config) |
286 | { | 286 | { |
287 | struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); | ||
287 | unsigned long flags; | 288 | unsigned long flags; |
288 | 289 | ||
289 | if ((config->src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES) || | 290 | if ((config->src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES) || |
@@ -297,8 +298,9 @@ static int sirfsoc_dma_slave_config(struct sirfsoc_dma_chan *schan, | |||
297 | return 0; | 298 | return 0; |
298 | } | 299 | } |
299 | 300 | ||
300 | static int sirfsoc_dma_terminate_all(struct sirfsoc_dma_chan *schan) | 301 | static int sirfsoc_dma_terminate_all(struct dma_chan *chan) |
301 | { | 302 | { |
303 | struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); | ||
302 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); | 304 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); |
303 | int cid = schan->chan.chan_id; | 305 | int cid = schan->chan.chan_id; |
304 | unsigned long flags; | 306 | unsigned long flags; |
@@ -327,8 +329,9 @@ static int sirfsoc_dma_terminate_all(struct sirfsoc_dma_chan *schan) | |||
327 | return 0; | 329 | return 0; |
328 | } | 330 | } |
329 | 331 | ||
330 | static int sirfsoc_dma_pause_chan(struct sirfsoc_dma_chan *schan) | 332 | static int sirfsoc_dma_pause_chan(struct dma_chan *chan) |
331 | { | 333 | { |
334 | struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); | ||
332 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); | 335 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); |
333 | int cid = schan->chan.chan_id; | 336 | int cid = schan->chan.chan_id; |
334 | unsigned long flags; | 337 | unsigned long flags; |
@@ -348,8 +351,9 @@ static int sirfsoc_dma_pause_chan(struct sirfsoc_dma_chan *schan) | |||
348 | return 0; | 351 | return 0; |
349 | } | 352 | } |
350 | 353 | ||
351 | static int sirfsoc_dma_resume_chan(struct sirfsoc_dma_chan *schan) | 354 | static int sirfsoc_dma_resume_chan(struct dma_chan *chan) |
352 | { | 355 | { |
356 | struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); | ||
353 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); | 357 | struct sirfsoc_dma *sdma = dma_chan_to_sirfsoc_dma(&schan->chan); |
354 | int cid = schan->chan.chan_id; | 358 | int cid = schan->chan.chan_id; |
355 | unsigned long flags; | 359 | unsigned long flags; |
@@ -369,30 +373,6 @@ static int sirfsoc_dma_resume_chan(struct sirfsoc_dma_chan *schan) | |||
369 | return 0; | 373 | return 0; |
370 | } | 374 | } |
371 | 375 | ||
372 | static int sirfsoc_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | ||
373 | unsigned long arg) | ||
374 | { | ||
375 | struct dma_slave_config *config; | ||
376 | struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); | ||
377 | |||
378 | switch (cmd) { | ||
379 | case DMA_PAUSE: | ||
380 | return sirfsoc_dma_pause_chan(schan); | ||
381 | case DMA_RESUME: | ||
382 | return sirfsoc_dma_resume_chan(schan); | ||
383 | case DMA_TERMINATE_ALL: | ||
384 | return sirfsoc_dma_terminate_all(schan); | ||
385 | case DMA_SLAVE_CONFIG: | ||
386 | config = (struct dma_slave_config *)arg; | ||
387 | return sirfsoc_dma_slave_config(schan, config); | ||
388 | |||
389 | default: | ||
390 | break; | ||
391 | } | ||
392 | |||
393 | return -ENOSYS; | ||
394 | } | ||
395 | |||
396 | /* Alloc channel resources */ | 376 | /* Alloc channel resources */ |
397 | static int sirfsoc_dma_alloc_chan_resources(struct dma_chan *chan) | 377 | static int sirfsoc_dma_alloc_chan_resources(struct dma_chan *chan) |
398 | { | 378 | { |
@@ -648,18 +628,6 @@ EXPORT_SYMBOL(sirfsoc_dma_filter_id); | |||
648 | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \ | 628 | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \ |
649 | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES)) | 629 | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES)) |
650 | 630 | ||
651 | static int sirfsoc_dma_device_slave_caps(struct dma_chan *dchan, | ||
652 | struct dma_slave_caps *caps) | ||
653 | { | ||
654 | caps->src_addr_widths = SIRFSOC_DMA_BUSWIDTHS; | ||
655 | caps->dstn_addr_widths = SIRFSOC_DMA_BUSWIDTHS; | ||
656 | caps->directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); | ||
657 | caps->cmd_pause = true; | ||
658 | caps->cmd_terminate = true; | ||
659 | |||
660 | return 0; | ||
661 | } | ||
662 | |||
663 | static struct dma_chan *of_dma_sirfsoc_xlate(struct of_phandle_args *dma_spec, | 631 | static struct dma_chan *of_dma_sirfsoc_xlate(struct of_phandle_args *dma_spec, |
664 | struct of_dma *ofdma) | 632 | struct of_dma *ofdma) |
665 | { | 633 | { |
@@ -739,11 +707,16 @@ static int sirfsoc_dma_probe(struct platform_device *op) | |||
739 | dma->device_alloc_chan_resources = sirfsoc_dma_alloc_chan_resources; | 707 | dma->device_alloc_chan_resources = sirfsoc_dma_alloc_chan_resources; |
740 | dma->device_free_chan_resources = sirfsoc_dma_free_chan_resources; | 708 | dma->device_free_chan_resources = sirfsoc_dma_free_chan_resources; |
741 | dma->device_issue_pending = sirfsoc_dma_issue_pending; | 709 | dma->device_issue_pending = sirfsoc_dma_issue_pending; |
742 | dma->device_control = sirfsoc_dma_control; | 710 | dma->device_config = sirfsoc_dma_slave_config; |
711 | dma->device_pause = sirfsoc_dma_pause_chan; | ||
712 | dma->device_resume = sirfsoc_dma_resume_chan; | ||
713 | dma->device_terminate_all = sirfsoc_dma_terminate_all; | ||
743 | dma->device_tx_status = sirfsoc_dma_tx_status; | 714 | dma->device_tx_status = sirfsoc_dma_tx_status; |
744 | dma->device_prep_interleaved_dma = sirfsoc_dma_prep_interleaved; | 715 | dma->device_prep_interleaved_dma = sirfsoc_dma_prep_interleaved; |
745 | dma->device_prep_dma_cyclic = sirfsoc_dma_prep_cyclic; | 716 | dma->device_prep_dma_cyclic = sirfsoc_dma_prep_cyclic; |
746 | dma->device_slave_caps = sirfsoc_dma_device_slave_caps; | 717 | dma->src_addr_widths = SIRFSOC_DMA_BUSWIDTHS; |
718 | dma->dst_addr_widths = SIRFSOC_DMA_BUSWIDTHS; | ||
719 | dma->directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); | ||
747 | 720 | ||
748 | INIT_LIST_HEAD(&dma->channels); | 721 | INIT_LIST_HEAD(&dma->channels); |
749 | dma_cap_set(DMA_SLAVE, dma->cap_mask); | 722 | dma_cap_set(DMA_SLAVE, dma->cap_mask); |