diff options
Diffstat (limited to 'drivers/pci/controller/pci-mvebu.c')
| -rw-r--r-- | drivers/pci/controller/pci-mvebu.c | 33 | 
1 files changed, 17 insertions, 16 deletions
| diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c index 153a64676bc9..c39978b750ec 100644 --- a/drivers/pci/controller/pci-mvebu.c +++ b/drivers/pci/controller/pci-mvebu.c @@ -71,7 +71,6 @@ struct mvebu_pcie {  	struct platform_device *pdev;  	struct mvebu_pcie_port *ports;  	struct msi_controller *msi; -	struct list_head resources;  	struct resource io;  	struct resource realio;  	struct resource mem; @@ -105,6 +104,7 @@ struct mvebu_pcie_port {  	struct mvebu_pcie_window memwin;  	struct mvebu_pcie_window iowin;  	u32 saved_pcie_stat; +	struct resource regs;  };  static inline void mvebu_writel(struct mvebu_pcie_port *port, u32 val, u32 reg) @@ -149,7 +149,9 @@ static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie_port *port, int nr)  /*   * Setup PCIE BARs and Address Decode Wins: - * BAR[0,2] -> disabled, BAR[1] -> covers all DRAM banks + * BAR[0] -> internal registers (needed for MSI) + * BAR[1] -> covers all DRAM banks + * BAR[2] -> Disabled   * WIN[0-3] -> DRAM bank[0-3]   */  static void mvebu_pcie_setup_wins(struct mvebu_pcie_port *port) @@ -203,6 +205,12 @@ static void mvebu_pcie_setup_wins(struct mvebu_pcie_port *port)  	mvebu_writel(port, 0, PCIE_BAR_HI_OFF(1));  	mvebu_writel(port, ((size - 1) & 0xffff0000) | 1,  		     PCIE_BAR_CTRL_OFF(1)); + +	/* +	 * Point BAR[0] to the device's internal registers. +	 */ +	mvebu_writel(port, round_down(port->regs.start, SZ_1M), PCIE_BAR_LO_OFF(0)); +	mvebu_writel(port, 0, PCIE_BAR_HI_OFF(0));  }  static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) @@ -708,14 +716,13 @@ static void __iomem *mvebu_pcie_map_registers(struct platform_device *pdev,  					      struct device_node *np,  					      struct mvebu_pcie_port *port)  { -	struct resource regs;  	int ret = 0; -	ret = of_address_to_resource(np, 0, ®s); +	ret = of_address_to_resource(np, 0, &port->regs);  	if (ret)  		return (void __iomem *)ERR_PTR(ret); -	return devm_ioremap_resource(&pdev->dev, ®s); +	return devm_ioremap_resource(&pdev->dev, &port->regs);  }  #define DT_FLAGS_TO_TYPE(flags)       (((flags) >> 24) & 0x03) @@ -961,17 +968,16 @@ static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)  {  	struct device *dev = &pcie->pdev->dev;  	struct device_node *np = dev->of_node; +	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);  	int ret; -	INIT_LIST_HEAD(&pcie->resources); -  	/* Get the bus range */  	ret = of_pci_parse_bus_range(np, &pcie->busn);  	if (ret) {  		dev_err(dev, "failed to parse bus-range property: %d\n", ret);  		return ret;  	} -	pci_add_resource(&pcie->resources, &pcie->busn); +	pci_add_resource(&bridge->windows, &pcie->busn);  	/* Get the PCIe memory aperture */  	mvebu_mbus_get_pcie_mem_aperture(&pcie->mem); @@ -981,7 +987,7 @@ static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)  	}  	pcie->mem.name = "PCI MEM"; -	pci_add_resource(&pcie->resources, &pcie->mem); +	pci_add_resource(&bridge->windows, &pcie->mem);  	/* Get the PCIe IO aperture */  	mvebu_mbus_get_pcie_io_aperture(&pcie->io); @@ -994,10 +1000,10 @@ static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)  					 resource_size(&pcie->io) - 1);  		pcie->realio.name = "PCI I/O"; -		pci_add_resource(&pcie->resources, &pcie->realio); +		pci_add_resource(&bridge->windows, &pcie->realio);  	} -	return devm_request_pci_bus_resources(dev, &pcie->resources); +	return devm_request_pci_bus_resources(dev, &bridge->windows);  }  /* @@ -1118,13 +1124,8 @@ static int mvebu_pcie_probe(struct platform_device *pdev)  	pcie->nports = i; -	list_splice_init(&pcie->resources, &bridge->windows); -	bridge->dev.parent = dev;  	bridge->sysdata = pcie; -	bridge->busnr = 0;  	bridge->ops = &mvebu_pcie_ops; -	bridge->map_irq = of_irq_parse_and_map_pci; -	bridge->swizzle_irq = pci_common_swizzle;  	bridge->align_resource = mvebu_pcie_align_resource;  	bridge->msi = pcie->msi; |