|
@@ -666,9 +666,9 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
|
|
|
break;
|
|
|
}
|
|
|
s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
|
|
|
- wake_up_ctx(ctx, reason, err);
|
|
|
WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
|
|
|
s5p_mfc_clock_off();
|
|
|
+ wake_up_ctx(ctx, reason, err);
|
|
|
s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
|
|
|
} else {
|
|
|
s5p_mfc_handle_frame(ctx, reason, err);
|
|
@@ -682,15 +682,11 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
|
|
|
case S5P_MFC_R2H_CMD_OPEN_INSTANCE_RET:
|
|
|
ctx->inst_no = s5p_mfc_hw_call(dev->mfc_ops, get_inst_no, dev);
|
|
|
ctx->state = MFCINST_GOT_INST;
|
|
|
- clear_work_bit(ctx);
|
|
|
- wake_up(&ctx->queue);
|
|
|
goto irq_cleanup_hw;
|
|
|
|
|
|
case S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET:
|
|
|
- clear_work_bit(ctx);
|
|
|
ctx->inst_no = MFC_NO_INSTANCE_SET;
|
|
|
ctx->state = MFCINST_FREE;
|
|
|
- wake_up(&ctx->queue);
|
|
|
goto irq_cleanup_hw;
|
|
|
|
|
|
case S5P_MFC_R2H_CMD_SYS_INIT_RET:
|
|
@@ -700,9 +696,9 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
|
|
|
if (ctx)
|
|
|
clear_work_bit(ctx);
|
|
|
s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
|
|
|
- wake_up_dev(dev, reason, err);
|
|
|
clear_bit(0, &dev->hw_lock);
|
|
|
clear_bit(0, &dev->enter_suspend);
|
|
|
+ wake_up_dev(dev, reason, err);
|
|
|
break;
|
|
|
|
|
|
case S5P_MFC_R2H_CMD_INIT_BUFFERS_RET:
|
|
@@ -717,9 +713,7 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
|
|
|
break;
|
|
|
|
|
|
case S5P_MFC_R2H_CMD_DPB_FLUSH_RET:
|
|
|
- clear_work_bit(ctx);
|
|
|
ctx->state = MFCINST_RUNNING;
|
|
|
- wake_up(&ctx->queue);
|
|
|
goto irq_cleanup_hw;
|
|
|
|
|
|
default:
|
|
@@ -738,6 +732,8 @@ irq_cleanup_hw:
|
|
|
mfc_err("Failed to unlock hw\n");
|
|
|
|
|
|
s5p_mfc_clock_off();
|
|
|
+ clear_work_bit(ctx);
|
|
|
+ wake_up(&ctx->queue);
|
|
|
|
|
|
s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
|
|
|
spin_unlock(&dev->irqlock);
|