linux/arch/m68knommu/platform/68328/timers.c
<<
>>
Prefs
   1/***************************************************************************/
   2
   3/*
   4 *  linux/arch/m68knommu/platform/68328/timers.c
   5 *
   6 *  Copyright (C) 1993 Hamish Macdonald
   7 *  Copyright (C) 1999 D. Jeff Dionne
   8 *  Copyright (C) 2001 Georges Menie, Ken Desmet
   9 *
  10 * This file is subject to the terms and conditions of the GNU General Public
  11 * License.  See the file COPYING in the main directory of this archive
  12 * for more details.
  13 */
  14
  15/***************************************************************************/
  16
  17#include <linux/types.h>
  18#include <linux/kernel.h>
  19#include <linux/mm.h>
  20#include <linux/interrupt.h>
  21#include <linux/irq.h>
  22#include <linux/clocksource.h>
  23#include <asm/setup.h>
  24#include <asm/system.h>
  25#include <asm/pgtable.h>
  26#include <asm/machdep.h>
  27#include <asm/MC68VZ328.h>
  28
  29/***************************************************************************/
  30
  31#if defined(CONFIG_DRAGEN2)
  32/* with a 33.16 MHz clock, this will give usec resolution to the time functions */
  33#define CLOCK_SOURCE    TCTL_CLKSOURCE_SYSCLK
  34#define CLOCK_PRE       7
  35#define TICKS_PER_JIFFY 41450
  36
  37#elif defined(CONFIG_XCOPILOT_BUGS)
  38/*
  39 * The only thing I know is that CLK32 is not available on Xcopilot
  40 * I have little idea about what frequency SYSCLK has on Xcopilot.
  41 * The values for prescaler and compare registers were simply
  42 * taken from the original source
  43 */
  44#define CLOCK_SOURCE    TCTL_CLKSOURCE_SYSCLK
  45#define CLOCK_PRE       2
  46#define TICKS_PER_JIFFY 0xd7e4
  47
  48#else
  49/* default to using the 32Khz clock */
  50#define CLOCK_SOURCE    TCTL_CLKSOURCE_32KHZ
  51#define CLOCK_PRE       31
  52#define TICKS_PER_JIFFY 10
  53#endif
  54
  55static u32 m68328_tick_cnt;
  56
  57/***************************************************************************/
  58
  59static irqreturn_t hw_tick(int irq, void *dummy)
  60{
  61        /* Reset Timer1 */
  62        TSTAT &= 0;
  63
  64        m68328_tick_cnt += TICKS_PER_JIFFY;
  65        return arch_timer_interrupt(irq, dummy);
  66}
  67
  68/***************************************************************************/
  69
  70static struct irqaction m68328_timer_irq = {
  71        .name    = "timer",
  72        .flags   = IRQF_DISABLED | IRQF_TIMER,
  73        .handler = hw_tick,
  74};
  75
  76/***************************************************************************/
  77
  78static cycle_t m68328_read_clk(struct clocksource *cs)
  79{
  80        unsigned long flags;
  81        u32 cycles;
  82
  83        local_irq_save(flags);
  84        cycles = m68328_tick_cnt + TCN;
  85        local_irq_restore(flags);
  86
  87        return cycles;
  88}
  89
  90/***************************************************************************/
  91
  92static struct clocksource m68328_clk = {
  93        .name   = "timer",
  94        .rating = 250,
  95        .read   = m68328_read_clk,
  96        .shift  = 20,
  97        .mask   = CLOCKSOURCE_MASK(32),
  98        .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
  99};
 100
 101/***************************************************************************/
 102
 103void hw_timer_init(void)
 104{
 105        /* disable timer 1 */
 106        TCTL = 0;
 107
 108        /* set ISR */
 109        setup_irq(TMR_IRQ_NUM, &m68328_timer_irq);
 110
 111        /* Restart mode, Enable int, Set clock source */
 112        TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
 113        TPRER = CLOCK_PRE;
 114        TCMP = TICKS_PER_JIFFY;
 115
 116        /* Enable timer 1 */
 117        TCTL |= TCTL_TEN;
 118        m68328_clk.mult = clocksource_hz2mult(TICKS_PER_JIFFY*HZ, m68328_clk.shift);
 119        clocksource_register(&m68328_clk);
 120}
 121
 122/***************************************************************************/
 123
 124void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec)
 125{
 126        long now = RTCTIME;
 127
 128        *year = *mon = *day = 1;
 129        *hour = (now >> 24) % 24;
 130        *min = (now >> 16) % 60;
 131        *sec = now % 60;
 132}
 133
 134/***************************************************************************/
 135