Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 355a22c3 authored by Adrian Salido's avatar Adrian Salido Committed by Andrea
Browse files

msm: mdss: add idle state node



Add a helper node that can be used to notify user space through sysfs
node when fb device has not had any activity for a specified amount of
time (through idle_time node).

Bug: 62110101
Change-Id: I4dfa4b1a376149aa55a940dad7ac336ec99f1af8
Signed-off-by: default avatarAdrian Salido <salidoa@google.com>
parent 4a25efe5
Loading
Loading
Loading
Loading
+38 −7
Original line number Diff line number Diff line
@@ -638,12 +638,17 @@ static void __mdss_fb_idle_notify_work(struct work_struct *work)

	/* Notify idle-ness here */
	pr_debug("Idle timeout %dms expired!\n", mfd->idle_time);
	if (mfd->idle_time)
		sysfs_notify(&mfd->fbi->dev->kobj, NULL, "idle_notify");

	mfd->idle_state = MDSS_FB_IDLE;
	/*
	 * idle_notify node events are used to reduce MDP load when idle,
	 * this is not needed for command mode panels.
	 */
	if (mfd->idle_time && mfd->panel.type != MIPI_CMD_PANEL)
		sysfs_notify(&mfd->fbi->dev->kobj, NULL, "idle_notify");
	sysfs_notify(&mfd->fbi->dev->kobj, NULL, "idle_state");
}


static ssize_t mdss_fb_get_fps_info(struct device *dev,
		struct device_attribute *attr, char *buf)
{
@@ -704,6 +709,26 @@ static ssize_t mdss_fb_get_idle_notify(struct device *dev,
	return ret;
}

static ssize_t mdss_fb_get_idle_state(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct fb_info *fbi = dev_get_drvdata(dev);
	struct msm_fb_data_type *mfd = fbi->par;
	const char *state_strs[] = {
		[MDSS_FB_NOT_IDLE] = "active",
		[MDSS_FB_IDLE_TIMER_RUNNING] = "pending",
		[MDSS_FB_IDLE] = "idle",
	};
	int state = mfd->idle_state;
	const char *s;
	if (state < ARRAY_SIZE(state_strs) && state_strs[state])
		s = state_strs[state];
	else
		s = "invalid";

	return scnprintf(buf, PAGE_SIZE, "%s\n", s);
}

static ssize_t mdss_fb_get_panel_info(struct device *dev,
		struct device_attribute *attr, char *buf)
{
@@ -1040,6 +1065,7 @@ static DEVICE_ATTR(show_blank_event, S_IRUGO, mdss_mdp_show_blank_event, NULL);
static DEVICE_ATTR(idle_time, S_IRUGO | S_IWUSR | S_IWGRP,
	mdss_fb_get_idle_time, mdss_fb_set_idle_time);
static DEVICE_ATTR(idle_notify, S_IRUGO, mdss_fb_get_idle_notify, NULL);
static DEVICE_ATTR(idle_state, S_IRUGO, mdss_fb_get_idle_state, NULL);
static DEVICE_ATTR(msm_fb_panel_info, S_IRUGO, mdss_fb_get_panel_info, NULL);
static DEVICE_ATTR(msm_fb_src_split_info, S_IRUGO, mdss_fb_get_src_split_info,
	NULL);
@@ -1061,6 +1087,7 @@ static struct attribute *mdss_fb_attrs[] = {
	&dev_attr_show_blank_event.attr,
	&dev_attr_idle_time.attr,
	&dev_attr_idle_notify.attr,
	&dev_attr_idle_state.attr,
	&dev_attr_msm_fb_panel_info.attr,
	&dev_attr_msm_fb_src_split_info.attr,
	&dev_attr_msm_fb_thermal_level.attr,
@@ -3429,14 +3456,18 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p,
			ret = __mdss_fb_wait_for_fence_sub(sync_pt_data,
				sync_pt_data->temp_fen, fence_cnt);
		}
		if (mfd->idle_time && !mod_delayed_work(system_wq,
		if (mfd->idle_time) {
			if (!mod_delayed_work(system_wq,
					&mfd->idle_notify_work,
					msecs_to_jiffies(mfd->idle_time)))
				pr_debug("fb%d: restarted idle work\n",
						mfd->index);
			mfd->idle_state = MDSS_FB_IDLE_TIMER_RUNNING;
		} else {
			mfd->idle_state = MDSS_FB_IDLE;
		}
		if (ret == -ETIME)
			ret = NOTIFY_BAD;
		mfd->idle_state = MDSS_FB_IDLE_TIMER_RUNNING;
		break;
	case MDP_NOTIFY_FRAME_FLUSHED:
		pr_debug("%s: frame flushed\n", sync_pt_data->fence_name);