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:
Nian Jing
2018-01-19 15:38:51 +08:00
parent 9fee745b2a
commit aa90ad1e9d

View File

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