Commit 76a4ddbd authored by Prathyush K's avatar Prathyush K Committed by Mauro Carvalho Chehab

[media] s5p-mfc: call wake_up_dev if in suspend mode

If a frame is still decoding when system enters suspend mode, we wait
on the device queue for a interrupt condition. This sometimes leads to a
timeout because the device queue might not be woken up everytime.
Usually, the context queue gets woken up when that context's frame gets
decoded. This patch adds a condition to wake up the device queue along
with the context queue when the system is in suspend mode.
Since the device queue is now woken up, we don't have to check the
context's int_cond flag while waiting. Also, we can skip calling try_run
after waking up the device queue to ensure that we don't have to wait
for more than one frame to be processed.
Signed-off-by: default avatarPrathyush K <prathyush.k@samsung.com>
Signed-off-by: default avatarArun Mankuzhi <arun.m@samsung.com>
Signed-off-by: default avatarArun Kumar K <arun.kk@samsung.com>
Signed-off-by: default avatarKamil Debski <k.debski@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent d6950c47
...@@ -404,7 +404,11 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx, ...@@ -404,7 +404,11 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx,
if (test_and_clear_bit(0, &dev->hw_lock) == 0) if (test_and_clear_bit(0, &dev->hw_lock) == 0)
BUG(); BUG();
s5p_mfc_clock_off(); s5p_mfc_clock_off();
s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); /* if suspending, wake up device and do not try_run again*/
if (test_bit(0, &dev->enter_suspend))
wake_up_dev(dev, reason, err);
else
s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
} }
/* Error handling for interrupt */ /* Error handling for interrupt */
...@@ -1286,9 +1290,7 @@ static int s5p_mfc_suspend(struct device *dev) ...@@ -1286,9 +1290,7 @@ static int s5p_mfc_suspend(struct device *dev)
/* Try and lock the HW */ /* Try and lock the HW */
/* Wait on the interrupt waitqueue */ /* Wait on the interrupt waitqueue */
ret = wait_event_interruptible_timeout(m_dev->queue, ret = wait_event_interruptible_timeout(m_dev->queue,
m_dev->int_cond || m_dev->ctx[m_dev->curr_ctx]->int_cond, m_dev->int_cond, msecs_to_jiffies(MFC_INT_TIMEOUT));
msecs_to_jiffies(MFC_INT_TIMEOUT));
if (ret == 0) { if (ret == 0) {
mfc_err("Waiting for hardware to finish timed out\n"); mfc_err("Waiting for hardware to finish timed out\n");
return -EIO; return -EIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment