diff options
Diffstat (limited to 'arch/sparc64/kernel/time.c')
-rw-r--r-- | arch/sparc64/kernel/time.c | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index d204f1ab1d4c..e5d238970c7e 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* $Id: time.c,v 1.42 2002/01/23 14:33:55 davem Exp $ | 1 | /* time.c: UltraSparc timer and TOD clock support. |
2 | * time.c: UltraSparc timer and TOD clock support. | ||
3 | * | 2 | * |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | 3 | * Copyright (C) 1997, 2008 David S. Miller (davem@davemloft.net) |
5 | * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) |
6 | * | 5 | * |
7 | * Based largely on code which is: | 6 | * Based largely on code which is: |
@@ -48,6 +47,8 @@ | |||
48 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
49 | #include <asm/irq_regs.h> | 48 | #include <asm/irq_regs.h> |
50 | 49 | ||
50 | #include "entry.h" | ||
51 | |||
51 | DEFINE_SPINLOCK(mostek_lock); | 52 | DEFINE_SPINLOCK(mostek_lock); |
52 | DEFINE_SPINLOCK(rtc_lock); | 53 | DEFINE_SPINLOCK(rtc_lock); |
53 | void __iomem *mstk48t02_regs = NULL; | 54 | void __iomem *mstk48t02_regs = NULL; |
@@ -508,6 +509,37 @@ static int __init has_low_battery(void) | |||
508 | return (data1 == data2); /* Was the write blocked? */ | 509 | return (data1 == data2); /* Was the write blocked? */ |
509 | } | 510 | } |
510 | 511 | ||
512 | static void __init mostek_set_system_time(void __iomem *mregs) | ||
513 | { | ||
514 | unsigned int year, mon, day, hour, min, sec; | ||
515 | u8 tmp; | ||
516 | |||
517 | spin_lock_irq(&mostek_lock); | ||
518 | |||
519 | /* Traditional Mostek chip. */ | ||
520 | tmp = mostek_read(mregs + MOSTEK_CREG); | ||
521 | tmp |= MSTK_CREG_READ; | ||
522 | mostek_write(mregs + MOSTEK_CREG, tmp); | ||
523 | |||
524 | sec = MSTK_REG_SEC(mregs); | ||
525 | min = MSTK_REG_MIN(mregs); | ||
526 | hour = MSTK_REG_HOUR(mregs); | ||
527 | day = MSTK_REG_DOM(mregs); | ||
528 | mon = MSTK_REG_MONTH(mregs); | ||
529 | year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) ); | ||
530 | |||
531 | xtime.tv_sec = mktime(year, mon, day, hour, min, sec); | ||
532 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | ||
533 | set_normalized_timespec(&wall_to_monotonic, | ||
534 | -xtime.tv_sec, -xtime.tv_nsec); | ||
535 | |||
536 | tmp = mostek_read(mregs + MOSTEK_CREG); | ||
537 | tmp &= ~MSTK_CREG_READ; | ||
538 | mostek_write(mregs + MOSTEK_CREG, tmp); | ||
539 | |||
540 | spin_unlock_irq(&mostek_lock); | ||
541 | } | ||
542 | |||
511 | /* Probe for the real time clock chip. */ | 543 | /* Probe for the real time clock chip. */ |
512 | static void __init set_system_time(void) | 544 | static void __init set_system_time(void) |
513 | { | 545 | { |
@@ -520,7 +552,6 @@ static void __init set_system_time(void) | |||
520 | unsigned long dregs = 0UL; | 552 | unsigned long dregs = 0UL; |
521 | void __iomem *bregs = 0UL; | 553 | void __iomem *bregs = 0UL; |
522 | #endif | 554 | #endif |
523 | u8 tmp; | ||
524 | 555 | ||
525 | if (!mregs && !dregs && !bregs) { | 556 | if (!mregs && !dregs && !bregs) { |
526 | prom_printf("Something wrong, clock regs not mapped yet.\n"); | 557 | prom_printf("Something wrong, clock regs not mapped yet.\n"); |
@@ -528,20 +559,11 @@ static void __init set_system_time(void) | |||
528 | } | 559 | } |
529 | 560 | ||
530 | if (mregs) { | 561 | if (mregs) { |
531 | spin_lock_irq(&mostek_lock); | 562 | mostek_set_system_time(mregs); |
532 | 563 | return; | |
533 | /* Traditional Mostek chip. */ | 564 | } |
534 | tmp = mostek_read(mregs + MOSTEK_CREG); | ||
535 | tmp |= MSTK_CREG_READ; | ||
536 | mostek_write(mregs + MOSTEK_CREG, tmp); | ||
537 | 565 | ||
538 | sec = MSTK_REG_SEC(mregs); | 566 | if (bregs) { |
539 | min = MSTK_REG_MIN(mregs); | ||
540 | hour = MSTK_REG_HOUR(mregs); | ||
541 | day = MSTK_REG_DOM(mregs); | ||
542 | mon = MSTK_REG_MONTH(mregs); | ||
543 | year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) ); | ||
544 | } else if (bregs) { | ||
545 | unsigned char val = readb(bregs + 0x0e); | 567 | unsigned char val = readb(bregs + 0x0e); |
546 | unsigned int century; | 568 | unsigned int century; |
547 | 569 | ||
@@ -596,14 +618,6 @@ static void __init set_system_time(void) | |||
596 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | 618 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); |
597 | set_normalized_timespec(&wall_to_monotonic, | 619 | set_normalized_timespec(&wall_to_monotonic, |
598 | -xtime.tv_sec, -xtime.tv_nsec); | 620 | -xtime.tv_sec, -xtime.tv_nsec); |
599 | |||
600 | if (mregs) { | ||
601 | tmp = mostek_read(mregs + MOSTEK_CREG); | ||
602 | tmp &= ~MSTK_CREG_READ; | ||
603 | mostek_write(mregs + MOSTEK_CREG, tmp); | ||
604 | |||
605 | spin_unlock_irq(&mostek_lock); | ||
606 | } | ||
607 | } | 621 | } |
608 | 622 | ||
609 | /* davem suggests we keep this within the 4M locked kernel image */ | 623 | /* davem suggests we keep this within the 4M locked kernel image */ |
@@ -1027,7 +1041,7 @@ void __init time_init(void) | |||
1027 | setup_clockevent_multiplier(clock); | 1041 | setup_clockevent_multiplier(clock); |
1028 | 1042 | ||
1029 | sparc64_clockevent.max_delta_ns = | 1043 | sparc64_clockevent.max_delta_ns = |
1030 | clockevent_delta2ns(0x7fffffffffffffff, &sparc64_clockevent); | 1044 | clockevent_delta2ns(0x7fffffffffffffffUL, &sparc64_clockevent); |
1031 | sparc64_clockevent.min_delta_ns = | 1045 | sparc64_clockevent.min_delta_ns = |
1032 | clockevent_delta2ns(0xF, &sparc64_clockevent); | 1046 | clockevent_delta2ns(0xF, &sparc64_clockevent); |
1033 | 1047 | ||