/*
 *  linux/include/asm-arm/rtc.h
 *
 *  Copyright (C) 2003 Deep Blue Solutions Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef ASMARM_RTC_H
#define ASMARM_RTC_H

struct module;

struct rtc_ops {
	struct module	*owner;
	int		(*open)(void);
	void		(*release)(void);
	int		(*ioctl)(unsigned int, unsigned long);

	int		(*read_time)(struct rtc_time *);
	int		(*set_time)(struct rtc_time *);
	int		(*read_alarm)(struct rtc_wkalrm *);
	int		(*set_alarm)(struct rtc_wkalrm *);
	int		(*proc)(char *buf);
};

void rtc_time_to_tm(unsigned long, struct rtc_time *);
int rtc_tm_to_time(struct rtc_time *, unsigned long *);
int rtc_valid_tm(struct rtc_time *);
void rtc_next_alarm_time(struct rtc_time *, struct rtc_time *, struct rtc_time *);
void rtc_update(unsigned long, unsigned long);
int register_rtc(struct rtc_ops *);
void unregister_rtc(struct rtc_ops *);

static inline int rtc_periodic_alarm(struct rtc_time *tm)
{
	return  (tm->tm_year == -1) ||
		((unsigned)tm->tm_mon >= 12) ||
		((unsigned)(tm->tm_mday - 1) >= 31) ||
		((unsigned)tm->tm_hour > 23) ||
		((unsigned)tm->tm_min > 59) ||
		((unsigned)tm->tm_sec > 59);
}

#endif
