32
32
#include <linux/interrupt.h>
33
33
#include <linux/delay.h>
34
34
#include <linux/dma-mapping.h>
35
+ #include <linux/dmaengine.h>
35
36
#include <linux/io.h>
36
37
#include <linux/slab.h>
37
38
#include <linux/gpio.h>
38
39
39
40
#include <asm/mach/flash.h>
40
41
#include <linux/platform_data/mtd-onenand-omap2.h>
41
42
42
- #include <linux/omap-dma.h>
43
-
44
43
#define DRIVER_NAME "omap2-onenand"
45
44
46
45
#define ONENAND_BUFRAM_SIZE (1024 * 5)
@@ -55,17 +54,15 @@ struct omap2_onenand {
55
54
struct onenand_chip onenand ;
56
55
struct completion irq_done ;
57
56
struct completion dma_done ;
58
- int dma_channel ;
57
+ struct dma_chan * dma_chan ;
59
58
int freq ;
60
59
int (* setup )(void __iomem * base , int * freq_ptr );
61
60
u8 flags ;
62
61
};
63
62
64
- static void omap2_onenand_dma_cb ( int lch , u16 ch_status , void * data )
63
+ static void omap2_onenand_dma_complete_func ( void * completion )
65
64
{
66
- struct omap2_onenand * c = data ;
67
-
68
- complete (& c -> dma_done );
65
+ complete (completion );
69
66
}
70
67
71
68
static irqreturn_t omap2_onenand_interrupt (int irq , void * dev_id )
@@ -292,23 +289,31 @@ static inline int omap2_onenand_dma_transfer(struct omap2_onenand *c,
292
289
dma_addr_t src , dma_addr_t dst ,
293
290
size_t count )
294
291
{
295
- int data_type = __ffs ((src | dst | count ));
292
+ struct dma_async_tx_descriptor * tx ;
293
+ dma_cookie_t cookie ;
296
294
297
- if (data_type > OMAP_DMA_DATA_TYPE_S32 )
298
- data_type = OMAP_DMA_DATA_TYPE_S32 ;
299
-
300
- omap_set_dma_transfer_params (c -> dma_channel , data_type ,
301
- count / BIT (data_type ), 1 , 0 , 0 , 0 );
302
- omap_set_dma_src_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
303
- src , 0 , 0 );
304
- omap_set_dma_dest_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
305
- dst , 0 , 0 );
295
+ tx = dmaengine_prep_dma_memcpy (c -> dma_chan , dst , src , count , 0 );
296
+ if (!tx ) {
297
+ dev_err (& c -> pdev -> dev , "Failed to prepare DMA memcpy\n" );
298
+ return - EIO ;
299
+ }
306
300
307
301
reinit_completion (& c -> dma_done );
308
- omap_start_dma (c -> dma_channel );
302
+
303
+ tx -> callback = omap2_onenand_dma_complete_func ;
304
+ tx -> callback_param = & c -> dma_done ;
305
+
306
+ cookie = tx -> tx_submit (tx );
307
+ if (dma_submit_error (cookie )) {
308
+ dev_err (& c -> pdev -> dev , "Failed to do DMA tx_submit\n" );
309
+ return - EIO ;
310
+ }
311
+
312
+ dma_async_issue_pending (c -> dma_chan );
313
+
309
314
if (!wait_for_completion_io_timeout (& c -> dma_done ,
310
315
msecs_to_jiffies (20 ))) {
311
- omap_stop_dma (c -> dma_channel );
316
+ dmaengine_terminate_sync (c -> dma_chan );
312
317
return - ETIMEDOUT ;
313
318
}
314
319
@@ -468,8 +473,7 @@ static int omap2_onenand_probe(struct platform_device *pdev)
468
473
c -> flags = pdata -> flags ;
469
474
c -> gpmc_cs = pdata -> cs ;
470
475
c -> gpio_irq = pdata -> gpio_irq ;
471
- c -> dma_channel = pdata -> dma_channel ;
472
- if (c -> dma_channel < 0 ) {
476
+ if (pdata -> dma_channel < 0 ) {
473
477
/* if -1, don't use DMA */
474
478
c -> gpio_irq = 0 ;
475
479
}
@@ -521,25 +525,17 @@ static int omap2_onenand_probe(struct platform_device *pdev)
521
525
goto err_release_gpio ;
522
526
}
523
527
524
- if (c -> dma_channel >= 0 ) {
525
- r = omap_request_dma (0 , pdev -> dev .driver -> name ,
526
- omap2_onenand_dma_cb , (void * ) c ,
527
- & c -> dma_channel );
528
- if (r == 0 ) {
529
- omap_set_dma_write_mode (c -> dma_channel ,
530
- OMAP_DMA_WRITE_NON_POSTED );
531
- omap_set_dma_src_data_pack (c -> dma_channel , 1 );
532
- omap_set_dma_src_burst_mode (c -> dma_channel ,
533
- OMAP_DMA_DATA_BURST_8 );
534
- omap_set_dma_dest_data_pack (c -> dma_channel , 1 );
535
- omap_set_dma_dest_burst_mode (c -> dma_channel ,
536
- OMAP_DMA_DATA_BURST_8 );
537
- } else {
528
+ if (pdata -> dma_channel >= 0 ) {
529
+ dma_cap_mask_t mask ;
530
+
531
+ dma_cap_zero (mask );
532
+ dma_cap_set (DMA_MEMCPY , mask );
533
+
534
+ c -> dma_chan = dma_request_channel (mask , NULL , NULL );
535
+ if (!c -> dma_chan )
538
536
dev_info (& pdev -> dev ,
539
537
"failed to allocate DMA for OneNAND, "
540
538
"using PIO instead\n" );
541
- c -> dma_channel = -1 ;
542
- }
543
539
}
544
540
545
541
dev_info (& pdev -> dev , "initializing on CS%d, phys base 0x%08lx, virtual "
@@ -553,7 +549,7 @@ static int omap2_onenand_probe(struct platform_device *pdev)
553
549
mtd_set_of_node (& c -> mtd , pdata -> of_node );
554
550
555
551
this = & c -> onenand ;
556
- if (c -> dma_channel >= 0 ) {
552
+ if (c -> dma_chan ) {
557
553
this -> wait = omap2_onenand_wait ;
558
554
this -> read_bufferram = omap2_onenand_read_bufferram ;
559
555
this -> write_bufferram = omap2_onenand_write_bufferram ;
@@ -573,8 +569,8 @@ static int omap2_onenand_probe(struct platform_device *pdev)
573
569
err_release_onenand :
574
570
onenand_release (& c -> mtd );
575
571
err_release_dma :
576
- if (c -> dma_channel != -1 )
577
- omap_free_dma (c -> dma_channel );
572
+ if (c -> dma_chan )
573
+ dma_release_channel (c -> dma_chan );
578
574
if (c -> gpio_irq )
579
575
free_irq (gpio_to_irq (c -> gpio_irq ), c );
580
576
err_release_gpio :
@@ -595,8 +591,8 @@ static int omap2_onenand_remove(struct platform_device *pdev)
595
591
struct omap2_onenand * c = dev_get_drvdata (& pdev -> dev );
596
592
597
593
onenand_release (& c -> mtd );
598
- if (c -> dma_channel != -1 )
599
- omap_free_dma (c -> dma_channel );
594
+ if (c -> dma_chan )
595
+ dma_release_channel (c -> dma_chan );
600
596
omap2_onenand_shutdown (pdev );
601
597
if (c -> gpio_irq ) {
602
598
free_irq (gpio_to_irq (c -> gpio_irq ), c );
0 commit comments