Skip to content

Commit 669cbc7

Browse files
robherringLorenzo Pieralisi
authored and
Lorenzo Pieralisi
committed
PCI: Move DT resource setup into devm_pci_alloc_host_bridge()
Now that pci_parse_request_of_pci_ranges() callers just setup pci_host_bridge.windows and dma_ranges directly and don't need the bus range returned, we can just initialize them when allocating the pci_host_bridge struct. With this, pci_parse_request_of_pci_ranges() becomes a static function. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rob Herring <[email protected]> Signed-off-by: Lorenzo Pieralisi <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Cc: Lorenzo Pieralisi <[email protected]> Cc: Bjorn Helgaas <[email protected]>
1 parent 4a95756 commit 669cbc7

24 files changed

+36
-155
lines changed

drivers/pci/controller/cadence/pcie-cadence-host.c

-6
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,8 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
171171
static int cdns_pcie_host_init(struct device *dev,
172172
struct cdns_pcie_rc *rc)
173173
{
174-
struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rc);
175174
int err;
176175

177-
/* Parse our PCI ranges and request their resources */
178-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL, NULL);
179-
if (err)
180-
return err;
181-
182176
err = cdns_pcie_host_init_root_port(rc);
183177
if (err)
184178
return err;

drivers/pci/controller/dwc/pcie-designware-host.c

-5
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
346346
if (!bridge)
347347
return -ENOMEM;
348348

349-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
350-
&bridge->dma_ranges, NULL);
351-
if (ret)
352-
return ret;
353-
354349
/* Get the I/O and memory ranges from DT */
355350
resource_list_for_each_entry(win, &bridge->windows) {
356351
switch (resource_type(win->res)) {

drivers/pci/controller/mobiveil/pcie-mobiveil-host.c

-8
Original file line numberDiff line numberDiff line change
@@ -577,14 +577,6 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie)
577577
if (!mobiveil_pcie_is_bridge(pcie))
578578
return -ENODEV;
579579

580-
/* parse the host bridge base addresses from the device tree file */
581-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
582-
&bridge->dma_ranges, NULL);
583-
if (ret) {
584-
dev_err(dev, "Getting bridge resources failed\n");
585-
return ret;
586-
}
587-
588580
/*
589581
* configure all inbound and outbound windows and prepare the RC for
590582
* config access

drivers/pci/controller/pci-aardvark.c

-7
Original file line numberDiff line numberDiff line change
@@ -1130,13 +1130,6 @@ static int advk_pcie_probe(struct platform_device *pdev)
11301130
return ret;
11311131
}
11321132

1133-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
1134-
&bridge->dma_ranges, NULL);
1135-
if (ret) {
1136-
dev_err(dev, "Failed to parse resources\n");
1137-
return ret;
1138-
}
1139-
11401133
pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
11411134
"reset-gpios", 0,
11421135
GPIOD_OUT_LOW,

drivers/pci/controller/pci-ftpci100.c

-5
Original file line numberDiff line numberDiff line change
@@ -465,11 +465,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
465465
if (IS_ERR(p->base))
466466
return PTR_ERR(p->base);
467467

468-
ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
469-
&host->dma_ranges, NULL);
470-
if (ret)
471-
return ret;
472-
473468
win = resource_list_first_type(&host->windows, IORESOURCE_IO);
474469
if (win) {
475470
io = win->res;

drivers/pci/controller/pci-host-common.c

+6-7
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,20 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
2525
{
2626
int err;
2727
struct resource cfgres;
28-
struct resource *bus_range = NULL;
28+
struct resource_entry *bus;
2929
struct pci_config_window *cfg;
3030

31-
/* Parse our PCI ranges and request their resources */
32-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL, &bus_range);
33-
if (err)
34-
return ERR_PTR(err);
35-
3631
err = of_address_to_resource(dev->of_node, 0, &cfgres);
3732
if (err) {
3833
dev_err(dev, "missing \"reg\" property\n");
3934
return ERR_PTR(err);
4035
}
4136

