Loading drivers/video/msm/mdss/mdss_dsi.c +0 −2 Original line number Diff line number Diff line Loading @@ -1256,8 +1256,6 @@ static int mdss_dsi_update_panel_config(struct mdss_dsi_ctrl_pdata *ctrl_pdata, ctrl_pdata->panel_mode = pinfo->mipi.mode; mdss_panel_get_dst_fmt(pinfo->bpp, pinfo->mipi.mode, pinfo->mipi.pixel_packing, &(pinfo->mipi.dst_format)); pinfo->cont_splash_enabled = 0; return ret; } Loading drivers/video/msm/mdss/mdss_fb.c +17 −3 Original line number Diff line number Diff line Loading @@ -3388,6 +3388,8 @@ static void mdss_fb_var_to_panelinfo(struct fb_var_screeninfo *var, void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo, struct fb_var_screeninfo *var) { u32 frame_rate; var->xres = mdss_fb_get_panel_xres(pinfo); var->yres = pinfo->yres; var->lower_margin = pinfo->lcdc.v_front_porch - Loading @@ -3399,9 +3401,21 @@ void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo, var->left_margin = pinfo->lcdc.h_back_porch; var->hsync_len = pinfo->lcdc.h_pulse_width; if (pinfo->clk_rate) var->pixclock = KHZ2PICOS((unsigned long int) pinfo->clk_rate/1000); frame_rate = mdss_panel_get_framerate(pinfo); if (frame_rate) { unsigned long clk_rate, h_total, v_total; h_total = var->xres + var->left_margin + var->right_margin + var->hsync_len; v_total = var->yres + var->lower_margin + var->upper_margin + var->vsync_len; clk_rate = h_total * v_total * frame_rate; var->pixclock = KHZ2PICOS(clk_rate / 1000); } else if (pinfo->clk_rate) { var->pixclock = KHZ2PICOS( (unsigned long int) pinfo->clk_rate / 1000); } if (pinfo->physical_width) var->width = pinfo->physical_width; if (pinfo->physical_height) Loading drivers/video/msm/mdss/mdss_mdp.h +3 −0 Original line number Diff line number Diff line Loading @@ -443,6 +443,9 @@ struct mdss_mdp_ctl { u64 last_input_time; int pending_mode_switch; u16 frame_rate; /* dynamic resolution switch during cont-splash handoff */ bool switch_with_handoff; }; struct mdss_mdp_mixer { Loading drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +20 −0 Original line number Diff line number Diff line Loading @@ -3392,6 +3392,26 @@ static int mdss_mdp_cmd_reconfigure(struct mdss_mdp_ctl *ctl, */ mdss_mdp_cmd_dsc_reconfig(ctl); /* * Make explicit cmd_panel_on call, when dynamic * resolution switch request comes before cont-splash * handoff, to match the ctl_stop/ctl_start done * during the reconfiguration. */ if (ctl->switch_with_handoff) { struct mdss_mdp_cmd_ctx *ctx; struct mdss_mdp_ctl *sctl; ctx = (struct mdss_mdp_cmd_ctx *) ctl->intf_ctx[MASTER_CTX]; if (ctx && __mdss_mdp_cmd_is_panel_power_off(ctx)) { sctl = mdss_mdp_get_split_ctl(ctl); mdss_mdp_cmd_panel_on(ctl, sctl); } ctl->switch_with_handoff = false; } mdss_mdp_ctl_stop(ctl, MDSS_PANEL_POWER_OFF); mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_DSI_DYNAMIC_SWITCH, Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +42 −1 Original line number Diff line number Diff line Loading @@ -4877,6 +4877,39 @@ static void mdss_mdp_set_lm_flag(struct msm_fb_data_type *mfd) } } static void mdss_mdp_handle_invalid_switch_state(struct msm_fb_data_type *mfd) { int rc = 0; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl = mdp5_data->ctl; struct mdss_mdp_ctl *sctl = mdss_mdp_get_split_ctl(ctl); struct mdss_mdp_data *buf, *tmpbuf; mfd->switch_state = MDSS_MDP_NO_UPDATE_REQUESTED; /* * Handle only for cmd mode panels as for video mode, buffers * cannot be freed at this point. Needs revisting to handle the * use case for video mode panels. */ if (mfd->panel_info->type == MIPI_CMD_PANEL) { if (ctl->ops.wait_pingpong) rc = ctl->ops.wait_pingpong(ctl, NULL); if (!rc && sctl && sctl->ops.wait_pingpong) rc = sctl->ops.wait_pingpong(sctl, NULL); if (rc) { pr_err("wait for pp failed\n"); return; } mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(buf, tmpbuf, &mdp5_data->bufs_used, buf_list) list_move(&buf->buf_list, &mdp5_data->bufs_freelist); mutex_unlock(&mdp5_data->list_lock); } } static int mdss_mdp_overlay_on(struct msm_fb_data_type *mfd) { int rc; Loading Loading @@ -5073,7 +5106,7 @@ static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd) need_cleanup = false; pr_warn("fb%d blank while mode switch (%d) in progress\n", mfd->index, mfd->switch_state); mfd->switch_state = MDSS_MDP_NO_UPDATE_REQUESTED; mdss_mdp_handle_invalid_switch_state(mfd); } mutex_unlock(&mfd->switch_lock); Loading Loading @@ -5433,6 +5466,7 @@ static int mdss_mdp_update_panel_info(struct msm_fb_data_type *mfd, int ret = 0; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl = mdp5_data->ctl; struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_panel_data *pdata; struct mdss_mdp_ctl *sctl; Loading Loading @@ -5466,6 +5500,13 @@ static int mdss_mdp_update_panel_info(struct msm_fb_data_type *mfd, */ mdss_mdp_ctl_reconfig(ctl, pdata); /* * Set flag when dynamic resolution switch happens before * handoff of cont-splash */ if (mdata->handoff_pending) ctl->switch_with_handoff = true; sctl = mdss_mdp_get_split_ctl(ctl); if (sctl) { if (mfd->split_mode == MDP_DUAL_LM_DUAL_DISPLAY) { Loading Loading
drivers/video/msm/mdss/mdss_dsi.c +0 −2 Original line number Diff line number Diff line Loading @@ -1256,8 +1256,6 @@ static int mdss_dsi_update_panel_config(struct mdss_dsi_ctrl_pdata *ctrl_pdata, ctrl_pdata->panel_mode = pinfo->mipi.mode; mdss_panel_get_dst_fmt(pinfo->bpp, pinfo->mipi.mode, pinfo->mipi.pixel_packing, &(pinfo->mipi.dst_format)); pinfo->cont_splash_enabled = 0; return ret; } Loading
drivers/video/msm/mdss/mdss_fb.c +17 −3 Original line number Diff line number Diff line Loading @@ -3388,6 +3388,8 @@ static void mdss_fb_var_to_panelinfo(struct fb_var_screeninfo *var, void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo, struct fb_var_screeninfo *var) { u32 frame_rate; var->xres = mdss_fb_get_panel_xres(pinfo); var->yres = pinfo->yres; var->lower_margin = pinfo->lcdc.v_front_porch - Loading @@ -3399,9 +3401,21 @@ void mdss_panelinfo_to_fb_var(struct mdss_panel_info *pinfo, var->left_margin = pinfo->lcdc.h_back_porch; var->hsync_len = pinfo->lcdc.h_pulse_width; if (pinfo->clk_rate) var->pixclock = KHZ2PICOS((unsigned long int) pinfo->clk_rate/1000); frame_rate = mdss_panel_get_framerate(pinfo); if (frame_rate) { unsigned long clk_rate, h_total, v_total; h_total = var->xres + var->left_margin + var->right_margin + var->hsync_len; v_total = var->yres + var->lower_margin + var->upper_margin + var->vsync_len; clk_rate = h_total * v_total * frame_rate; var->pixclock = KHZ2PICOS(clk_rate / 1000); } else if (pinfo->clk_rate) { var->pixclock = KHZ2PICOS( (unsigned long int) pinfo->clk_rate / 1000); } if (pinfo->physical_width) var->width = pinfo->physical_width; if (pinfo->physical_height) Loading
drivers/video/msm/mdss/mdss_mdp.h +3 −0 Original line number Diff line number Diff line Loading @@ -443,6 +443,9 @@ struct mdss_mdp_ctl { u64 last_input_time; int pending_mode_switch; u16 frame_rate; /* dynamic resolution switch during cont-splash handoff */ bool switch_with_handoff; }; struct mdss_mdp_mixer { Loading
drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +20 −0 Original line number Diff line number Diff line Loading @@ -3392,6 +3392,26 @@ static int mdss_mdp_cmd_reconfigure(struct mdss_mdp_ctl *ctl, */ mdss_mdp_cmd_dsc_reconfig(ctl); /* * Make explicit cmd_panel_on call, when dynamic * resolution switch request comes before cont-splash * handoff, to match the ctl_stop/ctl_start done * during the reconfiguration. */ if (ctl->switch_with_handoff) { struct mdss_mdp_cmd_ctx *ctx; struct mdss_mdp_ctl *sctl; ctx = (struct mdss_mdp_cmd_ctx *) ctl->intf_ctx[MASTER_CTX]; if (ctx && __mdss_mdp_cmd_is_panel_power_off(ctx)) { sctl = mdss_mdp_get_split_ctl(ctl); mdss_mdp_cmd_panel_on(ctl, sctl); } ctl->switch_with_handoff = false; } mdss_mdp_ctl_stop(ctl, MDSS_PANEL_POWER_OFF); mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_DSI_DYNAMIC_SWITCH, Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +42 −1 Original line number Diff line number Diff line Loading @@ -4877,6 +4877,39 @@ static void mdss_mdp_set_lm_flag(struct msm_fb_data_type *mfd) } } static void mdss_mdp_handle_invalid_switch_state(struct msm_fb_data_type *mfd) { int rc = 0; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl = mdp5_data->ctl; struct mdss_mdp_ctl *sctl = mdss_mdp_get_split_ctl(ctl); struct mdss_mdp_data *buf, *tmpbuf; mfd->switch_state = MDSS_MDP_NO_UPDATE_REQUESTED; /* * Handle only for cmd mode panels as for video mode, buffers * cannot be freed at this point. Needs revisting to handle the * use case for video mode panels. */ if (mfd->panel_info->type == MIPI_CMD_PANEL) { if (ctl->ops.wait_pingpong) rc = ctl->ops.wait_pingpong(ctl, NULL); if (!rc && sctl && sctl->ops.wait_pingpong) rc = sctl->ops.wait_pingpong(sctl, NULL); if (rc) { pr_err("wait for pp failed\n"); return; } mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(buf, tmpbuf, &mdp5_data->bufs_used, buf_list) list_move(&buf->buf_list, &mdp5_data->bufs_freelist); mutex_unlock(&mdp5_data->list_lock); } } static int mdss_mdp_overlay_on(struct msm_fb_data_type *mfd) { int rc; Loading Loading @@ -5073,7 +5106,7 @@ static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd) need_cleanup = false; pr_warn("fb%d blank while mode switch (%d) in progress\n", mfd->index, mfd->switch_state); mfd->switch_state = MDSS_MDP_NO_UPDATE_REQUESTED; mdss_mdp_handle_invalid_switch_state(mfd); } mutex_unlock(&mfd->switch_lock); Loading Loading @@ -5433,6 +5466,7 @@ static int mdss_mdp_update_panel_info(struct msm_fb_data_type *mfd, int ret = 0; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl = mdp5_data->ctl; struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_panel_data *pdata; struct mdss_mdp_ctl *sctl; Loading Loading @@ -5466,6 +5500,13 @@ static int mdss_mdp_update_panel_info(struct msm_fb_data_type *mfd, */ mdss_mdp_ctl_reconfig(ctl, pdata); /* * Set flag when dynamic resolution switch happens before * handoff of cont-splash */ if (mdata->handoff_pending) ctl->switch_with_handoff = true; sctl = mdss_mdp_get_split_ctl(ctl); if (sctl) { if (mfd->split_mode == MDP_DUAL_LM_DUAL_DISPLAY) { Loading