exynos: convert to stopwatch API
Instead of open coding monotonic timer usage, use the stopwatch API. BUG=None BRANCH=None TEST=None Change-Id: I1c541c1c9f3fde0dec9163ad6cc94322538ac7f7 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 46ede0897687da6bcf730a8904f25e5a4485d6cd Original-Change-Id: Ia63a05850a1b6afdc42c2422332f77af516d27e3 Original-Signed-off-by: Aaron Durbin <adurbin@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/219716 Original-Reviewed-by: Julius Werner <jwerner@chromium.org> Original-Reviewed-by: David Hendricks <dhendrix@chromium.org> Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/8825 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
515bd135d2
commit
43933466e7
|
@ -597,7 +597,7 @@ int clock_epll_set_rate(unsigned long rate)
|
||||||
unsigned int epll_con, epll_con_k;
|
unsigned int epll_con, epll_con_k;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int lockcnt;
|
unsigned int lockcnt;
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
|
|
||||||
epll_con = readl(&exynos_clock->epll_con0);
|
epll_con = readl(&exynos_clock->epll_con0);
|
||||||
epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
|
epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
|
||||||
|
@ -631,17 +631,16 @@ int clock_epll_set_rate(unsigned long rate)
|
||||||
writel(epll_con, &exynos_clock->epll_con0);
|
writel(epll_con, &exynos_clock->epll_con0);
|
||||||
writel(epll_con_k, &exynos_clock->epll_con1);
|
writel(epll_con_k, &exynos_clock->epll_con1);
|
||||||
|
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, TIMEOUT_EPLL_LOCK);
|
||||||
end = current;
|
|
||||||
mono_time_add_msecs(&end, TIMEOUT_EPLL_LOCK);
|
|
||||||
|
|
||||||
while (!(readl(&exynos_clock->epll_con0) &
|
while (!(readl(&exynos_clock->epll_con0) &
|
||||||
(0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
|
(0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
|
||||||
if (mono_time_after(¤t, &end)) {
|
if (stopwatch_expired(&sw)) {
|
||||||
printk(BIOS_DEBUG, "%s: Timeout waiting for EPLL lock\n", __func__);
|
printk(BIOS_DEBUG,
|
||||||
|
"%s: Timeout waiting for EPLL lock\n",
|
||||||
|
__func__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
timer_monotonic_get(¤t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -120,7 +120,7 @@ unsigned int s5p_dp_get_pll_lock_status(struct s5p_dp_device *dp)
|
||||||
int s5p_dp_init_analog_func(struct s5p_dp_device *dp)
|
int s5p_dp_init_analog_func(struct s5p_dp_device *dp)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg;
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
struct exynos5_dp *base = dp->base;
|
struct exynos5_dp *base = dp->base;
|
||||||
|
|
||||||
writel(0x00, &base->dp_phy_pd);
|
writel(0x00, &base->dp_phy_pd);
|
||||||
|
@ -135,17 +135,14 @@ int s5p_dp_init_analog_func(struct s5p_dp_device *dp)
|
||||||
|
|
||||||
clrbits_le32(&base->dp_pll_ctl, DP_PLL_PD);
|
clrbits_le32(&base->dp_pll_ctl, DP_PLL_PD);
|
||||||
|
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, PLL_LOCK_TIMEOUT);
|
||||||
end = current;
|
|
||||||
mono_time_add_msecs(&end, PLL_LOCK_TIMEOUT);
|
|
||||||
|
|
||||||
while (s5p_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
|
while (s5p_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
|
||||||
if (mono_time_after(¤t, &end)) {
|
if (stopwatch_expired(&sw)) {
|
||||||
printk(BIOS_ERR, "%s: PLL is not locked\n",
|
printk(BIOS_ERR, "%s: PLL is not locked\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
timer_monotonic_get(¤t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,13 +432,11 @@ void s5p_dp_enable_video_master(struct s5p_dp_device *dp)
|
||||||
int s5p_dp_is_video_stream_on(struct s5p_dp_device *dp)
|
int s5p_dp_is_video_stream_on(struct s5p_dp_device *dp)
|
||||||
{
|
{
|
||||||
u32 reg, i = 0;
|
u32 reg, i = 0;
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
struct exynos5_dp *base = dp->base;
|
struct exynos5_dp *base = dp->base;
|
||||||
|
|
||||||
/* Wait for 4 VSYNC_DET interrupts */
|
/* Wait for 4 VSYNC_DET interrupts */
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, STREAM_ON_TIMEOUT);
|
||||||
end = current;
|
|
||||||
mono_time_add_msecs(&end, STREAM_ON_TIMEOUT);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
reg = readl(&base->common_int_sta_1);
|
reg = readl(&base->common_int_sta_1);
|
||||||
|
@ -451,8 +446,7 @@ int s5p_dp_is_video_stream_on(struct s5p_dp_device *dp)
|
||||||
}
|
}
|
||||||
if (i == 4)
|
if (i == 4)
|
||||||
break;
|
break;
|
||||||
timer_monotonic_get(¤t);
|
} while (!stopwatch_expired(&sw));
|
||||||
} while (mono_time_before(¤t, &end));
|
|
||||||
|
|
||||||
if (i != 4) {
|
if (i != 4) {
|
||||||
printk(BIOS_DEBUG, "s5p_dp_is_video_stream_on timeout\n");
|
printk(BIOS_DEBUG, "s5p_dp_is_video_stream_on timeout\n");
|
||||||
|
|
|
@ -181,7 +181,7 @@ static int s5p_dp_config_video(struct s5p_dp_device *dp,
|
||||||
{
|
{
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
struct exynos5_dp *base = dp->base;
|
struct exynos5_dp *base = dp->base;
|
||||||
struct mono_time start, current, end;
|
struct stopwatch sw;
|
||||||
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,
|
||||||
|
@ -194,20 +194,17 @@ static int s5p_dp_config_video(struct s5p_dp_device *dp,
|
||||||
return -ERR_PLL_NOT_UNLOCKED;
|
return -ERR_PLL_NOT_UNLOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
timer_monotonic_get(&start);
|
stopwatch_init_msecs_expire(&sw, STREAM_ON_TIMEOUT);
|
||||||
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;
|
||||||
}
|
}
|
||||||
timer_monotonic_get(¤t);
|
} while (!stopwatch_expired(&sw));
|
||||||
} while (mono_time_before(¤t, &end));
|
|
||||||
|
|
||||||
if (!timeout) {
|
if (!timeout) {
|
||||||
printk(BIOS_ERR, "Video Clock Not ok after %ldus.\n",
|
printk(BIOS_ERR, "Video Clock Not ok after %ldus.\n",
|
||||||
mono_time_diff_microseconds(&start, &end));
|
stopwatch_duration_usecs(&sw));
|
||||||
return -ERR_VIDEO_CLOCK_BAD;
|
return -ERR_VIDEO_CLOCK_BAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,23 +399,20 @@ static int s5p_dp_hw_link_training(struct s5p_dp_device *dp,
|
||||||
int pll_is_locked = 0;
|
int pll_is_locked = 0;
|
||||||
u32 data;
|
u32 data;
|
||||||
int lane;
|
int lane;
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
struct exynos5_dp *base = dp->base;
|
struct exynos5_dp *base = dp->base;
|
||||||
|
|
||||||
/* Stop Video */
|
/* Stop Video */
|
||||||
clrbits_le32(&base->video_ctl_1, VIDEO_EN);
|
clrbits_le32(&base->video_ctl_1, VIDEO_EN);
|
||||||
|
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, PLL_LOCK_TIMEOUT);
|
||||||
end = current;
|
|
||||||
mono_time_add_msecs(&end, PLL_LOCK_TIMEOUT);
|
|
||||||
|
|
||||||
while ((pll_is_locked = s5p_dp_get_pll_lock_status(dp)) == PLL_UNLOCKED) {
|
while ((pll_is_locked = s5p_dp_get_pll_lock_status(dp)) == PLL_UNLOCKED) {
|
||||||
if (mono_time_after(¤t, &end)) {
|
if (stopwatch_expired(&sw)) {
|
||||||
/* Ignore this error, and try to continue */
|
/* Ignore this error, and try to continue */
|
||||||
printk(BIOS_ERR, "PLL is not locked yet.\n");
|
printk(BIOS_ERR, "PLL is not locked yet.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
timer_monotonic_get(¤t);
|
|
||||||
}
|
}
|
||||||
printk(BIOS_SPEW, "PLL is %slocked\n",
|
printk(BIOS_SPEW, "PLL is %slocked\n",
|
||||||
pll_is_locked == PLL_LOCKED ? "": "not ");
|
pll_is_locked == PLL_LOCKED ? "": "not ");
|
||||||
|
|
|
@ -561,7 +561,7 @@ int clock_epll_set_rate(unsigned long rate)
|
||||||
unsigned int epll_con, epll_con_k;
|
unsigned int epll_con, epll_con_k;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int lockcnt;
|
unsigned int lockcnt;
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
|
|
||||||
epll_con = readl(&exynos_clock->epll_con0);
|
epll_con = readl(&exynos_clock->epll_con0);
|
||||||
epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
|
epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
|
||||||
|
@ -595,17 +595,14 @@ int clock_epll_set_rate(unsigned long rate)
|
||||||
writel(epll_con, &exynos_clock->epll_con0);
|
writel(epll_con, &exynos_clock->epll_con0);
|
||||||
writel(epll_con_k, &exynos_clock->epll_con1);
|
writel(epll_con_k, &exynos_clock->epll_con1);
|
||||||
|
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, TIMEOUT_EPLL_LOCK);
|
||||||
end = current;
|
|
||||||
mono_time_add_msecs(&end, TIMEOUT_EPLL_LOCK);
|
|
||||||
|
|
||||||
while (!(readl(&exynos_clock->epll_con0) &
|
while (!(readl(&exynos_clock->epll_con0) &
|
||||||
(0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
|
(0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
|
||||||
if (mono_time_after(¤t, &end)) {
|
if (stopwatch_expired(&sw)) {
|
||||||
printk(BIOS_DEBUG, "%s: Timeout waiting for EPLL lock\n", __func__);
|
printk(BIOS_DEBUG, "%s: Timeout waiting for EPLL lock\n", __func__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
timer_monotonic_get(¤t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -415,16 +415,13 @@ static int hsi2c_check_transfer(struct hsi2c_regs *regs)
|
||||||
*/
|
*/
|
||||||
static int hsi2c_wait_for_transfer(struct hsi2c_regs *i2c)
|
static int hsi2c_wait_for_transfer(struct hsi2c_regs *i2c)
|
||||||
{
|
{
|
||||||
struct mono_time current, end;
|
struct stopwatch sw;
|
||||||
|
|
||||||
timer_monotonic_get(¤t);
|
stopwatch_init_msecs_expire(&sw, Hsi2cTimeout);
|
||||||
end = current;
|
while (!stopwatch_expired(&sw)) {
|
||||||
mono_time_add_usecs(&end, Hsi2cTimeout * 1000);
|
|
||||||
while (mono_time_before(¤t, &end)) {
|
|
||||||
int ret = hsi2c_check_transfer(i2c);
|
int ret = hsi2c_check_transfer(i2c);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
timer_monotonic_get(¤t);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue