rk29: vpu_service: fix bug when encoder and pp work at the same time

This commit is contained in:
陈恒明
2011-11-30 14:28:27 +08:00
parent 24e03ef0f5
commit 12f2bd1ae9

View File

@@ -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);
}