diff options
Diffstat (limited to 'arch/sh/mm/consistent.c')
| -rw-r--r-- | arch/sh/mm/consistent.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 9f8ea3ada4db..edcd5fbf9651 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
| @@ -42,6 +42,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
| 42 | return NULL; | 42 | return NULL; |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); | ||
| 46 | |||
| 45 | *dma_handle = virt_to_phys(ret); | 47 | *dma_handle = virt_to_phys(ret); |
| 46 | return ret_nocache; | 48 | return ret_nocache; |
| 47 | } | 49 | } |
| @@ -51,10 +53,13 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
| 51 | void *vaddr, dma_addr_t dma_handle) | 53 | void *vaddr, dma_addr_t dma_handle) |
| 52 | { | 54 | { |
| 53 | int order = get_order(size); | 55 | int order = get_order(size); |
| 56 | unsigned long pfn = dma_handle >> PAGE_SHIFT; | ||
| 57 | int k; | ||
| 54 | 58 | ||
| 55 | if (!dma_release_from_coherent(dev, order, vaddr)) { | 59 | if (!dma_release_from_coherent(dev, order, vaddr)) { |
| 56 | WARN_ON(irqs_disabled()); /* for portability */ | 60 | WARN_ON(irqs_disabled()); /* for portability */ |
| 57 | free_pages((unsigned long)phys_to_virt(dma_handle), order); | 61 | for (k = 0; k < (1 << order); k++) |
| 62 | __free_pages(pfn_to_page(pfn + k), 0); | ||
| 58 | iounmap(vaddr); | 63 | iounmap(vaddr); |
| 59 | } | 64 | } |
| 60 | } | 65 | } |
