1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2020 Loongson Technology Co., Ltd.
4 */
5
6 #include <linux/init.h>
7 #include <linux/kernel.h>
8 #include <linux/platform_device.h>
9 #include <loongson.h>
10
11 #define RTC_TOYREAD0 0x2C
12 #define RTC_YEAR 0x30
13
loongson_get_rtc_time(void)14 unsigned long loongson_get_rtc_time(void)
15 {
16 unsigned int year, mon, day, hour, min, sec;
17 unsigned int value;
18
19 value = ls7a_readl(LS7A_RTC_REG_BASE + RTC_TOYREAD0);
20 sec = (value >> 4) & 0x3f;
21 min = (value >> 10) & 0x3f;
22 hour = (value >> 16) & 0x1f;
23 day = (value >> 21) & 0x1f;
24 mon = (value >> 26) & 0x3f;
25 year = ls7a_readl(LS7A_RTC_REG_BASE + RTC_YEAR);
26
27 year = 1900 + year;
28
29 return mktime64(year, mon, day, hour, min, sec);
30 }
31
read_persistent_clock64(struct timespec64 *ts)32 void read_persistent_clock64(struct timespec64 *ts)
33 {
34 ts->tv_sec = loongson_get_rtc_time();
35 ts->tv_nsec = 0;
36 }
37