• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file COPYING in the main directory of this archive
4  * for more details.
5  */
6 
7 #include <linux/dma-mapping.h>
8 #include <linux/kernel.h>
9 #include <linux/scatterlist.h>
10 #include <linux/module.h>
11 #include <asm/pgalloc.h>
12 
dma_alloc(struct device * dev,size_t size,dma_addr_t * dma_handle,gfp_t gfp,struct dma_attrs * attrs)13 static void *dma_alloc(struct device *dev, size_t size,
14 		       dma_addr_t *dma_handle, gfp_t gfp,
15 		       struct dma_attrs *attrs)
16 {
17 	void *ret;
18 
19 	/* ignore region specifiers */
20 	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
21 
22 	if (dev == NULL || (*dev->dma_mask < 0xffffffff))
23 		gfp |= GFP_DMA;
24 	ret = (void *)__get_free_pages(gfp, get_order(size));
25 
26 	if (ret != NULL) {
27 		memset(ret, 0, size);
28 		*dma_handle = virt_to_phys(ret);
29 	}
30 	return ret;
31 }
32 
dma_free(struct device * dev,size_t size,void * vaddr,dma_addr_t dma_handle,struct dma_attrs * attrs)33 static void dma_free(struct device *dev, size_t size,
34 		     void *vaddr, dma_addr_t dma_handle,
35 		     struct dma_attrs *attrs)
36 
37 {
38 	free_pages((unsigned long)vaddr, get_order(size));
39 }
40 
map_page(struct device * dev,struct page * page,unsigned long offset,size_t size,enum dma_data_direction direction,struct dma_attrs * attrs)41 static dma_addr_t map_page(struct device *dev, struct page *page,
42 				  unsigned long offset, size_t size,
43 				  enum dma_data_direction direction,
44 				  struct dma_attrs *attrs)
45 {
46 	return page_to_phys(page) + offset;
47 }
48 
map_sg(struct device * dev,struct scatterlist * sgl,int nents,enum dma_data_direction direction,struct dma_attrs * attrs)49 static int map_sg(struct device *dev, struct scatterlist *sgl,
50 		  int nents, enum dma_data_direction direction,
51 		  struct dma_attrs *attrs)
52 {
53 	struct scatterlist *sg;
54 	int i;
55 
56 	for_each_sg(sgl, sg, nents, i) {
57 		sg->dma_address = sg_phys(sg);
58 	}
59 
60 	return nents;
61 }
62 
63 struct dma_map_ops h8300_dma_map_ops = {
64 	.alloc = dma_alloc,
65 	.free = dma_free,
66 	.map_page = map_page,
67 	.map_sg = map_sg,
68 };
69 EXPORT_SYMBOL(h8300_dma_map_ops);
70