42-
cfg = pci_ecam_create(dev, &cfgres, bus_range, ops);
37+
bus = resource_list_first_type(&bridge->windows, IORESOURCE_BUS);
38+
if (!bus)
39+
return ERR_PTR(-ENODEV);
40+
41+
cfg = pci_ecam_create(dev, &cfgres, bus->res, ops);
4342
if (IS_ERR(cfg))
4443
return cfg;
4544

drivers/pci/controller/pci-loongson.c

-7
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,6 @@ static int loongson_pci_probe(struct platform_device *pdev)
218218
}
219219
}
220220

221-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
222-
&bridge->dma_ranges, NULL);
223-
if (err) {
224-
dev_err(dev, "failed to get bridge resources\n");
225-
return err;
226-
}
227-
228221
bridge->sysdata = priv;
229222
bridge->ops = &loongson_pci_ops;
230223
bridge->map_irq = loongson_map_irq;

drivers/pci/controller/pci-rcar-gen2.c

-6
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ static int rcar_pci_probe(struct platform_device *pdev)
282282
struct rcar_pci_priv *priv;
283283
struct pci_host_bridge *bridge;
284284
void __iomem *reg;
285-
int ret;
286285

287286
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*priv));
288287
if (!bridge)
@@ -315,11 +314,6 @@ static int rcar_pci_probe(struct platform_device *pdev)
315314
return priv->irq;
316315
}
317316

318-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
319-
&bridge->dma_ranges, NULL);
320-
if (ret)
321-
return ret;
322-
323317
bridge->ops = &rcar_pci_ops;
324318

325319
pci_add_flags(PCI_REASSIGN_ALL_BUS);

drivers/pci/controller/pci-tegra.c

-6
Original file line numberDiff line numberDiff line change
@@ -2682,12 +2682,6 @@ static int tegra_pcie_probe(struct platform_device *pdev)
26822682
INIT_LIST_HEAD(&pcie->ports);
26832683
pcie->dev = dev;
26842684

2685-
err = pci_parse_request_of_pci_ranges(dev, &host->windows, NULL, NULL);
2686-
if (err) {
2687-
dev_err(dev, "Getting bridge resources failed\n");
2688-
return err;
2689-
}
2690-
26912685
err = tegra_pcie_parse_dt(pcie);
26922686
if (err < 0)
26932687
return err;

drivers/pci/controller/pci-v3-semi.c

-5
Original file line numberDiff line numberDiff line change
@@ -764,11 +764,6 @@ static int v3_pci_probe(struct platform_device *pdev)
764764
if (IS_ERR(v3->config_base))
765765
return PTR_ERR(v3->config_base);
766766

767-
ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
768-
&host->dma_ranges, NULL);
769-
if (ret)
770-
return ret;
771-
772767
/* Get and request error IRQ resource */
773768
irq = platform_get_irq(pdev, 0);
774769
if (irq < 0) {

drivers/pci/controller/pci-versatile.c

+1-6
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static int versatile_pci_probe(struct platform_device *pdev)
6767
struct device *dev = &pdev->dev;
6868
struct resource *res;
6969
struct resource_entry *entry;
70-
int ret, i, myslot = -1, mem = 1;
70+
int i, myslot = -1, mem = 1;
7171
u32 val;
7272
void __iomem *local_pci_cfg_base;
7373
struct pci_host_bridge *bridge;
@@ -89,11 +89,6 @@ static int versatile_pci_probe(struct platform_device *pdev)
8989
if (IS_ERR(versatile_cfg_base[1]))
9090
return PTR_ERR(versatile_cfg_base[1]);
9191

92-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
93-
NULL, NULL);
94-
if (ret)
95-
return ret;
96-
9792
resource_list_for_each_entry(entry, &bridge->windows) {
9893
if (resource_type(entry->res) == IORESOURCE_MEM) {
9994
writel(entry->res->start >> 28, PCI_IMAP(mem));

drivers/pci/controller/pci-xgene.c

-5
Original file line numberDiff line numberDiff line change
@@ -614,11 +614,6 @@ static int xgene_pcie_probe(struct platform_device *pdev)
614614
if (ret)
615615
return ret;
616616

617-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
618-
&bridge->dma_ranges, NULL);
619-
if (ret)
620-
return ret;
621-
622617
ret = xgene_pcie_setup(port);
623618
if (ret)
624619
return ret;

drivers/pci/controller/pcie-altera.c

-7
Original file line numberDiff line numberDiff line change
@@ -794,13 +794,6 @@ static int altera_pcie_probe(struct platform_device *pdev)
794794
return ret;
795795
}
796796

