Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d58cd64 authored by Jing Huang's avatar Jing Huang Committed by David S. Miller
Browse files

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: default avatarJing Huang <huangj@brocade.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e491c77e
Loading
Loading
Loading
Loading
+96 −46
Original line number Original line Diff line number Diff line
@@ -803,17 +803,72 @@ bfa_ioc_ct2_mac_reset(void __iomem *rb)
}
}


#define CT2_NFC_MAX_DELAY       1000
#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
static enum bfa_status
bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
{
{
	volatile u32 wgn, r32;
	volatile u32 wgn, r32;
	int i;
	u32 nfc_ver, i;


	/*
	 * Initialize PLL if not already done by NFC
	 */
	wgn = readl(rb + CT2_WGN_STATUS);
	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));
		writel(__HALT_NFC_CONTROLLER, (rb + CT2_NFC_CSR_SET_REG));
		for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
		for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
			r32 = readl(rb + CT2_NFC_CSR_SET_REG);
			r32 = readl(rb + CT2_NFC_CSR_SET_REG);
@@ -821,16 +876,38 @@ bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
				break;
				break;
			udelay(1000);
			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
	 * Mask the interrupts and clear any
	 * pending interrupts left by BIOS/EFI
	 * pending interrupts left by BIOS/EFI
	 */
	 */

	writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK));
	writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK));
	writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK));
	writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK));


	/* 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));
		r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
		if (r32 == 1) {
		if (r32 == 1) {
			writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
			writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
@@ -841,33 +918,6 @@ bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
			writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
			writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
			readl((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));
	}
	}


	bfa_ioc_ct2_mem_init(rb);
	bfa_ioc_ct2_mem_init(rb);
+6 −0
Original line number Original line Diff line number Diff line
@@ -339,10 +339,16 @@ enum {
#define __A2T_AHB_LOAD			0x00000800
#define __A2T_AHB_LOAD			0x00000800
#define __WGN_READY			0x00000400
#define __WGN_READY			0x00000400
#define __GLBL_PF_VF_CFG_RDY		0x00000200
#define __GLBL_PF_VF_CFG_RDY		0x00000200
#define CT2_NFC_CSR_CLR_REG             0x00027420
#define CT2_NFC_CSR_SET_REG		0x00027424
#define CT2_NFC_CSR_SET_REG		0x00027424
#define __HALT_NFC_CONTROLLER		0x00000002
#define __HALT_NFC_CONTROLLER		0x00000002
#define __NFC_CONTROLLER_HALTED		0x00001000
#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 CT2_CSI_MAC0_CONTROL_REG	0x000270d0
#define __CSI_MAC_RESET			0x00000010
#define __CSI_MAC_RESET			0x00000010
#define __CSI_MAC_AHB_RESET		0x00000008
#define __CSI_MAC_AHB_RESET		0x00000008