summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPing Li <pingli@codeaurora.org>2015-05-20 13:23:44 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:42:07 -0700
commit25ee56238aea54cac37da9555f98ee81a4374a16 (patch)
tree3a4b1be950138277ec6ab18cca047f0cc2aab8cd
parent64cafae38fc7b2e9bb33e30801a0a444f3a01b76 (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.c36
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c22
-rw-r--r--include/uapi/linux/msm_mdp.h1
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 {