Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

of_address: Add bus type match for pci ranges parser

So the parser can be used to parse range property of ISA bus.

As they're all using PCI-like method of range property, there is no need
start a new parser.

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>

authored by

Jiaxun Yang and committed by
Thomas Bogendoerfer
2f96593e aa35a5ee

+21 -12
+17 -12
drivers/of/address.c
··· 49 49 u64 (*map)(__be32 *addr, const __be32 *range, 50 50 int na, int ns, int pna); 51 51 int (*translate)(__be32 *addr, u64 offset, int na); 52 + bool has_flags; 52 53 unsigned int (*get_flags)(const __be32 *addr); 53 54 }; 54 55 ··· 365 364 .count_cells = of_bus_pci_count_cells, 366 365 .map = of_bus_pci_map, 367 366 .translate = of_bus_pci_translate, 367 + .has_flags = true, 368 368 .get_flags = of_bus_pci_get_flags, 369 369 }, 370 370 #endif /* CONFIG_PCI */ ··· 377 375 .count_cells = of_bus_isa_count_cells, 378 376 .map = of_bus_isa_map, 379 377 .translate = of_bus_isa_translate, 378 + .has_flags = true, 380 379 .get_flags = of_bus_isa_get_flags, 381 380 }, 382 381 /* Default */ ··· 701 698 702 699 parser->node = node; 703 700 parser->pna = of_n_addr_cells(node); 704 - parser->na = of_bus_n_addr_cells(node); 705 - parser->ns = of_bus_n_size_cells(node); 706 701 parser->dma = !strcmp(name, "dma-ranges"); 702 + parser->bus = of_match_bus(node); 703 + 704 + parser->bus->count_cells(parser->node, &parser->na, &parser->ns); 707 705 708 706 parser->range = of_get_property(node, name, &rlen); 709 707 if (parser->range == NULL) ··· 736 732 int na = parser->na; 737 733 int ns = parser->ns; 738 734 int np = parser->pna + na + ns; 735 + int busflag_na = 0; 739 736 740 737 if (!range) 741 738 return NULL; ··· 744 739 if (!parser->range || parser->range + np > parser->end) 745 740 return NULL; 746 741 747 - if (parser->na == 3) 748 - range->flags = of_bus_pci_get_flags(parser->range); 749 - else 750 - range->flags = 0; 742 + range->flags = parser->bus->get_flags(parser->range); 751 743 752 - range->pci_addr = of_read_number(parser->range, na); 744 + /* A extra cell for resource flags */ 745 + if (parser->bus->has_flags) 746 + busflag_na = 1; 747 + 748 + range->bus_addr = of_read_number(parser->range + busflag_na, na - busflag_na); 753 749 754 750 if (parser->dma) 755 751 range->cpu_addr = of_translate_dma_address(parser->node, ··· 765 759 /* Now consume following elements while they are contiguous */ 766 760 while (parser->range + np <= parser->end) { 767 761 u32 flags = 0; 768 - u64 pci_addr, cpu_addr, size; 762 + u64 bus_addr, cpu_addr, size; 769 763 770 - if (parser->na == 3) 771 - flags = of_bus_pci_get_flags(parser->range); 772 - pci_addr = of_read_number(parser->range, na); 764 + flags = parser->bus->get_flags(parser->range); 765 + bus_addr = of_read_number(parser->range + busflag_na, na - busflag_na); 773 766 if (parser->dma) 774 767 cpu_addr = of_translate_dma_address(parser->node, 775 768 parser->range + na); ··· 779 774 780 775 if (flags != range->flags) 781 776 break; 782 - if (pci_addr != range->pci_addr + range->size || 777 + if (bus_addr != range->bus_addr + range->size || 783 778 cpu_addr != range->cpu_addr + range->size) 784 779 break; 785 780
+4
include/linux/of_address.h
··· 6 6 #include <linux/of.h> 7 7 #include <linux/io.h> 8 8 9 + struct of_bus; 10 + 9 11 struct of_pci_range_parser { 10 12 struct device_node *node; 13 + struct of_bus *bus; 11 14 const __be32 *range; 12 15 const __be32 *end; 13 16 int na; ··· 122 119 return NULL; 123 120 } 124 121 #endif 122 + #define of_range_parser_init of_pci_range_parser_init 125 123 126 124 #if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI) 127 125 extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,