rtc: Add an RTC API, and implement it for x86.

This CL adds an API for RTC drivers, and implements its two functions, rtc_get
and rtc_set, for x86's RTC. The function which resets the clock when the CMOS
has lost state now uses the RTC driver instead of accessing the those registers
directly. The availability of "ALTCENTURY" is now set through a kconfig
variable so it can be available to the RTC driver without having to have a
specialized interface.

BUG=None
TEST=Built and booted on Link with the event log code modified to use the RTC
interface. Verified that the event times were accurate.
BRANCH=nyan

Change-Id: Ifa807898e583254e57167fd44932ea86627a02ee
Signed-off-by: Gabe Black <gabeblack@google.com>
Reviewed-on: https://chromium-review.googlesource.com/197795
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Tested-by: Gabe Black <gabeblack@chromium.org>
Commit-Queue: Gabe Black <gabeblack@chromium.org>
This commit is contained in:
Gabe Black 2014-04-30 21:31:44 -07:00 committed by chrome-internal-fetch
commit 9e0fd75142
14 changed files with 471 additions and 329 deletions

35
src/include/bcd.h Normal file
View file

@ -0,0 +1,35 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2014 Google, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
#ifndef _BCD_H_
#define _BCD_H_
#include <stdint.h>
static inline uint8_t bcd2bin(uint8_t val)
{
return ((val >> 4) & 0xf) * 10 + (val & 0xf);
}
static inline uint8_t bin2bcd(uint8_t val)
{
return ((val / 10) << 4) | (val % 10);
}
#endif /* _BCD_H_ */

View file

@ -91,9 +91,6 @@
#define RTC_CLK_YEAR 9
#define RTC_CLK_ALTCENTURY 0x32
#define RTC_HAS_ALTCENTURY 1
#define RTC_HAS_NO_ALTCENTURY 0
/* On PCs, the checksum is built only over bytes 16..45 */
#define PC_CKS_RANGE_START 16
#define PC_CKS_RANGE_END 45
@ -171,7 +168,7 @@ static inline void cmos_write32(u8 offset, u32 value)
#if !defined(__ROMCC__)
void cmos_init(int invalid);
void cmos_check_update_date(u8 has_century);
void cmos_check_update_date(void);
#if CONFIG_USE_OPTION_TABLE
int set_option(const char *name, void *val);
int get_option(void *dest, const char *name);

37
src/include/rtc.h Normal file
View file

@ -0,0 +1,37 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2014 Google, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
#ifndef _RTC_H_
#define _RTC_H_
struct rtc_time
{
int sec;
int min;
int hour;
int mday;
int mon;
int year;
int wday;
};
int rtc_set(const struct rtc_time *time);
int rtc_get(struct rtc_time *time);
#endif /* _RTC_H_ */