diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-15 12:32:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-15 12:32:52 -0400 |
commit | 0fa213310cd8fa7a51071cdcf130e26fa56e9549 (patch) | |
tree | 2a7e5cc33c8938ec82604a99c3797a3132fd91ec /arch/powerpc/kernel/time.c | |
parent | d3bf80bff13597004b5724ee4549cd68eb0badf0 (diff) | |
parent | bc47ab0241c7c86da4f5e5f82fbca7d45387c18d (diff) |
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (103 commits)
powerpc: Fix bug in move of altivec code to vector.S
powerpc: Add support for swiotlb on 32-bit
powerpc/spufs: Remove unused error path
powerpc: Fix warning when printing a resource_size_t
powerpc/xmon: Remove unused variable in xmon.c
powerpc/pseries: Fix warnings when printing resource_size_t
powerpc: Shield code specific to 64-bit server processors
powerpc: Separate PACA fields for server CPUs
powerpc: Split exception handling out of head_64.S
powerpc: Introduce CONFIG_PPC_BOOK3S
powerpc: Move VMX and VSX asm code to vector.S
powerpc: Set init_bootmem_done on NUMA platforms as well
powerpc/mm: Fix a AB->BA deadlock scenario with nohash MMU context lock
powerpc/mm: Fix some SMP issues with MMU context handling
powerpc: Add PTRACE_SINGLEBLOCK support
fbdev: Add PLB support and cleanup DCR in xilinxfb driver.
powerpc/virtex: Add ml510 reference design device tree
powerpc/virtex: Add Xilinx ML510 reference design support
powerpc/virtex: refactor intc driver and add support for i8259 cascading
powerpc/virtex: Add support for Xilinx PCI host bridge
...
Diffstat (limited to 'arch/powerpc/kernel/time.c')
-rw-r--r-- | arch/powerpc/kernel/time.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 48571ac56fb7..bee1443da763 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -109,7 +109,7 @@ static void decrementer_set_mode(enum clock_event_mode mode, | |||
109 | static struct clock_event_device decrementer_clockevent = { | 109 | static struct clock_event_device decrementer_clockevent = { |
110 | .name = "decrementer", | 110 | .name = "decrementer", |
111 | .rating = 200, | 111 | .rating = 200, |
112 | .shift = 16, | 112 | .shift = 0, /* To be filled in */ |
113 | .mult = 0, /* To be filled in */ | 113 | .mult = 0, /* To be filled in */ |
114 | .irq = 0, | 114 | .irq = 0, |
115 | .set_next_event = decrementer_set_next_event, | 115 | .set_next_event = decrementer_set_next_event, |
@@ -843,6 +843,22 @@ static void decrementer_set_mode(enum clock_event_mode mode, | |||
843 | decrementer_set_next_event(DECREMENTER_MAX, dev); | 843 | decrementer_set_next_event(DECREMENTER_MAX, dev); |
844 | } | 844 | } |
845 | 845 | ||
846 | static void __init setup_clockevent_multiplier(unsigned long hz) | ||
847 | { | ||
848 | u64 mult, shift = 32; | ||
849 | |||
850 | while (1) { | ||
851 | mult = div_sc(hz, NSEC_PER_SEC, shift); | ||
852 | if (mult && (mult >> 32UL) == 0UL) | ||
853 | break; | ||
854 | |||
855 | shift--; | ||
856 | } | ||
857 | |||
858 | decrementer_clockevent.shift = shift; | ||
859 | decrementer_clockevent.mult = mult; | ||
860 | } | ||
861 | |||
846 | static void register_decrementer_clockevent(int cpu) | 862 | static void register_decrementer_clockevent(int cpu) |
847 | { | 863 | { |
848 | struct clock_event_device *dec = &per_cpu(decrementers, cpu).event; | 864 | struct clock_event_device *dec = &per_cpu(decrementers, cpu).event; |
@@ -860,8 +876,7 @@ static void __init init_decrementer_clockevent(void) | |||
860 | { | 876 | { |
861 | int cpu = smp_processor_id(); | 877 | int cpu = smp_processor_id(); |
862 | 878 | ||
863 | decrementer_clockevent.mult = div_sc(ppc_tb_freq, NSEC_PER_SEC, | 879 | setup_clockevent_multiplier(ppc_tb_freq); |
864 | decrementer_clockevent.shift); | ||
865 | decrementer_clockevent.max_delta_ns = | 880 | decrementer_clockevent.max_delta_ns = |
866 | clockevent_delta2ns(DECREMENTER_MAX, &decrementer_clockevent); | 881 | clockevent_delta2ns(DECREMENTER_MAX, &decrementer_clockevent); |
867 | decrementer_clockevent.min_delta_ns = | 882 | decrementer_clockevent.min_delta_ns = |