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 | 694 | static int parser_init(struct of_pci_range_parser *parser, |
| 695 | 695 | struct device_node *node, const char *name) |
| 696 | 696 | { |
| 697 | − const int na = 3, ns = 2; | |
| 698 | 697 | int rlen; |
| 699 | 698 | |
| 700 | 699 | parser->node = node; |
| 701 | 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 | 703 | parser->dma = !strcmp(name, "dma-ranges"); |
| 704 | 704 | |
| 705 | 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 | 724 | return parser_init(parser, node, "dma-ranges"); |
| 725 | 725 | } |
| 726 | 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 | 729 | struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, |
| 729 | 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 | 736 | if (!range) |
| 734 | 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 | 740 | return NULL; |
| 738 | 741 | |
| 739 | − range->flags = of_bus_pci_get_flags(parser->range); | |
| 740 | − range->pci_addr = of_read_number(parser->range + 1, ns); | |
| 742 | + if (parser->na == 3) | |
| 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 | 749 | if (parser->dma) |
| 742 | 750 | range->cpu_addr = of_translate_dma_address(parser->node, |
| 743 | 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 | 754 | parser->range + na); |
| 747 | 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 | 759 | /* Now consume following elements while they are contiguous */ |
| 752 | − while (parser->range + parser->np <= parser->end) { | |
| 753 | − u32 flags; | |
| 760 | + while (parser->range + np <= parser->end) { | |
| 761 | + u32 flags = 0; | |
| 754 | 762 | u64 pci_addr, cpu_addr, size; |
| 755 | 763 | |
| 756 | − flags = of_bus_pci_get_flags(parser->range); | |
| 757 | − pci_addr = of_read_number(parser->range + 1, ns); | |
| 764 | + if (parser->na == 3) | |
| 765 | + flags = of_bus_pci_get_flags(parser->range); | |
| 766 | + pci_addr = of_read_number(parser->range, na); | |
| 758 | 767 | if (parser->dma) |
| 759 | 768 | cpu_addr = of_translate_dma_address(parser->node, |
| 760 | 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 | 779 | break; |
| 771 | 780 | |
| 772 | 781 | range->size += size; |
| 773 | − parser->range += parser->np; | |
| 782 | + parser->range += np; | |
| 774 | 783 | } |
| 775 | 784 | |
| 776 | 785 | return range; |
| @@ -10,20 +10,27 @@ struct of_pci_range_parser { · 9 unmodified lines | ||
| 10 | 10 | struct device_node *node; |
| 11 | 11 | const __be32 *range; |
| 12 | 12 | const __be32 *end; |
| 13 | − int np; | |
| 13 | + int na; | |
| 14 | + int ns; | |
| 14 | 15 | int pna; |
| 15 | 16 | bool dma; |
| 16 | 17 | }; |
| 18 | +#define of_range_parser of_pci_range_parser | |
| 17 | 19 | |
| 18 | 20 | struct of_pci_range { |
| 19 | − u64 pci_addr; | |
| 21 | + union { | |
| 22 | + u64 pci_addr; | |
| 23 | + u64 bus_addr; | |
| 24 | + }; | |
| 20 | 25 | u64 cpu_addr; |
| 21 | 26 | u64 size; |
| 22 | 27 | u32 flags; |
| 23 | 28 | }; |
| 29 | +#define of_range of_pci_range | |
| 24 | 30 | |
| 25 | 31 | #define for_each_of_pci_range(parser, range) \ |
| 26 | 32 | for (; of_pci_range_parser_one(parser, range);) |
| 33 | +#define for_each_of_range for_each_of_pci_range | |
| 27 | 34 | |
| 28 | 35 | /* Translate a DMA address from device space to CPU space */ |
| 29 | 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 | 149 | #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */ |
| 143 | 150 | |
| 144 | 151 | #endif /* __OF_ADDRESS_H */ |
| 145 | − | |