In Jaguar2 SoC family there are 3 different pcb. Each of this needs
to configure the SerDes and the phys in different ways.
Therefore implement the function board_phy_config and serdes_cfg
and based on pcb configure them accordingly.

Signed-off-by: Horatiu Vultur <horatiu.vul...@microchip.com>
---
 board/mscc/jr2/jr2.c | 542 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 542 insertions(+)

diff --git a/board/mscc/jr2/jr2.c b/board/mscc/jr2/jr2.c
index 58a4a04..94e0c5d 100644
--- a/board/mscc/jr2/jr2.c
+++ b/board/mscc/jr2/jr2.c
@@ -6,6 +6,140 @@
 #include <common.h>
 #include <asm/io.h>
 #include <led.h>
+#include <miiphy.h>
+
+#define HSIO_ANA_SERDES1G_DES_CFG              0xac
+#define                HSIO_ANA_SERDES1G_DES_CFG_BW_HYST(x)            ((x) << 
1)
+#define                HSIO_ANA_SERDES1G_DES_CFG_BW_ANA(x)             ((x) << 
5)
+#define                HSIO_ANA_SERDES1G_DES_CFG_MBTR_CTRL(x)          ((x) << 
8)
+#define                HSIO_ANA_SERDES1G_DES_CFG_PHS_CTRL(x)           ((x) << 
13)
+#define HSIO_ANA_SERDES1G_IB_CFG               0xb0
+#define                HSIO_ANA_SERDES1G_IB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES1G_IB_CFG_EQ_GAIN(x)             ((x) << 
6)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_OFFSET_COMP        BIT(9)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_DETLEV             BIT(11)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ENA_CMV_TERM           BIT(13)
+#define                HSIO_ANA_SERDES1G_IB_CFG_DET_LEV(x)             ((x) << 
19)
+#define                HSIO_ANA_SERDES1G_IB_CFG_ACJTAG_HYST(x)         ((x) << 
24)
+#define HSIO_ANA_SERDES1G_OB_CFG               0xb4
+#define                HSIO_ANA_SERDES1G_OB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES1G_OB_CFG_VCM_CTRL(x)            ((x) << 
4)
+#define                HSIO_ANA_SERDES1G_OB_CFG_CMM_BIAS_CTRL(x)       ((x) << 
10)
+#define                HSIO_ANA_SERDES1G_OB_CFG_AMP_CTRL(x)            ((x) << 
13)
+#define                HSIO_ANA_SERDES1G_OB_CFG_SLP(x)                 ((x) << 
17)
+#define HSIO_ANA_SERDES1G_SER_CFG              0xb8
+#define HSIO_ANA_SERDES1G_COMMON_CFG           0xbc
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_IF_MODE            BIT(0)
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_ENA_LANE           BIT(18)
+#define                HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST            BIT(31)
+#define HSIO_ANA_SERDES1G_PLL_CFG              0xc0
+#define                HSIO_ANA_SERDES1G_PLL_CFG_FSM_ENA               BIT(7)
+#define                HSIO_ANA_SERDES1G_PLL_CFG_FSM_CTRL_DATA(x)      ((x) << 
8)
+#define                HSIO_ANA_SERDES1G_PLL_CFG_ENA_RC_DIV2           BIT(21)
+#define HSIO_DIG_SERDES1G_DFT_CFG0             0xc8
+#define HSIO_DIG_SERDES1G_TP_CFG               0xd4
+#define HSIO_DIG_SERDES1G_MISC_CFG             0xdc
+#define                HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST             BIT(0)
+#define HSIO_MCB_SERDES1G_CFG                  0xe8
+#define                HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT               BIT(31)
+#define                HSIO_MCB_SERDES1G_CFG_ADDR(x)                   (x)
+
+#define HSIO_ANA_SERDES6G_DES_CFG              0x11c
+#define                HSIO_ANA_SERDES6G_DES_CFG_SWAP_ANA              BIT(0)
+#define                HSIO_ANA_SERDES6G_DES_CFG_BW_ANA(x)             ((x) << 
1)
+#define                HSIO_ANA_SERDES6G_DES_CFG_SWAP_HYST             BIT(4)
+#define                HSIO_ANA_SERDES6G_DES_CFG_BW_HYST(x)            ((x) << 
5)
+#define                HSIO_ANA_SERDES6G_DES_CFG_CPMD_SEL(x)           ((x) << 
8)
+#define                HSIO_ANA_SERDES6G_DES_CFG_MBTR_CTRL(x)          ((x) << 
10)
+#define                HSIO_ANA_SERDES6G_DES_CFG_PHS_CTRL(x)           ((x) << 
13)
+#define HSIO_ANA_SERDES6G_IB_CFG               0x120
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_ENA                BIT(0)
+#define                HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA                BIT(1)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA                BIT(2)
+#define                HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA                BIT(3)
+#define                HSIO_ANA_SERDES6G_IB_CFG_CONCUR                 BIT(4)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA            BIT(5)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(x)     ((x) << 
7)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(x)      ((x) << 
9)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(x)     ((x) << 
11)
+#define                HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(x)      ((x) << 
13)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(x)     ((x) << 
15)
+#define                HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(x)       ((x) << 
18)
+#define                HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(x)            ((x) << 
20)
+#define                HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(x)            ((x) << 
24)
+#define                HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL              BIT(28)
+#define                HSIO_ANA_SERDES6G_IB_CFG_SOFSI(x)               ((x) << 
29)
+#define HSIO_ANA_SERDES6G_IB_CFG1              0x124
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET           BIT(4)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP               BIT(5)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID              BIT(6)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP               BIT(7)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_SCALY(x)              ((x) << 
8)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_TSDET(x)              ((x) << 
12)
+#define                HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(x)              ((x) << 
17)
+#define HSIO_ANA_SERDES6G_IB_CFG2              0x128
+#define                HSIO_ANA_SERDES6G_IB_CFG2_UREG(x)               (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_UMAX(x)               ((x) << 
3)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_TCALV(x)              ((x) << 
5)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OCALS(x)              ((x) << 
10)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OINFS(x)              ((x) << 
16)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_OINFI(x)              ((x) << 
22)
+#define                HSIO_ANA_SERDES6G_IB_CFG2_TINFV(x)              ((x) << 
27)
+#define HSIO_ANA_SERDES6G_IB_CFG3              0x12c
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_LP(x)             ((x) << 
6)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_MID(x)            ((x) << 
12)
+#define                HSIO_ANA_SERDES6G_IB_CFG3_INI_HP(x)             ((x) << 
18)
+#define HSIO_ANA_SERDES6G_IB_CFG4              0x130
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_LP(x)             ((x) << 
6)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_MID(x)            ((x) << 
12)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MAX_HP(x)             ((x) << 
18)
+#define HSIO_ANA_SERDES6G_IB_CFG5              0x134
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_OFFSET(x)         (x)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_LP(x)             ((x) << 
6)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_MID(x)            ((x) << 
12)
+#define                HSIO_ANA_SERDES6G_IB_CFG4_MIN_HP(x)             ((x) << 
18)
+#define HSIO_ANA_SERDES6G_OB_CFG               0x138
+#define                HSIO_ANA_SERDES6G_OB_CFG_RESISTOR_CTRL(x)       (x)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SR(x)                  ((x) << 
4)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SR_H                   BIT(8)
+#define                HSIO_ANA_SERDES6G_OB_CFG_SEL_RCTRL              BIT(9)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_COR                  BIT(10)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POST1(x)               ((x) << 
11)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_ADJ_PDR              BIT(16)
+#define                HSIO_ANA_SERDES6G_OB_CFG_R_ADJ_MUX              BIT(17)
+#define                HSIO_ANA_SERDES6G_OB_CFG_PREC(x)                ((x) << 
18)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POST0(x)               ((x) << 
23)
+#define                HSIO_ANA_SERDES6G_OB_CFG_POL                    BIT(29)
+#define                HSIO_ANA_SERDES6G_OB_CFG_ENA1V_MODE             BIT(30)
+#define                HSIO_ANA_SERDES6G_OB_CFG_IDLE                   BIT(31)
+#define HSIO_ANA_SERDES6G_OB_CFG1              0x13c
+#define                HSIO_ANA_SERDES6G_OB_CFG1_LEV(x)                (x)
+#define                HSIO_ANA_SERDES6G_OB_CFG1_ENA_CAS(x)            ((x) << 
6)
+#define HSIO_ANA_SERDES6G_SER_CFG              0x140
+#define HSIO_ANA_SERDES6G_COMMON_CFG           0x144
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(x)         (x)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_QRATE              BIT(2)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_ENA_LANE           BIT(14)
+#define                HSIO_ANA_SERDES6G_COMMON_CFG_SYS_RST            BIT(16)
+#define HSIO_ANA_SERDES6G_PLL_CFG              0x148
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ROT_FRQ               BIT(0)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ROT_DIR               BIT(1)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_RB_DATA_SEL           BIT(2)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_OOR_RECAL_ENA     BIT(3)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_FORCE_SET_ENA     BIT(4)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_ENA               BIT(5)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(x)      ((x) << 
6)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ENA_ROT               BIT(14)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_DIV4                  BIT(15)
+#define                HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(x)           ((x) << 
16)
+#define HSIO_DIG_SERDES6G_MISC_CFG             0x108
+#define                HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST             BIT(0)
+#define HSIO_MCB_SERDES6G_CFG                  0x168
+#define                HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT               BIT(31)
+#define                HSIO_MCB_SERDES6G_CFG_ADDR(x)                   (x)
+#define HSIO_HW_CFGSTAT_HW_CFG                 0x16c
 
 enum {
        BOARD_TYPE_PCB110 = 0xAABBCE00,
@@ -64,6 +198,414 @@ static void vcoreiii_gpio_set_alternate(int gpio, int mode)
        }
 }
 
