Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 76585
b: refs/heads/master
c: 6594ad8
h: refs/heads/master
i:
  76583: 336f937
v: v3
  • Loading branch information
Mauro Carvalho Chehab committed Jan 25, 2008
1 parent 01f3ebe commit c261ef2
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 55862ac9b2e656c35ab1e25d9b162e5bda81281f
refs/heads/master: 6594ad829a98d5a9fe720d8d182a4e50fc81953a
73 changes: 41 additions & 32 deletions trunk/drivers/media/video/vivi.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,48 +425,57 @@ static void vivi_thread_tick(struct vivi_dmaqueue *dma_q)
spin_unlock(&dev->slock);
}

#define frames_to_ms(frames) \
((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

static void vivi_sleep(struct vivi_dmaqueue *dma_q)
{
struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
int timeout;
int timeout, running_time;
DECLARE_WAITQUEUE(wait, current);

dprintk(dev, 1, "%s dma_q=0x%08lx\n", __FUNCTION__,
(unsigned long)dma_q);

add_wait_queue(&dma_q->wq, &wait);
if (!kthread_should_stop()) {
dma_q->frame++;

/* Calculate time to wake up */
timeout = dma_q->ini_jiffies+
msecs_to_jiffies((dma_q->frame*WAKE_NUMERATOR * 1000)
/ WAKE_DENOMINATOR) - jiffies;

if (timeout <= 0) {
int old = dma_q->frame;
dma_q->frame = (jiffies_to_msecs(jiffies -
dma_q->ini_jiffies) *
WAKE_DENOMINATOR) /
(WAKE_NUMERATOR * 1000) + 1;

timeout = dma_q->ini_jiffies+
msecs_to_jiffies((dma_q->frame *
WAKE_NUMERATOR * 1000)
/ WAKE_DENOMINATOR) - jiffies;

dprintk(dev, 1, "underrun, losed %d frames. "
"Now, frame is %d. Waking on %d jiffies\n",
dma_q->frame-old, dma_q->frame, timeout);
} else
dprintk(dev, 1, "will sleep for %i jiffies\n",
timeout);

vivi_thread_tick(dma_q);

schedule_timeout_interruptible(timeout);
}
if (kthread_should_stop())
goto stop_task;

running_time = jiffies - dma_q->ini_jiffies;
dma_q->frame++;

/* Calculate time to wake up */
timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame)) - running_time;

if (timeout > msecs_to_jiffies(frames_to_ms(2)) || timeout <= 0) {
int old = dma_q->frame;
int nframes;

dma_q->frame = (jiffies_to_msecs(running_time) /
frames_to_ms(1)) + 1;

timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame))
- running_time;

if (unlikely (timeout <= 0))
timeout = 1;

nframes = (dma_q->frame > old)?
dma_q->frame - old : old - dma_q->frame;

dprintk(dev, 1, "%ld: %s %d frames. "
"Current frame is %d. Will sleep for %d jiffies\n",
jiffies,
(dma_q->frame > old)? "Underrun, losed" : "Overrun of",
nframes, dma_q->frame, timeout);
} else
dprintk(dev, 1, "will sleep for %d jiffies\n", timeout);

vivi_thread_tick(dma_q);

schedule_timeout_interruptible(timeout);

stop_task:
remove_wait_queue(&dma_q->wq, &wait);
try_to_freeze();
}
Expand Down

0 comments on commit c261ef2

Please sign in to comment.