diff --git a/src/radeon_driver.c b/src/radeon_driver.c index 5c20b0e..980c33f 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -783,6 +783,7 @@ void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn) unsigned char *RADEONMMIO = info->MMIO; CARD32 crtc2_gen_cntl; int i; + struct timeval tv, tv2; crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); if ((crtc2_gen_cntl & RADEON_CRTC2_DISP_REQ_EN_B) || @@ -793,9 +794,13 @@ void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn) OUTREG(RADEON_CRTC2_STATUS, RADEON_CRTC2_VBLANK_SAVE_CLEAR); /* Wait for it to go back up */ - for (i = 0; i < RADEON_TIMEOUT/1000; i++) { - if (INREG(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_SAVE) break; - usleep(1); + gettimeofday(&tv, NULL); + while (!(INREG(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_SAVE)) { + gettimeofday(&tv2, NULL); + if (tv2.tv_sec - tv.tv_sec > RADEON_TIMEOUT/1000000 || + (tv2.tv_sec - tv.tv_sec == 0 && tv2.tv_usec > tv.tv_usec)) + break; + usleep(100); } }