rtc: goldfish: switch to rtc_time64_to_tm/rtc_tm_to_time64
This RTC handles dates after 2106 (up to July 2554), call the 64bit versions of rtc_tm time conversion. Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
parent
6a6ec8c15d
commit
b509306d1f
|
@ -57,7 +57,7 @@ static int goldfish_rtc_read_alarm(struct device *dev,
|
||||||
do_div(rtc_alarm, NSEC_PER_SEC);
|
do_div(rtc_alarm, NSEC_PER_SEC);
|
||||||
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
||||||
|
|
||||||
rtc_time_to_tm(rtc_alarm, &alrm->time);
|
rtc_time64_to_tm(rtc_alarm, &alrm->time);
|
||||||
|
|
||||||
if (readl(base + TIMER_ALARM_STATUS))
|
if (readl(base + TIMER_ALARM_STATUS))
|
||||||
alrm->enabled = 1;
|
alrm->enabled = 1;
|
||||||
|
@ -71,21 +71,15 @@ static int goldfish_rtc_set_alarm(struct device *dev,
|
||||||
struct rtc_wkalrm *alrm)
|
struct rtc_wkalrm *alrm)
|
||||||
{
|
{
|
||||||
struct goldfish_rtc *rtcdrv;
|
struct goldfish_rtc *rtcdrv;
|
||||||
unsigned long rtc_alarm;
|
|
||||||
u64 rtc_alarm64;
|
u64 rtc_alarm64;
|
||||||
u64 rtc_status_reg;
|
u64 rtc_status_reg;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
rtcdrv = dev_get_drvdata(dev);
|
rtcdrv = dev_get_drvdata(dev);
|
||||||
base = rtcdrv->base;
|
base = rtcdrv->base;
|
||||||
|
|
||||||
if (alrm->enabled) {
|
if (alrm->enabled) {
|
||||||
ret = rtc_tm_to_time(&alrm->time, &rtc_alarm);
|
rtc_alarm64 = rtc_tm_to_time64(&alrm->time) * NSEC_PER_SEC;
|
||||||
if (ret != 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
rtc_alarm64 = rtc_alarm * NSEC_PER_SEC;
|
|
||||||
writel((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH);
|
writel((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH);
|
||||||
writel(rtc_alarm64, base + TIMER_ALARM_LOW);
|
writel(rtc_alarm64, base + TIMER_ALARM_LOW);
|
||||||
} else {
|
} else {
|
||||||
|
@ -99,7 +93,7 @@ static int goldfish_rtc_set_alarm(struct device *dev,
|
||||||
writel(1, base + TIMER_CLEAR_ALARM);
|
writel(1, base + TIMER_CLEAR_ALARM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int goldfish_rtc_alarm_irq_enable(struct device *dev,
|
static int goldfish_rtc_alarm_irq_enable(struct device *dev,
|
||||||
|
@ -148,7 +142,7 @@ static int goldfish_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||||
|
|
||||||
do_div(time, NSEC_PER_SEC);
|
do_div(time, NSEC_PER_SEC);
|
||||||
|
|
||||||
rtc_time_to_tm(time, tm);
|
rtc_time64_to_tm(time, tm);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -157,21 +151,16 @@ static int goldfish_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
struct goldfish_rtc *rtcdrv;
|
struct goldfish_rtc *rtcdrv;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
unsigned long now;
|
|
||||||
u64 now64;
|
u64 now64;
|
||||||
int ret;
|
|
||||||
|
|
||||||
rtcdrv = dev_get_drvdata(dev);
|
rtcdrv = dev_get_drvdata(dev);
|
||||||
base = rtcdrv->base;
|
base = rtcdrv->base;
|
||||||
|
|
||||||
ret = rtc_tm_to_time(tm, &now);
|
now64 = rtc_tm_to_time64(tm) * NSEC_PER_SEC;
|
||||||
if (ret == 0) {
|
writel((now64 >> 32), base + TIMER_TIME_HIGH);
|
||||||
now64 = now * NSEC_PER_SEC;
|
writel(now64, base + TIMER_TIME_LOW);
|
||||||
writel((now64 >> 32), base + TIMER_TIME_HIGH);
|
|
||||||
writel(now64, base + TIMER_TIME_LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct rtc_class_ops goldfish_rtc_ops = {
|
static const struct rtc_class_ops goldfish_rtc_ops = {
|
||||||
|
|
Loading…
Reference in New Issue