static int mrst_set_alarm(struct device *dev, struct rtc_wkalrm *t)
{
	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
	unsigned char hrs, min, sec;
	unsigned char wday, mday, mon, year;
	int ret = 0;

	if (!is_valid_irq(mrst->irq))
		return -EIO;

	hrs = t->time.tm_hour;
	min = t->time.tm_min;
	sec = t->time.tm_sec;

	wday = t->time.tm_wday;
	mday = t->time.tm_mday;
	mon = t->time.tm_mon;
	year = t->time.tm_year;

	spin_lock_irq(&rtc_lock);
	/* Next rtc irq must not be from previous alarm setting */
	mrst_irq_disable(mrst, RTC_AIE);

	/* Update alarm */
	vrtc_cmos_write(hrs, RTC_HOURS_ALARM);
	vrtc_cmos_write(min, RTC_MINUTES_ALARM);
	vrtc_cmos_write(sec, RTC_SECONDS_ALARM);

	if ((__intel_mid_cpu_chip == INTEL_MID_CPU_CHIP_PENWELL) ||
	    (__intel_mid_cpu_chip == INTEL_MID_CPU_CHIP_CLOVERVIEW)) {
		/* Support for date-field in Alarm using OSHOB
		 * Since, vRTC doesn't have Alarm-registers for date-fields,
		 * write date-fields into OSHOB for SCU to sync to MSIC-RTC */
		writeb(wday, oshob_addr+OSHOB_DAYW_OFFSET);
		writeb(mday, oshob_addr+OSHOB_DAYM_OFFSET);
		writeb(mon+1, oshob_addr+OSHOB_MON_OFFSET);
		/* Adjust for the 1972/1900 */
		writeb(year-72, oshob_addr+OSHOB_YEAR_OFFSET);
	}
	spin_unlock_irq(&rtc_lock);

	/* In moorestown vrtc used to be powered off & was not a wake source
	 * in Standby. In penwell vRTC is kept on even during standby.
	 * hence this ipc message need not be sent
	 */
	if (__intel_mid_cpu_chip == INTEL_MID_CPU_CHIP_LINCROFT) {
		ret = rpmsg_send_simple_command(vrtc_mrst_instance,
					IPCMSG_VRTC, IPC_CMD_VRTC_SETALARM);
		if (ret)
			return ret;
	}

	spin_lock_irq(&rtc_lock);
	if (t->enabled)
		mrst_irq_enable(mrst, RTC_AIE);

	spin_unlock_irq(&rtc_lock);

	return 0;
}
static int mrst_set_time(struct device *dev, struct rtc_time *time)
{
	int ret;
	unsigned long flags;
	unsigned char mon, day, hrs, min, sec;
	unsigned int yrs;

	yrs = time->tm_year;
	mon = time->tm_mon + 1;   /* tm_mon starts at zero */
	day = time->tm_mday;
	hrs = time->tm_hour;
	min = time->tm_min;
	sec = time->tm_sec;

	if (yrs < 72 || yrs > 138)
		return -EINVAL;
	printk("rtc mrst_set_time yrs=%d,mon=%d,day=%d,hrs=%d,min=%,sec=%d \r\n",yrs,mon,day,hrs,min,sec);
	yrs -= 72;

	spin_lock_irqsave(&rtc_lock, flags);

	vrtc_cmos_write(yrs, RTC_YEAR);
	vrtc_cmos_write(mon, RTC_MONTH);
	vrtc_cmos_write(day, RTC_DAY_OF_MONTH);
	vrtc_cmos_write(hrs, RTC_HOURS);
	vrtc_cmos_write(min, RTC_MINUTES);
	vrtc_cmos_write(sec, RTC_SECONDS);

	spin_unlock_irqrestore(&rtc_lock, flags);

	ret = rpmsg_send_simple_command(vrtc_mrst_instance,
				IPCMSG_VRTC, IPC_CMD_VRTC_SETTIME);
	return ret;
}
int rpmsg_send_generic_simple_command(u32 cmd, u32 sub)
{
	struct rpmsg_instance *rpmsg_ipc_instance =
		rpmsg_ddata[RPMSG_IPC_SIMPLE_COMMAND].rpmsg_instance;

	return rpmsg_send_simple_command(rpmsg_ipc_instance, cmd, sub);
}
/* stops the timer */
static int watchdog_stop(void)
{
	int ret = 0;
	int error = 0;

	pr_crit("%s\n", __func__);

	ret = rpmsg_send_simple_command(watchdog_instance, IPC_WATCHDOG,
					SCU_WATCHDOG_STOP);
	if (ret) {
		pr_crit("Error stopping watchdog: %x\n", ret);
		error = -EIO;
	}

	watchdog_device.started = false;

	return error;
}
/* Keep alive  */
static int watchdog_keepalive(void)
{
	int ret, error = 0;

	pr_info("%s\n", __func__);

	if (unlikely(!kicking_active)) {
		/* Close our eyes */
		pr_err("Transparent kicking\n");
		return 0;
	}

	/* Really kick it */
	ret = rpmsg_send_simple_command(watchdog_instance, IPC_WATCHDOG,
					SCU_WATCHDOG_KEEPALIVE);
	if (ret) {
		pr_crit("Error executing keepalive: %x\n", ret);
		error = -EIO;
	}

	return error;
}