Merge "disp: msm: dsi: commit DSI PHY timings after update"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
ca2fbfd531
@@ -262,6 +262,7 @@ static void dsi_catalog_phy_4_0_init(struct dsi_phy_hw *phy)
|
|||||||
phy->ops.dyn_refresh_ops.cache_phy_timings =
|
phy->ops.dyn_refresh_ops.cache_phy_timings =
|
||||||
dsi_phy_hw_v4_0_cache_phy_timings;
|
dsi_phy_hw_v4_0_cache_phy_timings;
|
||||||
phy->ops.set_continuous_clk = dsi_phy_hw_v4_0_set_continuous_clk;
|
phy->ops.set_continuous_clk = dsi_phy_hw_v4_0_set_continuous_clk;
|
||||||
|
phy->ops.commit_phy_timing = dsi_phy_hw_v4_0_commit_phy_timing;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -116,6 +116,8 @@ int dsi_phy_hw_v4_0_lane_reset(struct dsi_phy_hw *phy);
|
|||||||
void dsi_phy_hw_v4_0_toggle_resync_fifo(struct dsi_phy_hw *phy);
|
void dsi_phy_hw_v4_0_toggle_resync_fifo(struct dsi_phy_hw *phy);
|
||||||
void dsi_phy_hw_v4_0_reset_clk_en_sel(struct dsi_phy_hw *phy);
|
void dsi_phy_hw_v4_0_reset_clk_en_sel(struct dsi_phy_hw *phy);
|
||||||
void dsi_phy_hw_v4_0_set_continuous_clk(struct dsi_phy_hw *phy, bool enable);
|
void dsi_phy_hw_v4_0_set_continuous_clk(struct dsi_phy_hw *phy, bool enable);
|
||||||
|
void dsi_phy_hw_v4_0_commit_phy_timing(struct dsi_phy_hw *phy,
|
||||||
|
struct dsi_phy_per_lane_cfgs *timing);
|
||||||
|
|
||||||
/* DSI controller common ops */
|
/* DSI controller common ops */
|
||||||
u32 dsi_ctrl_hw_cmn_get_interrupt_status(struct dsi_ctrl_hw *ctrl);
|
u32 dsi_ctrl_hw_cmn_get_interrupt_status(struct dsi_ctrl_hw *ctrl);
|
||||||
|
@@ -4419,6 +4419,7 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
|
|||||||
int i;
|
int i;
|
||||||
struct dsi_display_ctrl *ctrl;
|
struct dsi_display_ctrl *ctrl;
|
||||||
struct dsi_display_mode_priv_info *priv_info;
|
struct dsi_display_mode_priv_info *priv_info;
|
||||||
|
bool commit_phy_timing = false;
|
||||||
|
|
||||||
priv_info = mode->priv_info;
|
priv_info = mode->priv_info;
|
||||||
if (!priv_info) {
|
if (!priv_info) {
|
||||||
@@ -4488,6 +4489,7 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
|
|||||||
|
|
||||||
if ((mode->dsi_mode_flags & DSI_MODE_FLAG_DMS) &&
|
if ((mode->dsi_mode_flags & DSI_MODE_FLAG_DMS) &&
|
||||||
(display->panel->panel_mode == DSI_OP_CMD_MODE)) {
|
(display->panel->panel_mode == DSI_OP_CMD_MODE)) {
|
||||||
|
commit_phy_timing = true;
|
||||||
atomic_set(&display->clkrate_change_pending, 1);
|
atomic_set(&display->clkrate_change_pending, 1);
|
||||||
|
|
||||||
dsi_display_validate_dms_fps(display->panel->cur_mode, mode);
|
dsi_display_validate_dms_fps(display->panel->cur_mode, mode);
|
||||||
@@ -4498,7 +4500,8 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
|
|||||||
ctrl = &display->ctrl[i];
|
ctrl = &display->ctrl[i];
|
||||||
rc = dsi_phy_set_timing_params(ctrl->phy,
|
rc = dsi_phy_set_timing_params(ctrl->phy,
|
||||||
priv_info->phy_timing_val,
|
priv_info->phy_timing_val,
|
||||||
priv_info->phy_timing_len);
|
priv_info->phy_timing_len,
|
||||||
|
commit_phy_timing);
|
||||||
if (rc)
|
if (rc)
|
||||||
DSI_ERR("failed to add DSI PHY timing params\n");
|
DSI_ERR("failed to add DSI PHY timing params\n");
|
||||||
}
|
}
|
||||||
|
@@ -1071,6 +1071,8 @@ int dsi_phy_set_clk_freq(struct msm_dsi_phy *phy,
|
|||||||
* @phy: DSI PHY handle
|
* @phy: DSI PHY handle
|
||||||
* @timing: array holding timing params.
|
* @timing: array holding timing params.
|
||||||
* @size: size of the array.
|
* @size: size of the array.
|
||||||
|
* @commit: boolean to indicate if programming PHY HW registers is
|
||||||
|
* required
|
||||||
*
|
*
|
||||||
* When PHY timing calculator is not implemented, this array will be used to
|
* When PHY timing calculator is not implemented, this array will be used to
|
||||||
* pass PHY timing information.
|
* pass PHY timing information.
|
||||||
@@ -1078,7 +1080,7 @@ int dsi_phy_set_clk_freq(struct msm_dsi_phy *phy,
|
|||||||
* Return: error code.
|
* Return: error code.
|
||||||
*/
|
*/
|
||||||
int dsi_phy_set_timing_params(struct msm_dsi_phy *phy,
|
int dsi_phy_set_timing_params(struct msm_dsi_phy *phy,
|
||||||
u32 *timing, u32 size)
|
u32 *timing, u32 size, bool commit)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
@@ -1091,9 +1093,13 @@ int dsi_phy_set_timing_params(struct msm_dsi_phy *phy,
|
|||||||
|
|
||||||
if (phy->hw.ops.phy_timing_val)
|
if (phy->hw.ops.phy_timing_val)
|
||||||
rc = phy->hw.ops.phy_timing_val(&phy->cfg.timing, timing, size);
|
rc = phy->hw.ops.phy_timing_val(&phy->cfg.timing, timing, size);
|
||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
phy->cfg.is_phy_timing_present = true;
|
phy->cfg.is_phy_timing_present = true;
|
||||||
|
|
||||||
|
if (phy->hw.ops.commit_phy_timing && commit)
|
||||||
|
phy->hw.ops.commit_phy_timing(&phy->hw, &phy->cfg.timing);
|
||||||
|
|
||||||
mutex_unlock(&phy->phy_lock);
|
mutex_unlock(&phy->phy_lock);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@@ -244,6 +244,8 @@ int dsi_phy_set_clk_freq(struct msm_dsi_phy *phy,
|
|||||||
* @phy: DSI PHY handle
|
* @phy: DSI PHY handle
|
||||||
* @timing: array holding timing params.
|
* @timing: array holding timing params.
|
||||||
* @size: size of the array.
|
* @size: size of the array.
|
||||||
|
* @commit: boolean to indicate if programming PHY HW registers is
|
||||||
|
* required
|
||||||
*
|
*
|
||||||
* When PHY timing calculator is not implemented, this array will be used to
|
* When PHY timing calculator is not implemented, this array will be used to
|
||||||
* pass PHY timing information.
|
* pass PHY timing information.
|
||||||
@@ -251,7 +253,7 @@ int dsi_phy_set_clk_freq(struct msm_dsi_phy *phy,
|
|||||||
* Return: error code.
|
* Return: error code.
|
||||||
*/
|
*/
|
||||||
int dsi_phy_set_timing_params(struct msm_dsi_phy *phy,
|
int dsi_phy_set_timing_params(struct msm_dsi_phy *phy,
|
||||||
u32 *timing, u32 size);
|
u32 *timing, u32 size, bool commit);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dsi_phy_lane_reset() - Reset DSI PHY lanes in case of error
|
* dsi_phy_lane_reset() - Reset DSI PHY lanes in case of error
|
||||||
|
@@ -321,6 +321,14 @@ struct dsi_phy_hw_ops {
|
|||||||
*/
|
*/
|
||||||
void (*set_continuous_clk)(struct dsi_phy_hw *phy, bool enable);
|
void (*set_continuous_clk)(struct dsi_phy_hw *phy, bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* commit_phy_timing() - Commit PHY timing
|
||||||
|
* @phy: Pointer to DSI PHY hardware object.
|
||||||
|
* @timing: Pointer to PHY timing array
|
||||||
|
*/
|
||||||
|
void (*commit_phy_timing)(struct dsi_phy_hw *phy,
|
||||||
|
struct dsi_phy_per_lane_cfgs *timing);
|
||||||
|
|
||||||
void *timing_ops;
|
void *timing_ops;
|
||||||
struct phy_ulps_config_ops ulps_ops;
|
struct phy_ulps_config_ops ulps_ops;
|
||||||
struct phy_dyn_refresh_ops dyn_refresh_ops;
|
struct phy_dyn_refresh_ops dyn_refresh_ops;
|
||||||
|
@@ -183,6 +183,26 @@ static void dsi_phy_hw_v4_0_lane_settings(struct dsi_phy_hw *phy,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dsi_phy_hw_v4_0_commit_phy_timing(struct dsi_phy_hw *phy,
|
||||||
|
struct dsi_phy_per_lane_cfgs *timing)
|
||||||
|
{
|
||||||
|
/* Commit DSI PHY timings */
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_0, timing->lane_v4[0]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_1, timing->lane_v4[1]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_2, timing->lane_v4[2]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_3, timing->lane_v4[3]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_4, timing->lane_v4[4]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_5, timing->lane_v4[5]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_6, timing->lane_v4[6]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_7, timing->lane_v4[7]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_8, timing->lane_v4[8]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_9, timing->lane_v4[9]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_10, timing->lane_v4[10]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_11, timing->lane_v4[11]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_12, timing->lane_v4[12]);
|
||||||
|
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_13, timing->lane_v4[13]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enable() - Enable PHY hardware
|
* enable() - Enable PHY hardware
|
||||||
* @phy: Pointer to DSI PHY hardware object.
|
* @phy: Pointer to DSI PHY hardware object.
|
||||||
@@ -290,20 +310,7 @@ void dsi_phy_hw_v4_0_enable(struct dsi_phy_hw *phy,
|
|||||||
DSI_W32(phy, DSIPHY_CMN_CLK_CFG1, (data << 2)); /* set PLL src */
|
DSI_W32(phy, DSIPHY_CMN_CLK_CFG1, (data << 2)); /* set PLL src */
|
||||||
|
|
||||||
/* DSI PHY timings */
|
/* DSI PHY timings */
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_0, timing->lane_v4[0]);
|
dsi_phy_hw_v4_0_commit_phy_timing(phy, timing);
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_1, timing->lane_v4[1]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_2, timing->lane_v4[2]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_3, timing->lane_v4[3]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_4, timing->lane_v4[4]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_5, timing->lane_v4[5]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_6, timing->lane_v4[6]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_7, timing->lane_v4[7]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_8, timing->lane_v4[8]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_9, timing->lane_v4[9]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_10, timing->lane_v4[10]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_11, timing->lane_v4[11]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_12, timing->lane_v4[12]);
|
|
||||||
DSI_W32(phy, DSIPHY_CMN_TIMING_CTRL_13, timing->lane_v4[13]);
|
|
||||||
|
|
||||||
/* DSI lane settings */
|
/* DSI lane settings */
|
||||||
dsi_phy_hw_v4_0_lane_settings(phy, cfg);
|
dsi_phy_hw_v4_0_lane_settings(phy, cfg);
|
||||||
|
Reference in New Issue
Block a user