static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
{
	struct rtc_time *time = &wkalrm->time;
	NvU32 now;
	NvU32 alarm_sec;
	struct rtc_time now_time;

	printk("%s(): wkalrm->enabled=%d\n", __func__, wkalrm?wkalrm->enabled:-1);

	pr_debug("wkalrm->enabled = %d\n", wkalrm->enabled);
        if (wkalrm->enabled == 0) {
                if(!NvOdmPmuWriteAlarm(hPmu, 0))
                        return -EINVAL;
                return 0;
        }

	if (!NvOdmPmuReadRtc(hPmu, &now)) {
		pr_debug("NvOdmPmuReadRtc failed\n");
		return -1;
	}

	rtc_time_to_tm(now, &now_time);
	pr_debug( "read  now_time %02d:%02d:%02d %02d/%02d/%04d\n",
		now_time.tm_hour, now_time.tm_min, now_time.tm_sec,
		now_time.tm_mon + 1, now_time.tm_mday, now_time.tm_year + 1900);

	pr_debug("write alarm_time %02d:%02d:%02d %02d/%02d/%04d\n",
		time->tm_hour, time->tm_min, time->tm_sec,
		time->tm_mon+1, time->tm_mday, time->tm_yday+1900);

	alarm_sec = (NvU32)mktime(now_time.tm_year + 1900, time->tm_mon+1, time->tm_mday,
				time->tm_hour, time->tm_min, time->tm_sec);
	if (alarm_sec < now)
		alarm_sec = (NvU32)mktime(now_time.tm_year + 1901, time->tm_mon+1, time->tm_mday,
				time->tm_hour, time->tm_min, time->tm_sec);

	pr_debug("alarm_sec = %u\n", alarm_sec);

	if(!NvOdmPmuWriteAlarm(hPmu, alarm_sec-now))
		return -EINVAL;

#if SYNC_EXTERNAL_RTC_TO_INTERNAL_RTC

        return internal_tegra_rtc_set_alarm(wkalrm);
#else

	pr_info("%s():enter.\n", __func__);

	/* Alarm set */
	events |= RTC_IRQF | RTC_AF;

	if (rtc)
		rtc_update_irq(rtc, 1, events);

	return NV_TRUE;
#endif
}
NvBool
NvRmPmuWriteAlarm(
    NvRmDeviceHandle  hRmDevice,
    NvU32 Count)
{
    NvBool ReturnStatus = NV_FALSE;

    if (!s_PmuSupportedEnv)
        return NV_FALSE;

    NV_ASSERT(s_Pmu.hMutex);
    NvOsMutexLock(s_Pmu.hMutex);
    ReturnStatus = NvOdmPmuWriteAlarm(s_Pmu.hOdmPmu, Count);
    NvOsMutexUnlock(s_Pmu.hMutex);
    return ReturnStatus;
}
Example #3
0
static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
{
	struct rtc_time *time = &wkalrm->time;
	NvU32 now;
	NvU32 alarm_sec;
	struct rtc_time now_time;

	pr_debug("wkalrm->enabled = %d\n", wkalrm->enabled);
	if (wkalrm->enabled == 0)
		return 0;

	if (!NvOdmPmuReadRtc(hPmu, &now)) {
		pr_debug("NvOdmPmuReadRtc failed\n");
		return -1;
	}

	rtc_time_to_tm(now, &now_time);
	pr_debug( "read  now_time %02d:%02d:%02d %02d/%02d/%04d\n",
		now_time.tm_hour, now_time.tm_min, now_time.tm_sec,
		now_time.tm_mon + 1, now_time.tm_mday, now_time.tm_year + 1900);

	pr_debug("write alarm_time %02d:%02d:%02d %02d/%02d/%04d\n",
		time->tm_hour, time->tm_min, time->tm_sec,
		time->tm_mon+1, time->tm_mday, time->tm_yday+1900);

	alarm_sec = (NvU32)mktime(now_time.tm_year + 1900, time->tm_mon+1, time->tm_mday,
				time->tm_hour, time->tm_min, time->tm_sec);
	if (alarm_sec < now)
		alarm_sec = (NvU32)mktime(now_time.tm_year + 1901, time->tm_mon+1, time->tm_mday,
				time->tm_hour, time->tm_min, time->tm_sec);

	pr_debug("alarm_sec = %u\n", alarm_sec);

	if(!NvOdmPmuWriteAlarm(hPmu, alarm_sec-now))
		return -EINVAL;

#if SYNC_EXTERNAL_RTC_TO_INTERNAL_RTC
        return internal_tegra_rtc_set_alarm(wkalrm);
#else
	return 0;
#endif
}