diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index be037b0e1fcc..59ee2484712a 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -659,6 +659,60 @@ static int mdss_fb_blanking_mode_switch(struct msm_fb_data_type *mfd, int mode) return 0; } +static ssize_t mdss_fb_change_dfps_mode(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)fbi->par; + struct mdss_panel_data *pdata; + struct mdss_panel_info *pinfo; + u32 dfps_mode; + + pdata = dev_get_platdata(&mfd->pdev->dev); + if (!pdata) { + pr_err("no panel connected!\n"); + return len; + } + pinfo = &pdata->panel_info; + + if (sscanf(buf, "%d", &dfps_mode) != 1) { + pr_err("sccanf buf error!\n"); + return len; + } + + if (dfps_mode >= DFPS_MODE_MAX) { + pinfo->dynamic_fps = false; + return len; + } + + pinfo->dynamic_fps = true; + pinfo->dfps_update = dfps_mode; + + return len; +} + +static ssize_t mdss_fb_get_dfps_mode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)fbi->par; + struct mdss_panel_data *pdata; + struct mdss_panel_info *pinfo; + int ret; + + pdata = dev_get_platdata(&mfd->pdev->dev); + if (!pdata) { + pr_err("no panel connected!\n"); + return -EINVAL; + } + pinfo = &pdata->panel_info; + + ret = scnprintf(buf, PAGE_SIZE, "dfps enabled=%d mode=%d\n", + pinfo->dynamic_fps, pinfo->dfps_update); + + return ret; +} + static DEVICE_ATTR(msm_fb_type, S_IRUGO, mdss_fb_get_type, NULL); static DEVICE_ATTR(msm_fb_split, S_IRUGO | S_IWUSR, mdss_fb_show_split, mdss_fb_store_split); @@ -673,6 +727,8 @@ static DEVICE_ATTR(msm_fb_thermal_level, S_IRUGO | S_IWUSR, mdss_fb_get_thermal_level, mdss_fb_set_thermal_level); static DEVICE_ATTR(msm_fb_panel_status, S_IRUGO, mdss_fb_get_panel_status, NULL); +static DEVICE_ATTR(msm_fb_dfps_mode, S_IRUGO | S_IWUSR, + mdss_fb_get_dfps_mode, mdss_fb_change_dfps_mode); static struct attribute *mdss_fb_attrs[] = { &dev_attr_msm_fb_type.attr, &dev_attr_msm_fb_split.attr, @@ -683,6 +739,7 @@ static struct attribute *mdss_fb_attrs[] = { &dev_attr_msm_fb_src_split_info.attr, &dev_attr_msm_fb_thermal_level.attr, &dev_attr_msm_fb_panel_status.attr, + &dev_attr_msm_fb_dfps_mode.attr, NULL, }; diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h index d76afb32b5e7..0f91011be254 100644 --- a/drivers/video/fbdev/msm/mdss_panel.h +++ b/drivers/video/fbdev/msm/mdss_panel.h @@ -330,6 +330,7 @@ enum dynamic_fps_update { DFPS_IMMEDIATE_CLK_UPDATE_MODE, DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP, DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP, + DFPS_MODE_MAX }; enum lvds_mode {