|
@@ -1,7 +1,7 @@
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
/*
|
|
|
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
|
|
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
+ * Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
*/
|
|
|
|
|
|
#include <linux/math64.h>
|
|
@@ -229,6 +229,26 @@ void dsi_phy_hw_v5_0_commit_phy_timing(struct dsi_phy_hw *phy,
|
|
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_13, timing->lane_v4[13]);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * calc_cmn_lane_ctrl0() - Calculate the value to be set for
|
|
|
+ * DSIPHY_CMN_LANE_CTRL0 register.
|
|
|
+ * @cfg: Per lane configurations for timing, strength and lane
|
|
|
+ * configurations.
|
|
|
+ */
|
|
|
+static inline u32 dsi_phy_hw_calc_cmn_lane_ctrl0(struct dsi_phy_cfg *cfg)
|
|
|
+{
|
|
|
+ u32 cmn_lane_ctrl0 = 0;
|
|
|
+
|
|
|
+ /* Only enable lanes that are required */
|
|
|
+ cmn_lane_ctrl0 |= ((cfg->data_lanes & DSI_DATA_LANE_0) ? BIT(0) : 0);
|
|
|
+ cmn_lane_ctrl0 |= ((cfg->data_lanes & DSI_DATA_LANE_1) ? BIT(1) : 0);
|
|
|
+ cmn_lane_ctrl0 |= ((cfg->data_lanes & DSI_DATA_LANE_2) ? BIT(2) : 0);
|
|
|
+ cmn_lane_ctrl0 |= ((cfg->data_lanes & DSI_DATA_LANE_3) ? BIT(3) : 0);
|
|
|
+ cmn_lane_ctrl0 |= BIT(4);
|
|
|
+
|
|
|
+ return cmn_lane_ctrl0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* cphy_enable() - Enable CPHY hardware
|
|
|
* @phy: Pointer to DSI PHY hardware object.
|
|
@@ -242,6 +262,7 @@ static void dsi_phy_hw_cphy_enable(struct dsi_phy_hw *phy, struct dsi_phy_cfg *c
|
|
|
/* For C-PHY, no low power settings for lower clk rate */
|
|
|
u32 glbl_str_swi_cal_sel_ctrl = 0;
|
|
|
u32 glbl_hstx_str_ctrl_0 = 0;
|
|
|
+ u32 cmn_lane_ctrl0 = 0;
|
|
|
|
|
|
/* de-assert digital and pll power down */
|
|
|
data = BIT(6) | BIT(5);
|
|
@@ -275,7 +296,8 @@ static void dsi_phy_hw_cphy_enable(struct dsi_phy_hw *phy, struct dsi_phy_cfg *c
|
|
|
/* Remove power down from all blocks */
|
|
|
DSI_W32(phy, DSIPHY_CMN_CTRL_0, 0x7f);
|
|
|
|
|
|
- DSI_W32(phy, DSIPHY_CMN_LANE_CTRL0, 0x17);
|
|
|
+ cmn_lane_ctrl0 = dsi_phy_hw_calc_cmn_lane_ctrl0(cfg);
|
|
|
+ DSI_W32(phy, DSIPHY_CMN_LANE_CTRL0, cmn_lane_ctrl0);
|
|
|
|
|
|
switch (cfg->pll_source) {
|
|
|
case DSI_PLL_SOURCE_STANDALONE:
|
|
@@ -325,6 +347,7 @@ static void dsi_phy_hw_dphy_enable(struct dsi_phy_hw *phy, struct dsi_phy_cfg *c
|
|
|
u32 glbl_rescode_bot_ctrl = 0;
|
|
|
bool split_link_enabled;
|
|
|
u32 lanes_per_sublink;
|
|
|
+ u32 cmn_lane_ctrl0 = 0;
|
|
|
|
|
|
/* Alter PHY configurations if data rate less than 1.5GHZ*/
|
|
|
if (cfg->bit_clk_rate_hz <= 1500000000)
|
|
@@ -389,7 +412,8 @@ static void dsi_phy_hw_dphy_enable(struct dsi_phy_hw *phy, struct dsi_phy_cfg *c
|
|
|
} else {
|
|
|
/* Remove power down from all blocks */
|
|
|
DSI_W32(phy, DSIPHY_CMN_CTRL_0, 0x7f);
|
|
|
- DSI_W32(phy, DSIPHY_CMN_LANE_CTRL0, 0x1F);
|
|
|
+ cmn_lane_ctrl0 = dsi_phy_hw_calc_cmn_lane_ctrl0(cfg);
|
|
|
+ DSI_W32(phy, DSIPHY_CMN_LANE_CTRL0, cmn_lane_ctrl0);
|
|
|
}
|
|
|
|
|
|
/* Select full-rate mode */
|
|
@@ -701,7 +725,7 @@ void dsi_phy_hw_v5_0_dyn_refresh_config(struct dsi_phy_hw *phy,
|
|
|
struct dsi_phy_cfg *cfg, bool is_master)
|
|
|
{
|
|
|
u32 reg;
|
|
|
- bool is_cphy = (cfg->phy_type == DSI_PHY_TYPE_CPHY) ? true : false;
|
|
|
+ u32 cmn_lane_ctrl0 = dsi_phy_hw_calc_cmn_lane_ctrl0(cfg);
|
|
|
|
|
|
if (is_master) {
|
|
|
DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL19,
|
|
@@ -727,7 +751,7 @@ void dsi_phy_hw_v5_0_dyn_refresh_config(struct dsi_phy_hw *phy,
|
|
|
cfg->timing.lane_v4[12], cfg->timing.lane_v4[13]);
|
|
|
DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL26,
|
|
|
DSIPHY_CMN_CTRL_0, DSIPHY_CMN_LANE_CTRL0, 0x7f,
|
|
|
- is_cphy ? 0x17 : 0x1f);
|
|
|
+ cmn_lane_ctrl0);
|
|
|
|
|
|
} else {
|
|
|
reg = DSI_R32(phy, DSIPHY_CMN_CLK_CFG1);
|
|
@@ -761,7 +785,7 @@ void dsi_phy_hw_v5_0_dyn_refresh_config(struct dsi_phy_hw *phy,
|
|
|
cfg->timing.lane_v4[13], 0x7f);
|
|
|
DSI_DYN_REF_REG_W(phy->dyn_pll_base, DSI_DYN_REFRESH_PLL_CTRL9,
|
|
|
DSIPHY_CMN_LANE_CTRL0, DSIPHY_CMN_CTRL_2,
|
|
|
- is_cphy ? 0x17 : 0x1f, 0x40);
|
|
|
+ cmn_lane_ctrl0, 0x40);
|
|
|
/*
|
|
|
* fill with dummy register writes since controller will blindly
|
|
|
* send these values to DSI PHY.
|
|
@@ -769,7 +793,7 @@ void dsi_phy_hw_v5_0_dyn_refresh_config(struct dsi_phy_hw *phy,
|
|
|
reg = DSI_DYN_REFRESH_PLL_CTRL11;
|
|
|
while (reg <= DSI_DYN_REFRESH_PLL_CTRL29) {
|
|
|
DSI_DYN_REF_REG_W(phy->dyn_pll_base, reg, DSIPHY_CMN_LANE_CTRL0,
|
|
|
- DSIPHY_CMN_CTRL_0, is_cphy ? 0x17 : 0x1f, 0x7f);
|
|
|
+ DSIPHY_CMN_CTRL_0, cmn_lane_ctrl0, 0x7f);
|
|
|
reg += 0x4;
|
|
|
}
|
|
|
|