mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
bna: Flash controller ioc pll init fixes
Added NFC pause/resume logic. We only do NFC pause/resume if NFC version is greater than 0x143 and it was halted before, otherwise we revert to old NFC halt mechanism. Made changes to avoid clearing off the interrupts during the initial pll initialization. Signed-off-by: Jing Huang <huangj@brocade.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e491c77ed3
commit
4d58cd6470
2 changed files with 102 additions and 46 deletions
|
@ -199,9 +199,9 @@ bfa_ioc_ct_notify_fail(struct bfa_ioc *ioc)
|
|||
* Host to LPU mailbox message addresses
|
||||
*/
|
||||
static const struct {
|
||||
u32 hfn_mbox;
|
||||
u32 lpu_mbox;
|
||||
u32 hfn_pgn;
|
||||
u32 hfn_mbox;
|
||||
u32 lpu_mbox;
|
||||
u32 hfn_pgn;
|
||||
} ct_fnreg[] = {
|
||||
{ HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 },
|
||||
{ HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 },
|
||||
|
@ -803,17 +803,72 @@ bfa_ioc_ct2_mac_reset(void __iomem *rb)
|
|||
}
|
||||
|
||||
#define CT2_NFC_MAX_DELAY 1000
|
||||
#define CT2_NFC_VER_VALID 0x143
|
||||
#define BFA_IOC_PLL_POLL 1000000
|
||||
|
||||
static bool
|
||||
bfa_ioc_ct2_nfc_halted(void __iomem *rb)
|
||||
{
|
||||
volatile u32 r32;
|
||||
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
if (r32 & __NFC_CONTROLLER_HALTED)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_nfc_resume(void __iomem *rb)
|
||||
{
|
||||
volatile u32 r32;
|
||||
int i;
|
||||
|
||||
writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_CLR_REG);
|
||||
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
if (!(r32 & __NFC_CONTROLLER_HALTED))
|
||||
return;
|
||||
udelay(1000);
|
||||
}
|
||||
BUG_ON(1);
|
||||
}
|
||||
|
||||
static enum bfa_status
|
||||
bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
|
||||
{
|
||||
volatile u32 wgn, r32;
|
||||
int i;
|
||||
u32 nfc_ver, i;
|
||||
|
||||
/*
|
||||
* Initialize PLL if not already done by NFC
|
||||
*/
|
||||
wgn = readl(rb + CT2_WGN_STATUS);
|
||||
if (!(wgn & __GLBL_PF_VF_CFG_RDY)) {
|
||||
|
||||
nfc_ver = readl(rb + CT2_RSC_GPR15_REG);
|
||||
|
||||
if ((wgn == (__A2T_AHB_LOAD | __WGN_READY)) &&
|
||||
(nfc_ver >= CT2_NFC_VER_VALID)) {
|
||||
if (bfa_ioc_ct2_nfc_halted(rb))
|
||||
bfa_ioc_ct2_nfc_resume(rb);
|
||||
writel(__RESET_AND_START_SCLK_LCLK_PLLS,
|
||||
rb + CT2_CSI_FW_CTL_SET_REG);
|
||||
|
||||
for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
|
||||
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
if (r32 & __RESET_AND_START_SCLK_LCLK_PLLS)
|
||||
break;
|
||||
}
|
||||
BUG_ON(!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS));
|
||||
|
||||
for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
|
||||
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
if (!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS))
|
||||
break;
|
||||
}
|
||||
BUG_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS);
|
||||
udelay(1000);
|
||||
|
||||
r32 = readl(rb + CT2_CSI_FW_CTL_REG);
|
||||
BUG_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS);
|
||||
} else {
|
||||
writel(__HALT_NFC_CONTROLLER, (rb + CT2_NFC_CSR_SET_REG));
|
||||
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
|
@ -821,53 +876,48 @@ bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
|
|||
break;
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
bfa_ioc_ct2_mac_reset(rb);
|
||||
bfa_ioc_ct2_sclk_init(rb);
|
||||
bfa_ioc_ct2_lclk_init(rb);
|
||||
|
||||
/* release soft reset on s_clk & l_clk */
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET,
|
||||
rb + CT2_APP_PLL_SCLK_CTL_REG);
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
|
||||
rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
}
|
||||
|
||||
/* Announce flash device presence, if flash was corrupted. */
|
||||
if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) {
|
||||
r32 = readl((rb + PSS_GPIO_OUT_REG));
|
||||
writel(r32 & ~1, rb + PSS_GPIO_OUT_REG);
|
||||
r32 = readl((rb + PSS_GPIO_OE_REG));
|
||||
writel(r32 | 1, rb + PSS_GPIO_OE_REG);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mask the interrupts and clear any
|
||||
* pending interrupts left by BIOS/EFI
|
||||
*/
|
||||
|
||||
writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK));
|
||||
writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK));
|
||||
|
||||
r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
}
|
||||
r32 = readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
}
|
||||
|
||||
bfa_ioc_ct2_mac_reset(rb);
|
||||
bfa_ioc_ct2_sclk_init(rb);
|
||||
bfa_ioc_ct2_lclk_init(rb);
|
||||
|
||||
/*
|
||||
* release soft reset on s_clk & l_clk
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
writel((r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET),
|
||||
(rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* release soft reset on s_clk & l_clk
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
|
||||
(rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* Announce flash device presence, if flash was corrupted.
|
||||
*/
|
||||
if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) {
|
||||
r32 = readl((rb + PSS_GPIO_OUT_REG));
|
||||
writel((r32 & ~1), (rb + PSS_GPIO_OUT_REG));
|
||||
r32 = readl((rb + PSS_GPIO_OE_REG));
|
||||
writel((r32 | 1), (rb + PSS_GPIO_OE_REG));
|
||||
/* For first time initialization, no need to clear interrupts */
|
||||
r32 = readl(rb + HOST_SEM5_REG);
|
||||
if (r32 & 0x1) {
|
||||
r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
}
|
||||
r32 = readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
}
|
||||
}
|
||||
|
||||
bfa_ioc_ct2_mem_init(rb);
|
||||
|
|
|
@ -339,10 +339,16 @@ enum {
|
|||
#define __A2T_AHB_LOAD 0x00000800
|
||||
#define __WGN_READY 0x00000400
|
||||
#define __GLBL_PF_VF_CFG_RDY 0x00000200
|
||||
#define CT2_NFC_CSR_CLR_REG 0x00027420
|
||||
#define CT2_NFC_CSR_SET_REG 0x00027424
|
||||
#define __HALT_NFC_CONTROLLER 0x00000002
|
||||
#define __NFC_CONTROLLER_HALTED 0x00001000
|
||||
|
||||
#define CT2_RSC_GPR15_REG 0x0002765c
|
||||
#define CT2_CSI_FW_CTL_REG 0x00027080
|
||||
#define __RESET_AND_START_SCLK_LCLK_PLLS 0x00010000
|
||||
#define CT2_CSI_FW_CTL_SET_REG 0x00027088
|
||||
|
||||
#define CT2_CSI_MAC0_CONTROL_REG 0x000270d0
|
||||
#define __CSI_MAC_RESET 0x00000010
|
||||
#define __CSI_MAC_AHB_RESET 0x00000008
|
||||
|
|
Loading…
Reference in a new issue