[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c3fa65d5-1e24-41d8-b7d0-2a4a464d83e8@amd.com>
Date: Fri, 13 Jun 2025 10:40:42 +0800
From: "Du, Bin" <bin.du@....com>
To: mchehab@...nel.org, hverkuil@...all.nl,
laurent.pinchart+renesas@...asonboard.com, bryan.odonoghue@...aro.org,
sakari.ailus@...ux.intel.com, prabhakar.mahadev-lad.rj@...renesas.com,
linux-media@...r.kernel.org, linux-kernel@...r.kernel.org
Cc: pratap.nirujogi@....com, benjamin.chan@....com, king.li@....com,
gjorgji.rosikopulos@....com, Phil.Jawich@....com, Dominic.Antony@....com,
Svetoslav.Stoilov@....com
Subject: Re: [PATCH v1 3/9] media: platform: amd: Add helpers to configure
isp4 mipi phy
Change-Id should be removed and will be fixed in V2
On 6/8/2025 10:49 PM, Bin Du wrote:
> The helper functions is for configuring, starting and stop the MIPI PHY.
> All configurations related to MIPI PHY configuration and calibration
> parameters are encapsulated in two helper functions: start and stop
> mipi phy.
>
> Signed-off-by: Bin Du <Bin.Du@....com>
> Signed-off-by: Svetoslav Stoilov <Svetoslav.Stoilov@....com>
> Change-Id: I5376794eb4e4116e1387e4f3607cdf6845f2cda4
> ---
> drivers/media/platform/amd/isp4/Makefile | 1 +
> drivers/media/platform/amd/isp4/isp4_phy.c | 1507 ++++++++++++++++++++
> drivers/media/platform/amd/isp4/isp4_phy.h | 14 +
> 3 files changed, 1522 insertions(+)
> create mode 100644 drivers/media/platform/amd/isp4/isp4_phy.c
> create mode 100644 drivers/media/platform/amd/isp4/isp4_phy.h
>
> diff --git a/drivers/media/platform/amd/isp4/Makefile b/drivers/media/platform/amd/isp4/Makefile
> index 4ef8be329d56..7cb496a56353 100644
> --- a/drivers/media/platform/amd/isp4/Makefile
> +++ b/drivers/media/platform/amd/isp4/Makefile
> @@ -4,6 +4,7 @@
>
> obj-$(CONFIG_AMD_ISP4) += amd_capture.o
> amd_capture-objs := isp4.o \
> + isp4_phy.o \
> isp4_hw.o \
>
> ccflags-y += -I$(srctree)/drivers/media/platform/amd/isp4
> diff --git a/drivers/media/platform/amd/isp4/isp4_phy.c b/drivers/media/platform/amd/isp4/isp4_phy.c
> new file mode 100644
> index 000000000000..1cf2eb58ea3b
> --- /dev/null
> +++ b/drivers/media/platform/amd/isp4/isp4_phy.c
> @@ -0,0 +1,1507 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2025 Advanced Micro Devices, Inc.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +
> +#include "isp4_hw.h"
> +#include "isp4_hw_reg.h"
> +#include "isp4_phy.h"
> +
> +#define ISP_MIPI_DPHY 0
> +#define T_DCO 5 /* nominal: 200MHz */
> +#define TMIN_RX 4
> +#define TIMEBASE 5 /* 5us */
> +
> +#define MIN_T_HS_SETTLE_NS 95
> +#define MAX_T_HS_SETTLE_NS 130
> +#define MIN_T_HS_SETTLE_UI 4
> +#define MAX_T_HS_SETTLE_UI 6
> +
> +#define PPI_STARTUP_RW_COMMON_DPHY_2 0x0C02
> +#define PPI_STARTUP_RW_COMMON_DPHY_6 0x0C06
> +#define PPI_STARTUP_RW_COMMON_DPHY_7 0x0C07
> +#define PPI_STARTUP_RW_COMMON_DPHY_8 0x0C08
> +#define PPI_STARTUP_RW_COMMON_DPHY_10 0x0C10
> +#define CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2 0x1CF2
> +#define CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_0 0x1CF0
> +#define PPI_STARTUP_RW_COMMON_STARTUP_1_1 0x0C11
> +#define PPI_CALIBCTRL_RW_COMMON_BG_0 0x0C26
> +#define PPI_RW_LPDCOCAL_NREF 0x0E02
> +#define PPI_RW_LPDCOCAL_NREF_RANGE 0x0E03
> +#define PPI_RW_LPDCOCAL_TWAIT_CONFIG 0x0E05
> +#define PPI_RW_LPDCOCAL_VT_CONFIG 0x0E06
> +#define PPI_RW_LPDCOCAL_COARSE_CFG 0x0E08
> +#define PPI_RW_COMMON_CFG 0x0E36
> +#define PPI_RW_TERMCAL_CFG_0 0x0E40
> +#define PPI_RW_OFFSETCAL_CFG_0 0x0E50
> +#define PPI_RW_LPDCOCAL_TIMEBASE 0x0E01
> +#define CORE_AFE_CTRL_2_0 0x1C20
> +#define CORE_AFE_CTRL_2_1 0x1C21
> +#define CORE_AFE_CTRL_2_3 0x1C23
> +#define CORE_AFE_CTRL_2_5 0x1C25
> +#define CORE_AFE_CTRL_2_6 0x1C26
> +#define CORE_AFE_CTRL_2_7 0x1C27
> +#define CORE_DIG_COMMON_RW_DESKEW_FINE_MEM 0x1FF0
> +#define CORE_DIG_DLANE_CLK_RW_CFG_0 0x3800
> +#define CORE_DIG_DLANE_0_RW_CFG_0 0x3000
> +#define CORE_DIG_DLANE_1_RW_CFG_0 0x3200
> +#define CORE_DIG_DLANE_2_RW_CFG_0 0x3400
> +#define CORE_DIG_DLANE_3_RW_CFG_0 0x3600
> +#define CORE_AFE_LANE0_CTRL_2_9 0x1029
> +#define CORE_AFE_LANE1_CTRL_2_9 0x1229
> +#define CORE_AFE_LANE2_CTRL_2_9 0x1429
> +#define CORE_AFE_LANE3_CTRL_2_9 0x1629
> +#define CORE_AFE_LANE4_CTRL_2_9 0x1829
> +#define CORE_DIG_RW_COMMON_6 0x1C46
> +#define CORE_DIG_RW_COMMON_7 0x1C47
> +#define PPI_RW_DDLCAL_CFG_0 0x0E20
> +#define PPI_RW_DDLCAL_CFG_1 0x0E21
> +#define PPI_RW_DDLCAL_CFG_2 0x0E22
> +#define PPI_RW_DDLCAL_CFG_3 0x0E23
> +#define PPI_RW_DDLCAL_CFG_4 0x0E24
> +#define PPI_RW_DDLCAL_CFG_5 0x0E25
> +#define PPI_RW_DDLCAL_CFG_6 0x0E26
> +#define PPI_RW_DDLCAL_CFG_7 0x0E27
> +#define CORE_AFE_LANE0_CTRL_2_8 0x1028
> +#define CORE_AFE_LANE1_CTRL_2_8 0x1228
> +#define CORE_AFE_LANE2_CTRL_2_8 0x1428
> +#define CORE_AFE_LANE3_CTRL_2_8 0x1628
> +#define CORE_AFE_LANE4_CTRL_2_8 0x1828
> +#define CORE_DIG_DLANE_0_RW_LP_0 0x3040
> +#define CORE_DIG_DLANE_1_RW_LP_0 0x3240
> +#define CORE_DIG_DLANE_2_RW_LP_0 0x3440
> +#define CORE_DIG_DLANE_3_RW_LP_0 0x3640
> +#define CORE_AFE_LANE0_CTRL_2_2 0x1022
> +#define CORE_AFE_LANE1_CTRL_2_2 0x1222
> +#define CORE_AFE_LANE2_CTRL_2_2 0x1422
> +#define CORE_AFE_LANE3_CTRL_2_2 0x1622
> +#define CORE_AFE_LANE4_CTRL_2_2 0x1822
> +#define CORE_AFE_LANE0_CTRL_2_12 0x102C
> +#define CORE_AFE_LANE1_CTRL_2_12 0x122C
> +#define CORE_AFE_LANE2_CTRL_2_12 0x142C
> +#define CORE_AFE_LANE3_CTRL_2_12 0x162C
> +#define CORE_AFE_LANE4_CTRL_2_12 0x182C
> +#define CORE_AFE_LANE0_CTRL_2_13 0x102D
> +#define CORE_AFE_LANE1_CTRL_2_13 0x122D
> +#define CORE_AFE_LANE2_CTRL_2_13 0x142D
> +#define CORE_AFE_LANE3_CTRL_2_13 0x162D
> +#define CORE_AFE_LANE4_CTRL_2_13 0x182D
> +#define CORE_DIG_DLANE_CLK_RW_HS_RX_0 0x3880
> +#define CORE_DIG_DLANE_CLK_RW_HS_RX_7 0x3887
> +#define CORE_DIG_DLANE_0_RW_HS_RX_0 0x3080
> +#define CORE_DIG_DLANE_1_RW_HS_RX_0 0x3280
> +#define CORE_DIG_DLANE_2_RW_HS_RX_0 0x3480
> +#define CORE_DIG_DLANE_3_RW_HS_RX_0 0x3680
> +#define CORE_DIG_DLANE_0_RW_CFG_1 0x3001
> +#define CORE_DIG_DLANE_1_RW_CFG_1 0x3201
> +#define CORE_DIG_DLANE_2_RW_CFG_1 0x3401
> +#define CORE_DIG_DLANE_3_RW_CFG_1 0x3601
> +#define CORE_DIG_DLANE_0_RW_HS_RX_2 0x3082
> +#define CORE_DIG_DLANE_1_RW_HS_RX_2 0x3282
> +#define CORE_DIG_DLANE_2_RW_HS_RX_2 0x3482
> +#define CORE_DIG_DLANE_3_RW_HS_RX_2 0x3682
> +#define CORE_DIG_DLANE_0_RW_LP_2 0x3042
> +#define CORE_DIG_DLANE_1_RW_LP_2 0x3242
> +#define CORE_DIG_DLANE_2_RW_LP_2 0x3442
> +#define CORE_DIG_DLANE_3_RW_LP_2 0x3642
> +#define CORE_DIG_DLANE_CLK_RW_LP_0 0x3840
> +#define CORE_DIG_DLANE_CLK_RW_LP_2 0x3842
> +#define CORE_DIG_DLANE_0_RW_HS_RX_1 0x3081
> +#define CORE_DIG_DLANE_1_RW_HS_RX_1 0x3281
> +#define CORE_DIG_DLANE_2_RW_HS_RX_1 0x3481
> +#define CORE_DIG_DLANE_3_RW_HS_RX_1 0x3681
> +#define CORE_DIG_DLANE_0_RW_HS_RX_3 0x3083
> +#define CORE_DIG_DLANE_1_RW_HS_RX_3 0x3283
> +#define CORE_DIG_DLANE_2_RW_HS_RX_3 0x3483
> +#define CORE_DIG_DLANE_3_RW_HS_RX_3 0x3683
> +#define CORE_DIG_DLANE_0_RW_HS_RX_4 0x3084
> +#define CORE_DIG_DLANE_1_RW_HS_RX_4 0x3284
> +#define CORE_DIG_DLANE_2_RW_HS_RX_4 0x3484
> +#define CORE_DIG_DLANE_3_RW_HS_RX_4 0x3684
> +#define CORE_DIG_DLANE_0_RW_HS_RX_5 0x3085
> +#define CORE_DIG_DLANE_1_RW_HS_RX_5 0x3285
> +#define CORE_DIG_DLANE_2_RW_HS_RX_5 0x3485
> +#define CORE_DIG_DLANE_3_RW_HS_RX_5 0x3685
> +#define CORE_DIG_DLANE_0_RW_HS_RX_6 0x3086
> +#define CORE_DIG_DLANE_1_RW_HS_RX_6 0x3286
> +#define CORE_DIG_DLANE_2_RW_HS_RX_6 0x3486
> +#define CORE_DIG_DLANE_3_RW_HS_RX_6 0x3686
> +#define CORE_DIG_DLANE_0_RW_HS_RX_7 0x3087
> +#define CORE_DIG_DLANE_1_RW_HS_RX_7 0x3287
> +#define CORE_DIG_DLANE_2_RW_HS_RX_7 0x3487
> +#define CORE_DIG_DLANE_3_RW_HS_RX_7 0x3687
> +#define CORE_DIG_DLANE_0_RW_HS_RX_9 0x3089
> +#define CORE_DIG_DLANE_1_RW_HS_RX_9 0x3289
> +#define CORE_DIG_DLANE_2_RW_HS_RX_9 0x3489
> +#define CORE_DIG_DLANE_3_RW_HS_RX_9 0x3689
> +#define PPI_R_TERMCAL_DEBUG_0 0x0E41
> +
> +#define PPI_STARTUP_RW_COMMON_DPHY_2_RCAL_ADDR_MASK 0x00FF
> +#define PPI_STARTUP_RW_COMMON_DPHY_10_PHY_READY_ADDR_MASK 0x00FF
> +#define CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2_GLOBAL_ULPS_OVR_VAL_MASK 0x2000
> +#define CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2_GLOBAL_ULPS_OVR_EN_MASK 0x1000
> +#define CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_0_CB_LP_DCO_EN_DLY_MASK 0x00FC
> +#define PPI_STARTUP_RW_COMMON_STARTUP_1_1_PHY_READY_DLY_MASK 0x0FFF
> +#define PPI_STARTUP_RW_COMMON_DPHY_6_LP_DCO_CAL_ADDR_MASK 0x00FF
> +#define PPI_CALIBCTRL_RW_COMMON_BG_0_BG_MAX_COUNTER_MASK 0x01FF
> +#define PPI_RW_LPDCOCAL_NREF_LPDCOCAL_NREF_MASK 0x07FF
> +#define PPI_RW_LPDCOCAL_NREF_RANGE_LPDCOCAL_NREF_RANGE_MASK 0x001F
> +#define PPI_RW_LPDCOCAL_TWAIT_CONFIG_LPDCOCAL_TWAIT_PON_MASK 0xFE00
> +#define PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_VT_TRACKING_EN_MASK 0x0001
> +#define PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_USE_IDEAL_NREF_MASK 0x0002
> +#define PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_VT_NREF_RANGE_MASK 0x007C
> +#define PPI_RW_LPDCOCAL_COARSE_CFG_NCOARSE_START_MASK 0x0003
> +#define PPI_RW_COMMON_CFG_CFG_CLK_DIV_FACTOR_MASK 0x0003
> +#define PPI_RW_TERMCAL_CFG_0_TERMCAL_TIMER_MASK 0x007F
> +#define PPI_RW_OFFSETCAL_CFG_0_OFFSETCAL_WAIT_THRESH_MASK 0x001F
> +#define PPI_RW_LPDCOCAL_TIMEBASE_LPDCOCAL_TIMEBASE_MASK 0x03FF
> +#define PPI_RW_LPDCOCAL_TWAIT_CONFIG_LPDCOCAL_TWAIT_COARSE_MASK 0x01FF
> +#define PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_TWAIT_FINE_MASK 0xFF80
> +#define CORE_AFE_CTRL_2_0_OA_CB_HSTX_VCOMM_REG_PON_OVR_VAL_MASK 0x0400
> +#define CORE_AFE_CTRL_2_1_OA_CB_HSTX_VCOMM_REG_PON_OVR_EN_MASK 0x0400
> +#define CORE_AFE_CTRL_2_1_OA_CB_HSTXLB_DCO_CLK0_EN_OVR_VAL_MASK 0x8000
> +#define CORE_AFE_CTRL_2_3_OA_CB_HSTXLB_DCO_CLK0_EN_OVR_EN_MASK 0x0100
> +#define CORE_AFE_CTRL_2_0_OA_CB_HSTXLB_DCO_CLK90_EN_OVR_VAL_MASK 0x8000
> +#define CORE_AFE_CTRL_2_3_OA_CB_HSTXLB_DCO_CLK90_EN_OVR_EN_MASK 0x0200
> +#define CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_EN_OVR_EN_MASK 0x2000
> +#define CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_EN_OVR_VAL_MASK 0x0200
> +#define CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_PON_OVR_EN_MASK 0x1000
> +#define CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_PON_OVR_VAL_MASK 0x0100
> +#define CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_TUNE_CLKDIG_EN_OVR_EN_MASK 0x4000
> +#define CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_TUNE_CLKDIG_EN_OVR_VAL_MASK 0x0400
> +#define CORE_AFE_CTRL_2_5_OA_CB_SEL_45OHM_50OHM_MASK 0x0100
> +#define CORE_DIG_DLANE_CLK_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_0_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_1_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_2_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_3_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_0_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK 0x0002
> +#define CORE_DIG_DLANE_1_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK 0x0002
> +#define CORE_DIG_DLANE_2_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK 0x0002
> +#define CORE_DIG_DLANE_3_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK 0x0002
> +#define CORE_AFE_LANE0_CTRL_2_9_OA_LANE0_HSRX_SEL_GATED_POLARITY_MASK 0x0100
> +#define CORE_AFE_LANE1_CTRL_2_9_OA_LANE1_HSRX_SEL_GATED_POLARITY_MASK 0x0100
> +#define CORE_AFE_LANE2_CTRL_2_9_OA_LANE2_HSRX_SEL_GATED_POLARITY_MASK 0x0100
> +#define CORE_AFE_LANE3_CTRL_2_9_OA_LANE3_HSRX_SEL_GATED_POLARITY_MASK 0x0100
> +#define CORE_AFE_LANE4_CTRL_2_9_OA_LANE4_HSRX_SEL_GATED_POLARITY_MASK 0x0100
> +#define CORE_DIG_RW_COMMON_7_LANE0_HSRX_WORD_CLK_SEL_GATING_REG_MASK 0x0003
> +#define CORE_DIG_RW_COMMON_7_LANE1_HSRX_WORD_CLK_SEL_GATING_REG_MASK 0x000C
> +#define CORE_DIG_RW_COMMON_7_LANE2_HSRX_WORD_CLK_SEL_GATING_REG_MASK 0x0030
> +#define CORE_DIG_RW_COMMON_7_LANE3_HSRX_WORD_CLK_SEL_GATING_REG_MASK 0x00C0
> +#define CORE_DIG_RW_COMMON_7_LANE4_HSRX_WORD_CLK_SEL_GATING_REG_MASK 0x0300
> +#define PPI_STARTUP_RW_COMMON_DPHY_8_CPHY_DDL_CAL_ADDR_MASK 0x00FF
> +#define PPI_STARTUP_RW_COMMON_DPHY_7_DPHY_DDL_CAL_ADDR_MASK 0x00FF
> +#define PPI_RW_DDLCAL_CFG_0_DDLCAL_TIMEBASE_TARGET_MASK 0x03FF
> +#define PPI_RW_DDLCAL_CFG_7_DDLCAL_DECR_WAIT_MASK 0x1F80
> +#define PPI_RW_DDLCAL_CFG_1_DDLCAL_DISABLE_TIME_MASK 0xFF00
> +#define PPI_RW_DDLCAL_CFG_2_DDLCAL_WAIT_MASK 0xF000
> +#define PPI_RW_DDLCAL_CFG_2_DDLCAL_TUNE_MODE_MASK 0x0C00
> +#define PPI_RW_DDLCAL_CFG_2_DDLCAL_DDL_DLL_MASK 0x0100
> +#define PPI_RW_DDLCAL_CFG_2_DDLCAL_ENABLE_WAIT_MASK 0x00FF
> +#define PPI_RW_DDLCAL_CFG_2_DDLCAL_UPDATE_SETTINGS_MASK 0x0200
> +#define PPI_RW_DDLCAL_CFG_4_DDLCAL_STUCK_THRESH_MASK 0x03FF
> +#define PPI_RW_DDLCAL_CFG_6_DDLCAL_MAX_DIFF_MASK 0x03FF
> +#define PPI_RW_DDLCAL_CFG_7_DDLCAL_START_DELAY_MASK 0x007F
> +#define PPI_RW_DDLCAL_CFG_3_DDLCAL_COUNTER_REF_MASK 0x03FF
> +#define PPI_RW_DDLCAL_CFG_1_DDLCAL_MAX_PHASE_MASK 0x00FF
> +#define PPI_RW_DDLCAL_CFG_5_DDLCAL_DLL_FBK_MASK 0x03F0
> +#define PPI_RW_DDLCAL_CFG_5_DDLCAL_DDL_COARSE_BANK_MASK 0x000F
> +#define CORE_AFE_LANE0_CTRL_2_8_OA_LANE0_HSRX_CDPHY_SEL_FAST_MASK 0x1000
> +#define CORE_AFE_LANE1_CTRL_2_8_OA_LANE1_HSRX_CDPHY_SEL_FAST_MASK 0x1000
> +#define CORE_AFE_LANE2_CTRL_2_8_OA_LANE2_HSRX_CDPHY_SEL_FAST_MASK 0x1000
> +#define CORE_AFE_LANE3_CTRL_2_8_OA_LANE3_HSRX_CDPHY_SEL_FAST_MASK 0x1000
> +#define CORE_AFE_LANE4_CTRL_2_8_OA_LANE4_HSRX_CDPHY_SEL_FAST_MASK 0x1000
> +#define CORE_DIG_DLANE_0_RW_LP_0_LP_0_TTAGO_REG_MASK 0x0F00
> +#define CORE_DIG_DLANE_1_RW_LP_0_LP_0_TTAGO_REG_MASK 0x0F00
> +#define CORE_DIG_DLANE_2_RW_LP_0_LP_0_TTAGO_REG_MASK 0x0F00
> +#define CORE_DIG_DLANE_3_RW_LP_0_LP_0_TTAGO_REG_MASK 0x0F00
> +#define CORE_AFE_LANE0_CTRL_2_2_OA_LANE0_SEL_LANE_CFG_MASK 0x0001
> +#define CORE_AFE_LANE1_CTRL_2_2_OA_LANE1_SEL_LANE_CFG_MASK 0x0001
> +#define CORE_AFE_LANE2_CTRL_2_2_OA_LANE2_SEL_LANE_CFG_MASK 0x0001
> +#define CORE_AFE_LANE3_CTRL_2_2_OA_LANE3_SEL_LANE_CFG_MASK 0x0001
> +#define CORE_AFE_LANE4_CTRL_2_2_OA_LANE4_SEL_LANE_CFG_MASK 0x0001
> +#define CORE_DIG_RW_COMMON_6_DESERIALIZER_EN_DEASS_COUNT_THRESH_D_MASK 0x0038
> +#define CORE_DIG_RW_COMMON_6_DESERIALIZER_DIV_EN_DELAY_THRESH_D_MASK 0x0007
> +#define CORE_AFE_LANE0_CTRL_2_12_OA_LANE0_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK 0x0002
> +#define CORE_AFE_LANE1_CTRL_2_12_OA_LANE1_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK 0x0002
> +#define CORE_AFE_LANE2_CTRL_2_12_OA_LANE2_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK 0x0002
> +#define CORE_AFE_LANE3_CTRL_2_12_OA_LANE3_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK 0x0002
> +#define CORE_AFE_LANE4_CTRL_2_12_OA_LANE4_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK 0x0002
> +#define CORE_AFE_LANE0_CTRL_2_13_OA_LANE0_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK 0x0002
> +#define CORE_AFE_LANE1_CTRL_2_13_OA_LANE1_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK 0x0002
> +#define CORE_AFE_LANE2_CTRL_2_13_OA_LANE2_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK 0x0002
> +#define CORE_AFE_LANE3_CTRL_2_13_OA_LANE3_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK 0x0002
> +#define CORE_AFE_LANE4_CTRL_2_13_OA_LANE4_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK 0x0002
> +#define CORE_AFE_LANE0_CTRL_2_12_OA_LANE0_HSRX_DPHY_DLL_EN_OVR_VAL_MASK 0x0008
> +#define CORE_AFE_LANE1_CTRL_2_12_OA_LANE1_HSRX_DPHY_DLL_EN_OVR_VAL_MASK 0x0008
> +#define CORE_AFE_LANE2_CTRL_2_12_OA_LANE2_HSRX_DPHY_DLL_EN_OVR_VAL_MASK 0x0008
> +#define CORE_AFE_LANE3_CTRL_2_12_OA_LANE3_HSRX_DPHY_DLL_EN_OVR_VAL_MASK 0x0008
> +#define CORE_AFE_LANE4_CTRL_2_12_OA_LANE4_HSRX_DPHY_DLL_EN_OVR_VAL_MASK 0x0008
> +#define CORE_AFE_LANE0_CTRL_2_13_OA_LANE0_HSRX_DPHY_DLL_EN_OVR_EN_MASK 0x0008
> +#define CORE_AFE_LANE1_CTRL_2_13_OA_LANE1_HSRX_DPHY_DLL_EN_OVR_EN_MASK 0x0008
> +#define CORE_AFE_LANE2_CTRL_2_13_OA_LANE2_HSRX_DPHY_DLL_EN_OVR_EN_MASK 0x0008
> +#define CORE_AFE_LANE3_CTRL_2_13_OA_LANE3_HSRX_DPHY_DLL_EN_OVR_EN_MASK 0x0008
> +#define CORE_AFE_LANE4_CTRL_2_13_OA_LANE4_HSRX_DPHY_DLL_EN_OVR_EN_MASK 0x0008
> +#define CORE_AFE_LANE2_CTRL_2_9_OA_LANE2_HSRX_HS_CLK_DIV_MASK 0x00E0
> +#define CORE_AFE_LANE1_CTRL_2_9_OA_LANE1_HSRX_HS_CLK_DIV_MASK 0x00E0
> +#define CORE_DIG_DLANE_CLK_RW_HS_RX_0_HS_RX_0_TCLKSETTLE_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_CLK_RW_HS_RX_7_HS_RX_7_TCLKMISS_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_1_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_2_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_3_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_0_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK 0x0004
> +#define CORE_DIG_DLANE_1_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK 0x0004
> +#define CORE_DIG_DLANE_2_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK 0x0004
> +#define CORE_DIG_DLANE_3_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK 0x0004
> +#define CORE_DIG_DLANE_0_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK 0x0008
> +#define CORE_DIG_DLANE_1_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK 0x0008
> +#define CORE_DIG_DLANE_2_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK 0x0008
> +#define CORE_DIG_DLANE_3_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK 0x0008
> +#define CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_0_RW_LP_0_LP_0_ITMINRX_REG_MASK 0xF000
> +#define CORE_DIG_DLANE_1_RW_LP_0_LP_0_ITMINRX_REG_MASK 0xF000
> +#define CORE_DIG_DLANE_2_RW_LP_0_LP_0_ITMINRX_REG_MASK 0xF000
> +#define CORE_DIG_DLANE_3_RW_LP_0_LP_0_ITMINRX_REG_MASK 0xF000
> +#define CORE_DIG_DLANE_0_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_1_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_2_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_3_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_CLK_RW_LP_0_LP_0_ITMINRX_REG_MASK 0xF000
> +#define CORE_DIG_DLANE_CLK_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK 0x0001
> +#define CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_0_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_1_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_2_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_3_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK 0x1E00
> +#define CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK 0x1E00
> +#define CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK 0x1E00
> +#define CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK 0x1E00
> +#define CORE_DIG_DLANE_0_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK 0x0007
> +#define CORE_DIG_DLANE_1_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK 0x0007
> +#define CORE_DIG_DLANE_2_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK 0x0007
> +#define CORE_DIG_DLANE_3_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK 0x0007
> +#define CORE_DIG_DLANE_0_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK 0xFFFF
> +#define CORE_DIG_DLANE_1_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK 0xFFFF
> +#define CORE_DIG_DLANE_2_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK 0xFFFF
> +#define CORE_DIG_DLANE_3_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK 0xFFFF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_1_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_2_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_3_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_1_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_2_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_3_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_0_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_1_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_2_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_3_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_1_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_2_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_3_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK 0x2000
> +#define CORE_DIG_DLANE_0_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_1_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_2_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_3_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK 0x8000
> +#define CORE_DIG_DLANE_0_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK 0x01F8
> +#define CORE_DIG_DLANE_1_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK 0x01F8
> +#define CORE_DIG_DLANE_2_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK 0x01F8
> +#define CORE_DIG_DLANE_3_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK 0x01F8
> +#define CORE_DIG_DLANE_0_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_1_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_2_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_3_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK 0x00FF
> +#define CORE_DIG_DLANE_0_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_1_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_2_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_3_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK 0xFF00
> +#define CORE_DIG_DLANE_CLK_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK 0x0002
> +
> +struct isp4phy_mipi_reg_seq {
> + u16 addr;
> + u16 mask;
> + u16 data;
> +};
> +
> +union isp4phy_mipi_0 {
> + struct {
> + u32 shutdownz : 1;
> + u32 rstz : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_1 {
> + struct {
> + u32 mode : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_2 {
> + struct {
> + u32 rxdatawidthhs_0 : 2;
> + u32 rxdatawidthhs_1 : 2;
> + u32 rxdatawidthhs_2 : 2;
> + u32 rxdatawidthhs_3 : 2;
> + } bit;
> + u32 value;
> +};
> +
> +struct isp4phy_mipi_3 {
> + u32 reserved;
> +};
> +
> +union isp4phy_mipi_4 {
> + struct {
> + u32 enableclk : 1;
> + u32 enable_0 : 1;
> + u32 enable_1 : 1;
> + u32 enable_2 : 1;
> + u32 enable_3 : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_5 {
> + struct {
> + u32 forcerxmode_0 : 1;
> + u32 forcerxmode_1 : 1;
> + u32 forcerxmode_2 : 1;
> + u32 forcerxmode_3 : 1;
> + u32 forcerxmode_clk : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_6 {
> + struct {
> + u32 turndisable_0 : 1;
> + u32 turndisable_1 : 1;
> + u32 turndisable_2 : 1;
> + u32 turndisable_3 : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_7 {
> + struct {
> + u32 ready : 1;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_ind_idx {
> + struct {
> + u32 addr : 16;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_ind_data {
> + struct {
> + u32 data : 16;
> + } bit;
> + u32 value;
> +};
> +
> +union isp4phy_mipi_ind_wack {
> + struct {
> + u32 ack : 1;
> + u32 pslverr : 1;
> + } bit;
> + u32 value;
> +};
> +
> +struct isp4phy_mipi_reg {
> + union isp4phy_mipi_0 isp_mipi_phy0;
> + union isp4phy_mipi_1 isp_mipi_phy1;
> + union isp4phy_mipi_2 isp_mipi_phy2;
> + struct isp4phy_mipi_3 isp_mipi_phy3;
> + union isp4phy_mipi_4 isp_mipi_phy4;
> + union isp4phy_mipi_5 isp_mipi_phy5;
> + union isp4phy_mipi_6 isp_mipi_phy6;
> + union isp4phy_mipi_7 isp_mipi_phy7;
> + u32 reserve;
> + union isp4phy_mipi_ind_idx isp_mipi_phy_ind_idx;
> + union isp4phy_mipi_ind_data isp_mipi_phy_ind_data;
> + union isp4phy_mipi_ind_wack isp_mipi_phy_inc_wack;
> +};
> +
> +struct isp4phy_mipi_config {
> + u16 afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg;
> + u16 max_phase;
> + u16 ddlcal_cfg_5ddlcal_dll_fbk_reg;
> + u16 ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg;
> + u16 afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg;
> + u16 afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg;
> + u16 afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg;
> + u16 afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg;
> + u16 cfg_1cfg_1_sot_detection_reg;
> + u16 hs_rx_2hs_rx_2_ignore_alterncal_reg;
> + u16 cfg_1cfg_1_deskew_supported_reg;
> + u16 afe_lanex_ctrl_2_9oa_hs_clk_div_reg;
> + u16 hs_rx_0hs_rx_0_thssettle_reg;
> + u16 hs_rx_3hs_rx_3_fjump_deskew_reg;
> + u16 hs_rx_6hs_rx_6_min_eye_opening_deskew_reg;
> +};
> +
> +enum isp4phy_mipi_id {
> + ISP_MIPI_PHY_ID_0 = 0,
> + ISP_MIPI_PHY_ID_1 = 1,
> + ISP_MIPI_PHY_ID_2 = 2,
> + ISP_MIPI_PHY_ID_MAX
> +};
> +
> +static const struct isp4phy_mipi_reg *isp_mipi_phy_reg[ISP_MIPI_PHY_ID_MAX] = {
> + (struct isp4phy_mipi_reg *)ISP_MIPI_PHY0_REG0,
> + (struct isp4phy_mipi_reg *)ISP_MIPI_PHY1_REG0,
> + (struct isp4phy_mipi_reg *)ISP_MIPI_PHY2_REG0,
> +};
> +
> +static const struct isp4phy_mipi_reg_seq startup_seq_general_common_config[] = {
> + { PPI_STARTUP_RW_COMMON_DPHY_10, PPI_STARTUP_RW_COMMON_DPHY_10_PHY_READY_ADDR_MASK, 0x30 },
> + { CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2, CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2_GLOBAL_ULPS_OVR_VAL_MASK, 0x0 },
> + { CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2, CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_2_GLOBAL_ULPS_OVR_EN_MASK, 0x1 },
> + { CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_0, CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_0_CB_LP_DCO_EN_DLY_MASK, 0x3F },
> + { PPI_STARTUP_RW_COMMON_STARTUP_1_1, PPI_STARTUP_RW_COMMON_STARTUP_1_1_PHY_READY_DLY_MASK, 0x233 },
> + { PPI_STARTUP_RW_COMMON_DPHY_6, PPI_STARTUP_RW_COMMON_DPHY_6_LP_DCO_CAL_ADDR_MASK, 0x27 },
> + { PPI_CALIBCTRL_RW_COMMON_BG_0, PPI_CALIBCTRL_RW_COMMON_BG_0_BG_MAX_COUNTER_MASK, 0x1F4 },
> + { PPI_RW_LPDCOCAL_NREF, PPI_RW_LPDCOCAL_NREF_LPDCOCAL_NREF_MASK, 0x320 },
> + { PPI_RW_LPDCOCAL_NREF_RANGE, PPI_RW_LPDCOCAL_NREF_RANGE_LPDCOCAL_NREF_RANGE_MASK, 0x1B },
> + { PPI_RW_LPDCOCAL_TWAIT_CONFIG, PPI_RW_LPDCOCAL_TWAIT_CONFIG_LPDCOCAL_TWAIT_PON_MASK, 0x7F },
> + { PPI_RW_LPDCOCAL_VT_CONFIG, PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_VT_NREF_RANGE_MASK, 0x1B },
> + { PPI_RW_LPDCOCAL_VT_CONFIG, PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_USE_IDEAL_NREF_MASK, 0x1 },
> + { PPI_RW_LPDCOCAL_VT_CONFIG, PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_VT_TRACKING_EN_MASK, 0x0 },
> + { PPI_RW_LPDCOCAL_COARSE_CFG, PPI_RW_LPDCOCAL_COARSE_CFG_NCOARSE_START_MASK, 0x1 },
> + { PPI_RW_COMMON_CFG, PPI_RW_COMMON_CFG_CFG_CLK_DIV_FACTOR_MASK, 0x3 },
> +};
> +
> +static const struct isp4phy_mipi_reg_seq startup_seq_common[] = {
> + { PPI_STARTUP_RW_COMMON_DPHY_2, PPI_STARTUP_RW_COMMON_DPHY_2_RCAL_ADDR_MASK, 0x5 },
> + { PPI_RW_TERMCAL_CFG_0, PPI_RW_TERMCAL_CFG_0_TERMCAL_TIMER_MASK, 0x17 },
> + { PPI_RW_OFFSETCAL_CFG_0, PPI_RW_OFFSETCAL_CFG_0_OFFSETCAL_WAIT_THRESH_MASK, 0x4 },
> + { PPI_RW_LPDCOCAL_TIMEBASE, PPI_RW_LPDCOCAL_TIMEBASE_LPDCOCAL_TIMEBASE_MASK, 0x5F },
> + { PPI_RW_LPDCOCAL_TWAIT_CONFIG, PPI_RW_LPDCOCAL_TWAIT_CONFIG_LPDCOCAL_TWAIT_COARSE_MASK, 0x1D },
> + { PPI_RW_LPDCOCAL_VT_CONFIG, PPI_RW_LPDCOCAL_VT_CONFIG_LPDCOCAL_TWAIT_FINE_MASK, 0x1D },
> + { CORE_AFE_CTRL_2_0, CORE_AFE_CTRL_2_0_OA_CB_HSTX_VCOMM_REG_PON_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_1, CORE_AFE_CTRL_2_1_OA_CB_HSTX_VCOMM_REG_PON_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_1, CORE_AFE_CTRL_2_1_OA_CB_HSTXLB_DCO_CLK0_EN_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_3, CORE_AFE_CTRL_2_3_OA_CB_HSTXLB_DCO_CLK0_EN_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_0, CORE_AFE_CTRL_2_0_OA_CB_HSTXLB_DCO_CLK90_EN_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_3, CORE_AFE_CTRL_2_3_OA_CB_HSTXLB_DCO_CLK90_EN_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_6, CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_EN_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_7, CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_EN_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_6, CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_PON_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_7, CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_PON_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_6, CORE_AFE_CTRL_2_6_OA_CB_HSTXLB_DCO_TUNE_CLKDIG_EN_OVR_EN_MASK, 0x1 },
> + { CORE_AFE_CTRL_2_7, CORE_AFE_CTRL_2_7_OA_CB_HSTXLB_DCO_TUNE_CLKDIG_EN_OVR_VAL_MASK, 0x0 },
> + { CORE_AFE_CTRL_2_5, CORE_AFE_CTRL_2_5_OA_CB_SEL_45OHM_50OHM_MASK, 0x0 },
> +};
> +
> +static const struct isp4phy_mipi_reg_seq
> + startup_seq_dphy_periodic_deskew_program[] = {
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x404 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x40C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x414 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x41C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x423 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x429 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x430 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x43A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x445 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x44A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x450 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x45A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x465 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x469 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x472 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x47A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x485 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x489 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x490 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x49A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4A4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4AC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4B4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4BC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4C4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4CC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4D4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4DC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4E4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4EC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4F4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x4FC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x504 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x50C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x514 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x51C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x523 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x529 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x530 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x53A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x545 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x54A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x550 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x55A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x565 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x569 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x572 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x57A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x585 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x589 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x590 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x59A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5A4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5AC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5B4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5BC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5C4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5CC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5D4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5DC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5E4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5EC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5F4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x5FC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x604 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x60C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x614 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x61C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x623 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x629 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x632 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x63A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x645 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x64A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x650 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x65A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x665 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x669 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x672 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x67A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x685 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x689 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x690 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x69A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6A4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6AC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6B4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6BC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6C4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6CC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6D4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6DC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6E4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6EC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6F4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x6FC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x704 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x70C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x714 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x71C },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x723 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x72A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x730 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x73A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x745 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x74A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x750 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x75A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x765 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x769 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x772 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x77A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x785 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x789 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x790 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x79A },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7A4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7AC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7B4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7BC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7C4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7CC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7D4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7DC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7E4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7EC },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7F4 },
> + { CORE_DIG_COMMON_RW_DESKEW_FINE_MEM, 0, 0x7FC },
> +};
> +
> +inline u16 isp4phy_rreg(void __iomem *base, u32 phy_id, u16 addr)
> +{
> + const struct isp4phy_mipi_reg *reg = isp_mipi_phy_reg[phy_id];
> +
> + isp4hw_wreg(base, (uintptr_t)(®->isp_mipi_phy_ind_idx), addr);
> + return (u16)isp4hw_rreg(base, (uintptr_t)(®->isp_mipi_phy_ind_data));
> +}
> +
> +inline void isp4phy_wreg(void __iomem *base, u32 phy_id, u16 addr, u16 data)
> +{
> + const struct isp4phy_mipi_reg *reg = isp_mipi_phy_reg[phy_id];
> +
> + isp4hw_wreg(base, (uintptr_t)(®->isp_mipi_phy_ind_idx), addr);
> + isp4hw_wreg(base, (uintptr_t)(®->isp_mipi_phy_ind_data), data);
> +}
> +
> +static void isp4phy_mask_wreg(void __iomem *base, u32 phy_id, u16 addr,
> + u16 mask, u16 regval)
> +{
> + unsigned long _mask = mask;
> + u16 shift = 0;
> + u16 data;
> +
> + data = isp4phy_rreg(base, phy_id, addr);
> + if (mask)
> + shift = find_first_bit(&_mask, 16);
> + data = (data & ~mask) | ((regval << shift) & mask);
> +
> + isp4phy_wreg(base, phy_id, addr, data);
> +}
> +
> +static void isp4phy_optional_features_dphy(void __iomem *base, u32 phy_id)
> +{
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_CFG_0,
> + CORE_DIG_DLANE_CLK_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_CFG_0,
> + CORE_DIG_DLANE_CLK_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK, 0x0);
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_CFG_0,
> + CORE_DIG_DLANE_0_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_CFG_0,
> + CORE_DIG_DLANE_1_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_CFG_0,
> + CORE_DIG_DLANE_2_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_CFG_0,
> + CORE_DIG_DLANE_3_RW_CFG_0_CFG_0_LP_PIN_SWAP_REG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_CFG_0,
> + CORE_DIG_DLANE_0_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_CFG_0,
> + CORE_DIG_DLANE_1_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_CFG_0,
> + CORE_DIG_DLANE_2_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_CFG_0,
> + CORE_DIG_DLANE_3_RW_CFG_0_CFG_0_HS_PIN_SWAP_REG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_9,
> + CORE_AFE_LANE0_CTRL_2_9_OA_LANE0_HSRX_SEL_GATED_POLARITY_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_9,
> + CORE_AFE_LANE1_CTRL_2_9_OA_LANE1_HSRX_SEL_GATED_POLARITY_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_9,
> + CORE_AFE_LANE2_CTRL_2_9_OA_LANE2_HSRX_SEL_GATED_POLARITY_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_9,
> + CORE_AFE_LANE3_CTRL_2_9_OA_LANE3_HSRX_SEL_GATED_POLARITY_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_9,
> + CORE_AFE_LANE4_CTRL_2_9_OA_LANE4_HSRX_SEL_GATED_POLARITY_MASK, 0x0);
> + }
> +}
> +
> +static void isp4phy_dphy_periodic_deskew_program(void __iomem *base,
> + u32 phy_id)
> +{
> + for (int ctr = 0;
> + ctr < ARRAY_SIZE(startup_seq_dphy_periodic_deskew_program);
> + ctr++)
> + isp4phy_wreg(base, phy_id,
> + startup_seq_dphy_periodic_deskew_program[ctr].addr,
> + startup_seq_dphy_periodic_deskew_program[ctr].data);
> +}
> +
> +static void isp4phy_dphy_specific(void __iomem *base, u32 phy_id,
> + u64 data_rate,
> + struct isp4phy_mipi_config *phycfg)
> +{
> + u64 half_rate = data_rate >> 1;
> + u16 ddl_cal;
> +
> + ddl_cal = TIMEBASE * half_rate;
> + ddl_cal = (ddl_cal + 31) >> 5;
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_7,
> + CORE_DIG_RW_COMMON_7_LANE0_HSRX_WORD_CLK_SEL_GATING_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_7,
> + CORE_DIG_RW_COMMON_7_LANE1_HSRX_WORD_CLK_SEL_GATING_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_7,
> + CORE_DIG_RW_COMMON_7_LANE2_HSRX_WORD_CLK_SEL_GATING_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_7,
> + CORE_DIG_RW_COMMON_7_LANE3_HSRX_WORD_CLK_SEL_GATING_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_7,
> + CORE_DIG_RW_COMMON_7_LANE4_HSRX_WORD_CLK_SEL_GATING_REG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, PPI_STARTUP_RW_COMMON_DPHY_8,
> + PPI_STARTUP_RW_COMMON_DPHY_8_CPHY_DDL_CAL_ADDR_MASK, 0x50);
> +
> + if (data_rate < 1500) {
> + isp4phy_mask_wreg(base, phy_id, PPI_STARTUP_RW_COMMON_DPHY_7,
> + PPI_STARTUP_RW_COMMON_DPHY_7_DPHY_DDL_CAL_ADDR_MASK, 0x68);
> + } else {
> + /* Digital Delay Line (DDL) tuning calibration */
> + isp4phy_mask_wreg(base, phy_id, PPI_STARTUP_RW_COMMON_DPHY_7,
> + PPI_STARTUP_RW_COMMON_DPHY_7_DPHY_DDL_CAL_ADDR_MASK, 0x28);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_0,
> + PPI_RW_DDLCAL_CFG_0_DDLCAL_TIMEBASE_TARGET_MASK, 0x77); /* LUT->24MHz case */
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_7,
> + PPI_RW_DDLCAL_CFG_7_DDLCAL_DECR_WAIT_MASK, 0x22);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_1,
> + PPI_RW_DDLCAL_CFG_1_DDLCAL_DISABLE_TIME_MASK, 0x17); /* LUT->24MHz case */
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_2,
> + PPI_RW_DDLCAL_CFG_2_DDLCAL_WAIT_MASK, 0x4);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_2,
> + PPI_RW_DDLCAL_CFG_2_DDLCAL_TUNE_MODE_MASK, 0x2);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_2,
> + PPI_RW_DDLCAL_CFG_2_DDLCAL_DDL_DLL_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_2,
> + PPI_RW_DDLCAL_CFG_2_DDLCAL_ENABLE_WAIT_MASK, 0x17); /* LUT->24MHz case */
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_2,
> + PPI_RW_DDLCAL_CFG_2_DDLCAL_UPDATE_SETTINGS_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_4,
> + PPI_RW_DDLCAL_CFG_4_DDLCAL_STUCK_THRESH_MASK, 0xA);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_6,
> + PPI_RW_DDLCAL_CFG_6_DDLCAL_MAX_DIFF_MASK, 0xA);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_7,
> + PPI_RW_DDLCAL_CFG_7_DDLCAL_START_DELAY_MASK, 0xB); /* LUT->24MHz case */
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_3,
> + PPI_RW_DDLCAL_CFG_3_DDLCAL_COUNTER_REF_MASK, ddl_cal);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_1,
> + PPI_RW_DDLCAL_CFG_1_DDLCAL_MAX_PHASE_MASK, phycfg->max_phase);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_5,
> + PPI_RW_DDLCAL_CFG_5_DDLCAL_DLL_FBK_MASK,
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg);
> + isp4phy_mask_wreg(base, phy_id, PPI_RW_DDLCAL_CFG_5,
> + PPI_RW_DDLCAL_CFG_5_DDLCAL_DDL_COARSE_BANK_MASK,
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_8,
> + CORE_AFE_LANE0_CTRL_2_8_OA_LANE0_HSRX_CDPHY_SEL_FAST_MASK,
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_8,
> + CORE_AFE_LANE1_CTRL_2_8_OA_LANE1_HSRX_CDPHY_SEL_FAST_MASK,
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_8,
> + CORE_AFE_LANE2_CTRL_2_8_OA_LANE2_HSRX_CDPHY_SEL_FAST_MASK,
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_8,
> + CORE_AFE_LANE3_CTRL_2_8_OA_LANE3_HSRX_CDPHY_SEL_FAST_MASK,
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_8,
> + CORE_AFE_LANE4_CTRL_2_8_OA_LANE4_HSRX_CDPHY_SEL_FAST_MASK,
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg);
> + }
> + }
> +
> + /* Write 6 if Tlpx (far end / near end) ratio < 1
> + * Write 7 if Tlpx (far end / near end) ratio >= 1
> + */
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_LP_0,
> + CORE_DIG_DLANE_0_RW_LP_0_LP_0_TTAGO_REG_MASK, 0x7);
> + /* Write 6 if Tlpx (far end / near end) ratio < 1
> + * Write 7 if Tlpx (far end / near end) ratio >= 1
> + */
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_LP_0,
> + CORE_DIG_DLANE_1_RW_LP_0_LP_0_TTAGO_REG_MASK, 0x7);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + /* Write 6 if Tlpx (far end / near end) ratio < 1
> + * Write 7 if Tlpx (far end / near end) ratio >= 1
> + */
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_LP_0,
> + CORE_DIG_DLANE_2_RW_LP_0_LP_0_TTAGO_REG_MASK, 0x7);
> + /* Write 6 if Tlpx (far end / near end) ratio < 1
> + * Write 7 if Tlpx (far end / near end) ratio >= 1
> + */
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_LP_0,
> + CORE_DIG_DLANE_3_RW_LP_0_LP_0_TTAGO_REG_MASK, 0x7);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_2,
> + CORE_AFE_LANE0_CTRL_2_2_OA_LANE0_SEL_LANE_CFG_MASK, 0x0);
> +
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_2,
> + CORE_AFE_LANE1_CTRL_2_2_OA_LANE1_SEL_LANE_CFG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_2,
> + CORE_AFE_LANE2_CTRL_2_2_OA_LANE2_SEL_LANE_CFG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_2,
> + CORE_AFE_LANE3_CTRL_2_2_OA_LANE3_SEL_LANE_CFG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_2,
> + CORE_AFE_LANE4_CTRL_2_2_OA_LANE4_SEL_LANE_CFG_MASK, 0x0);
> + } else {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_2,
> + CORE_AFE_LANE1_CTRL_2_2_OA_LANE1_SEL_LANE_CFG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_2,
> + CORE_AFE_LANE2_CTRL_2_2_OA_LANE2_SEL_LANE_CFG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_6,
> + CORE_DIG_RW_COMMON_6_DESERIALIZER_EN_DEASS_COUNT_THRESH_D_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_RW_COMMON_6,
> + CORE_DIG_RW_COMMON_6_DESERIALIZER_DIV_EN_DELAY_THRESH_D_MASK, 0x1);
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_12,
> + CORE_AFE_LANE0_CTRL_2_12_OA_LANE0_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_12,
> + CORE_AFE_LANE1_CTRL_2_12_OA_LANE1_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_12,
> + CORE_AFE_LANE2_CTRL_2_12_OA_LANE2_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_12,
> + CORE_AFE_LANE3_CTRL_2_12_OA_LANE3_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_12,
> + CORE_AFE_LANE4_CTRL_2_12_OA_LANE4_HSRX_DPHY_DDL_BYPASS_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_13,
> + CORE_AFE_LANE0_CTRL_2_13_OA_LANE0_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_13,
> + CORE_AFE_LANE1_CTRL_2_13_OA_LANE1_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_13,
> + CORE_AFE_LANE2_CTRL_2_13_OA_LANE2_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_13,
> + CORE_AFE_LANE3_CTRL_2_13_OA_LANE3_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_13,
> + CORE_AFE_LANE4_CTRL_2_13_OA_LANE4_HSRX_DPHY_DDL_BYPASS_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_12,
> + CORE_AFE_LANE0_CTRL_2_12_OA_LANE0_HSRX_DPHY_DLL_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_12,
> + CORE_AFE_LANE1_CTRL_2_12_OA_LANE1_HSRX_DPHY_DLL_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_12,
> + CORE_AFE_LANE2_CTRL_2_12_OA_LANE2_HSRX_DPHY_DLL_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_12,
> + CORE_AFE_LANE3_CTRL_2_12_OA_LANE3_HSRX_DPHY_DLL_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_12,
> + CORE_AFE_LANE4_CTRL_2_12_OA_LANE4_HSRX_DPHY_DLL_EN_OVR_VAL_MASK,
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE0_CTRL_2_13,
> + CORE_AFE_LANE0_CTRL_2_13_OA_LANE0_HSRX_DPHY_DLL_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_13,
> + CORE_AFE_LANE1_CTRL_2_13_OA_LANE1_HSRX_DPHY_DLL_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_13,
> + CORE_AFE_LANE2_CTRL_2_13_OA_LANE2_HSRX_DPHY_DLL_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE3_CTRL_2_13,
> + CORE_AFE_LANE3_CTRL_2_13_OA_LANE3_HSRX_DPHY_DLL_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE4_CTRL_2_13,
> + CORE_AFE_LANE4_CTRL_2_13_OA_LANE4_HSRX_DPHY_DLL_EN_OVR_EN_MASK,
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE2_CTRL_2_9,
> + CORE_AFE_LANE2_CTRL_2_9_OA_LANE2_HSRX_HS_CLK_DIV_MASK,
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg);
> + } else {
> + isp4phy_mask_wreg(base, phy_id, CORE_AFE_LANE1_CTRL_2_9,
> + CORE_AFE_LANE1_CTRL_2_9_OA_LANE1_HSRX_HS_CLK_DIV_MASK,
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_HS_RX_0,
> + CORE_DIG_DLANE_CLK_RW_HS_RX_0_HS_RX_0_TCLKSETTLE_REG_MASK, 0x1C);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_HS_RX_7,
> + CORE_DIG_DLANE_CLK_RW_HS_RX_7_HS_RX_7_TCLKMISS_REG_MASK, 0x6);
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_0,
> + CORE_DIG_DLANE_0_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK,
> + phycfg->hs_rx_0hs_rx_0_thssettle_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_0,
> + CORE_DIG_DLANE_1_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK,
> + phycfg->hs_rx_0hs_rx_0_thssettle_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_0,
> + CORE_DIG_DLANE_2_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK,
> + phycfg->hs_rx_0hs_rx_0_thssettle_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_0,
> + CORE_DIG_DLANE_3_RW_HS_RX_0_HS_RX_0_THSSETTLE_REG_MASK,
> + phycfg->hs_rx_0hs_rx_0_thssettle_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_CFG_1,
> + CORE_DIG_DLANE_0_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK,
> + phycfg->cfg_1cfg_1_deskew_supported_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_CFG_1,
> + CORE_DIG_DLANE_1_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK,
> + phycfg->cfg_1cfg_1_deskew_supported_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_CFG_1,
> + CORE_DIG_DLANE_2_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK,
> + phycfg->cfg_1cfg_1_deskew_supported_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_CFG_1,
> + CORE_DIG_DLANE_3_RW_CFG_1_CFG_1_DESKEW_SUPPORTED_REG_MASK,
> + phycfg->cfg_1cfg_1_deskew_supported_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_CFG_1,
> + CORE_DIG_DLANE_0_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK,
> + phycfg->cfg_1cfg_1_sot_detection_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_CFG_1,
> + CORE_DIG_DLANE_1_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK,
> + phycfg->cfg_1cfg_1_sot_detection_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_CFG_1,
> + CORE_DIG_DLANE_2_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK,
> + phycfg->cfg_1cfg_1_sot_detection_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_CFG_1,
> + CORE_DIG_DLANE_3_RW_CFG_1_CFG_1_SOT_DETECTION_REG_MASK,
> + phycfg->cfg_1cfg_1_sot_detection_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_2,
> + CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK,
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_2,
> + CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK,
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_2,
> + CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK,
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_2,
> + CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_IGNORE_ALTERNCAL_REG_MASK,
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_LP_0,
> + CORE_DIG_DLANE_0_RW_LP_0_LP_0_ITMINRX_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_LP_0,
> + CORE_DIG_DLANE_1_RW_LP_0_LP_0_ITMINRX_REG_MASK, 0x1);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_LP_0,
> + CORE_DIG_DLANE_2_RW_LP_0_LP_0_ITMINRX_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_LP_0,
> + CORE_DIG_DLANE_3_RW_LP_0_LP_0_ITMINRX_REG_MASK, 0x1);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_LP_2,
> + CORE_DIG_DLANE_0_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_LP_2,
> + CORE_DIG_DLANE_1_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_LP_2,
> + CORE_DIG_DLANE_2_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_LP_2,
> + CORE_DIG_DLANE_3_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_LP_0,
> + CORE_DIG_DLANE_CLK_RW_LP_0_LP_0_ITMINRX_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_CLK_RW_LP_2,
> + CORE_DIG_DLANE_CLK_RW_LP_2_LP_2_FILTER_INPUT_SAMPLING_REG_MASK, 0x0);
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_2,
> + CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_2,
> + CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK, 0x1);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_2,
> + CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_2,
> + CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_UPDATE_SETTINGS_DESKEW_REG_MASK, 0x1);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_1,
> + CORE_DIG_DLANE_0_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK, 0x10);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_1,
> + CORE_DIG_DLANE_1_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK, 0x10);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_1,
> + CORE_DIG_DLANE_2_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK, 0x10);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_1,
> + CORE_DIG_DLANE_3_RW_HS_RX_1_HS_RX_1_FILTER_SIZE_DESKEW_REG_MASK, 0x10);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_2,
> + CORE_DIG_DLANE_0_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK, 0x3);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_2,
> + CORE_DIG_DLANE_1_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK, 0x3);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_2,
> + CORE_DIG_DLANE_2_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK, 0x3);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_2,
> + CORE_DIG_DLANE_3_RW_HS_RX_2_HS_RX_2_WINDOW_SIZE_DESKEW_REG_MASK, 0x3);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_3,
> + CORE_DIG_DLANE_0_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_3,
> + CORE_DIG_DLANE_1_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK, 0x1);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_3,
> + CORE_DIG_DLANE_2_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_3,
> + CORE_DIG_DLANE_3_RW_HS_RX_3_HS_RX_3_STEP_SIZE_DESKEW_REG_MASK, 0x1);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_4,
> + CORE_DIG_DLANE_0_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK, 0x96);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_4,
> + CORE_DIG_DLANE_1_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK, 0x96);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_4,
> + CORE_DIG_DLANE_2_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK, 0x96);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_4,
> + CORE_DIG_DLANE_3_RW_HS_RX_4_HS_RX_4_MAX_ITERATIONS_DESKEW_REG_MASK, 0x96);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_5,
> + CORE_DIG_DLANE_0_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_5,
> + CORE_DIG_DLANE_1_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_5,
> + CORE_DIG_DLANE_2_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_5,
> + CORE_DIG_DLANE_3_RW_HS_RX_5_HS_RX_5_DDL_LEFT_INIT_REG_MASK, 0x0);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_5,
> + CORE_DIG_DLANE_0_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_5,
> + CORE_DIG_DLANE_1_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK, 0x1);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_5,
> + CORE_DIG_DLANE_2_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK, 0x1);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_5,
> + CORE_DIG_DLANE_3_RW_HS_RX_5_HS_RX_5_DDL_MID_INIT_REG_MASK, 0x1);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_6,
> + CORE_DIG_DLANE_0_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK, 0x2);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_6,
> + CORE_DIG_DLANE_1_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK, 0x2);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_6,
> + CORE_DIG_DLANE_2_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK, 0x2);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_6,
> + CORE_DIG_DLANE_3_RW_HS_RX_6_HS_RX_6_DDL_RIGHT_INIT_REG_MASK, 0x2);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_7,
> + CORE_DIG_DLANE_0_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_7,
> + CORE_DIG_DLANE_1_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_7,
> + CORE_DIG_DLANE_2_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_7,
> + CORE_DIG_DLANE_3_RW_HS_RX_7_HS_RX_7_DESKEW_AUTO_ALGO_SEL_REG_MASK, 0x0);
> + }
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_7,
> + CORE_DIG_DLANE_0_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_7,
> + CORE_DIG_DLANE_1_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK, 0x0);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_7,
> + CORE_DIG_DLANE_2_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK, 0x0);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_7,
> + CORE_DIG_DLANE_3_RW_HS_RX_7_HS_RX_7_SELECT_ALTERNATE_ALGO_REG_MASK, 0x0);
> + }
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_3,
> + CORE_DIG_DLANE_0_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK,
> + phycfg->hs_rx_3hs_rx_3_fjump_deskew_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_3,
> + CORE_DIG_DLANE_1_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK,
> + phycfg->hs_rx_3hs_rx_3_fjump_deskew_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_3,
> + CORE_DIG_DLANE_2_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK,
> + phycfg->hs_rx_3hs_rx_3_fjump_deskew_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_3,
> + CORE_DIG_DLANE_3_RW_HS_RX_3_HS_RX_3_FJUMP_DESKEW_REG_MASK,
> + phycfg->hs_rx_3hs_rx_3_fjump_deskew_reg);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_9,
> + CORE_DIG_DLANE_0_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK,
> + phycfg->max_phase);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_9,
> + CORE_DIG_DLANE_1_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK,
> + phycfg->max_phase);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_9,
> + CORE_DIG_DLANE_2_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK,
> + phycfg->max_phase);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_9,
> + CORE_DIG_DLANE_3_RW_HS_RX_9_HS_RX_9_PHASE_BOUND_REG_MASK,
> + phycfg->max_phase);
> + }
> +
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_HS_RX_6,
> + CORE_DIG_DLANE_0_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK,
> + phycfg->hs_rx_6hs_rx_6_min_eye_opening_deskew_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_1_RW_HS_RX_6,
> + CORE_DIG_DLANE_1_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK,
> + phycfg->hs_rx_6hs_rx_6_min_eye_opening_deskew_reg);
> + if (phy_id <= ISP_MIPI_PHY_ID_1) {
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_2_RW_HS_RX_6,
> + CORE_DIG_DLANE_2_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK,
> + phycfg->hs_rx_6hs_rx_6_min_eye_opening_deskew_reg);
> + isp4phy_mask_wreg(base, phy_id, CORE_DIG_DLANE_3_RW_HS_RX_6,
> + CORE_DIG_DLANE_3_RW_HS_RX_6_HS_RX_6_MIN_EYE_OPENING_DESKEW_REG_MASK,
> + phycfg->hs_rx_6hs_rx_6_min_eye_opening_deskew_reg);
> + }
> +}
> +
> +static void isp4phy_common(void __iomem *base, u32 phy_id)
> +{
> + for (int ctr = 0; ctr < ARRAY_SIZE(startup_seq_common); ctr++)
> + isp4phy_mask_wreg(base, phy_id, startup_seq_common[ctr].addr,
> + startup_seq_common[ctr].mask,
> + startup_seq_common[ctr].data);
> +}
> +
> +static void isp4phy_general_common_config(void __iomem *base, u32 phy_id)
> +{
> + for (int ctr = 0; ctr < ARRAY_SIZE(startup_seq_general_common_config); ctr++)
> + isp4phy_mask_wreg(base, phy_id,
> + startup_seq_general_common_config[ctr].addr,
> + startup_seq_general_common_config[ctr].mask,
> + startup_seq_general_common_config[ctr].data);
> +}
> +
> +static void
> +isp4phy_calculate_datarate_cfgs_rx(u32 phy_id, u64 data_rate,
> + u32 lane,
> + struct isp4phy_mipi_config *phycfg)
> +{
> + u64 half_rate = data_rate >> 1;
> + u64 hs_clk_freq;
> +
> + hs_clk_freq = half_rate * 1000;
> +
> + if (data_rate <= 2500)
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg = 1;
> + else if (data_rate <= 4500)
> + phycfg->hs_rx_2hs_rx_2_ignore_alterncal_reg = 0;
> +
> + if (data_rate < 1500) {
> + /* do nothing */
> + } else if (data_rate < 1588) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 143;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 17;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 3;
> + } else if (data_rate < 1688) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 135;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 16;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 2;
> + } else if (data_rate < 1800) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 127;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 15;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 2;
> + } else if (data_rate < 1929) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 119;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 14;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 2;
> + } else if (data_rate < 2077) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 111;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 13;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 2;
> + } else if (data_rate < 2250) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 103;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 12;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 2455) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 95;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 11;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 2700) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 87;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 10;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 3000) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 79;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 9;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 3230) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 0;
> + phycfg->max_phase = 71;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 8;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 0;
> + } else if (data_rate < 3600) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 1;
> + phycfg->max_phase = 87;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 10;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 4000) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 1;
> + phycfg->max_phase = 79;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 9;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else if (data_rate < 4500) {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 1;
> + phycfg->max_phase = 71;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 8;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 1;
> + } else {
> + phycfg->afe_lanex_ctrl_2_8oa_cdphy_sel_fast_reg = 1;
> + phycfg->max_phase = 63;
> + phycfg->ddlcal_cfg_5ddlcal_dll_fbk_reg = 7;
> + phycfg->ddlcal_cfg_5ddlcal_ddl_coarse_bank_reg = 0;
> + }
> +
> + if (data_rate <= 1500) {
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg = 1;
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg = 1;
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg = 0;
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg = 1;
> + phycfg->cfg_1cfg_1_deskew_supported_reg = 0;
> + phycfg->cfg_1cfg_1_sot_detection_reg = 1;
> + } else if (data_rate <= 4500) {
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_ddl_bypass_en_ovr_val_reg = 0;
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_ddl_bypass_en_ovr_en_reg = 0;
> + phycfg->afe_lanex_ctrl_2_12oa_dphy_dll_en_ovr_val_reg = 0;
> + phycfg->afe_lanex_ctrl_2_13oa_dphy_dll_en_ovr_en_reg = 0;
> + phycfg->cfg_1cfg_1_deskew_supported_reg = 1;
> + phycfg->cfg_1cfg_1_sot_detection_reg = 0;
> + }
> +
> + if (data_rate < 160)
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b001;
> + else if (data_rate < 320)
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b010;
> + else if (data_rate < 640)
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b011;
> + else if (data_rate < 1280)
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b100;
> + else if (data_rate < 2560)
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b101;
> + else
> + phycfg->afe_lanex_ctrl_2_9oa_hs_clk_div_reg = 0b110;
> +
> + u32 t_hs_settle_ns = MIN_T_HS_SETTLE_NS + MAX_T_HS_SETTLE_NS;
> +
> + t_hs_settle_ns = t_hs_settle_ns >> 1;
> + u32 t_hs_settle_ui = MIN_T_HS_SETTLE_UI + MAX_T_HS_SETTLE_UI;
> +
> + t_hs_settle_ui = t_hs_settle_ui >> 1;
> +
> + t_hs_settle_ui = t_hs_settle_ui * 1000000;
> + t_hs_settle_ui = t_hs_settle_ui >> 1;
> + do_div(t_hs_settle_ui, hs_clk_freq);
> + u32 ths_settle_target = t_hs_settle_ns + t_hs_settle_ui;
> +
> + do_div(ths_settle_target, T_DCO);
> + phycfg->hs_rx_0hs_rx_0_thssettle_reg = ths_settle_target - TMIN_RX - 7;
> +
> + u16 jump_deskew_reg = phycfg->max_phase + 39;
> +
> + do_div(jump_deskew_reg, 40);
> + phycfg->hs_rx_3hs_rx_3_fjump_deskew_reg = jump_deskew_reg;
> +
> + u16 eye_opening_deskew_reg = phycfg->max_phase + 4;
> +
> + do_div(eye_opening_deskew_reg, 5);
> + phycfg->hs_rx_6hs_rx_6_min_eye_opening_deskew_reg = eye_opening_deskew_reg;
> +}
> +
> +static void isp4phy_startup_seq_dphy_rx(void __iomem *base, u32 phy_id,
> + u64 data_rate, u32 lane)
> +{
> + struct isp4phy_mipi_config phycfg;
> +
> + memset(&phycfg, 0, sizeof(phycfg));
> +
> + isp4phy_calculate_datarate_cfgs_rx(phy_id, data_rate, lane, &phycfg);
> + isp4phy_general_common_config(base, phy_id);
> + isp4phy_common(base, phy_id);
> + isp4phy_dphy_specific(base, phy_id, data_rate, &phycfg);
> + isp4phy_dphy_periodic_deskew_program(base, phy_id);
> + isp4phy_optional_features_dphy(base, phy_id);
> +}
> +
> +static int isp4phy_startup_seq_cdphy_rx(struct device *dev,
> + void __iomem *base, u32 phy_id,
> + u64 data_rate, u32 lane)
> +{
> + struct isp4phy_mipi_reg phy_reg = {0};
> +
> + /* readback the mipi phy reg */
> + phy_reg.isp_mipi_phy0.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy0);
> + phy_reg.isp_mipi_phy1.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy1);
> + phy_reg.isp_mipi_phy2.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy2);
> + phy_reg.isp_mipi_phy4.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy4);
> + phy_reg.isp_mipi_phy5.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy5);
> + phy_reg.isp_mipi_phy6.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy6);
> + phy_reg.isp_mipi_phy7.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy7);
> +
> + phy_reg.isp_mipi_phy0.bit.shutdownz = 0;
> + phy_reg.isp_mipi_phy0.bit.rstz = 0;
> + isp4hw_wreg(base, (uintptr_t)(&isp_mipi_phy_reg[phy_id]->isp_mipi_phy0),
> + phy_reg.isp_mipi_phy0.value);
> +
> + /*PHY register access test */
> + isp4phy_wreg(base, phy_id, CORE_DIG_DLANE_0_RW_LP_0, 0x473C);
> + usleep_range(10, 20);
> + if (isp4phy_rreg(base, phy_id, CORE_DIG_DLANE_0_RW_LP_0) == 0x473C) {
> + dev_dbg(dev, "PHY register access test suc\n");
> + } else {
> + dev_err(dev, "PHY register access test fail\n");
> + return -EFAULT;
> + }
> +
> + /** T1: top level static inputs must be set to the desired
> + * configuration (for example, phyMode. These *inputs can be
> + * identified with Startup and Active Mode state: Static label
> + * in Chapter 4, ¡°Signal Descriptions¡±).
> + */
> + phy_reg.isp_mipi_phy5.value = (1 << lane) - 1;
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_clk = 1;
> + isp4hw_wreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy5,
> + phy_reg.isp_mipi_phy5.value);
> +
> + phy_reg.isp_mipi_phy4.value = (0x2 << lane) - 1;
> + isp4hw_wreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy4,
> + phy_reg.isp_mipi_phy4.value);
> +
> + phy_reg.isp_mipi_phy1.bit.mode = ISP_MIPI_DPHY;
> + isp4hw_wreg(base, (uintptr_t)(&isp_mipi_phy_reg[phy_id]->isp_mipi_phy1),
> + phy_reg.isp_mipi_phy1.value);
> +
> + /** T2: APB slave is active and can be accessed (presetN = 1b1)*/
> + /** T3: static register fields are programmed/read through the APB,
> + * with PHY in reset (these register
> + * fields can be found in Chapter 11.2, Static Register Access).
> + */
> + /* DPHY mode setup */
> + isp4phy_startup_seq_dphy_rx(base, phy_id, data_rate, lane);
> +
> + /** T4: initial programming phase is over and PHY is ready
> + * to leave Shutdown Mode (shutdownN = 1¡¯b1
> + * and rstN = 1¡¯b1).
> + */
> + phy_reg.isp_mipi_phy0.bit.shutdownz = 1;
> + phy_reg.isp_mipi_phy0.bit.rstz = 1;
> + isp4hw_wreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy0,
> + phy_reg.isp_mipi_phy0.value);
> +
> + dev_dbg(dev, "Termination calibration observability: 0x%x\n",
> + isp4phy_rreg(base, phy_id, PPI_R_TERMCAL_DEBUG_0));
> +
> + /** T5: internal calibrations ongoing. No configurations are accepted
> + * during power-on-reset (POR).
> + * phyReady asserts to signal that POR is complete.
> + */
> + do {
> + usleep_range(1000, 2000);
> + phy_reg.isp_mipi_phy7.value =
> + isp4hw_rreg(base, (uintptr_t)&isp_mipi_phy_reg[phy_id]->isp_mipi_phy7);
> + dev_dbg(dev, "Wait for phyReady: 0x%x\n",
> + phy_reg.isp_mipi_phy7.value);
> + } while (phy_reg.isp_mipi_phy7.bit.ready != 1);
> +
> + /** T6: dynamic register fields can be programmed/read through APB
> + * (these register fields can be found in Chapter 11.3, Dynamic Register Access).
> + * Check Chapter 9.3.4, D-PHY and C-PHY HS Receivers for analog settings that must be
> + * programmed in T3.
> + */
> +
> + /** T7: de-assert forcerxmode_N.*/
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_0 = 0;
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_1 = 0;
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_2 = 0;
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_3 = 0;
> + phy_reg.isp_mipi_phy5.bit.forcerxmode_clk = 0;
> + isp4hw_wreg(base, (uintptr_t)(&isp_mipi_phy_reg[phy_id]->isp_mipi_phy5),
> + phy_reg.isp_mipi_phy5.value);
> + return 0;
> +}
> +
> +int isp4phy_start(struct device *dev,
> + void __iomem *base, u32 phy_id, u64 bit_rate,
> + u32 lane_num)
> +{
> + if (phy_id >= ISP_MIPI_PHY_ID_MAX)
> + return -EINVAL;
> +
> + if (phy_id == 2 && lane_num > 2) {
> + dev_err(dev, "MIPI PHY 2 just has 2 lane\n");
> + return -EINVAL;
> + }
> +
> + if (phy_id == 0 && lane_num > 4) {
> + dev_err(dev, "fail invalid lane number %u for phy0\n",
> + lane_num);
> + return -EINVAL;
> + }
> +
> + return isp4phy_startup_seq_cdphy_rx(dev, base, phy_id, bit_rate, lane_num);
> +}
> +
> +int isp4phy_stop(void __iomem *base, u32 phy_id)
> +{
> + struct isp4phy_mipi_reg phy_reg = {0};
> +
> + if (phy_id >= ISP_MIPI_PHY_ID_MAX)
> + return -EINVAL;
> +
> + phy_reg.isp_mipi_phy0.value =
> + isp4hw_rreg(base, (uintptr_t)
> + (&isp_mipi_phy_reg[phy_id]->isp_mipi_phy0));
> +
> + /* shutdown phy */
> + phy_reg.isp_mipi_phy0.bit.shutdownz = 0;
> + phy_reg.isp_mipi_phy0.bit.rstz = 0;
> + isp4hw_wreg(base,
> + (uintptr_t)(&isp_mipi_phy_reg[phy_id]->isp_mipi_phy0),
> + phy_reg.isp_mipi_phy0.value);
> +
> + return 0;
> +}
> diff --git a/drivers/media/platform/amd/isp4/isp4_phy.h b/drivers/media/platform/amd/isp4/isp4_phy.h
> new file mode 100644
> index 000000000000..2909892dbd00
> --- /dev/null
> +++ b/drivers/media/platform/amd/isp4/isp4_phy.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2025 Advanced Micro Devices, Inc.
> + */
> +
> +#ifndef _ISP4_PHY_H_
> +#define _ISP4_PHY_H_
> +
> +int isp4phy_start(struct device *dev,
> + void __iomem *base, u32 phy_id, u64 bit_rate,
> + u32 lane_num);
> +int isp4phy_stop(void __iomem *base, u32 phy_id);
> +
> +#endif
Powered by blists - more mailing lists