mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
vbi: fix vbi crash on switch channel
PD#158142: fix vbi crash on switch channel Change-Id: I0d4a585479b142cc585db0b00efb9d8772cc61ee Signed-off-by: Nian Jing <nian.jing@amlogic.com>
This commit is contained in:
@@ -410,8 +410,9 @@ static unsigned int vbi_vcnt_search(struct vbi_dev_s *devp)
|
||||
if (burst_data[j] != burst_data_vcnt[j]) {
|
||||
match_cnt = 0;
|
||||
break;
|
||||
} else {
|
||||
match_cnt++;
|
||||
}
|
||||
match_cnt++;
|
||||
}
|
||||
if (match_cnt == VBI_WRITE_BURST_BYTE)
|
||||
break;
|
||||
@@ -479,6 +480,21 @@ static void vbi_slicer_task(unsigned long arg)
|
||||
tvafe_pr_info(": Start parsing, bytes_buffer:%d, rptr:0x%p...\n",
|
||||
bytes_buffer, rptr);
|
||||
while (bytes_buffer) {
|
||||
if (bytes_buffer >= devp->mem_size + VBI_WRITE_BURST_BYTE) {
|
||||
tvafe_pr_info("[vbi..]: illegal bytes_buffer!!:%d...\n",
|
||||
bytes_buffer);
|
||||
return;
|
||||
}
|
||||
if (devp->vbi_start == false ||
|
||||
tvafe_clk_status == false)
|
||||
return;
|
||||
if (!local_rptr ||
|
||||
local_rptr > devp->pac_addr_start +
|
||||
(devp->mem_size*2) - 1) {
|
||||
tvafe_pr_info("[vbi..]: illegal addr!!local_rptr:0x%p...\n",
|
||||
local_rptr);
|
||||
return;
|
||||
}
|
||||
vbi_get_byte(local_rptr, bytes_buffer, rbyte);
|
||||
vbi_skip_bytes(rptr, bytes_buffer, devp, 1);
|
||||
sync_code <<= 8;
|
||||
@@ -774,13 +790,15 @@ static ssize_t vbi_buffer_read(struct vbi_ringbuffer_s *src,
|
||||
|
||||
if (tvafe_clk_status == false) {
|
||||
ret = -EWOULDBLOCK;
|
||||
tvafe_pr_info("%s: tvafe is closed.\n", __func__);
|
||||
if (vbi_dbg_en)
|
||||
tvafe_pr_info("%s: tvafe is closed.\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
if (src->error) {
|
||||
ret = src->error;
|
||||
vbi_ringbuffer_flush(src);
|
||||
tvafe_pr_info("%s: read buffer error\n", __func__);
|
||||
if (vbi_dbg_en)
|
||||
tvafe_pr_info("%s: read buffer error\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
if (vbi_dbg_en)
|
||||
@@ -837,12 +855,10 @@ static int vbi_open(struct inode *inode, struct file *file)
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
tasklet_enable(&vbi_dev->tsklt_slicer);
|
||||
mutex_init(&vbi_dev->slicer->mutex);
|
||||
vbi_ringbuffer_init(&vbi_dev->slicer->buffer, NULL,
|
||||
VBI_DEFAULT_BUFFER_PACKAGE_NUM);
|
||||
vbi_dev->slicer->type = VBI_TYPE_NULL;
|
||||
vbi_slicer_state_set(vbi_dev, VBI_STATE_ALLOCATED);
|
||||
spin_lock_init(&vbi_dev->vbi_isr_lock);
|
||||
/*disable data capture function*/
|
||||
vbi_dev->tasklet_enable = false;
|
||||
vbi_dev->vbi_start = false;
|
||||
@@ -867,7 +883,7 @@ static int vbi_release(struct inode *inode, struct file *file)
|
||||
|
||||
vbi_dev->tasklet_enable = false;
|
||||
vbi_dev->vbi_start = false; /*disable data capture function*/
|
||||
tasklet_disable_nosync(&vbi_dev->tsklt_slicer);
|
||||
tasklet_disable(&vbi_dev->tsklt_slicer);
|
||||
ret = vbi_slicer_free(vbi_dev, vbi_slicer);
|
||||
/* free irq */
|
||||
if (vbi_dev->irq_free_status == 1)
|
||||
@@ -931,10 +947,10 @@ static long vbi_ioctl(struct file *file,
|
||||
tvafe_pr_err("%s: slicer mutex error\n", __func__);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = vbi_slicer_stop(vbi_slicer);
|
||||
/* disable data capture function */
|
||||
vbi_dev->tasklet_enable = false;
|
||||
vbi_dev->vbi_start = false;
|
||||
ret = vbi_slicer_stop(vbi_slicer);
|
||||
/* manuel reset vbi */
|
||||
/*W_VBI_APB_REG(ACD_REG_22, 0x82080000);*/
|
||||
/* vbi reset release, vbi agent enable*/
|
||||
@@ -955,12 +971,16 @@ static long vbi_ioctl(struct file *file,
|
||||
}
|
||||
if (copy_from_user(&vbi_slicer->type, argp, sizeof(int))) {
|
||||
ret = -EFAULT;
|
||||
mutex_unlock(&vbi_slicer->mutex);
|
||||
break;
|
||||
}
|
||||
if (tvafe_clk_status)
|
||||
if (tvafe_clk_status) {
|
||||
ret = vbi_slicer_set(vbi_dev, vbi_slicer);
|
||||
else
|
||||
} else {
|
||||
ret = -EFAULT;
|
||||
tvafe_pr_err("[vbi..] %s: tvafeclose, no vbi_slicer_set\n",
|
||||
__func__);
|
||||
}
|
||||
mutex_unlock(&vbi_slicer->mutex);
|
||||
tvafe_pr_info("%s: set slicer type to %d ,state:%d\n",
|
||||
__func__, vbi_slicer->type, vbi_slicer->state);
|
||||
@@ -974,6 +994,7 @@ static long vbi_ioctl(struct file *file,
|
||||
}
|
||||
if (copy_from_user(&buffer_size_t, argp, sizeof(int))) {
|
||||
ret = -EFAULT;
|
||||
mutex_unlock(&vbi_slicer->mutex);
|
||||
break;
|
||||
}
|
||||
ret = vbi_set_buffer_size(vbi_dev, buffer_size_t);
|
||||
@@ -1229,7 +1250,6 @@ static ssize_t vbi_store(struct device *dev,
|
||||
VBI_DEFAULT_BUFFER_PACKAGE_NUM);
|
||||
devp->slicer->type = VBI_TYPE_NULL;
|
||||
vbi_slicer_state_set(devp, VBI_STATE_ALLOCATED);
|
||||
spin_lock_init(&devp->vbi_isr_lock);
|
||||
/*disable data capture function*/
|
||||
devp->tasklet_enable = false;
|
||||
devp->vbi_start = false;
|
||||
@@ -1330,6 +1350,7 @@ static int vbi_probe(struct platform_device *pdev)
|
||||
|
||||
mutex_init(&vbi_dev->mutex);
|
||||
spin_lock_init(&vbi_dev->lock);
|
||||
spin_lock_init(&vbi_dev->vbi_isr_lock);
|
||||
|
||||
/* init drv data */
|
||||
dev_set_drvdata(vbi_dev->dev, vbi_dev);
|
||||
@@ -1349,6 +1370,7 @@ static int vbi_probe(struct platform_device *pdev)
|
||||
ret = -ENOMEM;
|
||||
goto fail_alloc_mem;
|
||||
}
|
||||
mutex_init(&vbi_dev->slicer->mutex);
|
||||
vbi_dev->slicer->buffer.data = NULL;
|
||||
vbi_dev->slicer->state = VBI_STATE_FREE;
|
||||
|
||||
@@ -1385,6 +1407,9 @@ static int vbi_remove(struct platform_device *pdev)
|
||||
struct vbi_dev_s *vbi_dev;
|
||||
|
||||
vbi_dev = platform_get_drvdata(pdev);
|
||||
|
||||
mutex_destroy(&vbi_dev->slicer->mutex);
|
||||
mutex_destroy(&vbi_dev->mutex);
|
||||
tasklet_kill(&vbi_dev->tsklt_slicer);
|
||||
if (vbi_dev->pac_addr_start)
|
||||
iounmap(vbi_dev->pac_addr_start);
|
||||
|
||||
Reference in New Issue
Block a user