summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c22
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c8
3 files changed, 31 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index b63752ad768a..f711dc86b3ec 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -562,6 +562,7 @@ struct mdss_overlay_private {
struct kernfs_node *vsync_event_sd;
struct kernfs_node *hist_event_sd;
struct kernfs_node *bl_event_sd;
+ struct kernfs_node *ad_event_sd;
int borderfill_enable;
int overlay_play_enable;
int hw_refresh;
@@ -602,6 +603,7 @@ struct mdss_overlay_private {
u32 cursor_ndx[2];
u32 hist_events;
u32 bl_events;
+ u32 ad_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 317fe18d6ba4..bdfbc9725743 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -2701,6 +2701,18 @@ static ssize_t mdss_mdp_hist_show_event(struct device *dev,
return ret;
}
+static ssize_t mdss_mdp_ad_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_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);
@@ -2917,6 +2929,7 @@ static DEVICE_ATTR(dyn_pu, S_IRUGO | S_IWUSR | S_IWGRP, mdss_mdp_dyn_pu_show,
mdss_mdp_dyn_pu_store);
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 struct attribute *mdp_overlay_sysfs_attrs[] = {
&dev_attr_vsync_event.attr,
@@ -2925,6 +2938,7 @@ static struct attribute *mdp_overlay_sysfs_attrs[] = {
&dev_attr_msm_cmd_autorefresh_en.attr,
&dev_attr_hist_event.attr,
&dev_attr_bl_event.attr,
+ &dev_attr_ad_event.attr,
NULL,
};
@@ -4906,6 +4920,14 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
goto init_fail;
}
+ mdp5_data->ad_event_sd = sysfs_get_dirent(dev->kobj.sd,
+ "ad_event");
+ if (!mdp5_data->ad_event_sd) {
+ pr_err("ad_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/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index efb4bda669ab..1ff6434463e8 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -5351,6 +5351,7 @@ static void pp_ad_calc_worker(struct work_struct *work)
struct mdss_ad_info *ad;
struct mdss_mdp_ctl *ctl;
struct msm_fb_data_type *mfd, *bl_mfd;
+ struct mdss_overlay_private *mdp5_data;
struct mdss_data_type *mdata;
char __iomem *base;
u32 calc_done = 0;
@@ -5365,13 +5366,13 @@ static void pp_ad_calc_worker(struct work_struct *work)
bl_mfd = ad->bl_mfd;
ctl = mfd_to_ctl(ad->mfd);
mdata = mfd_to_mdata(ad->mfd);
+ mdp5_data = mfd_to_mdp5_data(mfd);
if (!mdata || ad->calc_hw_num >= mdata->nad_cfgs) {
mutex_unlock(&ad->lock);
return;
}
-
base = mdata->ad_off[ad->calc_hw_num].base;
if ((ad->cfg.mode == MDSS_AD_MODE_AUTO_STR) && (ad->last_bl == 0)) {
@@ -5410,6 +5411,11 @@ static void pp_ad_calc_worker(struct work_struct *work)
if (!ad->calc_itr) {
ad->state &= ~PP_AD_STATE_VSYNC;
ctl->ops.remove_vsync_handler(ctl, &ad->handle);
+ } else {
+ if (mdp5_data) {
+ mdp5_data->ad_events++;
+ sysfs_notify_dirent(mdp5_data->ad_event_sd);
+ }
}
mutex_unlock(&ad->lock);
/* dspp3 doesn't have ad attached to it so following is safe */