Commit 52cae4c7 authored by Hou Zhiqiang's avatar Hou Zhiqiang Committed by Lorenzo Pieralisi

PCI: mobiveil: Allow mobiveil_host_init() to be used to re-init host

Allow the mobiveil_host_init() function to be used to re-init
host controller's PAB and GPEX CSR register block, since the NXP
integrated Mobiveil IP has to reset and then re-init the PAB
and GPEX CSR registers upon hot-reset.
Signed-off-by: default avatarHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarSubrahmanya Lingappa <l.subrahmanya@mobiveil.co.in>
Reviewed-by: default avatarAndrew Murray <amurray@thegoodpenguin.co.uk>
parent fc99b331
...@@ -221,18 +221,23 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie) ...@@ -221,18 +221,23 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)
writel_relaxed(1, pcie->apb_csr_base + MSI_ENABLE_OFFSET); writel_relaxed(1, pcie->apb_csr_base + MSI_ENABLE_OFFSET);
} }
static int mobiveil_host_init(struct mobiveil_pcie *pcie) int mobiveil_host_init(struct mobiveil_pcie *pcie, bool reinit)
{ {
struct mobiveil_root_port *rp = &pcie->rp; struct mobiveil_root_port *rp = &pcie->rp;
struct pci_host_bridge *bridge = rp->bridge; struct pci_host_bridge *bridge = rp->bridge;
u32 value, pab_ctrl, type; u32 value, pab_ctrl, type;
struct resource_entry *win; struct resource_entry *win;
/* setup bus numbers */ pcie->ib_wins_configured = 0;
value = mobiveil_csr_readl(pcie, PCI_PRIMARY_BUS); pcie->ob_wins_configured = 0;
value &= 0xff000000;
value |= 0x00ff0100; if (!reinit) {
mobiveil_csr_writel(pcie, value, PCI_PRIMARY_BUS); /* setup bus numbers */
value = mobiveil_csr_readl(pcie, PCI_PRIMARY_BUS);
value &= 0xff000000;
value |= 0x00ff0100;
mobiveil_csr_writel(pcie, value, PCI_PRIMARY_BUS);
}
/* /*
* program Bus Master Enable Bit in Command Register in PAB Config * program Bus Master Enable Bit in Command Register in PAB Config
...@@ -576,7 +581,7 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie) ...@@ -576,7 +581,7 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie)
* configure all inbound and outbound windows and prepare the RC for * configure all inbound and outbound windows and prepare the RC for
* config access * config access
*/ */
ret = mobiveil_host_init(pcie); ret = mobiveil_host_init(pcie, false);
if (ret) { if (ret) {
dev_err(dev, "Failed to initialize host\n"); dev_err(dev, "Failed to initialize host\n");
return ret; return ret;
......
...@@ -166,6 +166,7 @@ struct mobiveil_pcie { ...@@ -166,6 +166,7 @@ struct mobiveil_pcie {
}; };
int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie); int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie);
int mobiveil_host_init(struct mobiveil_pcie *pcie, bool reinit);
bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie); bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie);
int mobiveil_bringup_link(struct mobiveil_pcie *pcie); int mobiveil_bringup_link(struct mobiveil_pcie *pcie);
void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 cpu_addr, void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 cpu_addr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment