X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_m68k%2Ftime.c;h=29269f655b9c1248ee9b91b2e5dee1d31e6791bc;hb=a87426e6dc464839407ee92f133cabf38944b605;hp=0b85411dd87b4edf9af0a219af3c6d5327387bed;hpb=bf9e3b38f77c2eac620263dd60437c6ec47a27bf;p=u-boot diff --git a/lib_m68k/time.c b/lib_m68k/time.c index 0b85411dd8..29269f655b 100644 --- a/lib_m68k/time.c +++ b/lib_m68k/time.c @@ -25,31 +25,31 @@ #include -#include +#include +#include +#include -#ifdef CONFIG_M5272 -#include -#include -#endif +DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_M5282 -#include -#endif +static volatile ulong timestamp = 0; +#ifndef CONFIG_SYS_WATCHDOG_FREQ +#define CONFIG_SYS_WATCHDOG_FREQ (CONFIG_SYS_HZ / 2) +#endif -static ulong timestamp; -#ifdef CONFIG_M5282 -static unsigned short lastinc; +#if defined(CONFIG_MCFTMR) +#ifndef CONFIG_SYS_UDELAY_BASE +# error "uDelay base not defined!" #endif +#if !defined(CONFIG_SYS_TMR_BASE) || !defined(CONFIG_SYS_INTR_BASE) || !defined(CONFIG_SYS_TMRINTR_NO) || !defined(CONFIG_SYS_TMRINTR_MASK) +# error "TMR_BASE, INTR_BASE, TMRINTR_NO or TMRINTR_MASk not defined!" +#endif +extern void dtimer_intr_setup(void); -#if defined(CONFIG_M5272) -/* - * We use timer 3 which is running with a period of 1 us - */ void udelay(unsigned long usec) { - volatile timer_t *timerp = (timer_t *) (CFG_MBAR + MCFTIMER_BASE3); + volatile dtmr_t *timerp = (dtmr_t *) (CONFIG_SYS_UDELAY_BASE); uint start, now, tmp; while (usec > 0) { @@ -60,104 +60,133 @@ void udelay(unsigned long usec) usec = usec - tmp; /* Set up TIMER 3 as timebase clock */ - timerp->timer_tmr = MCFTIMER_TMR_DISABLE; - timerp->timer_tcn = 0; + timerp->tmr = DTIM_DTMR_RST_RST; + timerp->tcn = 0; /* set period to 1 us */ - timerp->timer_tmr = (((CFG_CLK / 1000000) - 1) << 8) | MCFTIMER_TMR_CLK1 | - MCFTIMER_TMR_FREERUN | MCFTIMER_TMR_ENABLE; + timerp->tmr = + CONFIG_SYS_TIMER_PRESCALER | DTIM_DTMR_CLK_DIV1 | DTIM_DTMR_FRR | + DTIM_DTMR_RST_EN; - start = now = timerp->timer_tcn; + start = now = timerp->tcn; while (now < start + tmp) - now = timerp->timer_tcn; + now = timerp->tcn; } } -void mcf_timer_interrupt (void * not_used){ - volatile timer_t *timerp = (timer_t *) (CFG_MBAR + MCFTIMER_BASE4); - volatile intctrl_t *intp = (intctrl_t *) (CFG_MBAR + MCFSIM_ICR1); - - /* check for timer 4 interrupts */ - if ((intp->int_isr & 0x01000000) != 0) { +void dtimer_interrupt(void *not_used) +{ + volatile dtmr_t *timerp = (dtmr_t *) (CONFIG_SYS_TMR_BASE); + + /* check for timer interrupt asserted */ + if ((CONFIG_SYS_TMRPND_REG & CONFIG_SYS_TMRINTR_MASK) == CONFIG_SYS_TMRINTR_PEND) { + timerp->ter = (DTIM_DTER_CAP | DTIM_DTER_REF); + timestamp++; + + #if defined(CONFIG_WATCHDOG) || defined (CONFIG_HW_WATCHDOG) + if ((timestamp % (CONFIG_SYS_WATCHDOG_FREQ)) == 0) { + WATCHDOG_RESET (); + } + #endif /* CONFIG_WATCHDOG || CONFIG_HW_WATCHDOG */ return; } - - /* reset timer */ - timerp->timer_ter = MCFTIMER_TER_CAP | MCFTIMER_TER_REF; - timestamp ++; } -void timer_init (void) { - volatile timer_t *timerp = (timer_t *) (CFG_MBAR + MCFTIMER_BASE4); - volatile intctrl_t *intp = (intctrl_t *) (CFG_MBAR + MCFSIM_ICR1); +void timer_init(void) +{ + volatile dtmr_t *timerp = (dtmr_t *) (CONFIG_SYS_TMR_BASE); timestamp = 0; + timerp->tcn = 0; + timerp->trr = 0; + /* Set up TIMER 4 as clock */ - timerp->timer_tmr = MCFTIMER_TMR_DISABLE; + timerp->tmr = DTIM_DTMR_RST_RST; + + /* initialize and enable timer interrupt */ + irq_install_handler(CONFIG_SYS_TMRINTR_NO, dtimer_interrupt, 0); + + timerp->tcn = 0; + timerp->trr = 1000; /* Interrupt every ms */ - /* initialize and enable timer 4 interrupt */ - irq_install_handler (72, mcf_timer_interrupt, 0); - intp->int_icr1 |= 0x0000000d; + dtimer_intr_setup(); - timerp->timer_tcn = 0; - timerp->timer_trr = 1000; /* Interrupt every ms */ /* set a period of 1us, set timer mode to restart and enable timer and interrupt */ - timerp->timer_tmr = (((CFG_CLK / 1000000) - 1) << 8) | MCFTIMER_TMR_CLK1 | - MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENORI | MCFTIMER_TMR_ENABLE; + timerp->tmr = CONFIG_SYS_TIMER_PRESCALER | DTIM_DTMR_CLK_DIV1 | + DTIM_DTMR_FRR | DTIM_DTMR_ORRI | DTIM_DTMR_RST_EN; } -void reset_timer (void) +void reset_timer(void) { timestamp = 0; } -ulong get_timer (ulong base) +ulong get_timer(ulong base) { return (timestamp - base); } -void set_timer (ulong t) +void set_timer(ulong t) { timestamp = t; } +#endif /* CONFIG_MCFTMR */ + +#if defined(CONFIG_MCFPIT) +#if !defined(CONFIG_SYS_PIT_BASE) +# error "CONFIG_SYS_PIT_BASE not defined!" #endif -#if defined(CONFIG_M5282) +static unsigned short lastinc; void udelay(unsigned long usec) { + volatile pit_t *timerp = (pit_t *) (CONFIG_SYS_UDELAY_BASE); + uint tmp; + + while (usec > 0) { + if (usec > 65000) + tmp = 65000; + else + tmp = usec; + usec = usec - tmp; + + /* Set up TIMER 3 as timebase clock */ + timerp->pcsr = PIT_PCSR_OVW; + timerp->pmr = 0; + /* set period to 1 us */ + timerp->pcsr |= PIT_PCSR_PRE(CONFIG_SYS_PIT_PRESCALE) | PIT_PCSR_EN; + + timerp->pmr = tmp; + while (timerp->pcntr > 0) ; + } } -void timer_init (void) +void timer_init(void) { - volatile unsigned short *timerp; - - timerp = (volatile unsigned short *) (CFG_MBAR + MCFTIMER_BASE4); + volatile pit_t *timerp = (pit_t *) (CONFIG_SYS_PIT_BASE); timestamp = 0; /* Set up TIMER 4 as poll clock */ - timerp[MCFTIMER_PCSR] = MCFTIMER_PCSR_OVW; - timerp[MCFTIMER_PMR] = lastinc = 0; - timerp[MCFTIMER_PCSR] = - (5 << 8) | MCFTIMER_PCSR_EN | MCFTIMER_PCSR_OVW; + timerp->pcsr = PIT_PCSR_OVW; + timerp->pmr = lastinc = 0; + timerp->pcsr |= PIT_PCSR_PRE(CONFIG_SYS_PIT_PRESCALE) | PIT_PCSR_EN; } -void set_timer (ulong t) +void set_timer(ulong t) { - volatile unsigned short *timerp; + volatile pit_t *timerp = (pit_t *) (CONFIG_SYS_PIT_BASE); - timerp = (volatile unsigned short *) (CFG_MBAR + MCFTIMER_BASE4); timestamp = 0; - timerp[MCFTIMER_PMR] = lastinc = 0; + timerp->pmr = lastinc = 0; } -ulong get_timer (ulong base) +ulong get_timer(ulong base) { unsigned short now, diff; - volatile unsigned short *timerp; + volatile pit_t *timerp = (pit_t *) (CONFIG_SYS_PIT_BASE); - timerp = (volatile unsigned short *) (CFG_MBAR + MCFTIMER_BASE4); - now = timerp[MCFTIMER_PCNTR]; + now = timerp->pcntr; diff = -(now - lastinc); timestamp += diff; @@ -165,9 +194,34 @@ ulong get_timer (ulong base) return timestamp - base; } -void wait_ticks (unsigned long ticks) +void wait_ticks(unsigned long ticks) { - set_timer (0); - while (get_timer (0) < ticks); + set_timer(0); + while (get_timer(0) < ticks) ; +} +#endif /* CONFIG_MCFPIT */ + +/* + * This function is derived from PowerPC code (read timebase as long long). + * On M68K it just returns the timer value. + */ +unsigned long long get_ticks(void) +{ + return get_timer(0); +} + +unsigned long usec2ticks(unsigned long usec) +{ + return get_timer(usec); +} + +/* + * This function is derived from PowerPC code (timebase clock frequency). + * On M68K it returns the number of timer ticks per second. + */ +ulong get_tbclk(void) +{ + ulong tbclk; + tbclk = CONFIG_SYS_HZ; + return tbclk; } -#endif