|
@@ -20,6 +20,13 @@
|
|
|
DEFINE_RAW_SPINLOCK(i8253_lock);
|
|
|
EXPORT_SYMBOL(i8253_lock);
|
|
|
|
|
|
+/*
|
|
|
+ * Handle PIT quirk in pit_shutdown() where zeroing the counter register
|
|
|
+ * restarts the PIT, negating the shutdown. On platforms with the quirk,
|
|
|
+ * platform specific code can set this to false.
|
|
|
+ */
|
|
|
+bool i8253_clear_counter_on_shutdown __ro_after_init = true;
|
|
|
+
|
|
|
#ifdef CONFIG_CLKSRC_I8253
|
|
|
/*
|
|
|
* Since the PIT overflows every tick, its not very useful
|
|
@@ -109,8 +116,11 @@ static int pit_shutdown(struct clock_event_device *evt)
|
|
|
raw_spin_lock(&i8253_lock);
|
|
|
|
|
|
outb_p(0x30, PIT_MODE);
|
|
|
- outb_p(0, PIT_CH0);
|
|
|
- outb_p(0, PIT_CH0);
|
|
|
+
|
|
|
+ if (i8253_clear_counter_on_shutdown) {
|
|
|
+ outb_p(0, PIT_CH0);
|
|
|
+ outb_p(0, PIT_CH0);
|
|
|
+ }
|
|
|
|
|
|
raw_spin_unlock(&i8253_lock);
|
|
|
return 0;
|