|
@@ -284,35 +284,16 @@ static int thunder_pem_config_write(struct pci_bus *bus, unsigned int devfn,
|
|
|
return pci_generic_config_write(bus, devfn, where, size, val);
|
|
|
}
|
|
|
|
|
|
-static int thunder_pem_init(struct pci_config_window *cfg)
|
|
|
+static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,
|
|
|
+ struct resource *res_pem)
|
|
|
{
|
|
|
- struct device *dev = cfg->parent;
|
|
|
- resource_size_t bar4_start;
|
|
|
- struct resource *res_pem;
|
|
|
struct thunder_pem_pci *pem_pci;
|
|
|
- struct platform_device *pdev;
|
|
|
-
|
|
|
- /* Only OF support for now */
|
|
|
- if (!dev->of_node)
|
|
|
- return -EINVAL;
|
|
|
+ resource_size_t bar4_start;
|
|
|
|
|
|
pem_pci = devm_kzalloc(dev, sizeof(*pem_pci), GFP_KERNEL);
|
|
|
if (!pem_pci)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- pdev = to_platform_device(dev);
|
|
|
-
|
|
|
- /*
|
|
|
- * The second register range is the PEM bridge to the PCIe
|
|
|
- * bus. It has a different config access method than those
|
|
|
- * devices behind the bridge.
|
|
|
- */
|
|
|
- res_pem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
|
|
- if (!res_pem) {
|
|
|
- dev_err(dev, "missing \"reg[1]\"property\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
pem_pci->pem_reg_base = devm_ioremap(dev, res_pem->start, 0x10000);
|
|
|
if (!pem_pci->pem_reg_base)
|
|
|
return -ENOMEM;
|
|
@@ -332,9 +313,32 @@ static int thunder_pem_init(struct pci_config_window *cfg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int thunder_pem_platform_init(struct pci_config_window *cfg)
|
|
|
+{
|
|
|
+ struct device *dev = cfg->parent;
|
|
|
+ struct platform_device *pdev = to_platform_device(dev);
|
|
|
+ struct resource *res_pem;
|
|
|
+
|
|
|
+ if (!dev->of_node)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The second register range is the PEM bridge to the PCIe
|
|
|
+ * bus. It has a different config access method than those
|
|
|
+ * devices behind the bridge.
|
|
|
+ */
|
|
|
+ res_pem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
|
|
+ if (!res_pem) {
|
|
|
+ dev_err(dev, "missing \"reg[1]\"property\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return thunder_pem_init(dev, cfg, res_pem);
|
|
|
+}
|
|
|
+
|
|
|
static struct pci_ecam_ops pci_thunder_pem_ops = {
|
|
|
.bus_shift = 24,
|
|
|
- .init = thunder_pem_init,
|
|
|
+ .init = thunder_pem_platform_init,
|
|
|
.pci_ops = {
|
|
|
.map_bus = pci_ecam_map_bus,
|
|
|
.read = thunder_pem_config_read,
|