diff options
| -rw-r--r-- | drivers/of/address.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c index 5359a80c4e8c..978427a9d5e6 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c | |||
| @@ -677,12 +677,30 @@ u64 of_translate_address(struct device_node *dev, const __be32 *in_addr) | |||
| 677 | } | 677 | } |
| 678 | EXPORT_SYMBOL(of_translate_address); | 678 | EXPORT_SYMBOL(of_translate_address); |
| 679 | 679 | ||
| 680 | static struct device_node *__of_get_dma_parent(const struct device_node *np) | ||
| 681 | { | ||
| 682 | struct of_phandle_args args; | ||
| 683 | int ret, index; | ||
| 684 | |||
| 685 | index = of_property_match_string(np, "interconnect-names", "dma-mem"); | ||
| 686 | if (index < 0) | ||
| 687 | return of_get_parent(np); | ||
| 688 | |||
| 689 | ret = of_parse_phandle_with_args(np, "interconnects", | ||
| 690 | "#interconnect-cells", | ||
| 691 | index, &args); | ||
| 692 | if (ret < 0) | ||
| 693 | return of_get_parent(np); | ||
| 694 | |||
| 695 | return of_node_get(args.np); | ||
| 696 | } | ||
| 697 | |||
| 680 | u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr) | 698 | u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr) |
| 681 | { | 699 | { |
| 682 | struct device_node *host; | 700 | struct device_node *host; |
| 683 | u64 ret; | 701 | u64 ret; |
| 684 | 702 | ||
| 685 | ret = __of_translate_address(dev, of_get_parent, | 703 | ret = __of_translate_address(dev, __of_get_dma_parent, |
| 686 | in_addr, "dma-ranges", &host); | 704 | in_addr, "dma-ranges", &host); |
| 687 | 705 | ||
| 688 | if (host) { | 706 | if (host) { |
| @@ -912,9 +930,15 @@ int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *siz | |||
| 912 | return -EINVAL; | 930 | return -EINVAL; |
| 913 | 931 | ||
| 914 | while (1) { | 932 | while (1) { |
| 933 | struct device_node *parent; | ||
| 934 | |||
| 915 | naddr = of_n_addr_cells(node); | 935 | naddr = of_n_addr_cells(node); |
| 916 | nsize = of_n_size_cells(node); | 936 | nsize = of_n_size_cells(node); |
| 917 | node = of_get_next_parent(node); | 937 | |
| 938 | parent = __of_get_dma_parent(node); | ||
| 939 | of_node_put(node); | ||
| 940 | |||
| 941 | node = parent; | ||
| 918 | if (!node) | 942 | if (!node) |
| 919 | break; | 943 | break; |
| 920 | 944 | ||
