mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Merge "video: fbdev: msm: add interface to send idle on/off command to panel"
This commit is contained in:
commit
4b3f2fb1b6
@ -476,6 +476,7 @@ struct mdss_dsi_ctrl_pdata {
|
||||
bool dsi_irq_line;
|
||||
bool dcs_cmd_insert;
|
||||
atomic_t te_irq_ready;
|
||||
bool idle;
|
||||
|
||||
bool cmd_sync_wait_broadcast;
|
||||
bool cmd_sync_wait_trigger;
|
||||
@ -507,6 +508,8 @@ struct mdss_dsi_ctrl_pdata {
|
||||
struct dsi_panel_cmds lp_on_cmds;
|
||||
struct dsi_panel_cmds lp_off_cmds;
|
||||
struct dsi_panel_cmds status_cmds;
|
||||
struct dsi_panel_cmds idle_on_cmds; /* for lp mode */
|
||||
struct dsi_panel_cmds idle_off_cmds;
|
||||
u32 *status_valid_params;
|
||||
u32 *status_cmds_rlen;
|
||||
u32 *status_value;
|
||||
|
@ -251,6 +251,55 @@ static void mdss_dsi_panel_bklt_dcs(struct mdss_dsi_ctrl_pdata *ctrl, int level)
|
||||
mdss_dsi_cmdlist_put(ctrl, &cmdreq);
|
||||
}
|
||||
|
||||
static void mdss_dsi_panel_set_idle_mode(struct mdss_panel_data *pdata,
|
||||
bool enable)
|
||||
{
|
||||
struct mdss_dsi_ctrl_pdata *ctrl = NULL;
|
||||
|
||||
if (pdata == NULL) {
|
||||
pr_err("%s: Invalid input data\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata,
|
||||
panel_data);
|
||||
|
||||
pr_debug("%s: Idle (%d->%d)\n", __func__, ctrl->idle, enable);
|
||||
|
||||
if (ctrl->idle == enable)
|
||||
return;
|
||||
|
||||
if (enable) {
|
||||
if (ctrl->idle_on_cmds.cmd_cnt) {
|
||||
mdss_dsi_panel_cmds_send(ctrl, &ctrl->idle_on_cmds,
|
||||
CMD_REQ_COMMIT);
|
||||
ctrl->idle = true;
|
||||
pr_debug("Idle on\n");
|
||||
}
|
||||
} else {
|
||||
if (ctrl->idle_off_cmds.cmd_cnt) {
|
||||
mdss_dsi_panel_cmds_send(ctrl, &ctrl->idle_off_cmds,
|
||||
CMD_REQ_COMMIT);
|
||||
ctrl->idle = false;
|
||||
pr_debug("Idle off\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool mdss_dsi_panel_get_idle_mode(struct mdss_panel_data *pdata)
|
||||
|
||||
{
|
||||
struct mdss_dsi_ctrl_pdata *ctrl = NULL;
|
||||
|
||||
if (pdata == NULL) {
|
||||
pr_err("%s: Invalid input data\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata,
|
||||
panel_data);
|
||||
return ctrl->idle;
|
||||
}
|
||||
|
||||
static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
|
||||
{
|
||||
int rc = 0;
|
||||
@ -1014,6 +1063,8 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata)
|
||||
}
|
||||
|
||||
end:
|
||||
/* clear idle state */
|
||||
ctrl->idle = false;
|
||||
pr_debug("%s:-\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
@ -1071,7 +1122,11 @@ static int mdss_dsi_panel_low_power_config(struct mdss_panel_data *pdata,
|
||||
enable);
|
||||
|
||||
/* Any panel specific low power commands/config */
|
||||
|
||||
/* Control idle mode for panel */
|
||||
if (enable)
|
||||
mdss_dsi_panel_set_idle_mode(pdata, true);
|
||||
else
|
||||
mdss_dsi_panel_set_idle_mode(pdata, false);
|
||||
pr_debug("%s:-\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
@ -2989,6 +3044,17 @@ static int mdss_panel_parse_dt(struct device_node *np,
|
||||
mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->off_cmds,
|
||||
"qcom,mdss-dsi-off-command", "qcom,mdss-dsi-off-command-state");
|
||||
|
||||
mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->idle_on_cmds,
|
||||
"qcom,mdss-dsi-idle-on-command",
|
||||
"qcom,mdss-dsi-idle-on-command-state");
|
||||
|
||||
mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->idle_off_cmds,
|
||||
"qcom,mdss-dsi-idle-off-command",
|
||||
"qcom,mdss-dsi-idle-off-command-state");
|
||||
|
||||
rc = of_property_read_u32(np, "qcom,mdss-dsi-idle-fps", &tmp);
|
||||
pinfo->mipi.frame_rate_idle = (!rc ? tmp : 60);
|
||||
|
||||
rc = of_property_read_u32(np, "qcom,adjust-timer-wakeup-ms", &tmp);
|
||||
pinfo->adjust_timer_delay_ms = (!rc ? tmp : 0);
|
||||
|
||||
@ -3083,6 +3149,6 @@ int mdss_dsi_panel_init(struct device_node *node,
|
||||
ctrl_pdata->panel_data.apply_display_setting =
|
||||
mdss_dsi_panel_apply_display_setting;
|
||||
ctrl_pdata->switch_mode = mdss_dsi_panel_switch_mode;
|
||||
|
||||
ctrl_pdata->panel_data.get_idle = mdss_dsi_panel_get_idle_mode;
|
||||
return 0;
|
||||
}
|
||||
|
@ -519,6 +519,7 @@ struct mipi_panel_info {
|
||||
char traffic_mode;
|
||||
char frame_rate;
|
||||
/* command mode */
|
||||
char frame_rate_idle;
|
||||
char interleave_max;
|
||||
char insert_dcs_cmd;
|
||||
char wr_mem_continue;
|
||||
@ -1009,6 +1010,7 @@ struct mdss_panel_data {
|
||||
*/
|
||||
int (*event_handler)(struct mdss_panel_data *pdata, int e, void *arg);
|
||||
struct device_node *(*get_fb_node)(struct platform_device *pdev);
|
||||
bool (*get_idle)(struct mdss_panel_data *pdata);
|
||||
|
||||
struct list_head timings_list;
|
||||
struct mdss_panel_timing *current_timing;
|
||||
@ -1044,6 +1046,10 @@ static inline u32 mdss_panel_get_framerate(struct mdss_panel_info *panel_info)
|
||||
{
|
||||
u32 frame_rate, pixel_total;
|
||||
u64 rate;
|
||||
struct mdss_panel_data *panel_data =
|
||||
container_of(panel_info, typeof(*panel_data),
|
||||
panel_info);
|
||||
bool idle = false;
|
||||
|
||||
if (panel_info == NULL)
|
||||
return DEFAULT_FRAME_RATE;
|
||||
@ -1052,6 +1058,12 @@ static inline u32 mdss_panel_get_framerate(struct mdss_panel_info *panel_info)
|
||||
case MIPI_VIDEO_PANEL:
|
||||
case MIPI_CMD_PANEL:
|
||||
frame_rate = panel_info->mipi.frame_rate;
|
||||
if (panel_data->get_idle)
|
||||
idle = panel_data->get_idle(panel_data);
|
||||
if (idle)
|
||||
frame_rate = panel_info->mipi.frame_rate_idle;
|
||||
else
|
||||
frame_rate = panel_info->mipi.frame_rate;
|
||||
break;
|
||||
case EDP_PANEL:
|
||||
frame_rate = panel_info->edp.frame_rate;
|
||||
|
Loading…
x
Reference in New Issue
Block a user