From: 陈恒明 Date: Wed, 30 Nov 2011 06:28:27 +0000 (+0800) Subject: rk29: vpu_service: fix bug when encoder and pp work at the same time X-Git-Tag: firefly_0821_release~9733^2~8 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=12f2bd1ae91c0efbb65a42a2015840ca1d0a2580;p=firefly-linux-kernel-4.4.55.git rk29: vpu_service: fix bug when encoder and pp work at the same time --- 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); }