From 12f2bd1ae91c0efbb65a42a2015840ca1d0a2580 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Wed, 30 Nov 2011 14:28:27 +0800 Subject: [PATCH] rk29: vpu_service: fix bug when encoder and pp work at the same time --- arch/arm/mach-rk29/vpu_service.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index eb1eda5a8358..32e5ec2b0447 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -486,13 +486,37 @@ static void try_set_reg(void) // first get reg from reg list spin_lock_irqsave(&service.lock, flag); if (!list_empty(&service.waiting)) { + int can_set = 0; vpu_reg *reg = list_entry(service.waiting.next, vpu_reg, status_link); vpu_service_power_maintain(); - if (((VPU_DEC_PP == reg->type) && (NULL == service.reg_codec) && (NULL == service.reg_pproc)) || - ((VPU_DEC == reg->type) && (NULL == service.reg_codec)) || - ((VPU_PP == reg->type) && (NULL == service.reg_pproc)) || - ((VPU_ENC == reg->type) && (NULL == service.reg_codec))) { + switch (reg->type) { + case VPU_ENC : { + if ((NULL == service.reg_codec) && (NULL == service.reg_pproc)) + can_set = 1; + } break; + case VPU_DEC : { + if (NULL == service.reg_codec) + can_set = 1; + } break; + case VPU_PP : { + if (NULL == service.reg_codec) { + if (NULL == service.reg_pproc) + can_set = 1; + } else { + if ((VPU_DEC == service.reg_codec->type) && (NULL == service.reg_pproc)) + can_set = 1; + } + } break; + case VPU_DEC_PP : { + if ((NULL == service.reg_codec) && (NULL == service.reg_pproc)) + can_set = 1; + } break; + default : { + printk("undefined reg type %d\n", reg->type); + } break; + } + if (can_set) { reg_from_wait_to_run(reg); reg_copy_to_hw(reg); } -- 2.34.1