diff options
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 77dc483e64c1..0d68d2c83cda 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -446,24 +446,6 @@ void ___dma_single_dev_to_cpu(const void *kaddr, size_t size, | |||
446 | } | 446 | } |
447 | EXPORT_SYMBOL(___dma_single_dev_to_cpu); | 447 | EXPORT_SYMBOL(___dma_single_dev_to_cpu); |
448 | 448 | ||
449 | static void dma_cache_maint_contiguous(struct page *page, unsigned long offset, | ||
450 | size_t size, void (*op)(const void *, const void *)) | ||
451 | { | ||
452 | void *vaddr; | ||
453 | |||
454 | if (!PageHighMem(page)) { | ||
455 | vaddr = page_address(page) + offset; | ||
456 | op(vaddr, vaddr + size); | ||
457 | } else { | ||
458 | vaddr = kmap_high_get(page); | ||
459 | if (vaddr) { | ||
460 | vaddr += offset; | ||
461 | op(vaddr, vaddr + size); | ||
462 | kunmap_high(page); | ||
463 | } | ||
464 | } | ||
465 | } | ||
466 | |||
467 | static void dma_cache_maint_page(struct page *page, unsigned long offset, | 449 | static void dma_cache_maint_page(struct page *page, unsigned long offset, |
468 | size_t size, void (*op)(const void *, const void *)) | 450 | size_t size, void (*op)(const void *, const void *)) |
469 | { | 451 | { |
@@ -476,14 +458,26 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | |||
476 | size_t left = size; | 458 | size_t left = size; |
477 | do { | 459 | do { |
478 | size_t len = left; | 460 | size_t len = left; |
479 | if (PageHighMem(page) && len + offset > PAGE_SIZE) { | 461 | void *vaddr; |
480 | if (offset >= PAGE_SIZE) { | 462 | |
481 | page += offset / PAGE_SIZE; | 463 | if (PageHighMem(page)) { |
482 | offset %= PAGE_SIZE; | 464 | if (len + offset > PAGE_SIZE) { |
465 | if (offset >= PAGE_SIZE) { | ||
466 | page += offset / PAGE_SIZE; | ||
467 | offset %= PAGE_SIZE; | ||
468 | } | ||
469 | len = PAGE_SIZE - offset; | ||
470 | } | ||
471 | vaddr = kmap_high_get(page); | ||
472 | if (vaddr) { | ||
473 | vaddr += offset; | ||
474 | op(vaddr, vaddr + len); | ||
475 | kunmap_high(page); | ||
483 | } | 476 | } |
484 | len = PAGE_SIZE - offset; | 477 | } else { |
478 | vaddr = page_address(page) + offset; | ||
479 | op(vaddr, vaddr + len); | ||
485 | } | 480 | } |
486 | dma_cache_maint_contiguous(page, offset, len, op); | ||
487 | offset = 0; | 481 | offset = 0; |
488 | page++; | 482 | page++; |
489 | left -= len; | 483 | left -= len; |