diff options
author | YongWook Shin <yongwook.shin@samsung.com> | 2023-12-06 15:19:39 +0900 |
---|---|---|
committer | Petri Gynther <pgynther@google.com> | 2024-01-03 12:16:13 -0800 |
commit | ec68d451360fa6cc79753c6253c03eec195b4318 (patch) | |
tree | de8f4148549ef762daea9a17bd356a1df84f5fdb | |
parent | 3064e4d0c0ed6d0dc85b1b7ee1ccd66a1f2859ee (diff) | |
download | display-ec68d451360fa6cc79753c6253c03eec195b4318.tar.gz |
drm: samsung: update DP TX PHY lanes configuration sequence
During Link Training, DP TX lane's clock can be changed.
To confirm DP TX PLL/Power State changes, the configuration sequence
is changed.
Bug: 309067706
Signed-off-by: YongWook Shin <yongwook.shin@samsung.com>
Change-Id: I03b6996aa2ac6c8e7f107c33936d60f2ba274781
-rw-r--r-- | samsung/cal_9865/dp_reg.c | 126 | ||||
-rw-r--r-- | samsung/cal_9865/regs-usbdpphy_ctrl.h | 21 |
2 files changed, 63 insertions, 84 deletions
diff --git a/samsung/cal_9865/dp_reg.c b/samsung/cal_9865/dp_reg.c index 0ebf859..28d27bc 100644 --- a/samsung/cal_9865/dp_reg.c +++ b/samsung/cal_9865/dp_reg.c @@ -496,17 +496,17 @@ static void dpphy_reg_set_config10_tx_eq_pre(u32 eq_pre_val, u32 eq_pre_mask) dp_phy_write_mask(SST1, DP_CONFIG10, eq_pre_val, eq_pre_mask); } -static void dpphy_reg_set_config11_tx_pstate(enum lane_usage lane) +static void dpphy_reg_set_config11_tx_pstate(u32 en, enum lane_usage lane) { - /* P2(0b11) is power down */ - u32 val = 0; + u32 val = DP_TX_PSTATE_SET_0LANES; - if (lane == DP_USE_0_LANES) - val = DP_TX_PSTATE_SET_0LANES; // Power Down for 4 Lanes + /* P2(0b11) is power down */ + if (!en || lane == DP_USE_0_LANES) + val = DP_TX_PSTATE_SET_0LANES; else if (lane == DP_USE_2_LANES) - val = DP_TX_PSTATE_SET_2LANES; // Power Up for 2 lanes + val = DP_TX_PSTATE_SET_2LANES; else if (lane == DP_USE_4_LANES) - val = DP_TX_PSTATE_SET_4LANES; // Power Up for 4 lanes + val = DP_TX_PSTATE_SET_4LANES; dp_phy_write_mask(SST1, DP_CONFIG11, val, DP_TX_PSTATE_MASK); } @@ -515,8 +515,7 @@ static void dpphy_reg_wait_config12_tx_ack(enum lane_usage lane) { u32 val = 0; - if (readl_poll_timeout_atomic(regs_dp[REGS_PHY][SST1].regs + - DP_CONFIG12, + if (readl_poll_timeout_atomic(regs_dp[REGS_PHY][SST1].regs + DP_CONFIG12, val, !DP_TX_ACK_GET(val), 10, 2000)) { cal_log_err(0, "is timeout. Fail to ack DP TX.\n"); cal_log_err(0, "val(0x%08x) DP_CONFIG12 read:0x%08x\n", val, @@ -524,34 +523,30 @@ static void dpphy_reg_wait_config12_tx_ack(enum lane_usage lane) } } -static void dpphy_reg_set_config12_status_update(enum lane_usage lane) +static void dpphy_reg_set_config12_status_update(void) { u32 val = 0; - if (lane == DP_USE_0_LANES) - return; - else if (lane == DP_USE_2_LANES) - val = DP_TX_REQ_STATUS_SET_2LANES; - else if (lane == DP_USE_4_LANES) - val = DP_TX_REQ_STATUS_SET_4LANES; - - dp_phy_write_mask(SST1, DP_CONFIG12, val, DP_TX_REQ_STATUS_MASK); + /* Set DP TX Request */ + dp_phy_write_mask(SST1, DP_CONFIG12, DP_TX_REQ_SET_4LANES, DP_TX_REQ_MASK); - if (readl_poll_timeout_atomic( - regs_dp[REGS_PHY][SST1].regs + DP_CONFIG12, val, - !DP_TX_REQ_STATUS_GET(val), 10, 2000)) { - cal_log_err(0, "is timeout. Fail to update DP TX status.\n"); + /* Wait for DP TX Request Clear */ + if (readl_poll_timeout_atomic(regs_dp[REGS_PHY][SST1].regs + DP_CONFIG12, + val, !DP_TX_REQ_GET(val), 10, 2000)) { + cal_log_err(0, "is timeout. Fail to request DP TX update.\n"); cal_log_err(0, "val(0x%08x) DP_CONFIG12 read:0x%08x\n", val, readl(regs_dp[REGS_PHY][SST1].regs + DP_CONFIG12)); - } else - cal_log_debug(0, "Success to update DP TX status.\n"); + } + + /* Wait for TX Acknowledge to confirm DP TX request is applied */ + dpphy_reg_wait_config12_tx_ack(DP_USE_4_LANES); } -static void dpphy_reg_set_config12_tx_mpllb_en(enum lane_usage lane) +static void dpphy_reg_set_config12_tx_mpllb_en(u32 en, enum lane_usage lane) { - u32 val = 0; + u32 val = DP_TX_MPLL_EN_SET_0LANES; - if (lane == DP_USE_0_LANES) + if (!en || lane == DP_USE_0_LANES) val = DP_TX_MPLL_EN_SET_0LANES; else if (lane == DP_USE_2_LANES) val = DP_TX_MPLL_EN_SET_2LANES; @@ -561,11 +556,12 @@ static void dpphy_reg_set_config12_tx_mpllb_en(enum lane_usage lane) dp_phy_write_mask(SST1, DP_CONFIG12, val, DP_TX_MPLL_EN_MASK); } -static void dpphy_reg_set_config12_tx_width(enum lane_usage lane) +static void dpphy_reg_set_config12_tx_width(u32 en, enum lane_usage lane) { u32 val = 0; - if (lane == DP_USE_0_LANES) + /* "0b11" is 20bit DP TX lane width */ + if (!en || lane == DP_USE_0_LANES) val = DP_TX_WIDTH_SET_0LANES; else if (lane == DP_USE_2_LANES) val = DP_TX_WIDTH_SET_2LANES; @@ -577,36 +573,22 @@ static void dpphy_reg_set_config12_tx_width(enum lane_usage lane) static void dpphy_reg_set_config13_tx_reset(u32 en) { - u32 val = 0; - - if (en) - val = DP_TX_RESET_ALL; - else - val = DP_TX_RESET_RELEASE; - - dp_phy_write_mask(SST1, DP_CONFIG13, val, DP_TX_RESET_MASK); + dp_phy_write_mask(SST1, DP_CONFIG13, + en ? DP_TX_RESET_ALL : DP_TX_RESET_RELEASE, + DP_TX_RESET_MASK); } -static void dpphy_reg_set_config13_tx_enable(enum lane_usage lane) +static void dpphy_reg_set_config13_tx_enable(u32 en, enum lane_usage lane) { u32 val = 0; - if (lane == DP_USE_2_LANES) - val = DP_TX_ENABLE_SET_2LANES; - else if (lane == DP_USE_4_LANES) - val = DP_TX_ENABLE_SET_4LANES; - - dp_phy_write_mask(SST1, DP_CONFIG13, val, DP_TX_DISABLE_MASK); -} - -static void dpphy_reg_set_config13_tx_disable(enum lane_usage lane) -{ - u32 val = 0; - - if (lane == DP_USE_2_LANES) + /* "0b1" disables DP TX lane, "0b0" enables DP TX lane */ + if (!en || lane == DP_USE_0_LANES) + val = DP_TX_DISABLE_SET_4LANES; + else if (lane == DP_USE_2_LANES) val = DP_TX_DISABLE_SET_2LANES; else if (lane == DP_USE_4_LANES) - val = DP_TX_DISABLE_SET_4LANES; + val = DP_TX_DISABLE_SET_0LANES; dp_phy_write_mask(SST1, DP_CONFIG13, val, DP_TX_DISABLE_MASK); } @@ -690,11 +672,11 @@ static void dpphy_reg_reset_tx_lanes(void) { // Assert all TX lanes reset dpphy_reg_set_config13_tx_reset(1); - dpphy_reg_set_config13_tx_disable(DP_USE_4_LANES); + dpphy_reg_set_config13_tx_enable(0, DP_USE_4_LANES); cal_log_debug(0, "disable all lanes.\n"); // Disable all TX lanes' power state: P2 - dpphy_reg_set_config11_tx_pstate(DP_USE_0_LANES); + dpphy_reg_set_config11_tx_pstate(0, DP_USE_4_LANES); cal_log_debug(0, "power off for all lanes.\n"); // Set TCA_TCPC Valid @@ -705,8 +687,6 @@ static void dpphy_reg_reset_tx_lanes(void) // De-Assert all TX lanes reset dpphy_reg_set_config13_tx_reset(0); - dpphy_reg_set_config13_tx_enable(DP_USE_4_LANES); - cal_log_debug(0, "enable all lanes.\n"); // Wait TX_ACK De-Assert dpphy_reg_wait_config12_tx_ack(DP_USE_4_LANES); @@ -716,18 +696,18 @@ static void dpphy_reg_reset_mpllb(u32 en) { if (en) { // Assert USBDP PHY MPLLB reset - dpphy_reg_set_config12_tx_mpllb_en(DP_USE_0_LANES); - dpphy_reg_set_config11_tx_pstate(DP_USE_0_LANES); + dpphy_reg_set_config12_tx_mpllb_en(0, DP_USE_4_LANES); + dpphy_reg_set_config11_tx_pstate(0, DP_USE_4_LANES); cal_log_debug(0, "disable mpllb and power off for all lanes\n"); } else { // De-assert USBDP PHY MPLLB reset - dpphy_reg_set_config12_tx_mpllb_en(DP_USE_4_LANES); - dpphy_reg_set_config11_tx_pstate(DP_USE_4_LANES); - cal_log_debug(0, "enable mpllb and power off for all lanes\n"); + dpphy_reg_set_config12_tx_mpllb_en(1, DP_USE_4_LANES); + dpphy_reg_set_config11_tx_pstate(1, DP_USE_4_LANES); + cal_log_debug(0, "enable mpllb and power on for all lanes\n"); } // Request to update TX status - dpphy_reg_set_config12_status_update(DP_USE_4_LANES); + dpphy_reg_set_config12_status_update(); cal_log_debug(0, "status update for all lanes.\n"); } @@ -917,16 +897,13 @@ static void dpphy_reg_switch_to_dp(enum lane_usage num_lane) static void dpphy_reg_set_lanes(struct dp_hw_config *hw_config, enum lane_usage num_lane) { - dpphy_reg_set_config13_tx_enable(num_lane); - cal_log_debug(0, "enable %d lanes.\n", num_lane); - - dpphy_reg_set_config12_tx_width(num_lane); - dpphy_reg_set_config12_tx_mpllb_en(num_lane); - dpphy_reg_set_config11_tx_pstate(num_lane); + dpphy_reg_set_config12_tx_width(1, num_lane); + dpphy_reg_set_config12_tx_mpllb_en(1, num_lane); + dpphy_reg_set_config11_tx_pstate(1, num_lane); cal_log_debug(0, "enable mpllb/power for %d lanes.\n", num_lane); - dpphy_reg_set_config12_status_update(num_lane); - cal_log_debug(0, "status update for %d lanes.\n", num_lane); + dpphy_reg_set_config12_status_update(); + cal_log_debug(0, "status update for all lanes.\n"); if (hw_config->link_rate > LINK_RATE_RBR) { /* @@ -935,6 +912,9 @@ static void dpphy_reg_set_lanes(struct dp_hw_config *hw_config, enum lane_usage */ dpphy_reg_set_config17_dcc_byp_ac_cap(0, num_lane); } + + dpphy_reg_set_config13_tx_enable(1, num_lane); + cal_log_debug(0, "enable %d lanes.\n", num_lane); } static void dpphy_reg_init(struct dp_hw_config *hw_config, bool reconfig) @@ -1488,12 +1468,12 @@ static void dp_hw_set_data_path(struct dp_hw_config *hw_config) break; } - // SNPS PHY Clock Enable - dp_reg_set_snps_tx_clk_en(num_lane); - // SNPS PHY Clock Ready dp_reg_set_snps_tx_clk_rdy(num_lane); + // SNPS PHY Clock Enable + dp_reg_set_snps_tx_clk_en(num_lane); + // SNPS PHY Data Enable dp_reg_set_snps_tx_data_en(num_lane); } diff --git a/samsung/cal_9865/regs-usbdpphy_ctrl.h b/samsung/cal_9865/regs-usbdpphy_ctrl.h index b03f9ea..d36bc74 100644 --- a/samsung/cal_9865/regs-usbdpphy_ctrl.h +++ b/samsung/cal_9865/regs-usbdpphy_ctrl.h @@ -400,14 +400,14 @@ #define DP_TX1_ACK (0x1 << 17) #define DP_TX0_ACK (0x1 << 16) #define DP_TX_ACK_GET(_v) (((_v) >> 16) & 0xF) -#define DP_TX3_REQ_STATUS (0x1 << 15) -#define DP_TX2_REQ_STATUS (0x1 << 14) -#define DP_TX1_REQ_STATUS (0x1 << 13) -#define DP_TX0_REQ_STATUS (0x1 << 12) -#define DP_TX_REQ_STATUS_GET(_v) (((_v) >> 12) & 0xF) -#define DP_TX_REQ_STATUS_SET_4LANES ((0xF & 0xF) << 12) -#define DP_TX_REQ_STATUS_SET_2LANES ((0x3 & 0xF) << 12) -#define DP_TX_REQ_STATUS_MASK (0xF << 12) +#define DP_TX_ACK_MASK (0xF << 16) +#define DP_TX3_REQ (0x1 << 15) +#define DP_TX2_REQ (0x1 << 14) +#define DP_TX1_REQ (0x1 << 13) +#define DP_TX0_REQ (0x1 << 12) +#define DP_TX_REQ_GET(_v) (((_v) >> 12) & 0xF) +#define DP_TX_REQ_SET_4LANES ((0xF & 0xF) << 12) +#define DP_TX_REQ_MASK (0xF << 12) #define DP_TX3_MPLL_EN (0x1 << 11) #define DP_TX2_MPLL_EN (0x1 << 10) #define DP_TX1_MPLL_EN (0x1 << 9) @@ -457,10 +457,9 @@ #define DP_TX2_DISABLE (0x1 << 2) #define DP_TX1_DISABLE (0x1 << 1) #define DP_TX0_DISABLE (0x1 << 0) -#define DP_TX_ENABLE_SET_4LANES ((0x0 & 0xF) << 0) #define DP_TX_DISABLE_SET_4LANES ((0xF & 0xF) << 0) -#define DP_TX_ENABLE_SET_2LANES ((0xC & 0xF) << 0) -#define DP_TX_DISABLE_SET_2LANES ((0xF & 0xF) << 0) +#define DP_TX_DISABLE_SET_2LANES ((0xC & 0xF) << 0) +#define DP_TX_DISABLE_SET_0LANES ((0x0 & 0xF) << 0) #define DP_TX_DISABLE_MASK (0xF << 0) #define DP_CONFIG14 (0x023C) |