mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 00:24:12 +08:00
PCI: versatile: Use pci_parse_request_of_pci_ranges()
Convert ARM Versatile host bridge to use the common pci_parse_request_of_pci_ranges(). There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling. Signed-off-by: Rob Herring <robh@kernel.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
3c65ebff8f
commit
f9f4fdaa35
@ -62,65 +62,16 @@ static struct pci_ops pci_versatile_ops = {
|
||||
.write = pci_generic_config_write,
|
||||
};
|
||||
|
||||
static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
|
||||
struct list_head *res)
|
||||
{
|
||||
int err, mem = 1, res_valid = 0;
|
||||
resource_size_t iobase;
|
||||
struct resource_entry *win, *tmp;
|
||||
|
||||
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, res, &iobase);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = devm_request_pci_bus_resources(dev, res);
|
||||
if (err)
|
||||
goto out_release_res;
|
||||
|
||||
resource_list_for_each_entry_safe(win, tmp, res) {
|
||||
struct resource *res = win->res;
|
||||
|
||||
switch (resource_type(res)) {
|
||||
case IORESOURCE_IO:
|
||||
err = devm_pci_remap_iospace(dev, res, iobase);
|
||||
if (err) {
|
||||
dev_warn(dev, "error %d: failed to map resource %pR\n",
|
||||
err, res);
|
||||
resource_list_destroy_entry(win);
|
||||
}
|
||||
break;
|
||||
case IORESOURCE_MEM:
|
||||
res_valid |= !(res->flags & IORESOURCE_PREFETCH);
|
||||
|
||||
writel(res->start >> 28, PCI_IMAP(mem));
|
||||
writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
|
||||
mem++;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (res_valid)
|
||||
return 0;
|
||||
|
||||
dev_err(dev, "non-prefetchable memory resource required\n");
|
||||
err = -EINVAL;
|
||||
|
||||
out_release_res:
|
||||
pci_free_resource_list(res);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int versatile_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
int ret, i, myslot = -1;
|
||||
struct resource_entry *entry;
|
||||
int ret, i, myslot = -1, mem = 1;
|
||||
u32 val;
|
||||
void __iomem *local_pci_cfg_base;
|
||||
struct pci_bus *bus, *child;
|
||||
struct pci_host_bridge *bridge;
|
||||
LIST_HEAD(pci_res);
|
||||
|
||||
bridge = devm_pci_alloc_host_bridge(dev, 0);
|
||||
if (!bridge)
|
||||
@ -141,10 +92,18 @@ static int versatile_pci_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(versatile_cfg_base[1]))
|
||||
return PTR_ERR(versatile_cfg_base[1]);
|
||||
|
||||
ret = versatile_pci_parse_request_of_pci_ranges(dev, &pci_res);
|
||||
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
resource_list_for_each_entry(entry, &bridge->windows) {
|
||||
if (resource_type(entry->res) == IORESOURCE_MEM) {
|
||||
writel(entry->res->start >> 28, PCI_IMAP(mem));
|
||||
writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
|
||||
mem++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to discover the PCI core first to configure itself
|
||||
* before the main PCI probing is performed
|
||||
@ -197,7 +156,6 @@ static int versatile_pci_probe(struct platform_device *pdev)
|
||||
pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
|
||||
pci_add_flags(PCI_REASSIGN_ALL_BUS);
|
||||
|
||||
list_splice_init(&pci_res, &bridge->windows);
|
||||
bridge->dev.parent = dev;
|
||||
bridge->sysdata = NULL;
|
||||
bridge->busnr = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user