The only PCI specific part of of_pci_range_parser_one() is the handling of the 3rd address cell. Rework it to work on regular 1 and 2 cell addresses. Use defines and a union to avoid a treewide renaming of the parsing helpers and struct.
Unified · Split
| @@ -694,12 +694,12 @@ EXPORT_SYMBOL(of_get_address); · 693 unmodified lines | |||
| 694 | static int parser_init(struct of_pci_range_parser *parser, | 694 | static int parser_init(struct of_pci_range_parser *parser, |
| 695 | struct device_node *node, const char *name) | 695 | struct device_node *node, const char *name) |
| 696 | { | 696 | { |
| 697 | const int na = 3, ns = 2; | ||
| 698 | int rlen; | 697 | int rlen; |
| 699 | 698 | ||
| 700 | parser->node = node; | 699 | parser->node = node; |
| 701 | parser->pna = of_n_addr_cells(node); | 700 | parser->pna = of_n_addr_cells(node); |
| 702 | parser->np = parser->pna + na + ns; | 701 | parser->na = of_bus_n_addr_cells(node); |
| 702 | parser->ns = of_bus_n_size_cells(node); | ||
| 703 | parser->dma = !strcmp(name, "dma-ranges"); | 703 | parser->dma = !strcmp(name, "dma-ranges"); |
| 704 | 704 | ||
| 705 | parser->range = of_get_property(node, name, &rlen); | 705 | parser->range = of_get_property(node, name, &rlen); |
| @@ -724,20 +724,28 @@ int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser, · 18 unmodified lines | |||
| 724 | return parser_init(parser, node, "dma-ranges"); | 724 | return parser_init(parser, node, "dma-ranges"); |
| 725 | } | 725 | } |
| 726 | EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init); | 726 | EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init); |
| 727 | #define of_dma_range_parser_init of_pci_dma_range_parser_init | ||
| 727 | 728 | ||
| 728 | struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, | 729 | struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, |
| 729 | struct of_pci_range *range) | 730 | struct of_pci_range *range) |
| 730 | { | 731 | { |
| 731 | const int na = 3, ns = 2; | 732 | int na = parser->na; |
| 733 | int ns = parser->ns; | ||
| 734 | int np = parser->pna + na + ns; | ||
| 732 | 735 | ||
| 733 | if (!range) | 736 | if (!range) |
| 734 | return NULL; | 737 | return NULL; |
| 735 | 738 | ||
| 736 | if (!parser->range || parser->range + parser->np > parser->end) | 739 | if (!parser->range || parser->range + np > parser->end) |
| 737 | return NULL; | 740 | return NULL; |
| 738 | 741 | ||
| 739 | range->flags = of_bus_pci_get_flags(parser->range); | 742 | if (parser->na == 3) |
| 740 | range->pci_addr = of_read_number(parser->range + 1, ns); | 743 | range->flags = of_bus_pci_get_flags(parser->range); |
| 744 | else | ||
| 745 | range->flags = 0; | ||
| 746 | |||
| 747 | range->pci_addr = of_read_number(parser->range, na); | ||
| 748 | |||
| 741 | if (parser->dma) | 749 | if (parser->dma) |
| 742 | range->cpu_addr = of_translate_dma_address(parser->node, | 750 | range->cpu_addr = of_translate_dma_address(parser->node, |
| 743 | parser->range + na); | 751 | parser->range + na); |
| @@ -746,15 +754,16 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, · 2 unmodified lines | |||
| 746 | parser->range + na); | 754 | parser->range + na); |
| 747 | range->size = of_read_number(parser->range + parser->pna + na, ns); | 755 | range->size = of_read_number(parser->range + parser->pna + na, ns); |
| 748 | 756 | ||
| 749 | parser->range += parser->np; | 757 | parser->range += np; |
| 750 | 758 | ||
| 751 | /* Now consume following elements while they are contiguous */ | 759 | /* Now consume following elements while they are contiguous */ |
| 752 | while (parser->range + parser->np <= parser->end) { | 760 | while (parser->range + np <= parser->end) { |
| 753 | u32 flags; | 761 | u32 flags = 0; |
| 754 | u64 pci_addr, cpu_addr, size; | 762 | u64 pci_addr, cpu_addr, size; |
| 755 | 763 | ||
| 756 | flags = of_bus_pci_get_flags(parser->range); | 764 | if (parser->na == 3) |
| 757 | pci_addr = of_read_number(parser->range + 1, ns); | 765 | flags = of_bus_pci_get_flags(parser->range); |
| 766 | pci_addr = of_read_number(parser->range, na); | ||
| 758 | if (parser->dma) | 767 | if (parser->dma) |
| 759 | cpu_addr = of_translate_dma_address(parser->node, | 768 | cpu_addr = of_translate_dma_address(parser->node, |
| 760 | parser->range + na); | 769 | parser->range + na); |
| @@ -770,7 +779,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, · 9 unmodified lines | |||
| 770 | break; | 779 | break; |
| 771 | 780 | ||
| 772 | range->size += size; | 781 | range->size += size; |
| 773 | parser->range += parser->np; | 782 | parser->range += np; |
| 774 | } | 783 | } |
| 775 | 784 | ||
| 776 | return range; | 785 | return range; |
| @@ -10,20 +10,27 @@ struct of_pci_range_parser { · 9 unmodified lines | |||
| 10 | struct device_node *node; | 10 | struct device_node *node; |
| 11 | const __be32 *range; | 11 | const __be32 *range; |
| 12 | const __be32 *end; | 12 | const __be32 *end; |
| 13 | int np; | 13 | int na; |
| 14 | int ns; | ||
| 14 | int pna; | 15 | int pna; |
| 15 | bool dma; | 16 | bool dma; |
| 16 | }; | 17 | }; |
| 18 | #define of_range_parser of_pci_range_parser | ||
| 17 | 19 | ||
| 18 | struct of_pci_range { | 20 | struct of_pci_range { |
| 19 | u64 pci_addr; | 21 | union { |
| 22 | u64 pci_addr; | ||
| 23 | u64 bus_addr; | ||
| 24 | }; | ||
| 20 | u64 cpu_addr; | 25 | u64 cpu_addr; |
| 21 | u64 size; | 26 | u64 size; |
| 22 | u32 flags; | 27 | u32 flags; |
| 23 | }; | 28 | }; |
| 29 | #define of_range of_pci_range | ||
| 24 | 30 | ||
| 25 | #define for_each_of_pci_range(parser, range) \ | 31 | #define for_each_of_pci_range(parser, range) \ |
| 26 | for (; of_pci_range_parser_one(parser, range);) | 32 | for (; of_pci_range_parser_one(parser, range);) |
| 33 | #define for_each_of_range for_each_of_pci_range | ||
| 27 | 34 | ||
| 28 | /* Translate a DMA address from device space to CPU space */ | 35 | /* Translate a DMA address from device space to CPU space */ |
| 29 | extern u64 of_translate_dma_address(struct device_node *dev, | 36 | extern u64 of_translate_dma_address(struct device_node *dev, |
| @@ -142,4 +149,3 @@ static inline int of_pci_range_to_resource(struct of_pci_range *range, · 112 unmodified lines | |||
| 142 | #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */ | 149 | #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */ |
| 143 | 150 | ||
| 144 | #endif /* __OF_ADDRESS_H */ | 151 | #endif /* __OF_ADDRESS_H */ |
| 145 | |||