diff --git a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_dec.c b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_dec.c index 963018553..ce725e63b 100644 --- a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_dec.c +++ b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_dec.c @@ -1875,6 +1875,7 @@ static int hantrodec_release(struct inode *inode, struct file *filp) { if (vcmd) { hantrovcmd_release(inode, filp); + MMURelease(filp, hantrodec_data.hwregs[0][HW_MMU]); allocator_release(inode, filp); return 0; } diff --git a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_mmu.c b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_mmu.c index bef8968aa..04ebd1ed6 100644 --- a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_mmu.c +++ b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_mmu.c @@ -1117,7 +1117,7 @@ enum MMUStatus MMURelease(void *filp, volatile unsigned char *hwregs) { return MMU_STATUS_OK; } - pr_notice(" *****MMU Release*****\n"); + pr_debug(" *****MMU Release*****\n"); AcquireMutex(g_mmu->page_table_mutex, MMU_INFINITE); diff --git a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_vcmd.c b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_vcmd.c index bd2a1275e..7af3cc2cf 100644 --- a/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_vcmd.c +++ b/drivers/staging/media/vpu-vc8000d-kernel/linux/subsys_driver/hantro_vcmd.c @@ -1541,7 +1541,7 @@ static long release_cmdbuf(struct file *filp,u16 cmdbuf_id) spin_lock_irqsave(&cmdbuf_obj->process_manager_obj->spinlock, flags); cmdbuf_obj->process_manager_obj->total_exe_time -= cmdbuf_obj->executing_time; spin_unlock_irqrestore(&cmdbuf_obj->process_manager_obj->spinlock, flags); - wake_up_interruptible_all(&cmdbuf_obj->process_manager_obj->wait_queue); + wake_up_all(&cmdbuf_obj->process_manager_obj->wait_queue); } free_cmdbuf_node(new_cmdbuf_node); @@ -1940,11 +1940,16 @@ static unsigned int wait_cmdbuf_ready(struct file *filp,u16 cmdbuf_id,u32 *irq_s #endif } #endif - - if(wait_event_interruptible(*dev->wait_queue, check_cmdbuf_irq(dev,cmdbuf_obj,irq_status_ret))) + /*In suspend, it got a signal from "Freezing user space processes" period, + * wait_event_interruptible() will be interrupted,return user space a IO error. + * So,here changed to wait_event_timeout(). + */ + if(!wait_event_timeout(*dev->wait_queue, + check_cmdbuf_irq(dev,cmdbuf_obj,irq_status_ret),msecs_to_jiffies(500)) + ) { - PDEBUG("vcmd_wait_queue_0 interrupted\n"); - return -ERESTARTSYS; + pr_err("vcmd_wait_queue_0 timeout"); + return -ETIME; } pr_debug("filp=%p, VCMD Wait CMDBUF [%d]\n", (void *)filp, cmdbuf_id); @@ -1952,10 +1957,12 @@ static unsigned int wait_cmdbuf_ready(struct file *filp,u16 cmdbuf_id,u32 *irq_s } else { if (check_mc_cmdbuf_irq(filp, cmdbuf_obj, irq_status_ret)) return 0; - if(wait_event_interruptible(mc_wait_queue, check_mc_cmdbuf_irq(filp,cmdbuf_obj,irq_status_ret))) + if(!wait_event_timeout(mc_wait_queue, + check_mc_cmdbuf_irq(filp,cmdbuf_obj,irq_status_ret),msecs_to_jiffies(500)) + ) { - PDEBUG("multicore wait queue interrupted\n"); - return -ERESTARTSYS; + pr_err("multicore wait queue timeout\n"); + return -ETIME; } return 0; } @@ -2609,7 +2616,7 @@ int hantrovcmd_release(struct inode *inode, struct file *filp) spin_unlock_irqrestore(dev[core_id].spinlock, flags); // VCMD aborted but not restarted, nedd to wake up if (vcmd_aborted && !restart_cmdbuf) - wake_up_interruptible_all(dev[core_id].wait_queue); + wake_up_all(dev[core_id].wait_queue); } if(release_cmdbuf_num) @@ -3644,10 +3651,10 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) vcmd_delink_cmdbuf(dev,base_cmdbuf_node); spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); //to let high priority cmdbuf be inserted - wake_up_interruptible_all(dev->wait_abort_queue); - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(dev->wait_abort_queue); + wake_up_all(&mc_wait_queue); handled++; return IRQ_HANDLED; } @@ -3716,9 +3723,9 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(&mc_wait_queue); return IRQ_HANDLED; } if(vcmd_get_register_mirror_value(dev->reg_mirror,HWIF_VCMD_IRQ_TIMEOUT)) @@ -3782,9 +3789,9 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(&mc_wait_queue); return IRQ_HANDLED; } if(vcmd_get_register_mirror_value(dev->reg_mirror,HWIF_VCMD_IRQ_CMDERR)) @@ -3852,9 +3859,9 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(&mc_wait_queue); return IRQ_HANDLED; } @@ -3916,9 +3923,9 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(&mc_wait_queue); return IRQ_HANDLED; } if(dev->hw_version_id <= HW_ID_1_0_C ) @@ -3962,12 +3969,12 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); if(!handled) { PDEBUG("IRQ received, but not hantro's!\n"); } - wake_up_interruptible_all(&mc_wait_queue); + wake_up_all(&mc_wait_queue); return IRQ_HANDLED; } @@ -4131,4 +4138,4 @@ bool hantro_cmdbuf_range(addr_t addr,size_t size){ (addr >= vcmd_status_buf_mem_pool.busAddress && (addr - vcmd_status_buf_mem_pool.busAddress + size) <= CMDBUF_POOL_TOTAL_SIZE); return bInRange; -} \ No newline at end of file +}