exynos5/5250: Update timer call sites to use monotonic timer API
This goes thru various call sites where we used timer_us() and updates them to use the new monotonic timer API. udelay() changed substantially and now gracefully handles wraparound. Change-Id: Ie2cc86a4125cf0de12837fd7d337a11aed25715c Signed-off-by: David Hendricks <dhendrix@chromium.org> Reviewed-on: http://review.coreboot.org/3176 Reviewed-by: Aaron Durbin <adurbin@google.com> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
c2f177737b
commit
0bb875be5e
|
@ -27,7 +27,7 @@
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <timer.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <cpu/samsung/exynos5250/cpu.h>
|
#include <cpu/samsung/exynos5250/cpu.h>
|
||||||
#include <cpu/samsung/exynos5250/power.h>
|
#include <cpu/samsung/exynos5250/power.h>
|
||||||
|
@ -212,9 +212,8 @@ static int s5p_dp_config_video(struct s5p_dp_device *dp,
|
||||||
struct video_info *video_info)
|
struct video_info *video_info)
|
||||||
{
|
{
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
u32 start, end;
|
|
||||||
struct exynos5_dp *base = dp->base;
|
struct exynos5_dp *base = dp->base;
|
||||||
|
struct mono_time start, current, end;
|
||||||
s5p_dp_config_video_slave_mode(dp, video_info);
|
s5p_dp_config_video_slave_mode(dp, video_info);
|
||||||
|
|
||||||
s5p_dp_set_video_color_format(dp, video_info->color_depth,
|
s5p_dp_set_video_color_format(dp, video_info->color_depth,
|
||||||
|
@ -227,18 +226,20 @@ static int s5p_dp_config_video(struct s5p_dp_device *dp,
|
||||||
return -ERR_PLL_NOT_UNLOCKED;
|
return -ERR_PLL_NOT_UNLOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = timer_us();
|
timer_monotonic_get(&start);
|
||||||
end = start + STREAM_ON_TIMEOUT*1000;
|
end = current = start;
|
||||||
|
mono_time_add_usecs(&end, STREAM_ON_TIMEOUT * USECS_PER_MSEC);
|
||||||
do {
|
do {
|
||||||
if (s5p_dp_is_slave_video_stream_clock_on(dp) == 0) {
|
if (s5p_dp_is_slave_video_stream_clock_on(dp) == 0) {
|
||||||
timeout++;
|
timeout++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (timer_us() < end);
|
timer_monotonic_get(¤t);
|
||||||
|
} while (mono_time_before(¤t, &end));
|
||||||
|
|
||||||
if (!timeout) {
|
if (!timeout) {
|
||||||
printk(BIOS_ERR, "Video Clock Not ok after %uus.\n",
|
printk(BIOS_ERR, "Video Clock Not ok after %ldus.\n",
|
||||||
timer_us() - start);
|
mono_time_diff_microseconds(&start, &end));
|
||||||
return -ERR_VIDEO_CLOCK_BAD;
|
return -ERR_VIDEO_CLOCK_BAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <time.h>
|
#include <timer.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <cpu/samsung/exynos5-common/pwm.h>
|
#include <cpu/samsung/exynos5-common/pwm.h>
|
||||||
#include <cpu/samsung/exynos5-common/clk.h>
|
#include <cpu/samsung/exynos5-common/clk.h>
|
||||||
|
@ -121,16 +121,23 @@ unsigned long timer_get_us(void)
|
||||||
/* delay x useconds */
|
/* delay x useconds */
|
||||||
void udelay(unsigned long usec)
|
void udelay(unsigned long usec)
|
||||||
{
|
{
|
||||||
unsigned long start;
|
struct mono_time current, end;
|
||||||
|
|
||||||
start = timer_us();
|
timer_monotonic_get(¤t);
|
||||||
if ((start + usec) < start){
|
end = current;
|
||||||
printk(BIOS_EMERG, "udelay: %08lx is impossibly large\n",
|
mono_time_add_usecs(&end, usec);
|
||||||
|
|
||||||
|
if (mono_time_after(¤t, &end)) {
|
||||||
|
printk(BIOS_EMERG, "udelay: 0x%08lx is impossibly large\n",
|
||||||
usec);
|
usec);
|
||||||
usec = 1000000;
|
/* There's not much we can do if usec is too big. Use a long,
|
||||||
|
* paranoid delay value and hope for the best... */
|
||||||
|
end = current;
|
||||||
|
mono_time_add_usecs(&end, USECS_PER_SEC);
|
||||||
}
|
}
|
||||||
while ((timer_us() - start) < usec)
|
|
||||||
;
|
while (mono_time_before(¤t, &end))
|
||||||
|
timer_monotonic_get(¤t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -7,6 +7,7 @@ bootblock-y += pinmux.c mct.c power.c
|
||||||
# Clock is required for UART
|
# Clock is required for UART
|
||||||
bootblock-$(CONFIG_EARLY_CONSOLE) += clock_init.c
|
bootblock-$(CONFIG_EARLY_CONSOLE) += clock_init.c
|
||||||
bootblock-$(CONFIG_EARLY_CONSOLE) += clock.c
|
bootblock-$(CONFIG_EARLY_CONSOLE) += clock.c
|
||||||
|
bootblock-$(CONFIG_EARLY_CONSOLE) += monotonic_timer.c
|
||||||
bootblock-$(CONFIG_EARLY_CONSOLE) += soc.c
|
bootblock-$(CONFIG_EARLY_CONSOLE) += soc.c
|
||||||
bootblock-$(CONFIG_EARLY_CONSOLE) += uart.c
|
bootblock-$(CONFIG_EARLY_CONSOLE) += uart.c
|
||||||
|
|
||||||
|
@ -17,6 +18,7 @@ romstage-y += dmc_common.c
|
||||||
romstage-y += dmc_init_ddr3.c
|
romstage-y += dmc_init_ddr3.c
|
||||||
romstage-y += power.c
|
romstage-y += power.c
|
||||||
romstage-y += mct.c
|
romstage-y += mct.c
|
||||||
|
romstage-y += monotonic_timer.c
|
||||||
romstage-$(CONFIG_EARLY_CONSOLE) += soc.c
|
romstage-$(CONFIG_EARLY_CONSOLE) += soc.c
|
||||||
romstage-$(CONFIG_EARLY_CONSOLE) += uart.c
|
romstage-$(CONFIG_EARLY_CONSOLE) += uart.c
|
||||||
|
|
||||||
|
@ -30,6 +32,7 @@ ramstage-$(CONFIG_CONSOLE_SERIAL_UART) += uart.c
|
||||||
ramstage-y += cpu.c
|
ramstage-y += cpu.c
|
||||||
ramstage-y += exynos5250-tmu.c
|
ramstage-y += exynos5250-tmu.c
|
||||||
ramstage-y += mct.c
|
ramstage-y += mct.c
|
||||||
|
ramstage-y += monotonic_timer.c
|
||||||
|
|
||||||
#ramstage-$(CONFIG_SATA_AHCI) += sata.c
|
#ramstage-$(CONFIG_SATA_AHCI) += sata.c
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue