msm: mdss: add support for multiple DSI host escape clk frequencies

Some panels have low escape clock requirements based on which the
host escape clock should be configured. Add support to configure
host escape clock based on the panel escape clock. By default, the
host would be configured for an escape clock of 19.2MHz.

Change-Id: If791ffb4d49dd97424366042ee35bd4ecda5c185
Signed-off-by: Ashish Garg <ashigarg@codeaurora.org>
This commit is contained in:
Ashish Garg 2017-03-03 11:57:54 +05:30
parent 6f55033ecf
commit 4cd60f6e04
5 changed files with 28 additions and 7 deletions

View file

@ -271,6 +271,8 @@ Optional properties:
"trigger_sw_te" = Software trigger and TE
- qcom,mdss-dsi-panel-framerate: Specifies the frame rate for the panel.
60 = 60 frames per second (default)
- qcom,mdss-dsi-host-esc-clk-freq-hz: Specifies the escape clock needed for the host.
19200000 = 19.2 MHz (default)
- qcom,mdss-dsi-panel-clockrate: A 64 bit value specifies the panel clock speed in Hz.
0 = default value.
- qcom,mdss-mdp-kickoff-threshold: This property can be used to define a region
@ -657,6 +659,7 @@ Example:
qcom,mdss-dsi-mdp-trigger = <0>;
qcom,mdss-dsi-dma-trigger = <0>;
qcom,mdss-dsi-panel-framerate = <60>;
qcom,mdss-dsi-host-esc-clk-freq-hz = <19200000>;
qcom,mdss-dsi-panel-clockrate = <424000000>;
qcom,mdss-mdp-kickoff-threshold = <11 2430>;
qcom,mdss-mdp-kickoff-delay = <1000>;

View file

@ -34,7 +34,6 @@
#include "mdss_dsi_phy.h"
#include "mdss_dba_utils.h"
#define XO_CLK_RATE 19200000
#define CMDLINE_DSI_CTL_NUM_STRING_LEN 2
/* Master structure to hold all the information about the DSI/panel */
@ -1871,7 +1870,7 @@ static void __mdss_dsi_dyn_refresh_config(
static void __mdss_dsi_calc_dfps_delay(struct mdss_panel_data *pdata)
{
u32 esc_clk_rate = XO_CLK_RATE;
u32 esc_clk_rate_hz;
u32 pipe_delay, pipe_delay2 = 0, pll_delay;
u32 hsync_period = 0;
u32 pclk_to_esc_ratio, byte_to_esc_ratio, hr_bit_to_esc_ratio;
@ -1898,9 +1897,11 @@ static void __mdss_dsi_calc_dfps_delay(struct mdss_panel_data *pdata)
pinfo = &pdata->panel_info;
pd = &(pinfo->mipi.dsi_phy_db);
pclk_to_esc_ratio = (ctrl_pdata->pclk_rate / esc_clk_rate);
byte_to_esc_ratio = (ctrl_pdata->byte_clk_rate / esc_clk_rate);
hr_bit_to_esc_ratio = ((ctrl_pdata->byte_clk_rate * 4) / esc_clk_rate);
esc_clk_rate_hz = ctrl_pdata->esc_clk_rate_hz;
pclk_to_esc_ratio = (ctrl_pdata->pclk_rate / esc_clk_rate_hz);
byte_to_esc_ratio = (ctrl_pdata->byte_clk_rate / esc_clk_rate_hz);
hr_bit_to_esc_ratio = ((ctrl_pdata->byte_clk_rate * 4) /
esc_clk_rate_hz);
hsync_period = mdss_panel_get_htotal(pinfo, true);
pipe_delay = (hsync_period + 1) / pclk_to_esc_ratio;
@ -1922,7 +1923,7 @@ static void __mdss_dsi_calc_dfps_delay(struct mdss_panel_data *pdata)
((pd->timing[4] >> 1) + 1)) / hr_bit_to_esc_ratio);
/* 130 us pll delay recommended by h/w doc */
pll_delay = ((130 * esc_clk_rate) / 1000000) * 2;
pll_delay = ((130 * esc_clk_rate_hz) / 1000000) * 2;
MIPI_OUTP((ctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_PIPE_DELAY,
pipe_delay);
@ -3057,7 +3058,7 @@ static int mdss_dsi_set_clk_rates(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
MDSS_DSI_LINK_ESC_CLK,
19200000,
ctrl_pdata->esc_clk_rate_hz,
MDSS_DSI_CLK_UPDATE_CLK_RATE_AT_ON);
if (rc) {
pr_err("%s: dsi_esc_clk - clk_set_rate failed\n",
@ -4236,6 +4237,9 @@ int dsi_panel_device_register(struct platform_device *ctrl_pdev,
pr_debug("%s: pclk=%d, bclk=%d\n", __func__,
ctrl_pdata->pclk_rate, ctrl_pdata->byte_clk_rate);
ctrl_pdata->esc_clk_rate_hz = pinfo->esc_clk_rate_hz;
pr_debug("%s: esc clk=%d\n", __func__,
ctrl_pdata->esc_clk_rate_hz);
rc = mdss_dsi_get_dt_vreg_data(&ctrl_pdev->dev, pan_node,
&ctrl_pdata->panel_power_data, DSI_PANEL_PM);

View file

@ -477,6 +477,7 @@ struct mdss_dsi_ctrl_pdata {
u32 byte_clk_rate;
u32 pclk_rate_bkp;
u32 byte_clk_rate_bkp;
u32 esc_clk_rate_hz;
bool refresh_clk_rate; /* flag to recalculate clk_rate */
struct dss_module_power panel_power_data;
struct dss_module_power power_data[DSI_MAX_PM]; /* for 8x10 */

View file

@ -2819,6 +2819,13 @@ static int mdss_panel_parse_dt(struct device_node *np,
MSM_DBA_CHIP_NAME_MAX_LEN);
}
rc = of_property_read_u32(np,
"qcom,mdss-dsi-host-esc-clk-freq-hz",
&pinfo->esc_clk_rate_hz);
if (rc)
pinfo->esc_clk_rate_hz = MDSS_DSI_MAX_ESC_CLK_RATE_HZ;
pr_debug("%s: esc clk %d\n", __func__, pinfo->esc_clk_rate_hz);
return 0;
error:

View file

@ -29,6 +29,9 @@ struct panel_id {
#define DEFAULT_FRAME_RATE 60
#define DEFAULT_ROTATOR_FRAME_RATE 120
#define ROTATOR_LOW_FRAME_RATE 30
#define MDSS_DSI_MAX_ESC_CLK_RATE_HZ 19200000
#define MDSS_DSI_RST_SEQ_LEN 10
/* worst case prefill lines for all chipsets including all vertical blank */
#define MDSS_MDP_MAX_PREFILL_FETCH 25
@ -909,6 +912,9 @@ struct mdss_panel_info {
/* HDR properties of display panel*/
struct mdss_panel_hdr_properties hdr_properties;
/* esc clk recommended for the panel */
u32 esc_clk_rate_hz;
};
struct mdss_panel_timing {