diff options
| author | Dimitri Sivanich <sivanich@sgi.com> | 2009-10-14 10:21:03 -0400 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-10-14 12:27:10 -0400 | 
| commit | d5991ff297ad2f7e2698eefcd8269df5ecec150f (patch) | |
| tree | 5178e9d2971deb227c88b877e0d4c0714c29a407 | |
| parent | 8c28de4d011f37b2893ecfcec9a985c0e9bd786f (diff) | |
x86: UV RTC: Clean up error handling
Cleanup error handling in uv_rtc_setup_clock.
Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
LKML-Reference: <20091014142103.GD11048@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | arch/x86/kernel/uv_time.c | 21 | 
1 files changed, 13 insertions, 8 deletions
diff --git a/arch/x86/kernel/uv_time.c b/arch/x86/kernel/uv_time.c index c6324ad7c0d9..255645084534 100644 --- a/arch/x86/kernel/uv_time.c +++ b/arch/x86/kernel/uv_time.c  | |||
| @@ -380,15 +380,12 @@ static __init int uv_rtc_setup_clock(void) | |||
| 380 | if (rc || !uv_rtc_evt_enable) | 380 | if (rc || !uv_rtc_evt_enable) | 
| 381 | return rc; | 381 | return rc; | 
| 382 | 382 | ||
| 383 | generic_interrupt_extension = uv_rtc_interrupt; | ||
| 384 | |||
| 385 | /* Setup and register clockevents */ | 383 | /* Setup and register clockevents */ | 
| 386 | rc = uv_rtc_allocate_timers(); | 384 | rc = uv_rtc_allocate_timers(); | 
| 387 | if (rc) { | 385 | if (rc) | 
| 388 | clocksource_unregister(&clocksource_uv); | 386 | goto error; | 
| 389 | generic_interrupt_extension = NULL; | 387 | |
| 390 | return rc; | 388 | generic_interrupt_extension = uv_rtc_interrupt; | 
| 391 | } | ||
| 392 | 389 | ||
| 393 | clock_event_device_uv.mult = div_sc(sn_rtc_cycles_per_second, | 390 | clock_event_device_uv.mult = div_sc(sn_rtc_cycles_per_second, | 
| 394 | NSEC_PER_SEC, clock_event_device_uv.shift); | 391 | NSEC_PER_SEC, clock_event_device_uv.shift); | 
| @@ -401,11 +398,19 @@ static __init int uv_rtc_setup_clock(void) | |||
| 401 | 398 | ||
| 402 | rc = schedule_on_each_cpu(uv_rtc_register_clockevents); | 399 | rc = schedule_on_each_cpu(uv_rtc_register_clockevents); | 
| 403 | if (rc) { | 400 | if (rc) { | 
| 404 | clocksource_unregister(&clocksource_uv); | ||
| 405 | generic_interrupt_extension = NULL; | 401 | generic_interrupt_extension = NULL; | 
| 406 | uv_rtc_deallocate_timers(); | 402 | uv_rtc_deallocate_timers(); | 
| 403 | goto error; | ||
| 407 | } | 404 | } | 
| 408 | 405 | ||
| 406 | printk(KERN_INFO "UV RTC clockevents registered\n"); | ||
| 407 | |||
| 408 | return 0; | ||
| 409 | |||
| 410 | error: | ||
| 411 | clocksource_unregister(&clocksource_uv); | ||
| 412 | printk(KERN_INFO "UV RTC clockevents failed rc %d\n", rc); | ||
| 413 | |||
| 409 | return rc; | 414 | return rc; | 
| 410 | } | 415 | } | 
| 411 | arch_initcall(uv_rtc_setup_clock); | 416 | arch_initcall(uv_rtc_setup_clock); | 
