Commit a015b8aa authored by Xunlei Pang's avatar Xunlei Pang Committed by Ingo Molnar

drivers/rtc/mxc: Convert get_alarm_or_time()/set_alarm_or_time() to use time64_t

We want to convert mxc_rtc_set_mmss() to use rtc_class_ops's
set_mmss64(), but it uses get_alarm_or_time()/set_alarm_or_time()
internal interfaces which are y2038 unsafe.

So here as a separate patch, it converts these two internal
interfaces of "mxc" to use safe time64_t to make some
preparations.
Signed-off-by: default avatarXunlei Pang <pang.xunlei@linaro.org>
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
Acked-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1427945681-29972-13-git-send-email-john.stultz@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 482494a8
...@@ -106,7 +106,7 @@ static inline int is_imx1_rtc(struct rtc_plat_data *data) ...@@ -106,7 +106,7 @@ static inline int is_imx1_rtc(struct rtc_plat_data *data)
* This function is used to obtain the RTC time or the alarm value in * This function is used to obtain the RTC time or the alarm value in
* second. * second.
*/ */
static u32 get_alarm_or_time(struct device *dev, int time_alarm) static time64_t get_alarm_or_time(struct device *dev, int time_alarm)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct rtc_plat_data *pdata = platform_get_drvdata(pdev); struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
...@@ -129,29 +129,28 @@ static u32 get_alarm_or_time(struct device *dev, int time_alarm) ...@@ -129,29 +129,28 @@ static u32 get_alarm_or_time(struct device *dev, int time_alarm)
hr = hr_min >> 8; hr = hr_min >> 8;
min = hr_min & 0xff; min = hr_min & 0xff;
return (((day * 24 + hr) * 60) + min) * 60 + sec; return ((((time64_t)day * 24 + hr) * 60) + min) * 60 + sec;
} }
/* /*
* This function sets the RTC alarm value or the time value. * This function sets the RTC alarm value or the time value.
*/ */
static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time) static void set_alarm_or_time(struct device *dev, int time_alarm, time64_t time)
{ {
u32 day, hr, min, sec, temp; u32 tod, day, hr, min, sec, temp;
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct rtc_plat_data *pdata = platform_get_drvdata(pdev); struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
void __iomem *ioaddr = pdata->ioaddr; void __iomem *ioaddr = pdata->ioaddr;
day = time / 86400; day = div_s64_rem(time, 86400, &tod);
time -= day * 86400;
/* time is within a day now */ /* time is within a day now */
hr = time / 3600; hr = tod / 3600;
time -= hr * 3600; tod -= hr * 3600;
/* time is within an hour now */ /* time is within an hour now */
min = time / 60; min = tod / 60;
sec = time - min * 60; sec = tod - min * 60;
temp = (hr << 8) + min; temp = (hr << 8) + min;
...@@ -175,12 +174,12 @@ static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time) ...@@ -175,12 +174,12 @@ static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time)
*/ */
static void rtc_update_alarm(struct device *dev, struct rtc_time *alrm) static void rtc_update_alarm(struct device *dev, struct rtc_time *alrm)
{ {
unsigned long time; time64_t time;
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct rtc_plat_data *pdata = platform_get_drvdata(pdev); struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
void __iomem *ioaddr = pdata->ioaddr; void __iomem *ioaddr = pdata->ioaddr;
rtc_tm_to_time(alrm, &time); time = rtc_tm_to_time64(alrm);
/* clear all the interrupt status bits */ /* clear all the interrupt status bits */
writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR); writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR);
...@@ -272,14 +271,14 @@ static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) ...@@ -272,14 +271,14 @@ static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
*/ */
static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm) static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm)
{ {
u32 val; time64_t val;
/* Avoid roll-over from reading the different registers */ /* Avoid roll-over from reading the different registers */
do { do {
val = get_alarm_or_time(dev, MXC_RTC_TIME); val = get_alarm_or_time(dev, MXC_RTC_TIME);
} while (val != get_alarm_or_time(dev, MXC_RTC_TIME)); } while (val != get_alarm_or_time(dev, MXC_RTC_TIME));
rtc_time_to_tm(val, tm); rtc_time64_to_tm(val, tm);
return 0; return 0;
} }
...@@ -322,7 +321,7 @@ static int mxc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) ...@@ -322,7 +321,7 @@ static int mxc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
struct rtc_plat_data *pdata = platform_get_drvdata(pdev); struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
void __iomem *ioaddr = pdata->ioaddr; void __iomem *ioaddr = pdata->ioaddr;
rtc_time_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time); rtc_time64_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time);
alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0; alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment