mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 12:03:54 +02:00
mips/malta,loongson2ef: use generic mc146818_get_time function
mc146818_get_cmos_time() is now mostly equivalent to mc146818_get_time() from drivers/rtc/rtc-mc146818-lib.c, with the latter using a more advanced algorithm (which checks the UIP bit in the CMOS). The Malta and Loongson2ef platforms, the only users of mc146818_get_cmos_time() have RTC devices that should be MC146818 compatible. So, rewrite mc146818_get_cmos_time() in a way that uses mc146818_get_time() and add CONFIG_RTC_MC146818_LIB as a dependency of CONFIG_MIPS_MALTA and CONFIG_CPU_LOONGSON2EF. The should be safe as: - malta_defconfig already uses a standard RTC CMOS driver (CONFIG_RTC_DRV_CMOS=y). The Malta board has an Intel 82371EB (PIIX4E) south bridge with the CMOS RTC, so should work correctly with the modification, - Loongson2e and 2f apparently use the VIA686B south bridge and the AMD CS5536 south bridge respectively (at least according to Kconfig). I have checked datasheets of both and these appear to be MC146818 software compatible. Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:
parent
6e68ee3475
commit
01557e349c
|
|
@ -563,6 +563,7 @@ config MIPS_MALTA
|
|||
select MIPS_L1_CACHE_SHIFT_6
|
||||
select MIPS_MSC
|
||||
select PCI_GT64XXX_PCI0
|
||||
select RTC_MC146818_LIB
|
||||
select SMP_UP if SMP
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
|
|
@ -1837,6 +1838,7 @@ config CPU_LOONGSON2EF
|
|||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
select RTC_MC146818_LIB
|
||||
|
||||
config CPU_LOONGSON32
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -8,41 +8,21 @@
|
|||
#ifndef __ASM_MC146818_TIME_H
|
||||
#define __ASM_MC146818_TIME_H
|
||||
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
#ifdef CONFIG_RTC_MC146818_LIB
|
||||
static inline time64_t mc146818_get_cmos_time(void)
|
||||
{
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
unsigned long flags;
|
||||
struct rtc_time tm;
|
||||
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
|
||||
do {
|
||||
sec = CMOS_READ(RTC_SECONDS);
|
||||
min = CMOS_READ(RTC_MINUTES);
|
||||
hour = CMOS_READ(RTC_HOURS);
|
||||
day = CMOS_READ(RTC_DAY_OF_MONTH);
|
||||
mon = CMOS_READ(RTC_MONTH);
|
||||
year = CMOS_READ(RTC_YEAR);
|
||||
} while (sec != CMOS_READ(RTC_SECONDS));
|
||||
|
||||
if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||
sec = bcd2bin(sec);
|
||||
min = bcd2bin(min);
|
||||
hour = bcd2bin(hour);
|
||||
day = bcd2bin(day);
|
||||
mon = bcd2bin(mon);
|
||||
year = bcd2bin(year);
|
||||
if (mc146818_get_time(&tm, 1000)) {
|
||||
pr_err("Unable to read current time from RTC\n");
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
if (year < 70)
|
||||
year += 2000;
|
||||
else
|
||||
year += 1900;
|
||||
|
||||
return mktime64(year, mon, day, hour, min, sec);
|
||||
return rtc_tm_to_time64(&tm);
|
||||
}
|
||||
#endif /* CONFIG_RTC_MC146818_LIB */
|
||||
|
||||
#endif /* __ASM_MC146818_TIME_H */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user