|
19 | 19 |
|
20 | 20 | #define NO_IOMMU 1
|
21 | 21 |
|
22 |
| -/** |
23 |
| - * of_get_dma_window - Parse *dma-window property and returns 0 if found. |
24 |
| - * |
25 |
| - * @dn: device node |
26 |
| - * @prefix: prefix for property name if any |
27 |
| - * @index: index to start to parse |
28 |
| - * @busno: Returns busno if supported. Otherwise pass NULL |
29 |
| - * @addr: Returns address that DMA starts |
30 |
| - * @size: Returns the range that DMA can handle |
31 |
| - * |
32 |
| - * This supports different formats flexibly. "prefix" can be |
33 |
| - * configured if any. "busno" and "index" are optionally |
34 |
| - * specified. Set 0(or NULL) if not used. |
35 |
| - */ |
36 |
| -int of_get_dma_window(struct device_node *dn, const char *prefix, int index, |
37 |
| - unsigned long *busno, dma_addr_t *addr, size_t *size) |
38 |
| -{ |
39 |
| - const __be32 *dma_window, *end; |
40 |
| - int bytes, cur_index = 0; |
41 |
| - char propname[NAME_MAX], addrname[NAME_MAX], sizename[NAME_MAX]; |
42 |
| - |
43 |
| - if (!dn || !addr || !size) |
44 |
| - return -EINVAL; |
45 |
| - |
46 |
| - if (!prefix) |
47 |
| - prefix = ""; |
48 |
| - |
49 |
| - snprintf(propname, sizeof(propname), "%sdma-window", prefix); |
50 |
| - snprintf(addrname, sizeof(addrname), "%s#dma-address-cells", prefix); |
51 |
| - snprintf(sizename, sizeof(sizename), "%s#dma-size-cells", prefix); |
52 |
| - |
53 |
| - dma_window = of_get_property(dn, propname, &bytes); |
54 |
| - if (!dma_window) |
55 |
| - return -ENODEV; |
56 |
| - end = dma_window + bytes / sizeof(*dma_window); |
57 |
| - |
58 |
| - while (dma_window < end) { |
59 |
| - u32 cells; |
60 |
| - const void *prop; |
61 |
| - |
62 |
| - /* busno is one cell if supported */ |
63 |
| - if (busno) |
64 |
| - *busno = be32_to_cpup(dma_window++); |
65 |
| - |
66 |
| - prop = of_get_property(dn, addrname, NULL); |
67 |
| - if (!prop) |
68 |
| - prop = of_get_property(dn, "#address-cells", NULL); |
69 |
| - |
70 |
| - cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn); |
71 |
| - if (!cells) |
72 |
| - return -EINVAL; |
73 |
| - *addr = of_read_number(dma_window, cells); |
74 |
| - dma_window += cells; |
75 |
| - |
76 |
| - prop = of_get_property(dn, sizename, NULL); |
77 |
| - cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn); |
78 |
| - if (!cells) |
79 |
| - return -EINVAL; |
80 |
| - *size = of_read_number(dma_window, cells); |
81 |
| - dma_window += cells; |
82 |
| - |
83 |
| - if (cur_index++ == index) |
84 |
| - break; |
85 |
| - } |
86 |
| - return 0; |
87 |
| -} |
88 |
| -EXPORT_SYMBOL_GPL(of_get_dma_window); |
89 |
| - |
90 | 22 | static int of_iommu_xlate(struct device *dev,
|
91 | 23 | struct of_phandle_args *iommu_spec)
|
92 | 24 | {
|
|
0 commit comments