* [PATCH 0/4] mips: CMOS RTC refactoring
@ 2025-07-13 10:04 Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 1/4] mips: remove unused function mc146818_set_rtc_mmss Mateusz Jończyk
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Mateusz Jończyk @ 2025-07-13 10:04 UTC (permalink / raw)
To: Jiaxun Yang, Huacai Chen, Thomas Bogendoerfer
Cc: Alexandre Belloni, linux-mips, linux-rtc, Mateusz Jończyk
Hello,
A while ago I wrote some patches that refactor a bit the RTC CMOS support on the
MIPS architecture. These were in response to a bug report about locking
problems during suspend / resume:
Link: https://lore.kernel.org/all/CAP-bSRZ0CWyZZsMtx046YV8L28LhY0fson2g4EqcwRAVN1Jk+Q@mail.gmail.com/
Back then, I was trying to convert the rtc_lock to a raw spinlock. This proved
to be unnecessary and harmful, but in the process I removed some dead and
duplicated code that touches the MC146818 (the chip of the CMOS RTC) for
the MIPS architecture.
These patches were tested only in an emulator, as I don't have the hardware.
They are roughly in the order of increasing risk.
Greetings,
Mateusz
Mateusz Jończyk (4):
mips: remove unused function mc146818_set_rtc_mmss
mips/mach-rm: remove custom mc146818rtc.h file
mips: remove redundant macro mc146818_decode_year
mips/malta,loongson2ef: use generic mc146818_get_time function
arch/mips/Kconfig | 2 +
.../include/asm/mach-generic/mc146818rtc.h | 4 -
arch/mips/include/asm/mach-jazz/mc146818rtc.h | 2 -
.../mips/include/asm/mach-malta/mc146818rtc.h | 2 -
arch/mips/include/asm/mach-rm/mc146818rtc.h | 21 ----
arch/mips/include/asm/mc146818-time.h | 105 ++----------------
6 files changed, 9 insertions(+), 127 deletions(-)
delete mode 100644 arch/mips/include/asm/mach-rm/mc146818rtc.h
base-commit: d7b8f8e20813f0179d8ef519541a3527e7661d3a
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] mips: remove unused function mc146818_set_rtc_mmss
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
@ 2025-07-13 10:04 ` Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 2/4] mips/mach-rm: remove custom mc146818rtc.h file Mateusz Jończyk
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Mateusz Jończyk @ 2025-07-13 10:04 UTC (permalink / raw)
To: Jiaxun Yang, Huacai Chen, Thomas Bogendoerfer
Cc: Alexandre Belloni, linux-mips, linux-rtc, Mateusz Jończyk
I have checked carefully: this function is unused, so remove it.
The last caller appears to have been removed in 2007 in
commit 4b550488f894 ("[MIPS] Deforest the function pointer jungle in the time code.")
mc146818-time.h is included only in three files:
- arch/mips/mti-malta/malta-time.c
- arch/mips/loongson64/numa.c
- arch/mips/loongson2ef/common/time.c
Also, remove unused macros USEC_AFTER/USEC_BEFORE.
Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
---
arch/mips/include/asm/mc146818-time.h | 74 ---------------------------
1 file changed, 74 deletions(-)
diff --git a/arch/mips/include/asm/mc146818-time.h b/arch/mips/include/asm/mc146818-time.h
index cbf5cec345f1..07bf30bee792 100644
--- a/arch/mips/include/asm/mc146818-time.h
+++ b/arch/mips/include/asm/mc146818-time.h
@@ -12,80 +12,6 @@
#include <linux/mc146818rtc.h>
#include <linux/time.h>
-/*
- * For check timing call set_rtc_mmss() 500ms; used in timer interrupt.
- */
-#define USEC_AFTER 500000
-#define USEC_BEFORE 500000
-
-/*
- * In order to set the CMOS clock precisely, set_rtc_mmss has to be
- * called 500 ms after the second nowtime has started, because when
- * nowtime is written into the registers of the CMOS clock, it will
- * jump to the next second precisely 500 ms later. Check the Motorola
- * MC146818A or Dallas DS12887 data sheet for details.
- *
- * BUG: This routine does not handle hour overflow properly; it just
- * sets the minutes. Usually you'll only notice that after reboot!
- */
-static inline int mc146818_set_rtc_mmss(unsigned long nowtime)
-{
- int real_seconds, real_minutes, cmos_minutes;
- unsigned char save_control, save_freq_select;
- int retval = 0;
- unsigned long flags;
-
- spin_lock_irqsave(&rtc_lock, flags);
- save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
- CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
-
- save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
- CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
-
- cmos_minutes = CMOS_READ(RTC_MINUTES);
- if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
- cmos_minutes = bcd2bin(cmos_minutes);
-
- /*
- * since we're only adjusting minutes and seconds,
- * don't interfere with hour overflow. This avoids
- * messing with unknown time zones but requires your
- * RTC not to be off by more than 15 minutes
- */
- real_seconds = nowtime % 60;
- real_minutes = nowtime / 60;
- if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
- real_minutes += 30; /* correct for half hour time zone */
- real_minutes %= 60;
-
- if (abs(real_minutes - cmos_minutes) < 30) {
- if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
- real_seconds = bin2bcd(real_seconds);
- real_minutes = bin2bcd(real_minutes);
- }
- CMOS_WRITE(real_seconds, RTC_SECONDS);
- CMOS_WRITE(real_minutes, RTC_MINUTES);
- } else {
- printk_once(KERN_NOTICE
- "set_rtc_mmss: can't update from %d to %d\n",
- cmos_minutes, real_minutes);
- retval = -1;
- }
-
- /* The following flags have to be released exactly in this order,
- * otherwise the DS12887 (popular MC146818A clone with integrated
- * battery and quartz) will not reset the oscillator and will not
- * update precisely 500 ms later. You won't find this mentioned in
- * the Dallas Semiconductor data sheets, but who believes data
- * sheets anyway ... -- Markus Kuhn
- */
- CMOS_WRITE(save_control, RTC_CONTROL);
- CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
- spin_unlock_irqrestore(&rtc_lock, flags);
-
- return retval;
-}
-
static inline time64_t mc146818_get_cmos_time(void)
{
unsigned int year, mon, day, hour, min, sec;
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] mips/mach-rm: remove custom mc146818rtc.h file
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 1/4] mips: remove unused function mc146818_set_rtc_mmss Mateusz Jończyk
@ 2025-07-13 10:04 ` Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 3/4] mips: remove redundant macro mc146818_decode_year Mateusz Jończyk
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Mateusz Jończyk @ 2025-07-13 10:04 UTC (permalink / raw)
To: Jiaxun Yang, Huacai Chen, Thomas Bogendoerfer
Cc: Alexandre Belloni, linux-mips, linux-rtc, Mateusz Jończyk
The mc146818_decode_year macro is used only in mc146818_get_cmos_time,
which in turn is called only in
arch/mips/loongson2ef/common/time.c
and
arch/mips/mti-malta/malta-time.c
So no SNI or mach-rm content. SNI did not use mc146818_get_cmos_time
apparently since
commit 06cf5583fd9a ("[MIPS] SNI RM updates")
in 2007.
Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
---
arch/mips/include/asm/mach-rm/mc146818rtc.h | 21 ---------------------
1 file changed, 21 deletions(-)
delete mode 100644 arch/mips/include/asm/mach-rm/mc146818rtc.h
diff --git a/arch/mips/include/asm/mach-rm/mc146818rtc.h b/arch/mips/include/asm/mach-rm/mc146818rtc.h
deleted file mode 100644
index a074f4f84f75..000000000000
--- a/arch/mips/include/asm/mach-rm/mc146818rtc.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2004 by Ralf Baechle
- *
- * RTC routines for PC style attached Dallas chip with ARC epoch.
- */
-#ifndef __ASM_MACH_RM_MC146818RTC_H
-#define __ASM_MACH_RM_MC146818RTC_H
-
-#ifdef CONFIG_CPU_BIG_ENDIAN
-#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900)
-#else
-#define mc146818_decode_year(year) ((year) + 1980)
-#endif
-
-#include <asm/mach-generic/mc146818rtc.h>
-
-#endif /* __ASM_MACH_RM_MC146818RTC_H */
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] mips: remove redundant macro mc146818_decode_year
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 1/4] mips: remove unused function mc146818_set_rtc_mmss Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 2/4] mips/mach-rm: remove custom mc146818rtc.h file Mateusz Jończyk
@ 2025-07-13 10:04 ` Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 4/4] mips/malta,loongson2ef: use generic mc146818_get_time function Mateusz Jończyk
2025-07-16 18:07 ` [PATCH 0/4] mips: CMOS RTC refactoring Thomas Bogendoerfer
4 siblings, 0 replies; 6+ messages in thread
From: Mateusz Jończyk @ 2025-07-13 10:04 UTC (permalink / raw)
To: Jiaxun Yang, Huacai Chen, Thomas Bogendoerfer
Cc: Alexandre Belloni, linux-mips, linux-rtc, Mateusz Jończyk
The mc146818_decode_year macro is used only in mc146818_get_cmos_time(),
which in turn is called only in
arch/mips/loongson2ef/common/time.c
and
arch/mips/mti-malta/malta-time.c
so on mach-jazz it is unused and can be removed. On other platforms it
is defined in the same way, so it can be safely folded into
mc146818_get_cmos_time().
Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
---
arch/mips/include/asm/mach-generic/mc146818rtc.h | 4 ----
arch/mips/include/asm/mach-jazz/mc146818rtc.h | 2 --
arch/mips/include/asm/mach-malta/mc146818rtc.h | 2 --
arch/mips/include/asm/mc146818-time.h | 5 ++++-
4 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/arch/mips/include/asm/mach-generic/mc146818rtc.h b/arch/mips/include/asm/mach-generic/mc146818rtc.h
index 9c72e540ff56..249279b0494d 100644
--- a/arch/mips/include/asm/mach-generic/mc146818rtc.h
+++ b/arch/mips/include/asm/mach-generic/mc146818rtc.h
@@ -29,8 +29,4 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
#define RTC_ALWAYS_BCD 0
-#ifndef mc146818_decode_year
-#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900)
-#endif
-
#endif /* __ASM_MACH_GENERIC_MC146818RTC_H */
diff --git a/arch/mips/include/asm/mach-jazz/mc146818rtc.h b/arch/mips/include/asm/mach-jazz/mc146818rtc.h
index 987f727afe25..639bff8ebca3 100644
--- a/arch/mips/include/asm/mach-jazz/mc146818rtc.h
+++ b/arch/mips/include/asm/mach-jazz/mc146818rtc.h
@@ -33,6 +33,4 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
#define RTC_ALWAYS_BCD 0
-#define mc146818_decode_year(year) ((year) + 1980)
-
#endif /* __ASM_MACH_JAZZ_MC146818RTC_H */
diff --git a/arch/mips/include/asm/mach-malta/mc146818rtc.h b/arch/mips/include/asm/mach-malta/mc146818rtc.h
index e8cc7fdf7415..7da2c0ea55da 100644
--- a/arch/mips/include/asm/mach-malta/mc146818rtc.h
+++ b/arch/mips/include/asm/mach-malta/mc146818rtc.h
@@ -31,6 +31,4 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
#define RTC_ALWAYS_BCD 0
-#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900)
-
#endif /* __ASM_MACH_MALTA_MC146818RTC_H */
diff --git a/arch/mips/include/asm/mc146818-time.h b/arch/mips/include/asm/mc146818-time.h
index 07bf30bee792..4e07914e94e6 100644
--- a/arch/mips/include/asm/mc146818-time.h
+++ b/arch/mips/include/asm/mc146818-time.h
@@ -37,7 +37,10 @@ static inline time64_t mc146818_get_cmos_time(void)
year = bcd2bin(year);
}
spin_unlock_irqrestore(&rtc_lock, flags);
- year = mc146818_decode_year(year);
+ if (year < 70)
+ year += 2000;
+ else
+ year += 1900;
return mktime64(year, mon, day, hour, min, sec);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] mips/malta,loongson2ef: use generic mc146818_get_time function
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
` (2 preceding siblings ...)
2025-07-13 10:04 ` [PATCH 3/4] mips: remove redundant macro mc146818_decode_year Mateusz Jończyk
@ 2025-07-13 10:04 ` Mateusz Jończyk
2025-07-16 18:07 ` [PATCH 0/4] mips: CMOS RTC refactoring Thomas Bogendoerfer
4 siblings, 0 replies; 6+ messages in thread
From: Mateusz Jończyk @ 2025-07-13 10:04 UTC (permalink / raw)
To: Jiaxun Yang, Huacai Chen, Thomas Bogendoerfer
Cc: Alexandre Belloni, linux-mips, linux-rtc, Mateusz Jończyk
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>
--
Tested only in an emulator for Malta.
---
arch/mips/Kconfig | 2 ++
arch/mips/include/asm/mc146818-time.h | 34 ++++++---------------------
2 files changed, 9 insertions(+), 27 deletions(-)
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 1e48184ecf1e..4df5589b3d35 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -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
diff --git a/arch/mips/include/asm/mc146818-time.h b/arch/mips/include/asm/mc146818-time.h
index 4e07914e94e6..ac52a30b4161 100644
--- a/arch/mips/include/asm/mc146818-time.h
+++ b/arch/mips/include/asm/mc146818-time.h
@@ -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 */
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 0/4] mips: CMOS RTC refactoring
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
` (3 preceding siblings ...)
2025-07-13 10:04 ` [PATCH 4/4] mips/malta,loongson2ef: use generic mc146818_get_time function Mateusz Jończyk
@ 2025-07-16 18:07 ` Thomas Bogendoerfer
4 siblings, 0 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2025-07-16 18:07 UTC (permalink / raw)
To: Mateusz Jończyk
Cc: Jiaxun Yang, Huacai Chen, Alexandre Belloni, linux-mips,
linux-rtc
On Sun, Jul 13, 2025 at 12:04:30PM +0200, Mateusz Jończyk wrote:
> Hello,
>
> A while ago I wrote some patches that refactor a bit the RTC CMOS support on the
> MIPS architecture. These were in response to a bug report about locking
> problems during suspend / resume:
>
> Link: https://lore.kernel.org/all/CAP-bSRZ0CWyZZsMtx046YV8L28LhY0fson2g4EqcwRAVN1Jk+Q@mail.gmail.com/
>
> Back then, I was trying to convert the rtc_lock to a raw spinlock. This proved
> to be unnecessary and harmful, but in the process I removed some dead and
> duplicated code that touches the MC146818 (the chip of the CMOS RTC) for
> the MIPS architecture.
>
> These patches were tested only in an emulator, as I don't have the hardware.
> They are roughly in the order of increasing risk.
>
> Greetings,
> Mateusz
>
> Mateusz Jończyk (4):
> mips: remove unused function mc146818_set_rtc_mmss
> mips/mach-rm: remove custom mc146818rtc.h file
> mips: remove redundant macro mc146818_decode_year
> mips/malta,loongson2ef: use generic mc146818_get_time function
>
> arch/mips/Kconfig | 2 +
> .../include/asm/mach-generic/mc146818rtc.h | 4 -
> arch/mips/include/asm/mach-jazz/mc146818rtc.h | 2 -
> .../mips/include/asm/mach-malta/mc146818rtc.h | 2 -
> arch/mips/include/asm/mach-rm/mc146818rtc.h | 21 ----
> arch/mips/include/asm/mc146818-time.h | 105 ++----------------
> 6 files changed, 9 insertions(+), 127 deletions(-)
> delete mode 100644 arch/mips/include/asm/mach-rm/mc146818rtc.h
>
>
> base-commit: d7b8f8e20813f0179d8ef519541a3527e7661d3a
> --
> 2.25.1
series applied to mips-next.
Thomas.
--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-07-16 18:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-13 10:04 [PATCH 0/4] mips: CMOS RTC refactoring Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 1/4] mips: remove unused function mc146818_set_rtc_mmss Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 2/4] mips/mach-rm: remove custom mc146818rtc.h file Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 3/4] mips: remove redundant macro mc146818_decode_year Mateusz Jończyk
2025-07-13 10:04 ` [PATCH 4/4] mips/malta,loongson2ef: use generic mc146818_get_time function Mateusz Jończyk
2025-07-16 18:07 ` [PATCH 0/4] mips: CMOS RTC refactoring Thomas Bogendoerfer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).