#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/ioport.h>
#include <linux/irqchip/chained_irq.h>
#include <linux/irqdomain.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/msi.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_pci.h>
#include <linux/of_platform.h>
#include <linux/pci.h>
#include <linux/pci-ecam.h>
#include <linux/printk.h>
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/sizes.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/types.h>
#include "../pci.h"
#define BRCM_PCIE_CAP_REGS …
#define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1 …
#define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK …
#define PCIE_RC_CFG_VENDOR_SPCIFIC_REG1_LITTLE_ENDIAN …
#define PCIE_RC_CFG_PRIV1_ID_VAL3 …
#define PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK …
#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY …
#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK …
#define PCIE_RC_CFG_PRIV1_ROOT_CAP …
#define PCIE_RC_CFG_PRIV1_ROOT_CAP_L1SS_MODE_MASK …
#define PCIE_RC_DL_MDIO_ADDR …
#define PCIE_RC_DL_MDIO_WR_DATA …
#define PCIE_RC_DL_MDIO_RD_DATA …
#define PCIE_MISC_MISC_CTRL …
#define PCIE_MISC_MISC_CTRL_PCIE_RCB_64B_MODE_MASK …
#define PCIE_MISC_MISC_CTRL_PCIE_RCB_MPS_MODE_MASK …
#define PCIE_MISC_MISC_CTRL_SCB_ACCESS_EN_MASK …
#define PCIE_MISC_MISC_CTRL_CFG_READ_UR_MODE_MASK …
#define PCIE_MISC_MISC_CTRL_MAX_BURST_SIZE_MASK …
#define PCIE_MISC_MISC_CTRL_SCB0_SIZE_MASK …
#define PCIE_MISC_MISC_CTRL_SCB1_SIZE_MASK …
#define PCIE_MISC_MISC_CTRL_SCB2_SIZE_MASK …
#define SCB_SIZE_MASK(x) …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO …
#define PCIE_MEM_WIN0_LO(win) …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI …
#define PCIE_MEM_WIN0_HI(win) …
#define PCIE_MISC_RC_BAR1_CONFIG_LO …
#define PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK …
#define PCIE_MISC_RC_BAR2_CONFIG_LO …
#define PCIE_MISC_RC_BAR2_CONFIG_LO_SIZE_MASK …
#define PCIE_MISC_RC_BAR2_CONFIG_HI …
#define PCIE_MISC_RC_BAR3_CONFIG_LO …
#define PCIE_MISC_RC_BAR3_CONFIG_LO_SIZE_MASK …
#define PCIE_MISC_MSI_BAR_CONFIG_LO …
#define PCIE_MISC_MSI_BAR_CONFIG_HI …
#define PCIE_MISC_MSI_DATA_CONFIG …
#define PCIE_MISC_MSI_DATA_CONFIG_VAL_32 …
#define PCIE_MISC_MSI_DATA_CONFIG_VAL_8 …
#define PCIE_MISC_PCIE_CTRL …
#define PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK …
#define PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK …
#define PCIE_MISC_PCIE_STATUS …
#define PCIE_MISC_PCIE_STATUS_PCIE_PORT_MASK …
#define PCIE_MISC_PCIE_STATUS_PCIE_DL_ACTIVE_MASK …
#define PCIE_MISC_PCIE_STATUS_PCIE_PHYLINKUP_MASK …
#define PCIE_MISC_PCIE_STATUS_PCIE_LINK_IN_L23_MASK …
#define PCIE_MISC_REVISION …
#define BRCM_PCIE_HW_REV_33 …
#define BRCM_PCIE_HW_REV_3_20 …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_LIMIT_MASK …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_BASE_MASK …
#define PCIE_MEM_WIN0_BASE_LIMIT(win) …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI_BASE_MASK …
#define PCIE_MEM_WIN0_BASE_HI(win) …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI …
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI_LIMIT_MASK …
#define PCIE_MEM_WIN0_LIMIT_HI(win) …
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG …
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK …
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_L1SS_ENABLE_MASK …
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK …
#define PCIE_BMIPS_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK …
#define PCIE_CLKREQ_MASK …
#define PCIE_INTR2_CPU_BASE …
#define PCIE_MSI_INTR2_BASE …
#define MSI_INT_STATUS …
#define MSI_INT_CLR …
#define MSI_INT_MASK_SET …
#define MSI_INT_MASK_CLR …
#define PCIE_EXT_CFG_DATA …
#define PCIE_EXT_CFG_INDEX …
#define PCIE_RGR1_SW_INIT_1_PERST_MASK …
#define PCIE_RGR1_SW_INIT_1_PERST_SHIFT …
#define RGR1_SW_INIT_1_INIT_GENERIC_MASK …
#define RGR1_SW_INIT_1_INIT_GENERIC_SHIFT …
#define RGR1_SW_INIT_1_INIT_7278_MASK …
#define RGR1_SW_INIT_1_INIT_7278_SHIFT …
#define BRCM_NUM_PCIE_OUT_WINS …
#define BRCM_INT_PCI_MSI_NR …
#define BRCM_INT_PCI_MSI_LEGACY_NR …
#define BRCM_INT_PCI_MSI_SHIFT …
#define BRCM_INT_PCI_MSI_MASK …
#define BRCM_INT_PCI_MSI_LEGACY_MASK …
#define BRCM_MSI_TARGET_ADDR_LT_4GB …
#define BRCM_MSI_TARGET_ADDR_GT_4GB …
#define MDIO_PORT0 …
#define MDIO_DATA_MASK …
#define MDIO_PORT_MASK …
#define MDIO_REGAD_MASK …
#define MDIO_CMD_MASK …
#define MDIO_CMD_READ …
#define MDIO_CMD_WRITE …
#define MDIO_DATA_DONE_MASK …
#define MDIO_RD_DONE(x) …
#define MDIO_WT_DONE(x) …
#define SSC_REGS_ADDR …
#define SET_ADDR_OFFSET …
#define SSC_CNTL_OFFSET …
#define SSC_CNTL_OVRD_EN_MASK …
#define SSC_CNTL_OVRD_VAL_MASK …
#define SSC_STATUS_OFFSET …
#define SSC_STATUS_SSC_MASK …
#define SSC_STATUS_PLL_LOCK_MASK …
#define PCIE_BRCM_MAX_MEMC …
#define IDX_ADDR(pcie) …
#define DATA_ADDR(pcie) …
#define PCIE_RGR1_SW_INIT_1(pcie) …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_MASK …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_SHIFT …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_MASK …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_MASK …
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT …
struct brcm_pcie;
enum { … };
enum { … };
enum pcie_type { … };
struct pcie_cfg_data { … };
struct subdev_regulators { … };
struct brcm_msi { … };
struct brcm_pcie { … };
static inline bool is_bmips(const struct brcm_pcie *pcie)
{ … }
static int brcm_pcie_encode_ibar_size(u64 size)
{ … }
static u32 brcm_pcie_mdio_form_pkt(int port, int regad, int cmd)
{ … }
static int brcm_pcie_mdio_read(void __iomem *base, u8 port, u8 regad, u32 *val)
{ … }
static int brcm_pcie_mdio_write(void __iomem *base, u8 port,
u8 regad, u16 wrdata)
{ … }
static int brcm_pcie_set_ssc(struct brcm_pcie *pcie)
{ … }
static void brcm_pcie_set_gen(struct brcm_pcie *pcie, int gen)
{ … }
static void brcm_pcie_set_outbound_win(struct brcm_pcie *pcie,
unsigned int win, u64 cpu_addr,
u64 pcie_addr, u64 size)
{ … }
static struct irq_chip brcm_msi_irq_chip = …;
static struct msi_domain_info brcm_msi_domain_info = …;
static void brcm_pcie_msi_isr(struct irq_desc *desc)
{ … }
static void brcm_msi_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
{ … }
static int brcm_msi_set_affinity(struct irq_data *irq_data,
const struct cpumask *mask, bool force)
{ … }
static void brcm_msi_ack_irq(struct irq_data *data)
{ … }
static struct irq_chip brcm_msi_bottom_irq_chip = …;
static int brcm_msi_alloc(struct brcm_msi *msi, unsigned int nr_irqs)
{ … }
static void brcm_msi_free(struct brcm_msi *msi, unsigned long hwirq,
unsigned int nr_irqs)
{ … }
static int brcm_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
unsigned int nr_irqs, void *args)
{ … }
static void brcm_irq_domain_free(struct irq_domain *domain,
unsigned int virq, unsigned int nr_irqs)
{ … }
static const struct irq_domain_ops msi_domain_ops = …;
static int brcm_allocate_domains(struct brcm_msi *msi)
{ … }
static void brcm_free_domains(struct brcm_msi *msi)
{ … }
static void brcm_msi_remove(struct brcm_pcie *pcie)
{ … }
static void brcm_msi_set_regs(struct brcm_msi *msi)
{ … }
static int brcm_pcie_enable_msi(struct brcm_pcie *pcie)
{ … }
static bool brcm_pcie_rc_mode(struct brcm_pcie *pcie)
{ … }
static bool brcm_pcie_link_up(struct brcm_pcie *pcie)
{ … }
static void __iomem *brcm_pcie_map_bus(struct pci_bus *bus,
unsigned int devfn, int where)
{ … }
static void __iomem *brcm7425_pcie_map_bus(struct pci_bus *bus,
unsigned int devfn, int where)
{ … }
static void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie, u32 val)
{ … }
static void brcm_pcie_bridge_sw_init_set_7278(struct brcm_pcie *pcie, u32 val)
{ … }
static void brcm_pcie_perst_set_4908(struct brcm_pcie *pcie, u32 val)
{ … }
static void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val)
{ … }
static void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val)
{ … }
static int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
u64 *rc_bar2_size,
u64 *rc_bar2_offset)
{ … }
static int brcm_pcie_setup(struct brcm_pcie *pcie)
{ … }
static void brcm_extend_rbus_timeout(struct brcm_pcie *pcie)
{ … }
static void brcm_config_clkreq(struct brcm_pcie *pcie)
{ … }
static int brcm_pcie_start_link(struct brcm_pcie *pcie)
{ … }
static const char * const supplies[] = …;
static void *alloc_subdev_regulators(struct device *dev)
{ … }
static int brcm_pcie_add_bus(struct pci_bus *bus)
{ … }
static void brcm_pcie_remove_bus(struct pci_bus *bus)
{ … }
static void brcm_pcie_enter_l23(struct brcm_pcie *pcie)
{ … }
static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
{ … }
static inline int brcm_phy_start(struct brcm_pcie *pcie)
{ … }
static inline int brcm_phy_stop(struct brcm_pcie *pcie)
{ … }
static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
{ … }
static int pci_dev_may_wakeup(struct pci_dev *dev, void *data)
{ … }
static int brcm_pcie_suspend_noirq(struct device *dev)
{ … }
static int brcm_pcie_resume_noirq(struct device *dev)
{ … }
static void __brcm_pcie_remove(struct brcm_pcie *pcie)
{ … }
static void brcm_pcie_remove(struct platform_device *pdev)
{ … }
static const int pcie_offsets[] = …;
static const int pcie_offsets_bmips_7425[] = …;
static const struct pcie_cfg_data generic_cfg = …;
static const struct pcie_cfg_data bcm7425_cfg = …;
static const struct pcie_cfg_data bcm7435_cfg = …;
static const struct pcie_cfg_data bcm4908_cfg = …;
static const int pcie_offset_bcm7278[] = …;
static const struct pcie_cfg_data bcm7278_cfg = …;
static const struct pcie_cfg_data bcm2711_cfg = …;
static const struct of_device_id brcm_pcie_match[] = …;
static struct pci_ops brcm_pcie_ops = …;
static struct pci_ops brcm7425_pcie_ops = …;
static int brcm_pcie_probe(struct platform_device *pdev)
{ … }
MODULE_DEVICE_TABLE(of, brcm_pcie_match);
static const struct dev_pm_ops brcm_pcie_pm_ops = …;
static struct platform_driver brcm_pcie_driver = …;
module_platform_driver(…) …;
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;