Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +29 −9 Original line number Diff line number Diff line Loading @@ -2705,7 +2705,7 @@ static int calc_extra_blanking(struct mdss_panel_data *pdata, u32 new_fps) int add_porches, diff; /* calculate extra: lines for vfp-method, pixels for hfp-method */ diff = pdata->panel_info.default_fps - new_fps; diff = abs(pdata->panel_info.default_fps - new_fps); add_porches = mult_frac(pdata->panel_info.saved_total, diff, new_fps); Loading Loading @@ -2748,6 +2748,14 @@ static void cache_initial_timings(struct mdss_panel_data *pdata) } } static inline void dfps_update_fps(struct mdss_panel_info *pinfo, u32 fps) { if (pinfo->type == DTV_PANEL) pinfo->lcdc.frame_rate = fps; else pinfo->mipi.frame_rate = fps; } static void dfps_update_panel_params(struct mdss_panel_data *pdata, u32 new_fps) { Loading @@ -2764,7 +2772,9 @@ static void dfps_update_panel_params(struct mdss_panel_data *pdata, /* update panel info with new values */ pdata->panel_info.lcdc.v_front_porch = pdata->panel_info.saved_fporch + add_v_lines; pdata->panel_info.mipi.frame_rate = new_fps; dfps_update_fps(&pdata->panel_info, new_fps); pdata->panel_info.prg_fet = mdss_mdp_get_prefetch_lines(&pdata->panel_info); Loading @@ -2776,11 +2786,18 @@ static void dfps_update_panel_params(struct mdss_panel_data *pdata, add_h_pixels = calc_extra_blanking(pdata, new_fps); /* update panel info */ if (pdata->panel_info.default_fps > new_fps) pdata->panel_info.lcdc.h_front_porch = pdata->panel_info.saved_fporch + add_h_pixels; pdata->panel_info.mipi.frame_rate = new_fps; else pdata->panel_info.lcdc.h_front_porch = pdata->panel_info.saved_fporch - add_h_pixels; dfps_update_fps(&pdata->panel_info, new_fps); } else { pdata->panel_info.mipi.frame_rate = new_fps; dfps_update_fps(&pdata->panel_info, new_fps); mdss_panel_update_clk_rate(&pdata->panel_info, new_fps); } } Loading Loading @@ -2826,7 +2843,7 @@ int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int dfps, rc = 0; int dfps, panel_fps, rc = 0; struct mdss_panel_data *pdata; struct fb_info *fbi = dev_get_drvdata(dev); struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)fbi->par; Loading Loading @@ -2855,7 +2872,9 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, return -EINVAL; } if (dfps == pdata->panel_info.mipi.frame_rate) { panel_fps = mdss_panel_get_framerate(&pdata->panel_info); if (dfps == panel_fps) { pr_debug("%s: FPS is already %d\n", __func__, dfps); return count; Loading Loading @@ -5493,7 +5512,8 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) if (rc) pr_warn("problem creating link to mdss_fb sysfs\n"); if (mfd->panel_info->type == MIPI_VIDEO_PANEL) { if (mfd->panel_info->type == MIPI_VIDEO_PANEL || mfd->panel_info->type == DTV_PANEL) { rc = sysfs_create_group(&dev->kobj, &dynamic_fps_fs_attrs_group); if (rc) { Loading drivers/video/msm/mdss/mdss_panel.h +31 −0 Original line number Diff line number Diff line Loading @@ -280,6 +280,7 @@ struct lcd_panel_info { u32 xres_pad; /* Pad height */ u32 yres_pad; u32 frame_rate; }; Loading Loading @@ -770,6 +771,11 @@ static inline u32 mdss_panel_get_framerate(struct mdss_panel_info *panel_info) case WRITEBACK_PANEL: frame_rate = DEFAULT_FRAME_RATE; break; case DTV_PANEL: if (panel_info->dynamic_fps) { frame_rate = panel_info->lcdc.frame_rate; break; } default: pixel_total = (panel_info->lcdc.h_back_porch + panel_info->lcdc.h_front_porch + Loading Loading @@ -914,6 +920,31 @@ static inline bool mdss_panel_is_power_on_ulp(int panel_power_state) return panel_power_state == MDSS_PANEL_POWER_LP2; } /** * mdss_panel_update_clk_rate() - update the clock rate based on panel timing * information. * @panel_info: Pointer to panel info containing all panel information * @fps: frame rate of the panel */ static inline void mdss_panel_update_clk_rate(struct mdss_panel_info *pinfo, u32 fps) { struct lcd_panel_info *lcdc = &pinfo->lcdc; u32 htotal, vtotal; if (pinfo->type == DTV_PANEL) { htotal = pinfo->xres + lcdc->h_front_porch + lcdc->h_back_porch + lcdc->h_pulse_width; vtotal = pinfo->yres + lcdc->v_front_porch + lcdc->v_back_porch + lcdc->v_pulse_width; pinfo->clk_rate = mult_frac(htotal * vtotal, fps, 1000); pr_debug("vtotal %d, htotal %d, rate %llu\n", vtotal, htotal, pinfo->clk_rate); } } /** * mdss_panel_calc_frame_rate() - calculate panel frame rate based on panel timing * information. Loading Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +29 −9 Original line number Diff line number Diff line Loading @@ -2705,7 +2705,7 @@ static int calc_extra_blanking(struct mdss_panel_data *pdata, u32 new_fps) int add_porches, diff; /* calculate extra: lines for vfp-method, pixels for hfp-method */ diff = pdata->panel_info.default_fps - new_fps; diff = abs(pdata->panel_info.default_fps - new_fps); add_porches = mult_frac(pdata->panel_info.saved_total, diff, new_fps); Loading Loading @@ -2748,6 +2748,14 @@ static void cache_initial_timings(struct mdss_panel_data *pdata) } } static inline void dfps_update_fps(struct mdss_panel_info *pinfo, u32 fps) { if (pinfo->type == DTV_PANEL) pinfo->lcdc.frame_rate = fps; else pinfo->mipi.frame_rate = fps; } static void dfps_update_panel_params(struct mdss_panel_data *pdata, u32 new_fps) { Loading @@ -2764,7 +2772,9 @@ static void dfps_update_panel_params(struct mdss_panel_data *pdata, /* update panel info with new values */ pdata->panel_info.lcdc.v_front_porch = pdata->panel_info.saved_fporch + add_v_lines; pdata->panel_info.mipi.frame_rate = new_fps; dfps_update_fps(&pdata->panel_info, new_fps); pdata->panel_info.prg_fet = mdss_mdp_get_prefetch_lines(&pdata->panel_info); Loading @@ -2776,11 +2786,18 @@ static void dfps_update_panel_params(struct mdss_panel_data *pdata, add_h_pixels = calc_extra_blanking(pdata, new_fps); /* update panel info */ if (pdata->panel_info.default_fps > new_fps) pdata->panel_info.lcdc.h_front_porch = pdata->panel_info.saved_fporch + add_h_pixels; pdata->panel_info.mipi.frame_rate = new_fps; else pdata->panel_info.lcdc.h_front_porch = pdata->panel_info.saved_fporch - add_h_pixels; dfps_update_fps(&pdata->panel_info, new_fps); } else { pdata->panel_info.mipi.frame_rate = new_fps; dfps_update_fps(&pdata->panel_info, new_fps); mdss_panel_update_clk_rate(&pdata->panel_info, new_fps); } } Loading Loading @@ -2826,7 +2843,7 @@ int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int dfps, rc = 0; int dfps, panel_fps, rc = 0; struct mdss_panel_data *pdata; struct fb_info *fbi = dev_get_drvdata(dev); struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)fbi->par; Loading Loading @@ -2855,7 +2872,9 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, return -EINVAL; } if (dfps == pdata->panel_info.mipi.frame_rate) { panel_fps = mdss_panel_get_framerate(&pdata->panel_info); if (dfps == panel_fps) { pr_debug("%s: FPS is already %d\n", __func__, dfps); return count; Loading Loading @@ -5493,7 +5512,8 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) if (rc) pr_warn("problem creating link to mdss_fb sysfs\n"); if (mfd->panel_info->type == MIPI_VIDEO_PANEL) { if (mfd->panel_info->type == MIPI_VIDEO_PANEL || mfd->panel_info->type == DTV_PANEL) { rc = sysfs_create_group(&dev->kobj, &dynamic_fps_fs_attrs_group); if (rc) { Loading
drivers/video/msm/mdss/mdss_panel.h +31 −0 Original line number Diff line number Diff line Loading @@ -280,6 +280,7 @@ struct lcd_panel_info { u32 xres_pad; /* Pad height */ u32 yres_pad; u32 frame_rate; }; Loading Loading @@ -770,6 +771,11 @@ static inline u32 mdss_panel_get_framerate(struct mdss_panel_info *panel_info) case WRITEBACK_PANEL: frame_rate = DEFAULT_FRAME_RATE; break; case DTV_PANEL: if (panel_info->dynamic_fps) { frame_rate = panel_info->lcdc.frame_rate; break; } default: pixel_total = (panel_info->lcdc.h_back_porch + panel_info->lcdc.h_front_porch + Loading Loading @@ -914,6 +920,31 @@ static inline bool mdss_panel_is_power_on_ulp(int panel_power_state) return panel_power_state == MDSS_PANEL_POWER_LP2; } /** * mdss_panel_update_clk_rate() - update the clock rate based on panel timing * information. * @panel_info: Pointer to panel info containing all panel information * @fps: frame rate of the panel */ static inline void mdss_panel_update_clk_rate(struct mdss_panel_info *pinfo, u32 fps) { struct lcd_panel_info *lcdc = &pinfo->lcdc; u32 htotal, vtotal; if (pinfo->type == DTV_PANEL) { htotal = pinfo->xres + lcdc->h_front_porch + lcdc->h_back_porch + lcdc->h_pulse_width; vtotal = pinfo->yres + lcdc->v_front_porch + lcdc->v_back_porch + lcdc->v_pulse_width; pinfo->clk_rate = mult_frac(htotal * vtotal, fps, 1000); pr_debug("vtotal %d, htotal %d, rate %llu\n", vtotal, htotal, pinfo->clk_rate); } } /** * mdss_panel_calc_frame_rate() - calculate panel frame rate based on panel timing * information. Loading