diff options
| author | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-12-17 16:53:07 +0100 | 
|---|---|---|
| committer | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-12-17 16:53:07 +0100 | 
| commit | cb5473205206c7f14cbb1e747f28ec75b48826e2 (patch) | |
| tree | 8f4808d60917100b18a10b05230f7638a0a9bbcc /lib_sh/time.c | |
| parent | baf449fc5ff96f071bb0e3789fd3265f6d4fd9a0 (diff) | |
| parent | 92c78a3bbcb2ce508b4bf1c4a1e0940406a024bb (diff) | |
| download | olio-uboot-2014.01-cb5473205206c7f14cbb1e747f28ec75b48826e2.tar.xz olio-uboot-2014.01-cb5473205206c7f14cbb1e747f28ec75b48826e2.zip | |
Merge branch 'fixes' into cleanups
Conflicts:
	board/atmel/atngw100/atngw100.c
	board/atmel/atstk1000/atstk1000.c
	cpu/at32ap/at32ap700x/gpio.c
	include/asm-avr32/arch-at32ap700x/clk.h
	include/configs/atngw100.h
	include/configs/atstk1002.h
	include/configs/atstk1003.h
	include/configs/atstk1004.h
	include/configs/atstk1006.h
	include/configs/favr-32-ezkit.h
	include/configs/hammerhead.h
	include/configs/mimc200.h
Diffstat (limited to 'lib_sh/time.c')
| -rw-r--r-- | lib_sh/time.c | 85 | 
1 files changed, 67 insertions, 18 deletions
| diff --git a/lib_sh/time.c b/lib_sh/time.c index 9c1dc509b..2bd771528 100644 --- a/lib_sh/time.c +++ b/lib_sh/time.c @@ -1,6 +1,9 @@  /* - * Copyright (c) 2007 - * Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + * (C) Copyright 2007-2008 + * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org> + * + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -23,53 +26,99 @@  #include <common.h>  #include <asm/processor.h> +#include <asm/io.h> + +#define TMU_MAX_COUNTER (~0UL) +static int clk_adj = 1;  static void tmu_timer_start (unsigned int timer)  {  	if (timer > 2)  		return; +	writeb(readb(TSTR) | (1 << timer), TSTR); +} -	*((volatile unsigned char *) TSTR0) |= (1 << timer); +static void tmu_timer_stop (unsigned int timer) +{ +	if (timer > 2) +		return; +	writeb(readb(TSTR) & ~(1 << timer), TSTR);  }  int timer_init (void)  { -	*(volatile u16 *)TCR0 = 0; +	/* Divide clock by TMU_CLK_DIVIDER */ +	u16 bit = 0; +	switch( TMU_CLK_DIVIDER ){ +	case 4: +		bit = 0; +		break; +	case 16: +		bit = 1; +		break; +	case 64: bit = 2; +		break; +	case 256: +		bit = 3; +		break; +	case 1024: +		bit = 4; +		break; +	default: +		bit = 0; +		break; +	} +	writew(readw(TCR0) | bit, TCR0); + +	/* Clock adjustment calc */ +	clk_adj = (int)(1.0/((1.0/CONFIG_SYS_HZ)*1000000)); +	if (clk_adj < 1) +		clk_adj = 1; + +	tmu_timer_stop(0); +	tmu_timer_start(0); -	tmu_timer_start (0);  	return 0;  }  unsigned long long get_ticks (void)  { -	return (0 - *((volatile unsigned int *) TCNT0)); +	return 0 - readl(TCNT0);  } -unsigned long get_timer (unsigned long base) +static unsigned long get_usec (void)  { -	return ((0 - *((volatile unsigned int *) TCNT0)) - base); +	return (0 - readl(TCNT0));  } -void set_timer (unsigned long t) +void udelay (unsigned long usec)  { -	*((volatile unsigned int *) TCNT0) = (0 - t); +	unsigned int start = get_usec(); +	unsigned int end = start + (usec * clk_adj); + +	while (get_usec() < end) +		continue;  } -void reset_timer (void) +unsigned long get_timer (unsigned long base)  { -	set_timer (0); +	/*  return msec */ +	return ((get_usec()/clk_adj)/1000) - base;  } -void udelay (unsigned long usec) +void set_timer (unsigned long t)  { -	unsigned int start = get_timer (0); -	unsigned int end = start + (usec * ((CFG_HZ + 500000) / 1000000)); +	writel((0 - t), TCNT0); +} -	while (get_timer (0) < end) -		continue; +void reset_timer (void) +{ +	tmu_timer_stop(0); +	set_timer (0); +	tmu_timer_start(0);  }  unsigned long get_tbclk (void)  { -	return CFG_HZ; +	return CONFIG_SYS_HZ;  } |