@@ -481,8 +481,10 @@ int saa7146_vv_release(struct saa7146_de
DEB_EE(("dev:%p\n",dev));
v4l2_device_unregister(&dev->v4l2_dev);
- pci_free_consistent(dev->pci, SAA7146_CLIPPING_MEM, vv->d_clipping.cpu_addr,
vv->d_clipping.dma_handle);
- kfree(vv);
+ if (vv) {
+ pci_free_consistent(dev->pci, SAA7146_CLIPPING_MEM,
vv->d_clipping.cpu_addr, vv->d_clipping.dma_handle);
+ kfree(vv);
+ }
dev->vv_data = NULL;
dev->vv_callback = NULL;
@@ -790,12 +790,20 @@ int av7110_init_v4l(struct av7110 *av711
vv_data = &av7110_vv_data_c;
else
vv_data = &av7110_vv_data_st;
+ ret = saa7146_vv_devinit(dev);
+
+ if (ret < 0) {
+ ERR(("cannot init device. skipping.\n"));
+ return ret;
+ }
+
ret = saa7146_vv_init(dev, vv_data);
-
- if (ret) {
+ if (ret < 0) {
ERR(("cannot init capture device. skipping.\n"));
+ saa7146_vv_release(dev);
return ret;
}
+
vv_data->ops.vidioc_enum_input = vidioc_enum_input;
vv_data->ops.vidioc_g_input = vidioc_g_input;
vv_data->ops.vidioc_s_input = vidioc_s_input;