|
@@ -24,7 +24,7 @@
|
|
#include <linux/regmap.h>
|
|
#include <linux/regmap.h>
|
|
#include "../pci.h"
|
|
#include "../pci.h"
|
|
|
|
|
|
-#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
|
|
|
|
|
+#if defined(CONFIG_PCI_HISI) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
|
|
|
|
|
|
static int hisi_pcie_acpi_rd_conf(struct pci_bus *bus, u32 devfn, int where,
|
|
static int hisi_pcie_acpi_rd_conf(struct pci_bus *bus, u32 devfn, int where,
|
|
int size, u32 *val)
|
|
int size, u32 *val)
|
|
@@ -74,6 +74,8 @@ static void __iomem *hisi_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
|
|
return pci_ecam_map_bus(bus, devfn, where);
|
|
return pci_ecam_map_bus(bus, devfn, where);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
|
|
|
+
|
|
static int hisi_pcie_init(struct pci_config_window *cfg)
|
|
static int hisi_pcie_init(struct pci_config_window *cfg)
|
|
{
|
|
{
|
|
struct device *dev = cfg->parent;
|
|
struct device *dev = cfg->parent;
|
|
@@ -321,4 +323,62 @@ static struct platform_driver hisi_pcie_driver = {
|
|
};
|
|
};
|
|
builtin_platform_driver(hisi_pcie_driver);
|
|
builtin_platform_driver(hisi_pcie_driver);
|
|
|
|
|
|
|
|
+static int hisi_pcie_almost_ecam_probe(struct platform_device *pdev)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = &pdev->dev;
|
|
|
|
+ struct pci_ecam_ops *ops;
|
|
|
|
+
|
|
|
|
+ ops = (struct pci_ecam_ops *)of_device_get_match_data(dev);
|
|
|
|
+ return pci_host_common_probe(pdev, ops);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = cfg->parent;
|
|
|
|
+ struct platform_device *pdev = to_platform_device(dev);
|
|
|
|
+ struct resource *res;
|
|
|
|
+ void __iomem *reg_base;
|
|
|
|
+
|
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
|
|
|
+ if (!res) {
|
|
|
|
+ dev_err(dev, "missing \"reg[1]\"property\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ reg_base = devm_ioremap(dev, res->start, resource_size(res));
|
|
|
|
+ if (!reg_base)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ cfg->priv = reg_base;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct pci_ecam_ops hisi_pcie_platform_ops = {
|
|
|
|
+ .bus_shift = 20,
|
|
|
|
+ .init = hisi_pcie_platform_init,
|
|
|
|
+ .pci_ops = {
|
|
|
|
+ .map_bus = hisi_pcie_map_bus,
|
|
|
|
+ .read = hisi_pcie_acpi_rd_conf,
|
|
|
|
+ .write = hisi_pcie_acpi_wr_conf,
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct of_device_id hisi_pcie_almost_ecam_of_match[] = {
|
|
|
|
+ {
|
|
|
|
+ .compatible = "hisilicon,pcie-almost-ecam",
|
|
|
|
+ .data = (void *) &hisi_pcie_platform_ops,
|
|
|
|
+ },
|
|
|
|
+ {},
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_driver hisi_pcie_almost_ecam_driver = {
|
|
|
|
+ .probe = hisi_pcie_almost_ecam_probe,
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "hisi-pcie-almost-ecam",
|
|
|
|
+ .of_match_table = hisi_pcie_almost_ecam_of_match,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+builtin_platform_driver(hisi_pcie_almost_ecam_driver);
|
|
|
|
+
|
|
|
|
+#endif
|
|
#endif
|
|
#endif
|