-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] RTC Subsystem: library functions
RTC and date/time related functions. Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
- Loading branch information
Alessandro Zummo
authored and
Linus Torvalds
committed
Mar 27, 2006
1 parent
d23ee8f
commit c58411e
Showing
6 changed files
with
120 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -70,4 +70,6 @@ source "drivers/sn/Kconfig" | |
|
||
source "drivers/edac/Kconfig" | ||
|
||
source "drivers/rtc/Kconfig" | ||
|
||
endmenu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# | ||
# RTC class/drivers configuration | ||
# | ||
|
||
config RTC_LIB | ||
tristate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# | ||
# Makefile for RTC class/drivers. | ||
# | ||
|
||
obj-$(CONFIG_RTC_LIB) += rtc-lib.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* rtc and date/time utility functions | ||
* | ||
* Copyright (C) 2005-06 Tower Technologies | ||
* Author: Alessandro Zummo <a.zummo@towertech.it> | ||
* | ||
* based on arch/arm/common/rtctime.c and other bits | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/rtc.h> | ||
|
||
static const unsigned char rtc_days_in_month[] = { | ||
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 | ||
}; | ||
|
||
#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400) | ||
#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) | ||
|
||
int rtc_month_days(unsigned int month, unsigned int year) | ||
{ | ||
return rtc_days_in_month[month] + (LEAP_YEAR(year) && month == 1); | ||
} | ||
EXPORT_SYMBOL(rtc_month_days); | ||
|
||
/* | ||
* Convert seconds since 01-01-1970 00:00:00 to Gregorian date. | ||
*/ | ||
void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) | ||
{ | ||
register int days, month, year; | ||
|
||
days = time / 86400; | ||
time -= days * 86400; | ||
|
||
/* day of the week, 1970-01-01 was a Thursday */ | ||
tm->tm_wday = (days + 4) % 7; | ||
|
||
year = 1970 + days / 365; | ||
days -= (year - 1970) * 365 | ||
+ LEAPS_THRU_END_OF(year - 1) | ||
- LEAPS_THRU_END_OF(1970 - 1); | ||
if (days < 0) { | ||
year -= 1; | ||
days += 365 + LEAP_YEAR(year); | ||
} | ||
tm->tm_year = year - 1900; | ||
tm->tm_yday = days + 1; | ||
|
||
for (month = 0; month < 11; month++) { | ||
int newdays; | ||
|
||
newdays = days - rtc_month_days(month, year); | ||
if (newdays < 0) | ||
break; | ||
days = newdays; | ||
} | ||
tm->tm_mon = month; | ||
tm->tm_mday = days + 1; | ||
|
||
tm->tm_hour = time / 3600; | ||
time -= tm->tm_hour * 3600; | ||
tm->tm_min = time / 60; | ||
tm->tm_sec = time - tm->tm_min * 60; | ||
} | ||
EXPORT_SYMBOL(rtc_time_to_tm); | ||
|
||
/* | ||
* Does the rtc_time represent a valid date/time? | ||
*/ | ||
int rtc_valid_tm(struct rtc_time *tm) | ||
{ | ||
if (tm->tm_year < 70 | ||
|| tm->tm_mon >= 12 | ||
|| tm->tm_mday < 1 | ||
|| tm->tm_mday > rtc_month_days(tm->tm_mon, tm->tm_year + 1900) | ||
|| tm->tm_hour >= 24 | ||
|| tm->tm_min >= 60 | ||
|| tm->tm_sec >= 60) | ||
return -EINVAL; | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL(rtc_valid_tm); | ||
|
||
/* | ||
* Convert Gregorian date to seconds since 01-01-1970 00:00:00. | ||
*/ | ||
int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time) | ||
{ | ||
*time = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, | ||
tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(rtc_tm_to_time); | ||
|
||
MODULE_LICENSE("GPL"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters