diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 81af31e5a9f143fb98209c8b1b3d05e243ab5ba5..4e911d0a49627ec287cffe676520f64537388d21 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -390,7 +390,7 @@ config HPET_TIMER config HPET_EMULATE_RTC def_bool y - depends on HPET_TIMER && RTC=y + depends on HPET_TIMER && (RTC=y || RTC=m) # Mark as embedded because too many people got it wrong. # The code disables itself when not needed. diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index d65ced59a18fc14fefb07ce7d7c7bcc44896d125..429d084e014d4b11a829bbf01f53fdc860e276e2 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -705,8 +705,6 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8)); if (irq_handler) irq_handler(rtc_int_flag, dev_id); - - rtc_interrupt(rtc_int_flag, dev_id); } return IRQ_HANDLED; } diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 3ac7952fe086fd47da23dc733a88f1bacdab5204..78b151c4d20f94b0bccecc1acb3540e14b77cdc9 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c @@ -110,6 +110,8 @@ static int rtc_has_irq = 1; #define hpet_set_rtc_irq_bit(arg) 0 #define hpet_rtc_timer_init() do { } while (0) #define hpet_rtc_dropped_irq() 0 +#define hpet_register_irq_handler(h) 0 +#define hpet_unregister_irq_handler(h) 0 #ifdef RTC_IRQ static irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) { @@ -1027,7 +1029,15 @@ static int __init rtc_init(void) #ifdef RTC_IRQ if (is_hpet_enabled()) { + int err; + rtc_int_handler_ptr = hpet_rtc_interrupt; + err = hpet_register_irq_handler(rtc_interrupt); + if (err != 0) { + printk(KERN_WARNING "hpet_register_irq_handler failed " + "in rtc_init()."); + return err; + } } else { rtc_int_handler_ptr = rtc_interrupt; } @@ -1050,6 +1060,7 @@ static int __init rtc_init(void) if (misc_register(&rtc_dev)) { #ifdef RTC_IRQ free_irq(RTC_IRQ, NULL); + hpet_unregister_irq_handler(rtc_interrupt); rtc_has_irq = 0; #endif rtc_release_region(); @@ -1141,8 +1152,10 @@ static void __exit rtc_exit(void) #else rtc_release_region(); #ifdef RTC_IRQ - if (rtc_has_irq) + if (rtc_has_irq) { free_irq(RTC_IRQ, NULL); + hpet_unregister_irq_handler(hpet_rtc_interrupt); + } #endif #endif /* CONFIG_SPARC32 */ }