ANDROID: fix up rtc-core merge error in previous upstream merge
Commitdd5c936967("Merge7e63420847("Merge tag 'acpi-5.7-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm") into android-mainline") was not done properly, and had a half-completed merge of drivers/rtc/class.c Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ibedf4e800ef54c77da371dea24fede7adc8a4a37
This commit is contained in:
+45
-1
@@ -34,6 +34,50 @@ static void rtc_device_release(struct device *dev)
|
||||
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
|
||||
/* Result of the last RTC to system clock attempt. */
|
||||
int rtc_hctosys_ret = -ENODEV;
|
||||
|
||||
/* IMPORTANT: the RTC only stores whole seconds. It is arbitrary
|
||||
* whether it stores the most close value or the value with partial
|
||||
* seconds truncated. However, it is important that we use it to store
|
||||
* the truncated value. This is because otherwise it is necessary,
|
||||
* in an rtc sync function, to read both xtime.tv_sec and
|
||||
* xtime.tv_nsec. On some processors (i.e. ARM), an atomic read
|
||||
* of >32bits is not possible. So storing the most close value would
|
||||
* slow down the sync API. So here we have the truncated value and
|
||||
* the best guess is to add 0.5s.
|
||||
*/
|
||||
|
||||
static void rtc_hctosys(struct rtc_device *rtc)
|
||||
{
|
||||
int err;
|
||||
struct rtc_time tm;
|
||||
struct timespec64 tv64 = {
|
||||
.tv_nsec = NSEC_PER_SEC >> 1,
|
||||
};
|
||||
|
||||
err = rtc_read_time(rtc, &tm);
|
||||
if (err) {
|
||||
dev_err(rtc->dev.parent,
|
||||
"hctosys: unable to read the hardware clock\n");
|
||||
goto err_read;
|
||||
}
|
||||
|
||||
tv64.tv_sec = rtc_tm_to_time64(&tm);
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
if (tv64.tv_sec > INT_MAX) {
|
||||
err = -ERANGE;
|
||||
goto err_read;
|
||||
}
|
||||
#endif
|
||||
|
||||
err = do_settimeofday64(&tv64);
|
||||
|
||||
dev_info(rtc->dev.parent, "setting system clock to %ptR UTC (%lld)\n",
|
||||
&tm, (long long)tv64.tv_sec);
|
||||
|
||||
err_read:
|
||||
rtc_hctosys_ret = err;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_RTC_HCTOSYS_DEVICE)
|
||||
@@ -377,7 +421,7 @@ int __rtc_register_device(struct module *owner, struct rtc_device *rtc)
|
||||
|
||||
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
|
||||
if (!strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE))
|
||||
rtc_hctosys();
|
||||
rtc_hctosys(rtc);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -46,7 +46,3 @@ static inline const struct attribute_group **rtc_get_dev_attribute_groups(void)
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTC_HCTOSYS
|
||||
extern int rtc_hctosys(void);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user