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 if (dmxdev->exit) { in dvb_demux_open()
794 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
798 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
799 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
802 if (i == dmxdev->filternum) { in dvb_demux_open()
803 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
807 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
812 dmxdev->may_do_mmap = 1; in dvb_demux_open()
814 dmxdev->may_do_mmap = 0; in dvb_demux_open()
826 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
830 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
833 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
846 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
848 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
855 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
867 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
889 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
894 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
916 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
937 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
956 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
1033 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
1037 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
1043 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1055 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1064 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1067 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1073 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1076 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1082 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1090 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1094 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1098 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1102 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1113 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1122 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1129 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1138 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1147 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1156 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1167 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1178 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1218 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_mmap() local
1221 if (!dmxdev->may_do_mmap) in dvb_demux_mmap()
1224 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_mmap()
1228 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1234 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1243 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1246 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1248 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1249 dmxdev->dvbdev->users--; in dvb_demux_release()
1250 if (dmxdev->dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_demux_release()
1251 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1252 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1254 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1287 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1291 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1296 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1301 ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1305 ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1309 ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1313 ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1314 if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_do_ioctl()
1315 ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx); in dvb_dvr_do_ioctl()
1319 ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1326 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1339 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1344 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1346 if (dmxdev->exit) in dvb_dvr_poll()
1348 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_poll()
1349 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait); in dvb_dvr_poll()
1352 dmxdev->may_do_mmap) { in dvb_dvr_poll()
1353 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1356 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1368 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_mmap() local
1371 if (!dmxdev->may_do_mmap) in dvb_dvr_mmap()
1374 if (dmxdev->exit) in dvb_dvr_mmap()
1377 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_mmap()
1380 ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma); in dvb_dvr_mmap()
1381 mutex_unlock(&dmxdev->mutex); in dvb_dvr_mmap()
1409 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1413 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1416 dmxdev->filter = vmalloc(array_size(sizeof(struct dmxdev_filter), in dvb_dmxdev_init()
1417 dmxdev->filternum)); in dvb_dmxdev_init()
1418 if (!dmxdev->filter) in dvb_dmxdev_init()
1421 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1422 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1423 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1424 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1425 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1426 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1430 ret = dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1431 DVB_DEVICE_DEMUX, dmxdev->filternum); in dvb_dmxdev_init()
1435 ret = dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1436 dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); in dvb_dmxdev_init()
1440 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1445 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_init()
1447 vfree(dmxdev->filter); in dvb_dmxdev_init()
1448 dmxdev->filter = NULL; in dvb_dmxdev_init()
1454 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1456 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_release()
1457 dmxdev->exit = 1; in dvb_dmxdev_release()
1458 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_release()
1460 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1461 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1462 dmxdev->dvbdev->users == 1); in dvb_dmxdev_release()
1464 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1465 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1466 dmxdev->dvr_dvbdev->users == 1); in dvb_dmxdev_release()
1469 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1470 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1472 vfree(dmxdev->filter); in dvb_dmxdev_release()
1473 dmxdev->filter = NULL; in dvb_dmxdev_release()
1474 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()