static void plugin_cal_t72_hook_t6(struct plugin_ac *p, u8 status)
{
	const struct mxt_config *dcfg = p->dcfg;
	struct device *dev = dcfg->dev;
	struct t72_observer *obs = p->obs;

	if (status & (MXT_T6_STATUS_RESET|MXT_T6_STATUS_CAL)) {
		dev_dbg2(dev, "T72 hook T6 0x%x\n", status);
		
		if (status & MXT_T6_STATUS_CAL) {
			set_and_clr_flag(T72_FLAG_CAL,
				T72_FLAG_MASK_NORMAL,&obs->flag);
		}
		if (status & MXT_T6_STATUS_RESET) {
			set_and_clr_flag(T72_FLAG_RESET,
				T72_FLAG_MASK,&obs->flag);
		}
	}else{
		if (test_flag(T72_FLAG_CAL|T72_FLAG_RESET,&obs->flag)) {
			dev_dbg2(dev, "T72 hook T6 end\n");
			set_and_clr_flag(T72_FLAG_START_T61, 0, &obs->flag);
		}
	}

	dev_info2(dev, "mxt t72 flag=0x%lx\n",
		 obs->flag);
}
static long plugin_ac_t72_post_process_messages(struct plugin_ac *p, unsigned long pl_flag)
{
	const struct mxt_config *dcfg = p->dcfg;
	struct device *dev = dcfg->dev;
	struct t72_config *cfg = p->cfg;
	struct t72_observer *obs = p->obs;
	long next_interval = MAX_SCHEDULE_TIMEOUT;
	int ret = 0;

	if (test_flag(T72_FLAG_WORKAROUND_HALT,&obs->flag))
		return MAX_SCHEDULE_TIMEOUT;

	if (test_flag(T72_FLAG_STATE_CHANGE, &obs->flag)) {
		mxt_proc_noise_msg(p, pl_flag);
	}

	if (test_flag(/*T72_FLAG_CAL*/T72_FLAG_RESUME, &obs->flag)) {
		mxt_proc_proximity_msg(p, pl_flag);
	}

	if (test_flag(T72_FLAG_START_T61, &obs->flag)) {
		mxt_proc_timer_msg(p, pl_flag);
	}

	if (test_flag(T72_FLAG_MASK_LOW, &obs->flag)) {
		mxt_proc_hw_msg(p, pl_flag);
	}

	if (time_after_eq(jiffies,obs->time_next_st)) {
		if (test_flag(IRAD_FLAG_PROXIMITY_DETECTED, &obs->flag)) {
		mxt_proc_proximity_msg(p, pl_flag);
		}
	}else {
		dev_dbg2(dev, "mxt wait %lu\n", obs->time_next_st - jiffies);
		ret = -ETIME;
	}

	if (ret == -ETIME)
		next_interval = obs->time_next_st - jiffies + 1;
	if (ret == -EAGAIN)
		next_interval = cfg->interval_fast;
	else {
		next_interval = status_interval(p,obs->flag);
	}

	if (ret != -ETIME) {
		obs->time_next_st = jiffies;
		if (next_interval != MAX_SCHEDULE_TIMEOUT)
			obs->time_next_st = jiffies + next_interval;
		else
			obs->time_next_st = next_interval;
	}

	if (!next_interval)
		next_interval = MAX_SCHEDULE_TIMEOUT; //just wait interrupt if zero

	dev_dbg2(dev, "t72 mxt interval %lu wait %ld\n",next_interval,obs->time_next_st - jiffies);
	return next_interval;
}
static int mxt_proc_hw_msg(struct plugin_ac *p,unsigned long pl_flag)
{
	const struct mxt_config *dcfg = p->dcfg;
	struct device *dev = dcfg->dev;
	struct t72_observer *obs = p->obs;

	dev_dbg2(dev, "mxt t72 at mxt_proc_hw_msg flag 0x%lx pl_flag 0x%lx\n",obs->flag,pl_flag);

	clear_flag(T72_FLAG_MASK_LOW, &obs->flag);

	obs->time_next_st = jiffies + 1;

	return 0;
}
long status_interval(struct plugin_ac *p, unsigned long flag)
{
	const struct mxt_config *dcfg = p->dcfg;
	struct device *dev = dcfg->dev;
	struct t72_config *cfg = p->cfg;
	unsigned long interval;

	if (test_flag(IRAD_FLAG_PROXIMITY_DETECTED, &flag))
		interval = cfg->interval_proximity_check;
	else
		interval = MAX_SCHEDULE_TIMEOUT;

	dev_dbg2(dev, "mxt interval %lu\n",interval);
	return (long)interval;
}