Commit | Line | Data |
---|---|---|
35ff9477 J |
1 | /* |
2 | * Copyright 2016 Broadcom | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License, version 2, as | |
6 | * published by the Free Software Foundation (the "GPL"). | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | * General Public License version 2 (GPLv2) for more details. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * version 2 (GPLv2) along with this source code. | |
15 | */ | |
16 | #ifndef DRIVERS_PCI_ECAM_H | |
17 | #define DRIVERS_PCI_ECAM_H | |
18 | ||
19 | #include <linux/kernel.h> | |
20 | #include <linux/platform_device.h> | |
21 | ||
22 | /* | |
23 | * struct to hold pci ops and bus shift of the config window | |
24 | * for a PCI controller. | |
25 | */ | |
26 | struct pci_config_window; | |
27 | struct pci_ecam_ops { | |
28 | unsigned int bus_shift; | |
29 | struct pci_ops pci_ops; | |
30 | int (*init)(struct device *, | |
31 | struct pci_config_window *); | |
32 | }; | |
33 | ||
34 | /* | |
35 | * struct to hold the mappings of a config space window. This | |
36 | * is expected to be used as sysdata for PCI controllers that | |
37 | * use ECAM. | |
38 | */ | |
39 | struct pci_config_window { | |
40 | struct resource res; | |
41 | struct resource busr; | |
42 | void *priv; | |
43 | struct pci_ecam_ops *ops; | |
44 | union { | |
45 | void __iomem *win; /* 64-bit single mapping */ | |
46 | void __iomem **winp; /* 32-bit per-bus mapping */ | |
47 | }; | |
48 | }; | |
49 | ||
50 | /* create and free pci_config_window */ | |
51 | struct pci_config_window *pci_ecam_create(struct device *dev, | |
52 | struct resource *cfgres, struct resource *busr, | |
53 | struct pci_ecam_ops *ops); | |
54 | void pci_ecam_free(struct pci_config_window *cfg); | |
55 | ||
56 | /* map_bus when ->sysdata is an instance of pci_config_window */ | |
57 | void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn, | |
58 | int where); | |
59 | /* default ECAM ops */ | |
60 | extern struct pci_ecam_ops pci_generic_ecam_ops; | |
61 | ||
1958e717 J |
62 | #ifdef CONFIG_PCI_HOST_GENERIC |
63 | /* for DT-based PCI controllers that support ECAM */ | |
64 | int pci_host_common_probe(struct platform_device *pdev, | |
65 | struct pci_ecam_ops *ops); | |
66 | #endif | |
35ff9477 | 67 | #endif |