rtc: use the IRQ callback interface in (old) RTC driver
the previous patch in the old RTC driver. It also removes the direct rtc_interrupt() call from arch/x86/kernel/hpetc.c so that there's finally no (code) dependency to CONFIG_RTC in arch/x86/kernel/hpet.c. Because of this, it's possible to compile the drivers/char/rtc.ko driver as module and still use the HPET emulation functionality. This is also expressed in Kconfig. Signed-off-by: Bernhard Walle <bwalle@suse.de> Cc: Alessandro Zummo <a.zummo@towertech.it> Cc: David Brownell <david-b@pacbell.net> Cc: Andi Kleen <ak@suse.de> Cc: john stultz <johnstul@us.ibm.com> Cc: Robert Picco <Robert.Picco@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Родитель
1bdbdaacf7
Коммит
f8f76481bc
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 @@ no_irq:
|
|||
|
||||
#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 @@ no_irq:
|
|||
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 */
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче