Lines Matching refs:dmxdev

119 	struct dmxdev *dmxdev = dvbdev->priv;  in dvb_dvr_open()  local
125 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_open()
128 if (dmxdev->exit) { in dvb_dvr_open()
129 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
133 dmxdev->may_do_mmap = 0; in dvb_dvr_open()
148 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { in dvb_dvr_open()
150 dmxdev->may_do_mmap = 1; in dvb_dvr_open()
153 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
163 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
168 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
171 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); in dvb_dvr_open()
172 if (dmxdev->may_do_mmap) in dvb_dvr_open()
173 dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr", in dvb_dvr_open()
179 dmxdev->dvr_orig_fe = dmxdev->demux->frontend; in dvb_dvr_open()
181 if (!dmxdev->demux->write) { in dvb_dvr_open()
182 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
186 front = get_fe(dmxdev->demux, DMX_MEMORY_FE); in dvb_dvr_open()
189 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
192 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_open()
193 dmxdev->demux->connect_frontend(dmxdev->demux, front); in dvb_dvr_open()
196 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
203 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_release() local
205 mutex_lock(&dmxdev->mutex); in dvb_dvr_release()
208 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_release()
209 dmxdev->demux->connect_frontend(dmxdev->demux, in dvb_dvr_release()
210 dmxdev->dvr_orig_fe); in dvb_dvr_release()
214 dmxdev->may_do_mmap) { in dvb_dvr_release()
215 if (dmxdev->may_do_mmap) { in dvb_dvr_release()
216 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_release()
217 dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx); in dvb_dvr_release()
218 dvb_vb2_release(&dmxdev->dvr_vb2_ctx); in dvb_dvr_release()
221 if (dmxdev->dvr_buffer.data) { in dvb_dvr_release()
222 void *mem = dmxdev->dvr_buffer.data; in dvb_dvr_release()
225 spin_lock_irq(&dmxdev->lock); in dvb_dvr_release()
226 dmxdev->dvr_buffer.data = NULL; in dvb_dvr_release()
227 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_release()
233 if (dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_dvr_release()
234 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
237 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
246 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_write() local
249 if (!dmxdev->demux->write) in dvb_dvr_write()
253 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_write()
256 if (dmxdev->exit) { in dvb_dvr_write()
257 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
260 ret = dmxdev->demux->write(dmxdev->demux, buf, count); in dvb_dvr_write()
261 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
269 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_read() local
271 if (dmxdev->exit) in dvb_dvr_read()
274 return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, in dvb_dvr_read()
279 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, in dvb_dvr_set_buffer_size() argument
282 struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer; in dvb_dvr_set_buffer_size()
299 spin_lock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
305 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
530 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_feed_restart() local
533 for (i = 0; i < dmxdev->filternum; i++) in dvb_dmxdev_feed_restart()
534 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_feed_restart()
535 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_feed_restart()
536 dmxdev->filter[i].params.sec.pid == pid) { in dvb_dmxdev_feed_restart()
537 dvb_dmxdev_feed_start(&dmxdev->filter[i]); in dvb_dmxdev_feed_restart()
541 filter->dev->demux->release_section_feed(dmxdev->demux, in dvb_dmxdev_feed_restart()
611 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, in dvb_dmxdev_start_feed() argument
640 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts, in dvb_dmxdev_start_feed()
650 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
656 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
665 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_filter_start() local
699 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_filter_start()
700 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_filter_start()
701 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_filter_start()
702 dmxdev->filter[i].params.sec.pid == para->pid) { in dvb_dmxdev_filter_start()
703 *secfeed = dmxdev->filter[i].feed.sec; in dvb_dmxdev_filter_start()
710 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, in dvb_dmxdev_filter_start()
765 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_filter_start()
783 struct dmxdev *dmxdev = dvbdev->priv; in dvb_demux_open() local
787 if (!dmxdev->filter) in dvb_demux_open()
790 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_open()
793 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
794 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
797 if (i == dmxdev->filternum) { in dvb_demux_open()
798 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
802 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
807 dmxdev->may_do_mmap = 1; in dvb_demux_open()
809 dmxdev->may_do_mmap = 0; in dvb_demux_open()
821 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
825 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
828 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
841 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
843 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
850 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
862 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
884 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
889 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
911 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
932 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
951 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
1028 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
1032 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
1038 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1050 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1059 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1062 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1068 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1071 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1077 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1085 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1089 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1093 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1097 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1108 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1117 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1124 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1133 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1142 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1151 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1162 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1173 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1213 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_mmap() local
1216 if (!dmxdev->may_do_mmap) in dvb_demux_mmap()
1219 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_mmap()
1223 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1229 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1238 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1241 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1243 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1244 dmxdev->dvbdev->users--; in dvb_demux_release()
1245 if (dmxdev->dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_demux_release()
1246 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1247 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1249 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1282 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1286 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1291 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1296 ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1300 ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1304 ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1308 ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1309 if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_do_ioctl()
1310 ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx); in dvb_dvr_do_ioctl()
1314 ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1321 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1334 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1339 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1341 if (dmxdev->exit) in dvb_dvr_poll()
1343 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_poll()
1344 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait); in dvb_dvr_poll()
1347 dmxdev->may_do_mmap) { in dvb_dvr_poll()
1348 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1351 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1363 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_mmap() local
1366 if (!dmxdev->may_do_mmap) in dvb_dvr_mmap()
1369 if (dmxdev->exit) in dvb_dvr_mmap()
1372 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_mmap()
1375 ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma); in dvb_dvr_mmap()
1376 mutex_unlock(&dmxdev->mutex); in dvb_dvr_mmap()
1404 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1408 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1411 dmxdev->filter = vmalloc(array_size(sizeof(struct dmxdev_filter), in dvb_dmxdev_init()
1412 dmxdev->filternum)); in dvb_dmxdev_init()
1413 if (!dmxdev->filter) in dvb_dmxdev_init()
1416 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1417 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1418 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1419 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1420 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1421 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1425 ret = dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1426 DVB_DEVICE_DEMUX, dmxdev->filternum); in dvb_dmxdev_init()
1430 ret = dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1431 dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); in dvb_dmxdev_init()
1435 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1440 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_init()
1442 vfree(dmxdev->filter); in dvb_dmxdev_init()
1443 dmxdev->filter = NULL; in dvb_dmxdev_init()
1449 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1451 dmxdev->exit = 1; in dvb_dmxdev_release()
1452 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1453 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1454 dmxdev->dvbdev->users == 1); in dvb_dmxdev_release()
1456 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1457 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1458 dmxdev->dvr_dvbdev->users == 1); in dvb_dmxdev_release()
1461 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1462 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1464 vfree(dmxdev->filter); in dvb_dmxdev_release()
1465 dmxdev->filter = NULL; in dvb_dmxdev_release()
1466 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()