From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhong Hongbo Date: Thu, 05 Jul 2012 19:55:49 +0800 Subject: [U-Boot] [PATCH] arm/s5pxx: Fix get_timer_masked to get the time. In-Reply-To: <1341273049-3587-1-git-send-email-bocui107@gmail.com> References: <1341273049-3587-1-git-send-email-bocui107@gmail.com> Message-ID: <4FF580C5.1000008@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Minkyu, Could you help me to review it? Thanks, hongbo On 07/03/2012 07:50 AM, Zhong Hongbo wrote: > From: Zhong Hongbo > > In general, The get_timer_masked function get the system time, > no the number of ticks. Such as the nand_wait_ready will use > get_timer_masked to delay the operations. And change the system > time to adopt to the CONFIG_SYS_HZ. > > Signed-off-by: Hongbo Zhong > --- > arch/arm/cpu/armv7/s5p-common/pwm.c | 2 +- > arch/arm/cpu/armv7/s5p-common/timer.c | 20 ++++++++++++++++---- > 2 files changed, 17 insertions(+), 5 deletions(-) > > diff --git a/arch/arm/cpu/armv7/s5p-common/pwm.c b/arch/arm/cpu/armv7/s5p-common/pwm.c > index 58d279e..44d7bc3 100644 > --- a/arch/arm/cpu/armv7/s5p-common/pwm.c > +++ b/arch/arm/cpu/armv7/s5p-common/pwm.c > @@ -170,7 +170,7 @@ int pwm_init(int pwm_id, int div, int invert) > timer_rate_hz = get_pwm_clk() / ((prescaler + 1) * > (div + 1)); > > - timer_rate_hz = timer_rate_hz / 100; > + timer_rate_hz = timer_rate_hz / CONFIG_SYS_HZ; > > /* set count value */ > offset = pwm_id * 3; > diff --git a/arch/arm/cpu/armv7/s5p-common/timer.c b/arch/arm/cpu/armv7/s5p-common/timer.c > index 359c21f..bb0e795 100644 > --- a/arch/arm/cpu/armv7/s5p-common/timer.c > +++ b/arch/arm/cpu/armv7/s5p-common/timer.c > @@ -31,6 +31,8 @@ > > DECLARE_GLOBAL_DATA_PTR; > > +unsigned long get_current_tick(void); > + > /* macro to read the 16 bit timer */ > static inline struct s5p_timer *s5p_get_base_timer(void) > { > @@ -44,6 +46,8 @@ int timer_init(void) > pwm_config(4, 0, 0); > pwm_enable(4); > > + reset_timer_masked(); > + > return 0; > } > > @@ -72,16 +76,16 @@ void __udelay(unsigned long usec) > * 3. finish normalize. > */ > tmo = usec / 1000; > - tmo *= (CONFIG_SYS_HZ * count_value / 10); > + tmo *= (CONFIG_SYS_HZ * count_value); > tmo /= 1000; > } else { > /* else small number, don't kill it prior to HZ multiply */ > - tmo = usec * CONFIG_SYS_HZ * count_value / 10; > + tmo = usec * CONFIG_SYS_HZ * count_value; > tmo /= (1000 * 1000); > } > > /* get current timestamp */ > - tmp = get_timer(0); > + tmp = get_current_tick(); > > /* if setting this fordward will roll time stamp */ > /* reset "advancing" timestamp to 0, set lastinc value */ > @@ -92,7 +96,7 @@ void __udelay(unsigned long usec) > tmo += tmp; > > /* loop till event */ > - while (get_timer_masked() < tmo) > + while (get_current_tick() < tmo) > ; /* nop */ > } > > @@ -108,6 +112,14 @@ void reset_timer_masked(void) > unsigned long get_timer_masked(void) > { > struct s5p_timer *const timer = s5p_get_base_timer(); > + unsigned long count_value = readl(&timer->tcntb4); > + > + return get_current_tick() / count_value; > +} > + > +unsigned long get_current_tick(void) > +{ > + struct s5p_timer *const timer = s5p_get_base_timer(); > unsigned long now = readl(&timer->tcnto4); > unsigned long count_value = readl(&timer->tcntb4); > >