/* Unregister v4l2 devices */ void cx18_streams_cleanup(struct cx18 *cx, int unregister) { struct video_device *vdev; int type; /* Teardown all streams */ for (type = 0; type < CX18_MAX_STREAMS; type++) { if (cx->streams[type].dvb.enabled) { cx18_dvb_unregister(&cx->streams[type]); cx->streams[type].dvb.enabled = false; } vdev = cx->streams[type].video_dev; cx->streams[type].video_dev = NULL; if (vdev == NULL) continue; cx18_stream_free(&cx->streams[type]); /* Unregister or release device */ if (unregister) video_unregister_device(vdev); else video_device_release(vdev); } }
/* Unregister v4l2 devices */ void cx18_streams_cleanup(struct cx18 *cx, int unregister) { struct video_device *vdev; int type; /* Teardown all streams */ for (type = 0; type < CX18_MAX_STREAMS; type++) { /* The TS has a cx18_dvb structure, not a video_device */ if (type == CX18_ENC_STREAM_TYPE_TS) { if (cx->streams[type].dvb != NULL) { if (unregister) cx18_dvb_unregister(&cx->streams[type]); kfree(cx->streams[type].dvb); cx->streams[type].dvb = NULL; cx18_stream_free(&cx->streams[type]); } continue; } /* No struct video_device, but can have buffers allocated */ if (type == CX18_ENC_STREAM_TYPE_IDX) { /* If the module params didn't inhibit IDX ... */ if (cx->stream_buffers[type] != 0) { cx->stream_buffers[type] = 0; /* * Before calling cx18_stream_free(), * check if the IDX stream was actually set up. * Needed, since the cx18_probe() error path * exits through here as well as normal clean up */ if (cx->streams[type].buffers != 0) cx18_stream_free(&cx->streams[type]); } continue; } /* If struct video_device exists, can have buffers allocated */ vdev = cx->streams[type].video_dev; cx->streams[type].video_dev = NULL; if (vdev == NULL) continue; if (type == CX18_ENC_STREAM_TYPE_YUV) videobuf_mmap_free(&cx->streams[type].vbuf_q); cx18_stream_free(&cx->streams[type]); /* Unregister or release device */ if (unregister) video_unregister_device(vdev); else video_device_release(vdev); } }
void cx18_streams_cleanup(struct cx18 *cx, int unregister) { struct video_device *vdev; int type; for (type = 0; type < CX18_MAX_STREAMS; type++) { if (type == CX18_ENC_STREAM_TYPE_TS) { if (cx->streams[type].dvb != NULL) { if (unregister) cx18_dvb_unregister(&cx->streams[type]); kfree(cx->streams[type].dvb); cx->streams[type].dvb = NULL; cx18_stream_free(&cx->streams[type]); } continue; } if (type == CX18_ENC_STREAM_TYPE_IDX) { if (cx->stream_buffers[type] != 0) { cx->stream_buffers[type] = 0; if (cx->streams[type].buffers != 0) cx18_stream_free(&cx->streams[type]); } continue; } vdev = cx->streams[type].video_dev; cx->streams[type].video_dev = NULL; if (vdev == NULL) continue; if (type == CX18_ENC_STREAM_TYPE_YUV) videobuf_mmap_free(&cx->streams[type].vbuf_q); cx18_stream_free(&cx->streams[type]); if (unregister) video_unregister_device(vdev); else video_device_release(vdev); } }
/* Unregister v4l2 devices */ void cx18_streams_cleanup(struct cx18 *cx, int unregister) { struct video_device *vdev; int type; /* Teardown all streams */ for (type = 0; type < CX18_MAX_STREAMS; type++) { /* No struct video_device, but can have buffers allocated */ if (type == CX18_ENC_STREAM_TYPE_TS) { if (cx->streams[type].dvb.enabled) { cx18_dvb_unregister(&cx->streams[type]); cx->streams[type].dvb.enabled = false; cx18_stream_free(&cx->streams[type]); } continue; } /* No struct video_device, but can have buffers allocated */ if (type == CX18_ENC_STREAM_TYPE_IDX) { if (cx->stream_buffers[type] != 0) { cx->stream_buffers[type] = 0; cx18_stream_free(&cx->streams[type]); } continue; } /* If struct video_device exists, can have buffers allocated */ vdev = cx->streams[type].video_dev; cx->streams[type].video_dev = NULL; if (vdev == NULL) continue; cx18_stream_free(&cx->streams[type]); /* Unregister or release device */ if (unregister) video_unregister_device(vdev); else video_device_release(vdev); } }