msys: axp-amc: align NFC code
- update mvBoardTclkGet and mvCpuPllClkGet with values for AXP
- add auxiliary routine for setting NAND ECC clock for AXP
- add necessary registers' defines
Change-Id: I1d29983c035dcada4a274ba783f04406399d78b0
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Signed-off-by: Omri Itach <omrii@marvell.com>
Reviewed-on: http://vgitil04.il.marvell.com:8080/20557
Tested-by: Star_Automation <star@marvell.com>
diff --git a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
index 4b9dd07..ee941b2 100755
--- a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
@@ -546,7 +546,15 @@
*******************************************************************************/
MV_U32 mvBoardTclkGet(MV_VOID)
{
- return 200000000; /* constant Tclock @ 200MHz (not Sampled@Reset) */
+ if (mvCtrlDevFamilyIdGet(0) != MV_78460_DEV_ID)
+ /* constant Tclock @ 200MHz (not Sampled@Reset) */
+ return MV_BOARD_TCLK_200MHZ;
+
+ if ((MV_REG_READ(MPP_SAMPLE_AT_RESET(0)) & MSAR_TCLK_MASK) != 0)
+ return MV_BOARD_TCLK_200MHZ;
+ else
+ return MV_BOARD_TCLK_250MHZ;
+
}
/*******************************************************************************
diff --git a/board/mv_ebu/msys/msys_family/cpu/mvCpu.c b/board/mv_ebu/msys/msys_family/cpu/mvCpu.c
index 796940f..785dfe5 100644
--- a/board/mv_ebu/msys/msys_family/cpu/mvCpu.c
+++ b/board/mv_ebu/msys/msys_family/cpu/mvCpu.c
@@ -180,7 +180,12 @@
MV_CPUDDR_MODE bc2ClockRatioTbl[8] = MV_CPU_DDR_CLK_TBL_BC2;
MV_CPUDDR_MODE ac3ClockRatioTbl[8] = MV_CPU_DDR_CLK_TBL_AC3;
MV_U16 family = mvCtrlDevFamilyIdGet(0);
- MV_U32 sar2 = MV_DFX_REG_READ(DFX_DEVICE_SAR_REG(1));
+ MV_U32 sar2;
+
+ if (family == MV_78460_DEV_ID)
+ return AXP_PLL_IN_CLK;
+
+ sar2 = MV_DFX_REG_READ(DFX_DEVICE_SAR_REG(1));
idx = MSAR_CPU_DDR_CLK(0, sar2);
switch (family) {
diff --git a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvLib.c b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvLib.c
index 659d689..2a45c4b 100755
--- a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvLib.c
+++ b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvLib.c
@@ -1776,6 +1776,53 @@
}
/*******************************************************************************
+* mvCtrlNandClkSetAxp
+*
+* DESCRIPTION:
+* Set the division ratio of ECC Clock for AXP
+*
+*******************************************************************************/
+static int mvCtrlNandClkSetAxp(int nfc_clk_freq, MV_U32 pll_clk)
+{
+ int divider;
+
+ /* Set the division ratio of ECC Clock 0x00018748[13:8] (by default it's
+ * double of core clock)
+ */
+ MV_U32 nVal = MV_REG_READ(AXP_CORE_DIV_CLK_CTRL(1));
+
+ /* Calculate nand divider for requested nfc_clk_freq. If integer divider
+ * cannot be achieved, it will be rounded-up, which will result in
+ * setting the closest lower frequency.
+ * ECC engine clock = (PLL frequency / divider)
+ * NFC clock = ECC clock / 2
+ */
+ divider = DIV_ROUND_UP(pll_clk, (2 * nfc_clk_freq));
+ DB(mvOsPrintf("%s: divider %d\n", __func__, divider));
+
+ nVal &= ~(AXP_NAND_ECC_DIVCLK_RATIO_MASK);
+ nVal |= (divider << AXP_NAND_ECC_DIVCLK_RATIO_OFFS);
+ MV_REG_WRITE(AXP_CORE_DIV_CLK_CTRL(1), nVal);
+
+ /* Set reload force of ECC clock 0x00018740[7:0] to 0x2 (meaning you
+ * will force only the ECC clock)
+ */
+ nVal = MV_REG_READ(AXP_CORE_DIV_CLK_CTRL(0));
+ nVal &= ~(AXP_CORE_DIVCLK_RELOAD_FORCE_MASK);
+ nVal |= AXP_CORE_DIVCLK_RELOAD_FORCE_VAL;
+ MV_REG_WRITE(AXP_CORE_DIV_CLK_CTRL(0), nVal);
+
+ /* Set reload ratio bit 0x00018740[8] to 1'b1 */
+ MV_REG_BIT_SET(AXP_CORE_DIV_CLK_CTRL(0), AXP_CORE_DIVCLK_RELOAD_RATIO_MASK);
+ mvOsDelay(1); /* msec */
+ /* Set reload ratio bit 0x00018740[8] to 0'b1 */
+ MV_REG_BIT_RESET(AXP_CORE_DIV_CLK_CTRL(0), AXP_CORE_DIVCLK_RELOAD_RATIO_MASK);
+
+ /* Return calculated nand clock frequency */
+ return (pll_clk)/(2 * divider);
+}
+
+/*******************************************************************************
* mvCtrlNandClkSet
*
* DESCRIPTION:
@@ -1793,9 +1840,14 @@
int mvCtrlNandClkSet(int nfc_clk_freq)
{
int divider;
- MV_U32 nVal = MV_DFX_REG_READ(CORE_DIV_CLK_CTRL(2));
+ MV_U32 nVal;
MV_U32 pll_clk = mvCpuPllClkGet();
+ if (mvCtrlDevFamilyIdGet(0) == MV_78460_DEV_ID)
+ return mvCtrlNandClkSetAxp(nfc_clk_freq, pll_clk);
+
+ nVal = MV_DFX_REG_READ(CORE_DIV_CLK_CTRL(2));
+
/*
* Calculate nand divider for requested nfc_clk_freq. If integer divider
* cannot be achieved, it will be rounded-up, which will result in
diff --git a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
index cb05eb4..c4f6f6a6 100644
--- a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
+++ b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
@@ -279,10 +279,23 @@
#define CORE_DIV_CLK_CTRL(num) (DFX_CORE_DIVCLK_CONTROL0_REG + ((num) * 0x4))
-
#define DFX_TEMPERATURE_SENSOR_LSB_CTRL_REG 0xF8070
#define DFX_TEMPERATURE_SENSOR_MSB_CTRL_REG 0xF8074
#define DFX_TEMPERATURE_SENSOR_STATUS_REG 0xF8078
+
+/* Core Divider Clock Control - AXP only */
+#define AXP_CORE_DIV_CLK_CTRL(num) (0x18740 + ((num) * 0x8))
+
+#define AXP_CORE_DIVCLK_RELOAD_FORCE_OFFS 0
+#define AXP_CORE_DIVCLK_RELOAD_FORCE_MASK (0xFF << AXP_CORE_DIVCLK_RELOAD_FORCE_OFFS)
+#define AXP_CORE_DIVCLK_RELOAD_FORCE_VAL (0x2 << AXP_CORE_DIVCLK_RELOAD_FORCE_OFFS)
+
+#define AXP_NAND_ECC_DIVCLK_RATIO_OFFS 8
+#define AXP_NAND_ECC_DIVCLK_RATIO_MASK (0x3F << AXP_NAND_ECC_DIVCLK_RATIO_OFFS)
+
+#define AXP_CORE_DIVCLK_RELOAD_RATIO_OFFS 8
+#define AXP_CORE_DIVCLK_RELOAD_RATIO_MASK (1 << AXP_CORE_DIVCLK_RELOAD_RATIO_OFFS)
+
/* definition for caculate Temperature */
#define TEMPERATURE_OFFSET (596)
#define TEMPERATURE_FACTOR (2154)
@@ -351,6 +364,9 @@
#define MSAR_TCLK_OFFS 28
#define MSAR_TCLK_MASK (0x1 << MSAR_TCLK_OFFS)
+/* PLL(CPU) input clock - AXP only */
+#define AXP_PLL_IN_CLK _2GHz
+
#ifndef MV_ASMLANGUAGE
#define MV_CPU_CLK_TBL_AXP { 1000, 1066, 1200, 1333, 1500, 1666, 1800, 2000,\