11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2f30c2269544bffc7bf1b0d7c0abe5be1be83b8cbUwe Zeisberger * include/asm-parisc/rtc.h 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 2002 Randolph CHung <tausq@debian.org> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Based on: include/asm-ppc/rtc.h and the genrtc driver in the 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2.4 parisc linux tree 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASM_RTC_H__ 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __ASM_RTC_H__ 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __KERNEL__ 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/rtc.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pdc.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SECS_PER_HOUR (60 * 60) 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SECS_PER_DAY (SECS_PER_HOUR * 24) 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_PIE 0x40 /* periodic interrupt enable */ 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_AIE 0x20 /* alarm interrupt enable */ 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_UIE 0x10 /* update-finished interrupt enable */ 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_BATT_BAD 0x100 /* battery bad */ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* some dummy definitions */ 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_SQWE 0x08 /* enable square-wave output */ 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_DM_BINARY 0x04 /* all time/date values are BCD if clear */ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_24H 0x02 /* 24 hour mode - else hours bit 7 means pm */ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RTC_DST_EN 0x01 /* auto switch DST - works f. USA only */ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define __isleap(year) \ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* How many days come before each month (0-12). */ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const unsigned short int __mon_yday[2][13] = 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Normal years. */ 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Leap years. */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int get_rtc_time(struct rtc_time *wtime) 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pdc_tod tod_data; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds long int days, rem, y; 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const unsigned short int *ip; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 537210c678202bb3107085bffeb63f66a9b8ba1c85Kyle McMartin memset(wtime, 0, sizeof(*wtime)); 547210c678202bb3107085bffeb63f66a9b8ba1c85Kyle McMartin if (pdc_tod_read(&tod_data) < 0) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return RTC_24H | RTC_BATT_BAD; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // most of the remainder of this function is: 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Copyright (C) 1991, 1993, 1997, 1998 Free Software Foundation, Inc. 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// This was originally a part of the GNU C Library. 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// It is distributed under the GPL, and was swiped from offtime.c 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds days = tod_data.tod_sec / SECS_PER_DAY; 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rem = tod_data.tod_sec % SECS_PER_DAY; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_hour = rem / SECS_PER_HOUR; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rem %= SECS_PER_HOUR; 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_min = rem / 60; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_sec = rem % 60; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = 1970; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DIV(a, b) ((a) / (b) - ((a) % (b) < 0)) 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400)) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (days < 0 || days >= (__isleap (y) ? 366 : 365)) 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Guess a corrected year, assuming 365 days per year. */ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds long int yg = y + days / 365 - (days % 365 < 0); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Adjust DAYS and Y to match the guessed year. */ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds days -= ((yg - y) * 365 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds + LEAPS_THRU_END_OF (yg - 1) 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds - LEAPS_THRU_END_OF (y - 1)); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = yg; 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_year = y - 1900; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ip = __mon_yday[__isleap(y)]; 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (y = 11; days < (long int) ip[y]; --y) 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds days -= ip[y]; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_mon = y; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_mday = days + 1; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return RTC_24H; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_rtc_time(struct rtc_time *wtime) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int32_t secs; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds secs = mktime(wtime->tm_year + 1900, wtime->tm_mon + 1, wtime->tm_mday, 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wtime->tm_hour, wtime->tm_min, wtime->tm_sec); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if(pdc_tod_set(secs, 0) < 0) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -1; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int get_rtc_ss(void) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct rtc_time h; 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_rtc_time(&h); 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return h.tm_sec; 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int get_rtc_pll(struct rtc_pll_info *pll) 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int set_rtc_pll(struct rtc_pll_info *pll) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __KERNEL__ */ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ASM_RTC_H__ */ 132