Loading drivers/video/msm/mdss/mdss_dsi.c +36 −1 Original line number Diff line number Diff line Loading @@ -2016,6 +2016,37 @@ error_byte: return rc; } static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg) { struct mdss_panel_info *var_pinfo, *pinfo; int rc = 0; if (!ctrl || !arg) return 0; pinfo = &ctrl->panel_data.panel_info; if (!pinfo->is_pluggable) return 0; var_pinfo = (struct mdss_panel_info *)arg; pr_debug("%s: reconfig xres: %d yres: %d, current xres: %d yres: %d\n", __func__, var_pinfo->xres, var_pinfo->yres, pinfo->xres, pinfo->yres); if ((var_pinfo->xres != pinfo->xres) || (var_pinfo->yres != pinfo->yres) || (var_pinfo->lcdc.h_back_porch != pinfo->lcdc.h_back_porch) || (var_pinfo->lcdc.h_front_porch != pinfo->lcdc.h_front_porch) || (var_pinfo->lcdc.h_pulse_width != pinfo->lcdc.h_pulse_width) || (var_pinfo->lcdc.v_back_porch != pinfo->lcdc.v_back_porch) || (var_pinfo->lcdc.v_front_porch != pinfo->lcdc.v_front_porch) || (var_pinfo->lcdc.v_pulse_width != pinfo->lcdc.v_pulse_width) ) rc = 1; return rc; } static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps) { int rc = 0; Loading Loading @@ -2345,13 +2376,17 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, switch (event) { case MDSS_EVENT_CHECK_PARAMS: pr_debug("%s:Entered Case MDSS_EVENT_CHECK_PARAMS\n", __func__); if (mdss_dsi_check_params(ctrl_pdata, arg)) { ctrl_pdata->refresh_clk_rate = true; rc = 1; } break; case MDSS_EVENT_LINK_READY: if (ctrl_pdata->refresh_clk_rate) rc = mdss_dsi_clk_refresh(pdata); mdss_dsi_get_hw_revision(ctrl_pdata); mdss_dsi_get_phy_revision(ctrl_pdata); rc = mdss_dsi_on(pdata); mdss_dsi_op_mode_config(pdata->panel_info.mipi.mode, pdata); Loading drivers/video/msm/mdss/mdss_panel.h +29 −0 Original line number Diff line number Diff line Loading @@ -902,6 +902,35 @@ static inline bool mdss_panel_is_power_on_ulp(int panel_power_state) return panel_power_state == MDSS_PANEL_POWER_LP2; } /** * mdss_panel_calc_frame_rate() - calculate panel frame rate based on panel timing * information. * @panel_info: Pointer to panel info containing all panel information */ static inline u8 mdss_panel_calc_frame_rate(struct mdss_panel_info *pinfo) { u32 pixel_total = 0; u8 frame_rate = 0; unsigned long pclk_rate = pinfo->clk_rate; pixel_total = (pinfo->lcdc.h_back_porch + pinfo->lcdc.h_front_porch + pinfo->lcdc.h_pulse_width + pinfo->xres) * (pinfo->lcdc.v_back_porch + pinfo->lcdc.v_front_porch + pinfo->lcdc.v_pulse_width + pinfo->yres); if (pclk_rate && pixel_total) frame_rate = DIV_ROUND_CLOSEST(pclk_rate, pixel_total); else frame_rate = DEFAULT_FRAME_RATE; return frame_rate; } /** * mdss_panel_intf_type: - checks if a given intf type is primary * @intf_val: panel interface type of the individual controller Loading drivers/video/msm/mdss/msm_mdss_io_8974.c +26 −0 Original line number Diff line number Diff line Loading @@ -1071,10 +1071,27 @@ void mdss_dsi_core_clk_deinit(struct device *dev, struct dsi_shared_data *sdata) int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int rc = 0; if (!pdata) { pr_err("%s: invalid panel data\n", __func__); return -EINVAL; } ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); pinfo = &pdata->panel_info; if (!ctrl_pdata || !pinfo) { pr_err("%s: invalid ctrl data\n", __func__); return -EINVAL; } /* Re-calculate frame rate before clk config */ pinfo->mipi.frame_rate = mdss_panel_calc_frame_rate(pinfo); pr_debug("%s: new frame rate %d\n", __func__, pinfo->mipi.frame_rate); rc = mdss_dsi_clk_div_config(&pdata->panel_info, pdata->panel_info.mipi.frame_rate); if (rc) { Loading Loading @@ -1105,6 +1122,15 @@ int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) __func__); return rc; } /* phy panel timing calaculation */ rc = mdss_dsi_phy_calc_timing_param(pinfo, ctrl_pdata->shared_data->phy_rev, pinfo->mipi.frame_rate); if (rc) { pr_err("%s: unable to calculate phy timings\n", __func__); return rc; } return rc; } Loading Loading
drivers/video/msm/mdss/mdss_dsi.c +36 −1 Original line number Diff line number Diff line Loading @@ -2016,6 +2016,37 @@ error_byte: return rc; } static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg) { struct mdss_panel_info *var_pinfo, *pinfo; int rc = 0; if (!ctrl || !arg) return 0; pinfo = &ctrl->panel_data.panel_info; if (!pinfo->is_pluggable) return 0; var_pinfo = (struct mdss_panel_info *)arg; pr_debug("%s: reconfig xres: %d yres: %d, current xres: %d yres: %d\n", __func__, var_pinfo->xres, var_pinfo->yres, pinfo->xres, pinfo->yres); if ((var_pinfo->xres != pinfo->xres) || (var_pinfo->yres != pinfo->yres) || (var_pinfo->lcdc.h_back_porch != pinfo->lcdc.h_back_porch) || (var_pinfo->lcdc.h_front_porch != pinfo->lcdc.h_front_porch) || (var_pinfo->lcdc.h_pulse_width != pinfo->lcdc.h_pulse_width) || (var_pinfo->lcdc.v_back_porch != pinfo->lcdc.v_back_porch) || (var_pinfo->lcdc.v_front_porch != pinfo->lcdc.v_front_porch) || (var_pinfo->lcdc.v_pulse_width != pinfo->lcdc.v_pulse_width) ) rc = 1; return rc; } static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps) { int rc = 0; Loading Loading @@ -2345,13 +2376,17 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, switch (event) { case MDSS_EVENT_CHECK_PARAMS: pr_debug("%s:Entered Case MDSS_EVENT_CHECK_PARAMS\n", __func__); if (mdss_dsi_check_params(ctrl_pdata, arg)) { ctrl_pdata->refresh_clk_rate = true; rc = 1; } break; case MDSS_EVENT_LINK_READY: if (ctrl_pdata->refresh_clk_rate) rc = mdss_dsi_clk_refresh(pdata); mdss_dsi_get_hw_revision(ctrl_pdata); mdss_dsi_get_phy_revision(ctrl_pdata); rc = mdss_dsi_on(pdata); mdss_dsi_op_mode_config(pdata->panel_info.mipi.mode, pdata); Loading
drivers/video/msm/mdss/mdss_panel.h +29 −0 Original line number Diff line number Diff line Loading @@ -902,6 +902,35 @@ static inline bool mdss_panel_is_power_on_ulp(int panel_power_state) return panel_power_state == MDSS_PANEL_POWER_LP2; } /** * mdss_panel_calc_frame_rate() - calculate panel frame rate based on panel timing * information. * @panel_info: Pointer to panel info containing all panel information */ static inline u8 mdss_panel_calc_frame_rate(struct mdss_panel_info *pinfo) { u32 pixel_total = 0; u8 frame_rate = 0; unsigned long pclk_rate = pinfo->clk_rate; pixel_total = (pinfo->lcdc.h_back_porch + pinfo->lcdc.h_front_porch + pinfo->lcdc.h_pulse_width + pinfo->xres) * (pinfo->lcdc.v_back_porch + pinfo->lcdc.v_front_porch + pinfo->lcdc.v_pulse_width + pinfo->yres); if (pclk_rate && pixel_total) frame_rate = DIV_ROUND_CLOSEST(pclk_rate, pixel_total); else frame_rate = DEFAULT_FRAME_RATE; return frame_rate; } /** * mdss_panel_intf_type: - checks if a given intf type is primary * @intf_val: panel interface type of the individual controller Loading
drivers/video/msm/mdss/msm_mdss_io_8974.c +26 −0 Original line number Diff line number Diff line Loading @@ -1071,10 +1071,27 @@ void mdss_dsi_core_clk_deinit(struct device *dev, struct dsi_shared_data *sdata) int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int rc = 0; if (!pdata) { pr_err("%s: invalid panel data\n", __func__); return -EINVAL; } ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); pinfo = &pdata->panel_info; if (!ctrl_pdata || !pinfo) { pr_err("%s: invalid ctrl data\n", __func__); return -EINVAL; } /* Re-calculate frame rate before clk config */ pinfo->mipi.frame_rate = mdss_panel_calc_frame_rate(pinfo); pr_debug("%s: new frame rate %d\n", __func__, pinfo->mipi.frame_rate); rc = mdss_dsi_clk_div_config(&pdata->panel_info, pdata->panel_info.mipi.frame_rate); if (rc) { Loading Loading @@ -1105,6 +1122,15 @@ int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) __func__); return rc; } /* phy panel timing calaculation */ rc = mdss_dsi_phy_calc_timing_param(pinfo, ctrl_pdata->shared_data->phy_rev, pinfo->mipi.frame_rate); if (rc) { pr_err("%s: unable to calculate phy timings\n", __func__); return rc; } return rc; } Loading