Commit 5235afa8 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Michael Ellerman
Browse files

powerpc: use time64_t in update_persistent_clock



update_persistent_clock() is deprecated because it suffers from overflow
in 2038 on 32-bit architectures. This changes powerpc to use the
update_persistent_clock64() replacement, and to pass down 64-bit
timestamps consistently.

This is now simpler, as we no longer have to worry about the offset
numbers in tm_year and tm_mon that are different between the Linux
conventions and RTAS.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 5bfd6435
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -811,16 +811,14 @@ void __init generic_calibrate_decr(void)
	}
}

int update_persistent_clock(struct timespec now)
int update_persistent_clock64(struct timespec64 now)
{
	struct rtc_time tm;

	if (!ppc_md.set_rtc_time)
		return -ENODEV;

	to_tm(now.tv_sec + 1 + timezone_offset, &tm);
	tm.tm_year -= 1900;
	tm.tm_mon -= 1;
	rtc_time64_to_tm(now.tv_sec + 1 + timezone_offset, &tm);

	return ppc_md.set_rtc_time(&tm);
}
+3 −4
Original line number Diff line number Diff line
@@ -169,15 +169,14 @@ int mpc8xx_set_rtc_time(struct rtc_time *tm)
{
	sitk8xx_t __iomem *sys_tmr1;
	sit8xx_t __iomem *sys_tmr2;
	int time;
	time64_t time;

	sys_tmr1 = immr_map(im_sitk);
	sys_tmr2 = immr_map(im_sit);
	time = mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
	              tm->tm_hour, tm->tm_min, tm->tm_sec);
	time = rtc_tm_to_time64(tm);

	out_be32(&sys_tmr1->sitk_rtck, KAPWR_KEY);
	out_be32(&sys_tmr2->sit_rtc, time);
	out_be32(&sys_tmr2->sit_rtc, (u32)time);
	out_be32(&sys_tmr1->sitk_rtck, ~KAPWR_KEY);

	immr_unmap(sys_tmr2);
+4 −13
Original line number Diff line number Diff line
@@ -84,15 +84,6 @@ long __init pmac_time_init(void)
	return delta;
}

#if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU) || \
    defined(CONFIG_PMAC_SMU)
static unsigned long from_rtc_time(struct rtc_time *tm)
{
	return mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
		      tm->tm_hour, tm->tm_min, tm->tm_sec);
}
#endif

#ifdef CONFIG_ADB_CUDA
static time64_t cuda_get_time(void)
{
@@ -115,10 +106,10 @@ static time64_t cuda_get_time(void)

static int cuda_set_rtc_time(struct rtc_time *tm)
{
	unsigned int nowtime;
	time64_t nowtime;
	struct adb_request req;

	nowtime = from_rtc_time(tm) + RTC_OFFSET;
	nowtime = rtc_tm_to_time64(tm) + RTC_OFFSET;
	if (cuda_request(&req, NULL, 6, CUDA_PACKET, CUDA_SET_TIME,
			 nowtime >> 24, nowtime >> 16, nowtime >> 8,
			 nowtime) < 0)
@@ -158,10 +149,10 @@ static time64_t pmu_get_time(void)

static int pmu_set_rtc_time(struct rtc_time *tm)
{
	unsigned int nowtime;
	time64_t nowtime;
	struct adb_request req;

	nowtime = from_rtc_time(tm) + RTC_OFFSET;
	nowtime = rtc_tm_to_time64(tm) + RTC_OFFSET;
	if (pmu_request(&req, NULL, 5, PMU_SET_RTC, nowtime >> 24,
			nowtime >> 16, nowtime >> 8, nowtime) < 0)
		return -ENXIO;