msm: mdss: add support to parse dynamic refresh rate range
DSI panel dynamic refresh rate range varies from panel to panel. Add support to parse dynamic refresh range from the panel device tree. If the range is not specified, use the default range from 30 to max panel supported rate. Change-Id: Iac5adebe187bdc7abd4e82464de81305862df794 Signed-off-by: Jeevan Shriram <jshriram@codeaurora.org>
This commit is contained in:
parent
96833747dd
commit
9e696e5b2c
5 changed files with 100 additions and 50 deletions
|
@ -145,6 +145,10 @@ Optional properties:
|
|||
"dfps_immediate_porch_mode" = FPS change request is
|
||||
implemented immediately by changing panel porch
|
||||
values.
|
||||
- qcom,min-refresh-rate: Minimum refresh rate supported by the panel.
|
||||
- qcom,max-refresh-rate: Maximum refresh rate supported by the panel. If max refresh
|
||||
rate is not specified, then the frame rate of the panel in
|
||||
qcom,mdss-dsi-panel-framerate is used.
|
||||
- qcom,mdss-dsi-bl-pmic-control-type: A string that specifies the implementation of backlight
|
||||
control for this panel.
|
||||
"bl_ctrl_pwm" = Backlight controlled by PWM gpio.
|
||||
|
@ -435,6 +439,8 @@ Example:
|
|||
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
|
||||
qcom,mdss-dsi-pan-enable-dynamic-fps;
|
||||
qcom,mdss-dsi-pan-fps-update = "dfps_suspend_resume_mode";
|
||||
qcom,min-refresh-rate = <30>;
|
||||
qcom,max-refresh-rate = <60>;
|
||||
qcom,mdss-dsi-bl-pmic-bank-select = <0>;
|
||||
qcom,mdss-dsi-bl-pmic-pwm-frequency = <0>;
|
||||
qcom,mdss-dsi-pwm-gpio = <&pm8941_mpps 5 0>;
|
||||
|
|
|
@ -1477,7 +1477,6 @@ int dsi_panel_device_register(struct device_node *pan_node,
|
|||
struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
|
||||
struct device_node *dsi_ctrl_np = NULL;
|
||||
struct platform_device *ctrl_pdev = NULL;
|
||||
bool dynamic_fps;
|
||||
const char *data;
|
||||
|
||||
mipi = &(pinfo->mipi);
|
||||
|
@ -1581,48 +1580,6 @@ int dsi_panel_device_register(struct device_node *pan_node,
|
|||
ctrl_pdata->cmd_sync_wait_broadcast,
|
||||
ctrl_pdata->cmd_sync_wait_trigger);
|
||||
|
||||
dynamic_fps = of_property_read_bool(pan_node,
|
||||
"qcom,mdss-dsi-pan-enable-dynamic-fps");
|
||||
if (dynamic_fps) {
|
||||
pinfo->dynamic_fps = true;
|
||||
data = of_get_property(pan_node,
|
||||
"qcom,mdss-dsi-pan-fps-update", NULL);
|
||||
if (data) {
|
||||
if (!strcmp(data, "dfps_suspend_resume_mode")) {
|
||||
pinfo->dfps_update =
|
||||
DFPS_SUSPEND_RESUME_MODE;
|
||||
pr_debug("%s: dfps mode: suspend/resume\n",
|
||||
__func__);
|
||||
} else if (!strcmp(data,
|
||||
"dfps_immediate_clk_mode")) {
|
||||
pinfo->dfps_update =
|
||||
DFPS_IMMEDIATE_CLK_UPDATE_MODE;
|
||||
pr_debug("%s: dfps mode: Immediate clk\n",
|
||||
__func__);
|
||||
} else if (!strcmp(data,
|
||||
"dfps_immediate_porch_mode")) {
|
||||
pinfo->dfps_update =
|
||||
DFPS_IMMEDIATE_PORCH_UPDATE_MODE;
|
||||
pr_debug("%s: dfps mode: Immediate porch\n",
|
||||
__func__);
|
||||
} else {
|
||||
pr_debug("%s: dfps to default mode\n",
|
||||
__func__);
|
||||
pinfo->dfps_update =
|
||||
DFPS_SUSPEND_RESUME_MODE;
|
||||
pr_debug("%s: dfps mode: suspend/resume\n",
|
||||
__func__);
|
||||
}
|
||||
} else {
|
||||
pr_debug("%s: dfps update mode not configured\n",
|
||||
__func__);
|
||||
pinfo->dynamic_fps = false;
|
||||
pr_debug("%s: dynamic FPS disabled\n",
|
||||
__func__);
|
||||
}
|
||||
pinfo->new_fps = pinfo->mipi.frame_rate;
|
||||
}
|
||||
|
||||
pinfo->panel_max_fps = mdss_panel_get_framerate(pinfo);
|
||||
pinfo->panel_max_vtotal = mdss_panel_get_vtotal(pinfo);
|
||||
ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#define NT35596_BUF_5_STATUS 0x80
|
||||
#define NT35596_MAX_ERR_CNT 2
|
||||
|
||||
#define MIN_REFRESH_RATE 30
|
||||
|
||||
DEFINE_LED_TRIGGER(bl_led_trigger);
|
||||
|
||||
void mdss_dsi_panel_pwm_cfg(struct mdss_dsi_ctrl_pdata *ctrl)
|
||||
|
@ -1144,6 +1146,85 @@ static void mdss_dsi_parse_panel_horizintal_line_idle(struct device_node *np,
|
|||
ctrl->horizontal_idle_cnt);
|
||||
}
|
||||
|
||||
static int mdss_dsi_set_refresh_rate_range(struct device_node *pan_node,
|
||||
struct mdss_panel_info *pinfo)
|
||||
{
|
||||
int rc = 0;
|
||||
rc = of_property_read_u32(pan_node,
|
||||
"qcom,mdss-dsi-min-refresh-rate",
|
||||
&pinfo->min_fps);
|
||||
if (rc) {
|
||||
pr_warn("%s:%d, Unable to read min refresh rate\n",
|
||||
__func__, __LINE__);
|
||||
|
||||
/*
|
||||
* Since min refresh rate is not specified when dynamic
|
||||
* fps is enabled, using minimum as 30
|
||||
*/
|
||||
pinfo->min_fps = MIN_REFRESH_RATE;
|
||||
rc = 0;
|
||||
}
|
||||
|
||||
rc = of_property_read_u32(pan_node,
|
||||
"qcom,mdss-dsi-max-refresh-rate",
|
||||
&pinfo->max_fps);
|
||||
if (rc) {
|
||||
pr_warn("%s:%d, Unable to read max refresh rate\n",
|
||||
__func__, __LINE__);
|
||||
|
||||
/*
|
||||
* Since max refresh rate was not specified when dynamic
|
||||
* fps is enabled, using the default panel refresh rate
|
||||
* as max refresh rate supported.
|
||||
*/
|
||||
pinfo->max_fps = pinfo->mipi.frame_rate;
|
||||
rc = 0;
|
||||
}
|
||||
|
||||
pr_info("dyn_fps: min = %d, max = %d\n",
|
||||
pinfo->min_fps, pinfo->max_fps);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void mdss_dsi_parse_dfps_config(struct device_node *pan_node,
|
||||
struct mdss_dsi_ctrl_pdata *ctrl_pdata)
|
||||
{
|
||||
const char *data;
|
||||
bool dynamic_fps;
|
||||
struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
|
||||
|
||||
dynamic_fps = of_property_read_bool(pan_node,
|
||||
"qcom,mdss-dsi-pan-enable-dynamic-fps");
|
||||
|
||||
if (!dynamic_fps)
|
||||
return;
|
||||
|
||||
pinfo->dynamic_fps = true;
|
||||
data = of_get_property(pan_node, "qcom,mdss-dsi-pan-fps-update", NULL);
|
||||
if (data) {
|
||||
if (!strcmp(data, "dfps_suspend_resume_mode")) {
|
||||
pinfo->dfps_update = DFPS_SUSPEND_RESUME_MODE;
|
||||
pr_debug("dfps mode: suspend/resume\n");
|
||||
} else if (!strcmp(data, "dfps_immediate_clk_mode")) {
|
||||
pinfo->dfps_update = DFPS_IMMEDIATE_CLK_UPDATE_MODE;
|
||||
pr_debug("dfps mode: Immediate clk\n");
|
||||
} else if (!strcmp(data, "dfps_immediate_porch_mode")) {
|
||||
pinfo->dfps_update = DFPS_IMMEDIATE_PORCH_UPDATE_MODE;
|
||||
pr_debug("dfps mode: Immediate porch\n");
|
||||
} else {
|
||||
pinfo->dfps_update = DFPS_SUSPEND_RESUME_MODE;
|
||||
pr_debug("default dfps mode: suspend/resume\n");
|
||||
}
|
||||
mdss_dsi_set_refresh_rate_range(pan_node, pinfo);
|
||||
} else {
|
||||
pinfo->dynamic_fps = false;
|
||||
pr_debug("dfps update mode not configured: disable\n");
|
||||
}
|
||||
pinfo->new_fps = pinfo->mipi.frame_rate;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int mdss_panel_parse_dt(struct device_node *np,
|
||||
struct mdss_dsi_ctrl_pdata *ctrl_pdata)
|
||||
{
|
||||
|
@ -1480,6 +1561,8 @@ static int mdss_panel_parse_dt(struct device_node *np,
|
|||
|
||||
mdss_dsi_parse_panel_horizintal_line_idle(np, ctrl_pdata);
|
||||
|
||||
mdss_dsi_parse_dfps_config(np, ctrl_pdata);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
|
|
|
@ -2199,13 +2199,15 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev,
|
|||
}
|
||||
|
||||
mutex_lock(&mdp5_data->dfps_lock);
|
||||
if (dfps < 30) {
|
||||
pr_err("Unsupported FPS. Configuring to min_fps = 30\n");
|
||||
dfps = 30;
|
||||
rc = mdss_mdp_ctl_update_fps(mdp5_data->ctl, dfps);
|
||||
} else if (dfps > 60) {
|
||||
pr_err("Unsupported FPS. Configuring to max_fps = 60\n");
|
||||
dfps = 60;
|
||||
if (dfps < pdata->panel_info.min_fps) {
|
||||
pr_err("Unsupported FPS. min_fps = %d\n",
|
||||
pdata->panel_info.min_fps);
|
||||
mutex_unlock(&mdp5_data->dfps_lock);
|
||||
return -EINVAL;
|
||||
} else if (dfps > pdata->panel_info.max_fps) {
|
||||
pr_warn("Unsupported FPS. Configuring to max_fps = %d\n",
|
||||
pdata->panel_info.max_fps);
|
||||
dfps = pdata->panel_info.max_fps;
|
||||
rc = mdss_mdp_ctl_update_fps(mdp5_data->ctl, dfps);
|
||||
} else {
|
||||
rc = mdss_mdp_ctl_update_fps(mdp5_data->ctl, dfps);
|
||||
|
|
|
@ -372,6 +372,8 @@ struct mdss_panel_info {
|
|||
u32 height_pix_align;
|
||||
u32 min_width;
|
||||
u32 min_height;
|
||||
u32 min_fps;
|
||||
u32 max_fps;
|
||||
|
||||
u32 cont_splash_enabled;
|
||||
u32 partial_update_enabled;
|
||||
|
|
Loading…
Add table
Reference in a new issue