Commit 814daadb authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'timers_urgent_for_v5.11_rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Borislav Petkov:
 "Two more timers-related fixes for v5.11:

   - Use a freezable workqueue for RTC sync because the sync can happen
     at any time and trigger suspend assertion checks in the i2c
     subsystem.

   - Correct a previous RTC validation change to check only bit 6 in
     register D because some Intel machines use bits 0-5"

* tag 'timers_urgent_for_v5.11_rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  ntp: Use freezable workqueue for RTC synchronization
  rtc: mc146818: Dont test for bit 0-5 in Register D
parents e24f9c5f 24c242ec
...@@ -805,8 +805,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) ...@@ -805,8 +805,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
spin_lock_irq(&rtc_lock); spin_lock_irq(&rtc_lock);
/* Ensure that the RTC is accessible. Bit 0-6 must be 0! */ /* Ensure that the RTC is accessible. Bit 6 must be 0! */
if ((CMOS_READ(RTC_VALID) & 0x7f) != 0) { if ((CMOS_READ(RTC_VALID) & 0x40) != 0) {
spin_unlock_irq(&rtc_lock); spin_unlock_irq(&rtc_lock);
dev_warn(dev, "not accessible\n"); dev_warn(dev, "not accessible\n");
retval = -ENXIO; retval = -ENXIO;
......
...@@ -21,8 +21,8 @@ unsigned int mc146818_get_time(struct rtc_time *time) ...@@ -21,8 +21,8 @@ unsigned int mc146818_get_time(struct rtc_time *time)
again: again:
spin_lock_irqsave(&rtc_lock, flags); spin_lock_irqsave(&rtc_lock, flags);
/* Ensure that the RTC is accessible. Bit 0-6 must be 0! */ /* Ensure that the RTC is accessible. Bit 6 must be 0! */
if (WARN_ON_ONCE((CMOS_READ(RTC_VALID) & 0x7f) != 0)) { if (WARN_ON_ONCE((CMOS_READ(RTC_VALID) & 0x40) != 0)) {
spin_unlock_irqrestore(&rtc_lock, flags); spin_unlock_irqrestore(&rtc_lock, flags);
memset(time, 0xff, sizeof(*time)); memset(time, 0xff, sizeof(*time));
return 0; return 0;
......
...@@ -502,7 +502,7 @@ static struct hrtimer sync_hrtimer; ...@@ -502,7 +502,7 @@ static struct hrtimer sync_hrtimer;
static enum hrtimer_restart sync_timer_callback(struct hrtimer *timer) static enum hrtimer_restart sync_timer_callback(struct hrtimer *timer)
{ {
queue_work(system_power_efficient_wq, &sync_work); queue_work(system_freezable_power_efficient_wq, &sync_work);
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
} }
...@@ -668,7 +668,7 @@ void ntp_notify_cmos_timer(void) ...@@ -668,7 +668,7 @@ void ntp_notify_cmos_timer(void)
* just a pointless work scheduled. * just a pointless work scheduled.
*/ */
if (ntp_synced() && !hrtimer_is_queued(&sync_hrtimer)) if (ntp_synced() && !hrtimer_is_queued(&sync_hrtimer))
queue_work(system_power_efficient_wq, &sync_work); queue_work(system_freezable_power_efficient_wq, &sync_work);
} }
static void __init ntp_init_cmos_sync(void) static void __init ntp_init_cmos_sync(void)
......
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