797-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
798-
&bridge->dma_ranges, NULL);
799-
if (ret) {
800-
dev_err(dev, "Failed add resources\n");
801-
return ret;
802-
}
803-
804797
ret = altera_pcie_init_irq_domain(pcie);
805798
if (ret) {
806799
dev_err(dev, "Failed creating IRQ Domain\n");

drivers/pci/controller/pcie-brcmstb.c

-5
Original file line numberDiff line numberDiff line change
@@ -970,11 +970,6 @@ static int brcm_pcie_probe(struct platform_device *pdev)
970970

971971
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
972972

973-
ret = pci_parse_request_of_pci_ranges(pcie->dev, &bridge->windows,
974-
&bridge->dma_ranges, NULL);
975-
if (ret)
976-
return ret;
977-
978973
ret = clk_prepare_enable(pcie->clk);
979974
if (ret) {
980975
dev_err(&pdev->dev, "could not enable clock\n");

drivers/pci/controller/pcie-iproc-platform.c

-7
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
9595
if (IS_ERR(pcie->phy))
9696
return PTR_ERR(pcie->phy);
9797

98-
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
99-
&bridge->dma_ranges, NULL);
100-
if (ret) {
101-
dev_err(dev, "unable to get PCI host bridge resources\n");
102-
return ret;
103-
}
104-
10598
/* PAXC doesn't support legacy IRQs, skip mapping */
10699
switch (pcie->type) {
107100
case IPROC_PCIE_PAXC:

drivers/pci/controller/pcie-mediatek.c

-7
Original file line numberDiff line numberDiff line change
@@ -1027,15 +1027,8 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
10271027
struct device *dev = pcie->dev;
10281028
struct device_node *node = dev->of_node, *child;
10291029
struct mtk_pcie_port *port, *tmp;
1030-
struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1031-
struct list_head *windows = &host->windows;
10321030
int err;
10331031

1034-
err = pci_parse_request_of_pci_ranges(dev, windows,
1035-
&host->dma_ranges, NULL);
1036-
if (err)
1037-
return err;
1038-
10391032
for_each_available_child_of_node(node, child) {
10401033
int slot;
10411034

drivers/pci/controller/pcie-rcar-host.c

-5
Original file line numberDiff line numberDiff line change
@@ -913,11 +913,6 @@ static int rcar_pcie_probe(struct platform_device *pdev)
913913
pcie->dev = dev;
914914
platform_set_drvdata(pdev, host);
915915

916-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
917-
&bridge->dma_ranges, NULL);
918-
if (err)
919-
return err;
920-
921916
pm_runtime_enable(pcie->dev);
922917
err = pm_runtime_get_sync(pcie->dev);
923918
if (err < 0) {

drivers/pci/controller/pcie-rockchip-host.c

-5
Original file line numberDiff line numberDiff line change
@@ -989,11 +989,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
989989
if (err < 0)
990990
goto err_deinit_port;
991991

992-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
993-
&bridge->dma_ranges, NULL);
994-
if (err)
995-
goto err_remove_irq_domain;
996-
997992
err = rockchip_pcie_cfg_atu(rockchip);
998993
if (err)
999994
goto err_remove_irq_domain;

drivers/pci/controller/pcie-xilinx-nwl.c

-7
Original file line numberDiff line numberDiff line change
@@ -838,13 +838,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)
838838
return err;
839839
}
840840

841-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
842-
&bridge->dma_ranges, NULL);
843-
if (err) {
844-
dev_err(dev, "Getting bridge resources failed\n");
845-
return err;
846-
}
847-
848841
err = nwl_pcie_init_irq_domain(pcie);
849842
if (err) {
850843
dev_err(dev, "Failed creating IRQ Domain\n");

drivers/pci/controller/pcie-xilinx.c

-7
Original file line numberDiff line numberDiff line change
@@ -641,13 +641,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
641641
return err;
642642
}
643643