+int board_phy_config(struct phy_device *phydev)
+{
+       if (gd->board_type == BOARD_TYPE_PCB110 ||
+           gd->board_type == BOARD_TYPE_PCB112) {
+               phy_write(phydev, 0, 31, 0x10);
+               phy_write(phydev, 0, 18, 0x80F0);
+               while (phy_read(phydev, 0, 18) & 0x8000)
+                       ;
+               phy_write(phydev, 0, 31, 0);
+       }
+       if (gd->board_type == BOARD_TYPE_PCB111) {
+               phy_write(phydev, 0, 31, 0x10);
+               phy_write(phydev, 0, 18, 0x80A0);
+               while (phy_read(phydev, 0, 18) & 0x8000)
+                       ;
+               phy_write(phydev, 0, 14, 0x800);
+               phy_write(phydev, 0, 31, 0);
+       }
+
+       return 0;
+}
+
+static void serdes6g_write(void __iomem *base, u32 addr)
+{
+       u32 data;
+
+       writel(HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT |
+              HSIO_MCB_SERDES6G_CFG_ADDR(addr),
+              base + HSIO_MCB_SERDES6G_CFG);
+
+       do {
+               data = readl(base + HSIO_MCB_SERDES6G_CFG);
+       } while (data & HSIO_MCB_SERDES6G_CFG_WR_ONE_SHOT);
+
+       mdelay(100);
+}
+
+static void serdes6g_pcb111_cfg(void __iomem *base)
+{
+       /* sets serdes6g in QSGMII mode */
+       writel(0xfff, base + HSIO_HW_CFGSTAT_HW_CFG);
+
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(3),
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(120) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(3) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xfff0);
+
+       writel(HSIO_ANA_SERDES6G_OB_CFG_RESISTOR_CTRL(1) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR(7) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR_H |
+              HSIO_ANA_SERDES6G_OB_CFG_POL, base + HSIO_ANA_SERDES6G_OB_CFG);
+       writel(HSIO_ANA_SERDES6G_OB_CFG1_LEV(24),
+              base + HSIO_ANA_SERDES6G_OB_CFG1);
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(16) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+       writel(0x0, base + HSIO_ANA_SERDES6G_SER_CFG);
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(3) |
+              HSIO_ANA_SERDES6G_COMMON_CFG_ENA_LANE |
+              HSIO_ANA_SERDES6G_COMMON_CFG_SYS_RST,
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xfff0);
+
+       /* set pll_fsm_ena = 1 */
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_ENA |
+              HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(120) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+
+       serdes6g_write(base, 0xfff0);
+
+       /* wait 20ms for pll bringup */
+       mdelay(20);
+
+       /* start IB calibration by setting ib_cal_ena and clearing lane_rst */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xfff0);
+
+       /* wait 60 for calibration */
+       mdelay(60);
+
+       /* set ib_tsdet and ib_reg_pat_sel_offset back to correct values */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CAL_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(16) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+
+       serdes6g_write(base, 0xfff0);
+}
+
+static void serdes6g_pcb112_cfg(void __iomem *base)
+{
+       /* sets serdes6g in SGMII mode */
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(3),
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(120) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(3) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xf);
+
+       writel(HSIO_ANA_SERDES6G_OB_CFG_RESISTOR_CTRL(1) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR(7) |
+              HSIO_ANA_SERDES6G_OB_CFG_SR_H |
+              HSIO_ANA_SERDES6G_OB_CFG_POL |
+              HSIO_ANA_SERDES6G_OB_CFG_ENA1V_MODE,
+              base + HSIO_ANA_SERDES6G_OB_CFG);
+       writel(HSIO_ANA_SERDES6G_OB_CFG1_LEV(48) |
+              HSIO_ANA_SERDES6G_OB_CFG1_ENA_CAS(2),
+              base + HSIO_ANA_SERDES6G_OB_CFG1);
+       writel(HSIO_ANA_SERDES6G_DES_CFG_BW_ANA(3) |
+              HSIO_ANA_SERDES6G_DES_CFG_BW_HYST(5) |
+              HSIO_ANA_SERDES6G_DES_CFG_MBTR_CTRL(2) |
+              HSIO_ANA_SERDES6G_DES_CFG_PHS_CTRL(6),
+              base + HSIO_ANA_SERDES6G_DES_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(16) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(60) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+       writel(HSIO_ANA_SERDES6G_COMMON_CFG_IF_MODE(1) |
+              HSIO_ANA_SERDES6G_COMMON_CFG_QRATE |
+              HSIO_ANA_SERDES6G_COMMON_CFG_ENA_LANE |
+              HSIO_ANA_SERDES6G_COMMON_CFG_SYS_RST,
+              base + HSIO_ANA_SERDES6G_COMMON_CFG);
+       writel(0x0, base + HSIO_ANA_SERDES6G_SER_CFG);
+       writel(HSIO_DIG_SERDES6G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xf);
+
+       /* set pll_fsm_ena = 1 */
+       writel(HSIO_ANA_SERDES6G_PLL_CFG_FSM_ENA |
+              HSIO_ANA_SERDES6G_PLL_CFG_FSM_CTRL_DATA(60) |
+              HSIO_ANA_SERDES6G_PLL_CFG_ENA_OFFS(3),
+              base + HSIO_ANA_SERDES6G_PLL_CFG);
+
+       serdes6g_write(base, 0xf);
+
+       /* wait 20ms for pll bringup */
+       mdelay(20);
+
+       /* start IB calibration by setting ib_cal_ena and clearing lane_rst */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES6G_MISC_CFG);
+
+       serdes6g_write(base, 0xf);
+
+       /* wait 60ms for calibration */
+       mdelay(60);
+
+       /* set ib_tsdet and ib_reg_pat_sel_offset back to correct values */
+       writel(HSIO_ANA_SERDES6G_IB_CFG_REG_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_EQZ_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_SAM_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_CONCUR |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_ENA |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_OFF(0) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_LP(2) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_MID(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_REG_PAT_SEL_HP(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_SIG_DET_CLK_SEL(7) |
+              HSIO_ANA_SERDES6G_IB_CFG_TERM_MODE_SEL(1) |
+              HSIO_ANA_SERDES6G_IB_CFG_ICML_ADJ(5) |
+              HSIO_ANA_SERDES6G_IB_CFG_RTRM_ADJ(13) |
+              HSIO_ANA_SERDES6G_IB_CFG_VBULK_SEL |
+              HSIO_ANA_SERDES6G_IB_CFG_SOFSI(1),
+              base + HSIO_ANA_SERDES6G_IB_CFG);
+       writel(HSIO_ANA_SERDES6G_IB_CFG1_FILT_OFFSET |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_LP |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_MID |
+              HSIO_ANA_SERDES6G_IB_CFG1_FILT_HP |
+              HSIO_ANA_SERDES6G_IB_CFG1_SCALY(15) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TSDET(3) |
+              HSIO_ANA_SERDES6G_IB_CFG1_TJTAG(8),
+              base + HSIO_ANA_SERDES6G_IB_CFG1);
+
+       serdes6g_write(base, 0xf);
+}
+
+static void serdes_write(void __iomem *base, u32 addr)
+{
+       u32 data;
+
+       writel(HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT |
+              HSIO_MCB_SERDES1G_CFG_ADDR(addr),
+              base + HSIO_MCB_SERDES1G_CFG);
+
+       do {
+               data = readl(base + HSIO_MCB_SERDES1G_CFG);
+       } while (data & HSIO_MCB_SERDES1G_CFG_WR_ONE_SHOT);
+
+       mdelay(100);
+}
+
+static void serdes1g_pcb110_cfg(void __iomem *base)
+{
+       writel(0x0, base + HSIO_ANA_SERDES1G_SER_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES1G_TP_CFG);
+       writel(0x0, base + HSIO_DIG_SERDES1G_DFT_CFG0);
+       writel(HSIO_ANA_SERDES1G_OB_CFG_RESISTOR_CTRL(1) |
+              HSIO_ANA_SERDES1G_OB_CFG_VCM_CTRL(4) |
+              HSIO_ANA_SERDES1G_OB_CFG_CMM_BIAS_CTRL(2) |
+              HSIO_ANA_SERDES1G_OB_CFG_AMP_CTRL(12) |
+              HSIO_ANA_SERDES1G_OB_CFG_SLP(3),
+              base + HSIO_ANA_SERDES1G_OB_CFG);
+       writel(HSIO_ANA_SERDES1G_IB_CFG_RESISTOR_CTRL(13) |
+              HSIO_ANA_SERDES1G_IB_CFG_EQ_GAIN(2) |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_OFFSET_COMP |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_DETLEV |
+              HSIO_ANA_SERDES1G_IB_CFG_ENA_CMV_TERM |
+              HSIO_ANA_SERDES1G_IB_CFG_DET_LEV(3) |
+              HSIO_ANA_SERDES1G_IB_CFG_ACJTAG_HYST(1),
+              base + HSIO_ANA_SERDES1G_IB_CFG);
+       writel(HSIO_ANA_SERDES1G_DES_CFG_BW_HYST(7) |
+              HSIO_ANA_SERDES1G_DES_CFG_BW_ANA(6) |
+              HSIO_ANA_SERDES1G_DES_CFG_MBTR_CTRL(2) |
+              HSIO_ANA_SERDES1G_DES_CFG_PHS_CTRL(6),
+              base + HSIO_ANA_SERDES1G_DES_CFG);
+       writel(HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST,
+              base + HSIO_DIG_SERDES1G_MISC_CFG);
+       writel(HSIO_ANA_SERDES1G_PLL_CFG_FSM_ENA |
+              HSIO_ANA_SERDES1G_PLL_CFG_FSM_CTRL_DATA(0xc8) |
+              HSIO_ANA_SERDES1G_PLL_CFG_ENA_RC_DIV2,
+              base + HSIO_ANA_SERDES1G_PLL_CFG);
+       writel(HSIO_ANA_SERDES1G_COMMON_CFG_IF_MODE |
+              HSIO_ANA_SERDES1G_COMMON_CFG_ENA_LANE |
+              HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST,
+              base + HSIO_ANA_SERDES1G_COMMON_CFG);
+
+       serdes_write(base, 0x1fe);
+
+       setbits_le32(base + HSIO_ANA_SERDES1G_COMMON_CFG,
+                    HSIO_ANA_SERDES1G_COMMON_CFG_SYS_RST);
+
+       serdes_write(base, 0x1fe);
+
+       clrbits_le32(base + HSIO_DIG_SERDES1G_MISC_CFG,
+                    HSIO_DIG_SERDES1G_MISC_CFG_LANE_RST);
+
+       serdes_write(base, 0x1fe);
+}
+
+void serdes_cfg(void __iomem *base)
+{
+       if (gd->board_type == BOARD_TYPE_PCB111)
+               return serdes6g_pcb111_cfg(base);
+       if (gd->board_type == BOARD_TYPE_PCB112)
+               return serdes6g_pcb112_cfg(base);
+       if (gd->board_type == BOARD_TYPE_PCB110)
+               return serdes1g_pcb110_cfg(base);
+}
+
 void board_debug_uart_init(void)
 {
        /* too early for the pinctrl driver, so configure the UART pins here */
-- 
2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to