diff options
| author | Ping Li <pingli@codeaurora.org> | 2015-05-20 13:23:44 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:42:07 -0700 |
| commit | 25ee56238aea54cac37da9555f98ee81a4374a16 (patch) | |
| tree | 3a4b1be950138277ec6ab18cca047f0cc2aab8cd | |
| parent | 64cafae38fc7b2e9bb33e30801a0a444f3a01b76 (diff) | |
msm: mdss: add sysfs node for AD backlight notification
This change adds a sysfs node for assertive display attenuation
backlight change notification. Any AD related backlight notification
will be posted to the ad_bl_event sysfs node, so userspace clients
can be notified if they poll on the same sysfs node.
It will simplify and optimize the previous notification ioctl
implementation.
Change-Id: I7a8f86563d5802a41dc200f5901a8d0bed1cf765
Signed-off-by: Ping Li <pingli@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 36 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 22 | ||||
| -rw-r--r-- | include/uapi/linux/msm_mdp.h | 1 |
4 files changed, 52 insertions, 9 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 2d5f3af80c52..761cb9546ea4 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -122,7 +122,8 @@ void mdss_fb_no_update_notify_timer_cb(unsigned long data) complete(&mfd->no_update.comp); } -void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) +void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd, + uint32_t notification_type) { struct mdss_overlay_private *mdp5_data = NULL; if (!mfd) { @@ -130,9 +131,13 @@ void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) return; } mutex_lock(&mfd->update.lock); + if (mfd->update.is_suspend) { + mutex_unlock(&mfd->update.lock); + return; + } if (mfd->update.ref_count > 0) { mutex_unlock(&mfd->update.lock); - mfd->update.value = NOTIFY_TYPE_BL_UPDATE; + mfd->update.value = notification_type; complete(&mfd->update.comp); mutex_lock(&mfd->update.lock); } @@ -141,15 +146,20 @@ void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) mutex_lock(&mfd->no_update.lock); if (mfd->no_update.ref_count > 0) { mutex_unlock(&mfd->no_update.lock); - mfd->no_update.value = NOTIFY_TYPE_BL_UPDATE; + mfd->no_update.value = notification_type; complete(&mfd->no_update.comp); mutex_lock(&mfd->no_update.lock); } mutex_unlock(&mfd->no_update.lock); mdp5_data = mfd_to_mdp5_data(mfd); if (mdp5_data) { - mdp5_data->bl_events++; - sysfs_notify_dirent(mdp5_data->bl_event_sd); + if (notification_type == NOTIFY_TYPE_BL_AD_ATTEN_UPDATE) { + mdp5_data->ad_bl_events++; + sysfs_notify_dirent(mdp5_data->ad_bl_event_sd); + } else if (notification_type == NOTIFY_TYPE_BL_UPDATE) { + mdp5_data->bl_events++; + sysfs_notify_dirent(mdp5_data->bl_event_sd); + } } } @@ -1221,6 +1231,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) { struct mdss_panel_data *pdata; u32 temp = bkl_lvl; + bool ad_bl_notify_needed = false; bool bl_notify_needed = false; if ((((mdss_fb_is_power_off(mfd) && mfd->dcm_state != DCM_ENTER) @@ -1237,9 +1248,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if ((pdata) && (pdata->set_backlight)) { if (mfd->mdp.ad_calc_bl) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, - &bl_notify_needed); - if (bl_notify_needed) - mdss_fb_bl_update_notify(mfd); + &ad_bl_notify_needed); if (!IS_CALIB_MODE_BL(mfd)) mdss_fb_scale_bl(mfd, &temp); /* @@ -1253,11 +1262,19 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) if (mfd->bl_level_scaled == temp) { mfd->bl_level = bkl_lvl; } else { + if (mfd->bl_level != bkl_lvl) + bl_notify_needed = true; pr_debug("backlight sent to panel :%d\n", temp); pdata->set_backlight(pdata, temp); mfd->bl_level = bkl_lvl; mfd->bl_level_scaled = temp; } + if (ad_bl_notify_needed) + mdss_fb_bl_update_notify(mfd, + NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); + else if (bl_notify_needed) + mdss_fb_bl_update_notify(mfd, + NOTIFY_TYPE_BL_UPDATE); } } @@ -1279,7 +1296,8 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &bl_notify); if (bl_notify) - mdss_fb_bl_update_notify(mfd); + mdss_fb_bl_update_notify(mfd, + NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; mfd->bl_updated = 1; diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index f711dc86b3ec..8a0ad0835c65 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -563,6 +563,7 @@ struct mdss_overlay_private { struct kernfs_node *hist_event_sd; struct kernfs_node *bl_event_sd; struct kernfs_node *ad_event_sd; + struct kernfs_node *ad_bl_event_sd; int borderfill_enable; int overlay_play_enable; int hw_refresh; @@ -604,6 +605,7 @@ struct mdss_overlay_private { u32 hist_events; u32 bl_events; u32 ad_events; + u32 ad_bl_events; }; struct mdss_mdp_set_ot_params { diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index bdfbc9725743..8f05d9c37939 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -2713,6 +2713,18 @@ static ssize_t mdss_mdp_ad_show_event(struct device *dev, return ret; } +static ssize_t mdss_mdp_ad_bl_show_event(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_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); + int ret; + + ret = scnprintf(buf, PAGE_SIZE, "%d\n", mdp5_data->ad_bl_events); + return ret; +} + static inline int mdss_mdp_ad_is_supported(struct msm_fb_data_type *mfd) { struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); @@ -2930,6 +2942,7 @@ static DEVICE_ATTR(dyn_pu, S_IRUGO | S_IWUSR | S_IWGRP, mdss_mdp_dyn_pu_show, static DEVICE_ATTR(hist_event, S_IRUGO, mdss_mdp_hist_show_event, NULL); static DEVICE_ATTR(bl_event, S_IRUGO, mdss_mdp_bl_show_event, NULL); static DEVICE_ATTR(ad_event, S_IRUGO, mdss_mdp_ad_show_event, NULL); +static DEVICE_ATTR(ad_bl_event, S_IRUGO, mdss_mdp_ad_bl_show_event, NULL); static struct attribute *mdp_overlay_sysfs_attrs[] = { &dev_attr_vsync_event.attr, @@ -2939,6 +2952,7 @@ static struct attribute *mdp_overlay_sysfs_attrs[] = { &dev_attr_hist_event.attr, &dev_attr_bl_event.attr, &dev_attr_ad_event.attr, + &dev_attr_ad_bl_event.attr, NULL, }; @@ -4928,6 +4942,14 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) goto init_fail; } + mdp5_data->ad_bl_event_sd = sysfs_get_dirent(dev->kobj.sd, + "ad_bl_event"); + if (!mdp5_data->ad_bl_event_sd) { + pr_err("ad_bl_event sysfs lookup failed\n"); + rc = -ENODEV; + goto init_fail; + } + rc = sysfs_create_link_nowarn(&dev->kobj, &mdp5_data->mdata->pdev->dev.kobj, "mdp"); if (rc) diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index c06954354b06..4fbaaac79b98 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -125,6 +125,7 @@ enum { NOTIFY_TYPE_SUSPEND, NOTIFY_TYPE_UPDATE, NOTIFY_TYPE_BL_UPDATE, + NOTIFY_TYPE_BL_AD_ATTEN_UPDATE, }; enum { |
