diff mbox series

[1/3] rtc: vr41xx: remove mktime usage

Message ID 20180420161433.3721192-1-arnd@arndb.de
State New
Headers show
Series [1/3] rtc: vr41xx: remove mktime usage | expand

Commit Message

Arnd Bergmann April 20, 2018, 4:14 p.m. UTC
This driver uses mktime() and rtc_time_to_tm() to convert between time
values. This works fine on 64-bit kernels over the whole supported
range, and the vr41xx chip is a 64-bit MIPS implementation, but it is
inconsistent because it doesn't do the same thing on 32-bit kernels that
overflow in 2106 or 2038.

Changing it to use mktime64/rtc_time64_to_tm() should have no visible
impact on vr41xx but gets us closer to removing the 32-bit interfaces.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 drivers/rtc/rtc-vr41xx.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

-- 
2.9.0

Comments

Alexandre Belloni May 16, 2018, 1:55 p.m. UTC | #1
Hi,

On 20/04/2018 18:14:24+0200, Arnd Bergmann wrote:
> This driver uses mktime() and rtc_time_to_tm() to convert between time

> values. This works fine on 64-bit kernels over the whole supported

> range, and the vr41xx chip is a 64-bit MIPS implementation, but it is

> inconsistent because it doesn't do the same thing on 32-bit kernels that

> overflow in 2106 or 2038.

> 

> Changing it to use mktime64/rtc_time64_to_tm() should have no visible

> impact on vr41xx but gets us closer to removing the 32-bit interfaces.

> 

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  drivers/rtc/rtc-vr41xx.c | 24 ++++++++++++------------

>  1 file changed, 12 insertions(+), 12 deletions(-)

> 


I've applied the series a while ago. It should be noted that mktime64
will fail on 32bit platforms in year 21000 or so but I pretty sure it is
not worth fixing. My understanding is that the kernel will fail in April
2262 anyway as ktime_t will overflow.

Note that I will be following up with multiple series adding proper
rtc HW range, removing set_mmss and rtc_time_to_tm/rtc_tm_to_time64.

-- 
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
Arnd Bergmann May 17, 2018, 3:43 a.m. UTC | #2
On Wed, May 16, 2018 at 9:55 AM, Alexandre Belloni
<alexandre.belloni@bootlin.com> wrote:
> Hi,

>

> On 20/04/2018 18:14:24+0200, Arnd Bergmann wrote:

>> This driver uses mktime() and rtc_time_to_tm() to convert between time

>> values. This works fine on 64-bit kernels over the whole supported

>> range, and the vr41xx chip is a 64-bit MIPS implementation, but it is

>> inconsistent because it doesn't do the same thing on 32-bit kernels that

>> overflow in 2106 or 2038.

>>

>> Changing it to use mktime64/rtc_time64_to_tm() should have no visible

>> impact on vr41xx but gets us closer to removing the 32-bit interfaces.

>>

>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

>> ---

>>  drivers/rtc/rtc-vr41xx.c | 24 ++++++++++++------------

>>  1 file changed, 12 insertions(+), 12 deletions(-)

>>

>

> I've applied the series a while ago.


Thanks! We should be able to remove mktime() in the near future then,
along with some other interfaces from linux/time32.h and linux/timekeeping32.h.

> It should be noted that mktime64

> will fail on 32bit platforms in year 21000 or so but I pretty sure it is

> not worth fixing. My understanding is that the kernel will fail in April

> 2262 anyway as ktime_t will overflow.


Right.

> Note that I will be following up with multiple series adding proper

> rtc HW range, removing set_mmss and rtc_time_to_tm/rtc_tm_to_time64.


Ok, looking forward to those patches!

        Arnd
diff mbox series

Patch

diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c
index 7ce22967fd16..480cffe8d321 100644
--- a/drivers/rtc/rtc-vr41xx.c
+++ b/drivers/rtc/rtc-vr41xx.c
@@ -88,7 +88,7 @@  static unsigned int alarm_enabled;
 static int aie_irq;
 static int pie_irq;
 
-static inline unsigned long read_elapsed_second(void)
+static inline time64_t read_elapsed_second(void)
 {
 
 	unsigned long first_low, first_mid, first_high;
@@ -105,10 +105,10 @@  static inline unsigned long read_elapsed_second(void)
 	} while (first_low != second_low || first_mid != second_mid ||
 		 first_high != second_high);
 
-	return (first_high << 17) | (first_mid << 1) | (first_low >> 15);
+	return ((u64)first_high << 17) | (first_mid << 1) | (first_low >> 15);
 }
 
-static inline void write_elapsed_second(unsigned long sec)
+static inline void write_elapsed_second(time64_t sec)
 {
 	spin_lock_irq(&rtc_lock);
 
@@ -121,22 +121,22 @@  static inline void write_elapsed_second(unsigned long sec)
 
 static int vr41xx_rtc_read_time(struct device *dev, struct rtc_time *time)
 {
-	unsigned long epoch_sec, elapsed_sec;
+	time64_t epoch_sec, elapsed_sec;
 
-	epoch_sec = mktime(epoch, 1, 1, 0, 0, 0);
+	epoch_sec = mktime64(epoch, 1, 1, 0, 0, 0);
 	elapsed_sec = read_elapsed_second();
 
-	rtc_time_to_tm(epoch_sec + elapsed_sec, time);
+	rtc_time64_to_tm(epoch_sec + elapsed_sec, time);
 
 	return 0;
 }
 
 static int vr41xx_rtc_set_time(struct device *dev, struct rtc_time *time)
 {
-	unsigned long epoch_sec, current_sec;
+	time64_t epoch_sec, current_sec;
 
-	epoch_sec = mktime(epoch, 1, 1, 0, 0, 0);
-	current_sec = mktime(time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
+	epoch_sec = mktime64(epoch, 1, 1, 0, 0, 0);
+	current_sec = mktime64(time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
 			     time->tm_hour, time->tm_min, time->tm_sec);
 
 	write_elapsed_second(current_sec - epoch_sec);
@@ -165,11 +165,11 @@  static int vr41xx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
 
 static int vr41xx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
 {
-	unsigned long alarm_sec;
+	time64_t alarm_sec;
 	struct rtc_time *time = &wkalrm->time;
 
-	alarm_sec = mktime(time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
-			   time->tm_hour, time->tm_min, time->tm_sec);
+	alarm_sec = mktime64(time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
+			     time->tm_hour, time->tm_min, time->tm_sec);
 
 	spin_lock_irq(&rtc_lock);