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

PCI: mediatek: Use devm_of_pci_get_host_bridge_resources() to parse DT

Use the devm_of_pci_get_host_bridge_resources() API in place of the PCI OF
DT parser.

Signed-off-by: Honghui Zhang <honghui.zhang@mediatek.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Ryder Lee <ryder.lee@mediatek.com>

authored by

Honghui Zhang and committed by
Lorenzo Pieralisi
0c0f2f93 65102238

+27 -74
+27 -74
drivers/pci/controller/pcie-mediatek.c
··· 197 197 * @dev: pointer to PCIe device 198 198 * @base: IO mapped register base 199 199 * @free_ck: free-run reference clock 200 - * @io: IO resource 201 - * @pio: PIO resource 202 200 * @mem: non-prefetchable memory resource 203 - * @busn: bus range 204 - * @offset: IO / Memory offset 205 201 * @ports: pointer to PCIe port information 206 202 * @soc: pointer to SoC-dependent operations 203 + * @busnr: root bus number 207 204 */ 208 205 struct mtk_pcie { 209 206 struct device *dev; 210 207 void __iomem *base; 211 208 struct clk *free_ck; 212 209 213 - struct resource io; 214 - struct resource pio; 215 210 struct resource mem; 216 - struct resource busn; 217 - struct { 218 - resource_size_t mem; 219 - resource_size_t io; 220 - } offset; 221 211 struct list_head ports; 222 212 const struct mtk_pcie_soc *soc; 213 + unsigned int busnr; 223 214 }; 224 215 225 216 static void mtk_pcie_subsys_powerdown(struct mtk_pcie *pcie) ··· 1036 1045 { 1037 1046 struct device *dev = pcie->dev; 1038 1047 struct device_node *node = dev->of_node, *child; 1039 - struct of_pci_range_parser parser; 1040 - struct of_pci_range range; 1041 - struct resource res; 1042 1048 struct mtk_pcie_port *port, *tmp; 1049 + struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie); 1050 + struct list_head *windows = &host->windows; 1051 + struct resource_entry *win, *tmp_win; 1052 + resource_size_t io_base; 1043 1053 int err; 1044 1054 1045 - if (of_pci_range_parser_init(&parser, node)) { 1046 - dev_err(dev, "missing \"ranges\" property\n"); 1047 - return -EINVAL; 1048 - } 1055 + err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, 1056 + windows, &io_base); 1057 + if (err) 1058 + return err; 1049 1059 1050 - for_each_of_pci_range(&parser, &range) { 1051 - err = of_pci_range_to_resource(&range, node, &res); 1052 - if (err < 0) 1053 - return err; 1060 + err = devm_request_pci_bus_resources(dev, windows); 1061 + if (err < 0) 1062 + return err; 1054 1063 1055 - switch (res.flags & IORESOURCE_TYPE_BITS) { 1064 + /* Get the I/O and memory ranges from DT */ 1065 + resource_list_for_each_entry_safe(win, tmp_win, windows) { 1066 + switch (resource_type(win->res)) { 1056 1067 case IORESOURCE_IO: 1057 - pcie->offset.io = res.start - range.pci_addr; 1058 - 1059 - memcpy(&pcie->pio, &res, sizeof(res)); 1060 - pcie->pio.name = node->full_name; 1061 - 1062 - pcie->io.start = range.cpu_addr; 1063 - pcie->io.end = range.cpu_addr + range.size - 1; 1064 - pcie->io.flags = IORESOURCE_MEM; 1065 - pcie->io.name = "I/O"; 1066 - 1067 - memcpy(&res, &pcie->io, sizeof(res)); 1068 + err = devm_pci_remap_iospace(dev, win->res, io_base); 1069 + if (err) { 1070 + dev_warn(dev, "error %d: failed to map resource %pR\n", 1071 + err, win->res); 1072 + resource_list_destroy_entry(win); 1073 + } 1068 1074 break; 1069 - 1070 1075 case IORESOURCE_MEM: 1071 - pcie->offset.mem = res.start - range.pci_addr; 1072 - 1073 - memcpy(&pcie->mem, &res, sizeof(res)); 1076 + memcpy(&pcie->mem, win->res, sizeof(*win->res)); 1074 1077 pcie->mem.name = "non-prefetchable"; 1075 1078 break; 1079 + case IORESOURCE_BUS: 1080 + pcie->busnr = win->res->start; 1081 + break; 1076 1082 } 1077 - } 1078 - 1079 - err = of_pci_parse_bus_range(node, &pcie->busn); 1080 - if (err < 0) { 1081 - dev_err(dev, "failed to parse bus ranges property: %d\n", err); 1082 - pcie->busn.name = node->name; 1083 - pcie->busn.start = 0; 1084 - pcie->busn.end = 0xff; 1085 - pcie->busn.flags = IORESOURCE_BUS; 1086 1083 } 1087 1084 1088 1085 for_each_available_child_of_node(node, child) { ··· 1104 1125 return 0; 1105 1126 } 1106 1127 1107 - static int mtk_pcie_request_resources(struct mtk_pcie *pcie) 1108 - { 1109 - struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie); 1110 - struct list_head *windows = &host->windows; 1111 - struct device *dev = pcie->dev; 1112 - int err; 1113 - 1114 - pci_add_resource_offset(windows, &pcie->pio, pcie->offset.io); 1115 - pci_add_resource_offset(windows, &pcie->mem, pcie->offset.mem); 1116 - pci_add_resource(windows, &pcie->busn); 1117 - 1118 - err = devm_request_pci_bus_resources(dev, windows); 1119 - if (err < 0) 1120 - return err; 1121 - 1122 - err = devm_pci_remap_iospace(dev, &pcie->pio, pcie->io.start); 1123 - if (err) 1124 - return err; 1125 - 1126 - return 0; 1127 - } 1128 - 1129 1128 static int mtk_pcie_probe(struct platform_device *pdev) 1130 1129 { 1131 1130 struct device *dev = &pdev->dev; ··· 1126 1169 if (err) 1127 1170 return err; 1128 1171 1129 - err = mtk_pcie_request_resources(pcie); 1130 - if (err) 1131 - goto put_resources; 1132 - 1133 - host->busnr = pcie->busn.start; 1172 + host->busnr = pcie->busnr; 1134 1173 host->dev.parent = pcie->dev; 1135 1174 host->ops = pcie->soc->ops; 1136 1175 host->map_irq = of_irq_parse_and_map_pci;