644-
err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
645-
&bridge->dma_ranges, NULL);
646-
if (err) {
647-
dev_err(dev, "Getting bridge resources failed\n");
648-
return err;
649-
}
650-
651644
bridge->sysdata = port;
652645
bridge->ops = &xilinx_pcie_ops;
653646
bridge->map_irq = of_irq_parse_and_map_pci;

drivers/pci/of.c

+17-20
Original file line numberDiff line numberDiff line change
@@ -521,28 +521,26 @@ int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
521521
EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
522522
#endif /* CONFIG_OF_IRQ */
523523

524-
int pci_parse_request_of_pci_ranges(struct device *dev,
525-
struct list_head *resources,
526-
struct list_head *ib_resources,
527-
struct resource **bus_range)
524+
static int pci_parse_request_of_pci_ranges(struct device *dev,
525+
struct pci_host_bridge *bridge)
528526
{
529527
int err, res_valid = 0;
530528
resource_size_t iobase;
531529
struct resource_entry *win, *tmp;
532530

533-
INIT_LIST_HEAD(resources);
534-
if (ib_resources)
535-
INIT_LIST_HEAD(ib_resources);
536-
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
537-
ib_resources, &iobase);
531+
INIT_LIST_HEAD(&bridge->windows);
532+
INIT_LIST_HEAD(&bridge->dma_ranges);
533+
534+
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &bridge->windows,
535+
&bridge->dma_ranges, &iobase);
538536
if (err)
539537
return err;
540538

541-
err = devm_request_pci_bus_resources(dev, resources);
539+
err = devm_request_pci_bus_resources(dev, &bridge->windows);
542540
if (err)
543-
goto out_release_res;
541+
return err;
544542

545-
resource_list_for_each_entry_safe(win, tmp, resources) {
543+
resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
546544
struct resource *res = win->res;
547545

548546
switch (resource_type(res)) {
@@ -557,23 +555,22 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
557555
case IORESOURCE_MEM:
558556
res_valid |= !(res->flags & IORESOURCE_PREFETCH);
559557
break;
560-
case IORESOURCE_BUS:
561-
if (bus_range)
562-
*bus_range = res;
563-
break;
564558
}
565559
}
566560

567561
if (!res_valid)
568562
dev_warn(dev, "non-prefetchable memory resource required\n");
569563

570564
return 0;
565+
}
571566

572-
out_release_res:
573-
pci_free_resource_list(resources);
574-
return err;
567+
int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
568+
{
569+
if (!dev->of_node)
570+
return 0;
571+
572+
return pci_parse_request_of_pci_ranges(dev, bridge);
575573
}
576-
EXPORT_SYMBOL_GPL(pci_parse_request_of_pci_ranges);
577574

578575
#endif /* CONFIG_PCI */
579576

drivers/pci/pci.h

+8
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,8 @@ void pci_release_of_node(struct pci_dev *dev);
627627
void pci_set_bus_of_node(struct pci_bus *bus);
628628
void pci_release_bus_of_node(struct pci_bus *bus);
629629

630+
int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge);
631+
630632
#else
631633
static inline int
632634
of_pci_parse_bus_range(struct device_node *node, struct resource *res)
@@ -650,6 +652,12 @@ static inline void pci_set_of_node(struct pci_dev *dev) { }
650652
static inline void pci_release_of_node(struct pci_dev *dev) { }
651653
static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
652654
static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
655+
656+
static inline int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
657+
{
658+
return 0;
659+
}
660+
653661
#endif /* CONFIG_OF */
654662

655663
#ifdef CONFIG_PCIEAER

drivers/pci/probe.c

+4
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,10 @@ struct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev,
635635
if (ret)
636636
return NULL;
637637

638+
ret = devm_of_pci_bridge_init(dev, bridge);
639+
if (ret)
640+
return NULL;
641+
638642
return bridge;
639643
}
640644
EXPORT_SYMBOL(devm_pci_alloc_host_bridge);

0 commit comments

Comments
 (0)