diff options
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index e9db6b4bf65a..ef3e0f3aac96 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -823,16 +823,17 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | |||
823 | if (PageHighMem(page)) { | 823 | if (PageHighMem(page)) { |
824 | if (len + offset > PAGE_SIZE) | 824 | if (len + offset > PAGE_SIZE) |
825 | len = PAGE_SIZE - offset; | 825 | len = PAGE_SIZE - offset; |
826 | vaddr = kmap_high_get(page); | 826 | |
827 | if (vaddr) { | 827 | if (cache_is_vipt_nonaliasing()) { |
828 | vaddr += offset; | ||
829 | op(vaddr, len, dir); | ||
830 | kunmap_high(page); | ||
831 | } else if (cache_is_vipt()) { | ||
832 | /* unmapped pages might still be cached */ | ||
833 | vaddr = kmap_atomic(page); | 828 | vaddr = kmap_atomic(page); |
834 | op(vaddr + offset, len, dir); | 829 | op(vaddr + offset, len, dir); |
835 | kunmap_atomic(vaddr); | 830 | kunmap_atomic(vaddr); |
831 | } else { | ||
832 | vaddr = kmap_high_get(page); | ||
833 | if (vaddr) { | ||
834 | op(vaddr + offset, len, dir); | ||
835 | kunmap_high(page); | ||
836 | } | ||
836 | } | 837 | } |
837 | } else { | 838 | } else { |
838 | vaddr = page_address(page) + offset; | 839 | vaddr = page_address(page) + offset; |