@@ -288,6 +288,33 @@ static inline int omap2_onenand_bufferram_offset(struct mtd_info *mtd, int area)
288
288
return 0 ;
289
289
}
290
290
291
+ static inline int omap2_onenand_dma_transfer (struct omap2_onenand * c ,
292
+ dma_addr_t src , dma_addr_t dst ,
293
+ size_t count )
294
+ {
295
+ int data_type = __ffs ((src | dst | count ));
296
+
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 );
306
+
307
+ reinit_completion (& c -> dma_done );
308
+ omap_start_dma (c -> dma_channel );
309
+ if (!wait_for_completion_io_timeout (& c -> dma_done ,
310
+ msecs_to_jiffies (20 ))) {
311
+ omap_stop_dma (c -> dma_channel );
312
+ return - ETIMEDOUT ;
313
+ }
314
+
315
+ return 0 ;
316
+ }
317
+
291
318
#if defined(CONFIG_ARCH_OMAP3 ) || defined(MULTI_OMAP2 )
292
319
293
320
static int omap3_onenand_read_bufferram (struct mtd_info * mtd , int area ,
@@ -298,10 +325,9 @@ static int omap3_onenand_read_bufferram(struct mtd_info *mtd, int area,
298
325
struct onenand_chip * this = mtd -> priv ;
299
326
dma_addr_t dma_src , dma_dst ;
300
327
int bram_offset ;
301
- unsigned long timeout ;
302
328
void * buf = (void * )buffer ;
303
329
size_t xtra ;
304
- volatile unsigned * done ;
330
+ int ret ;
305
331
306
332
bram_offset = omap2_onenand_bufferram_offset (mtd , area ) + area + offset ;
307
333
if (bram_offset & 3 || (size_t )buf & 3 || count < 384 )
@@ -338,25 +364,10 @@ static int omap3_onenand_read_bufferram(struct mtd_info *mtd, int area,
338
364
goto out_copy ;
339
365
}
340
366
341
- omap_set_dma_transfer_params (c -> dma_channel , OMAP_DMA_DATA_TYPE_S32 ,
342
- count >> 2 , 1 , 0 , 0 , 0 );
343
- omap_set_dma_src_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
344
- dma_src , 0 , 0 );
345
- omap_set_dma_dest_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
346
- dma_dst , 0 , 0 );
347
-
348
- reinit_completion (& c -> dma_done );
349
- omap_start_dma (c -> dma_channel );
350
-
351
- timeout = jiffies + msecs_to_jiffies (20 );
352
- done = & c -> dma_done .done ;
353
- while (time_before (jiffies , timeout ))
354
- if (* done )
355
- break ;
356
-
367
+ ret = omap2_onenand_dma_transfer (c , dma_src , dma_dst , count );
357
368
dma_unmap_single (& c -> pdev -> dev , dma_dst , count , DMA_FROM_DEVICE );
358
369
359
- if (! * done ) {
370
+ if (ret ) {
360
371
dev_err (& c -> pdev -> dev , "timeout waiting for DMA\n" );
361
372
goto out_copy ;
362
373
}
@@ -376,9 +387,8 @@ static int omap3_onenand_write_bufferram(struct mtd_info *mtd, int area,
376
387
struct onenand_chip * this = mtd -> priv ;
377
388
dma_addr_t dma_src , dma_dst ;
378
389
int bram_offset ;
379
- unsigned long timeout ;
380
390
void * buf = (void * )buffer ;
381
- volatile unsigned * done ;
391
+ int ret ;
382
392
383
393
bram_offset = omap2_onenand_bufferram_offset (mtd , area ) + area + offset ;
384
394
if (bram_offset & 3 || (size_t )buf & 3 || count < 384 )
@@ -409,25 +419,10 @@ static int omap3_onenand_write_bufferram(struct mtd_info *mtd, int area,
409
419
return -1 ;
410
420
}
411
421
412
- omap_set_dma_transfer_params (c -> dma_channel , OMAP_DMA_DATA_TYPE_S32 ,
413
- count >> 2 , 1 , 0 , 0 , 0 );
414
- omap_set_dma_src_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
415
- dma_src , 0 , 0 );
416
- omap_set_dma_dest_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
417
- dma_dst , 0 , 0 );
418
-
419
- reinit_completion (& c -> dma_done );
420
- omap_start_dma (c -> dma_channel );
421
-
422
- timeout = jiffies + msecs_to_jiffies (20 );
423
- done = & c -> dma_done .done ;
424
- while (time_before (jiffies , timeout ))
425
- if (* done )
426
- break ;
427
-
422
+ ret = omap2_onenand_dma_transfer (c , dma_src , dma_dst , count );
428
423
dma_unmap_single (& c -> pdev -> dev , dma_src , count , DMA_TO_DEVICE );
429
424
430
- if (! * done ) {
425
+ if (ret ) {
431
426
dev_err (& c -> pdev -> dev , "timeout waiting for DMA\n" );
432
427
goto out_copy ;
433
428
}
@@ -466,7 +461,7 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area,
466
461
struct omap2_onenand * c = container_of (mtd , struct omap2_onenand , mtd );
467
462
struct onenand_chip * this = mtd -> priv ;
468
463
dma_addr_t dma_src , dma_dst ;
469
- int bram_offset ;
464
+ int bram_offset , ret ;
470
465
471
466
bram_offset = omap2_onenand_bufferram_offset (mtd , area ) + area + offset ;
472
467
/* DMA is not used. Revisit PM requirements before enabling it. */
@@ -488,20 +483,13 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area,
488
483
return -1 ;
489
484
}
490
485
491
- omap_set_dma_transfer_params (c -> dma_channel , OMAP_DMA_DATA_TYPE_S32 ,
492
- count / 4 , 1 , 0 , 0 , 0 );
493
- omap_set_dma_src_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
494
- dma_src , 0 , 0 );
495
- omap_set_dma_dest_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
496
- dma_dst , 0 , 0 );
497
-
498
- reinit_completion (& c -> dma_done );
499
- omap_start_dma (c -> dma_channel );
500
- wait_for_completion (& c -> dma_done );
501
-
486
+ ret = omap2_onenand_dma_transfer (c , dma_src , dma_dst , count );
502
487
dma_unmap_single (& c -> pdev -> dev , dma_dst , count , DMA_FROM_DEVICE );
503
488
504
- return 0 ;
489
+ if (ret )
490
+ dev_err (& c -> pdev -> dev , "timeout waiting for DMA\n" );
491
+
492
+ return ret ;
505
493
}
506
494
507
495
static int omap2_onenand_write_bufferram (struct mtd_info * mtd , int area ,
@@ -511,7 +499,7 @@ static int omap2_onenand_write_bufferram(struct mtd_info *mtd, int area,
511
499
struct omap2_onenand * c = container_of (mtd , struct omap2_onenand , mtd );
512
500
struct onenand_chip * this = mtd -> priv ;
513
501
dma_addr_t dma_src , dma_dst ;
514
- int bram_offset ;
502
+ int bram_offset , ret ;
515
503
516
504
bram_offset = omap2_onenand_bufferram_offset (mtd , area ) + area + offset ;
517
505
/* DMA is not used. Revisit PM requirements before enabling it. */
@@ -533,20 +521,13 @@ static int omap2_onenand_write_bufferram(struct mtd_info *mtd, int area,
533
521
return -1 ;
534
522
}
535
523
536
- omap_set_dma_transfer_params (c -> dma_channel , OMAP_DMA_DATA_TYPE_S16 ,
537
- count / 2 , 1 , 0 , 0 , 0 );
538
- omap_set_dma_src_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
539
- dma_src , 0 , 0 );
540
- omap_set_dma_dest_params (c -> dma_channel , 0 , OMAP_DMA_AMODE_POST_INC ,
541
- dma_dst , 0 , 0 );
542
-
543
- reinit_completion (& c -> dma_done );
544
- omap_start_dma (c -> dma_channel );
545
- wait_for_completion (& c -> dma_done );
546
-
524
+ ret = omap2_onenand_dma_transfer (c , dma_src , dma_dst , count );
547
525
dma_unmap_single (& c -> pdev -> dev , dma_src , count , DMA_TO_DEVICE );
548
526
549
- return 0 ;
527
+ if (ret )
528
+ dev_err (& c -> pdev -> dev , "timeout waiting for DMA\n" );
529
+
530
+ return ret ;
550
531
}
551
532
552
533
#else
0 commit comments