Skip to content

Commit

Permalink
rtc: use the IRQ callback interface in (old) RTC driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bernhard Walle authored and Ingo Molnar committed Jan 30, 2008
1 parent 1bdbdaa commit f8f7648
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
2 changes: 1 addition & 1 deletion arch/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 0 additions & 2 deletions arch/x86/kernel/hpet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
15 changes: 14 additions & 1 deletion drivers/char/rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
Expand All @@ -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();
Expand Down Expand Up @@ -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 */
}
Expand Down

0 comments on commit f8f7648

Please sign in to comment.