diff options
Diffstat (limited to 'drivers/pci/controller/pcie-rcar-host.c')
| -rw-r--r-- | drivers/pci/controller/pcie-rcar-host.c | 95 | 
1 files changed, 9 insertions, 86 deletions
| diff --git a/drivers/pci/controller/pcie-rcar-host.c b/drivers/pci/controller/pcie-rcar-host.c index d210a36561be..cdc0963f154e 100644 --- a/drivers/pci/controller/pcie-rcar-host.c +++ b/drivers/pci/controller/pcie-rcar-host.c @@ -53,8 +53,6 @@ struct rcar_pcie_host {  	struct device		*dev;  	struct phy		*phy;  	void __iomem		*base; -	struct list_head	resources; -	int			root_bus_nr;  	struct clk		*bus_clk;  	struct			rcar_msi msi;  	int			(*phy_init_fn)(struct rcar_pcie_host *host); @@ -100,22 +98,14 @@ static int rcar_pcie_config_access(struct rcar_pcie_host *host,  		if (dev != 0)  			return PCIBIOS_DEVICE_NOT_FOUND; -		if (access_type == RCAR_PCI_ACCESS_READ) { +		if (access_type == RCAR_PCI_ACCESS_READ)  			*data = rcar_pci_read_reg(pcie, PCICONF(index)); -		} else { -			/* Keep an eye out for changes to the root bus number */ -			if (pci_is_root_bus(bus) && (reg == PCI_PRIMARY_BUS)) -				host->root_bus_nr = *data & 0xff; - +		else  			rcar_pci_write_reg(pcie, *data, PCICONF(index)); -		}  		return PCIBIOS_SUCCESSFUL;  	} -	if (host->root_bus_nr < 0) -		return PCIBIOS_DEVICE_NOT_FOUND; -  	/* Clear errors */  	rcar_pci_write_reg(pcie, rcar_pci_read_reg(pcie, PCIEERRFR), PCIEERRFR); @@ -124,7 +114,7 @@ static int rcar_pcie_config_access(struct rcar_pcie_host *host,  		PCIE_CONF_DEV(dev) | PCIE_CONF_FUNC(func) | reg, PCIECAR);  	/* Enable the configuration access */ -	if (bus->parent->number == host->root_bus_nr) +	if (pci_is_root_bus(bus->parent))  		rcar_pci_write_reg(pcie, CONFIG_SEND_ENABLE | TYPE0, PCIECCTLR);  	else  		rcar_pci_write_reg(pcie, CONFIG_SEND_ENABLE | TYPE1, PCIECCTLR); @@ -212,38 +202,6 @@ static struct pci_ops rcar_pcie_ops = {  	.write	= rcar_pcie_write_conf,  }; -static int rcar_pcie_setup(struct list_head *resource, -			   struct rcar_pcie_host *host) -{ -	struct resource_entry *win; -	int i = 0; - -	/* Setup PCI resources */ -	resource_list_for_each_entry(win, &host->resources) { -		struct resource *res = win->res; - -		if (!res->flags) -			continue; - -		switch (resource_type(res)) { -		case IORESOURCE_IO: -		case IORESOURCE_MEM: -			rcar_pcie_set_outbound(&host->pcie, i, win); -			i++; -			break; -		case IORESOURCE_BUS: -			host->root_bus_nr = res->start; -			break; -		default: -			continue; -		} - -		pci_add_resource(resource, res); -	} - -	return 1; -} -  static void rcar_pcie_force_speedup(struct rcar_pcie *pcie)  {  	struct device *dev = pcie->dev; @@ -301,6 +259,7 @@ done:  static void rcar_pcie_hw_enable(struct rcar_pcie_host *host)  {  	struct rcar_pcie *pcie = &host->pcie; +	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(host);  	struct resource_entry *win;  	LIST_HEAD(res);  	int i = 0; @@ -309,7 +268,7 @@ static void rcar_pcie_hw_enable(struct rcar_pcie_host *host)  	rcar_pcie_force_speedup(pcie);  	/* Setup PCI resources */ -	resource_list_for_each_entry(win, &host->resources) { +	resource_list_for_each_entry(win, &bridge->windows) {  		struct resource *res = win->res;  		if (!res->flags) @@ -328,42 +287,17 @@ static void rcar_pcie_hw_enable(struct rcar_pcie_host *host)  static int rcar_pcie_enable(struct rcar_pcie_host *host)  {  	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(host); -	struct rcar_pcie *pcie = &host->pcie; -	struct device *dev = pcie->dev; -	struct pci_bus *bus, *child; -	int ret; - -	/* Try setting 5 GT/s link speed */ -	rcar_pcie_force_speedup(pcie); -	rcar_pcie_setup(&bridge->windows, host); +	rcar_pcie_hw_enable(host);  	pci_add_flags(PCI_REASSIGN_ALL_BUS); -	bridge->dev.parent = dev;  	bridge->sysdata = host; -	bridge->busnr = host->root_bus_nr;  	bridge->ops = &rcar_pcie_ops; -	bridge->map_irq = of_irq_parse_and_map_pci; -	bridge->swizzle_irq = pci_common_swizzle;  	if (IS_ENABLED(CONFIG_PCI_MSI))  		bridge->msi = &host->msi.chip; -	ret = pci_scan_root_bus_bridge(bridge); -	if (ret < 0) -		return ret; - -	bus = bridge->bus; - -	pci_bus_size_bridges(bus); -	pci_bus_assign_resources(bus); - -	list_for_each_entry(child, &bus->children, node) -		pcie_bus_configure_settings(child); - -	pci_bus_add_devices(bus); - -	return 0; +	return pci_host_probe(bridge);  }  static int phy_wait_for_ack(struct rcar_pcie *pcie) @@ -968,7 +902,7 @@ static int rcar_pcie_probe(struct platform_device *pdev)  	int err;  	struct pci_host_bridge *bridge; -	bridge = pci_alloc_host_bridge(sizeof(*host)); +	bridge = devm_pci_alloc_host_bridge(dev, sizeof(*host));  	if (!bridge)  		return -ENOMEM; @@ -977,16 +911,11 @@ static int rcar_pcie_probe(struct platform_device *pdev)  	pcie->dev = dev;  	platform_set_drvdata(pdev, host); -	err = pci_parse_request_of_pci_ranges(dev, &host->resources, -					      &bridge->dma_ranges, NULL); -	if (err) -		goto err_free_bridge; -  	pm_runtime_enable(pcie->dev);  	err = pm_runtime_get_sync(pcie->dev);  	if (err < 0) {  		dev_err(pcie->dev, "pm_runtime_get_sync failed\n"); -		goto err_pm_disable; +		goto err_pm_put;  	}  	err = rcar_pcie_get_resources(host); @@ -1057,13 +986,7 @@ err_unmap_msi_irqs:  err_pm_put:  	pm_runtime_put(dev); - -err_pm_disable:  	pm_runtime_disable(dev); -	pci_free_resource_list(&host->resources); - -err_free_bridge: -	pci_free_host_bridge(bridge);  	return err;  } |