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()
531 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_feed_restart() local
534 for (i = 0; i < dmxdev->filternum; i++) in dvb_dmxdev_feed_restart()
535 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_feed_restart()
536 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_feed_restart()
537 dmxdev->filter[i].params.sec.pid == pid) { in dvb_dmxdev_feed_restart()
538 dvb_dmxdev_feed_start(&dmxdev->filter[i]); in dvb_dmxdev_feed_restart()
542 filter->dev->demux->release_section_feed(dmxdev->demux, in dvb_dmxdev_feed_restart()
612 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, in dvb_dmxdev_start_feed() argument
641 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts, in dvb_dmxdev_start_feed()
651 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
657 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
666 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_filter_start() local
700 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_filter_start()
701 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_filter_start()
702 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_filter_start()
703 dmxdev->filter[i].params.sec.pid == para->pid) { in dvb_dmxdev_filter_start()
704 *secfeed = dmxdev->filter[i].feed.sec; in dvb_dmxdev_filter_start()
711 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, in dvb_dmxdev_filter_start()
766 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_filter_start()
784 struct dmxdev *dmxdev = dvbdev->priv; in dvb_demux_open() local
788 if (!dmxdev->filter) in dvb_demux_open()
791 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_open()
794 if (dmxdev->exit) { in dvb_demux_open()
795 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
799 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
800 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
803 if (i == dmxdev->filternum) { in dvb_demux_open()
804 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
808 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
813 dmxdev->may_do_mmap = 1; in dvb_demux_open()
815 dmxdev->may_do_mmap = 0; in dvb_demux_open()
827 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
831 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
834 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
847 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
849 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
856 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
868 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
890 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
895 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
917 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
938 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
957 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
1034 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
1038 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
1044 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1056 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1065 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1068 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1074 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1077 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1083 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1091 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1095 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1099 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1103 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1114 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1123 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1130 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1139 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1148 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1157 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1168 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1179 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1219 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_mmap() local
1222 if (!dmxdev->may_do_mmap) in dvb_demux_mmap()
1225 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_mmap()
1229 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1235 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1244 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1247 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1249 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1250 dmxdev->dvbdev->users--; in dvb_demux_release()
1251 if (dmxdev->dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_demux_release()
1252 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1253 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1255 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1288 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1292 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1297 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1302 ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1306 ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1310 ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1314 ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1315 if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_do_ioctl()
1316 ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx); in dvb_dvr_do_ioctl()
1320 ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1327 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1340 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1345 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1347 if (dmxdev->exit) in dvb_dvr_poll()
1349 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_poll()
1350 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait); in dvb_dvr_poll()
1353 dmxdev->may_do_mmap) { in dvb_dvr_poll()
1354 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1357 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1369 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_mmap() local
1372 if (!dmxdev->may_do_mmap) in dvb_dvr_mmap()
1375 if (dmxdev->exit) in dvb_dvr_mmap()
1378 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_mmap()
1381 ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma); in dvb_dvr_mmap()
1382 mutex_unlock(&dmxdev->mutex); in dvb_dvr_mmap()
1410 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1414 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1417 dmxdev->filter = vmalloc(array_size(sizeof(struct dmxdev_filter), in dvb_dmxdev_init()
1418 dmxdev->filternum)); in dvb_dmxdev_init()
1419 if (!dmxdev->filter) in dvb_dmxdev_init()
1422 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1423 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1424 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1425 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1426 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1427 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1431 ret = dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1432 DVB_DEVICE_DEMUX, dmxdev->filternum); in dvb_dmxdev_init()
1436 ret = dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1437 dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); in dvb_dmxdev_init()
1441 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1446 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_init()
1448 vfree(dmxdev->filter); in dvb_dmxdev_init()
1449 dmxdev->filter = NULL; in dvb_dmxdev_init()
1455 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1457 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_release()
1458 dmxdev->exit = 1; in dvb_dmxdev_release()
1459 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_release()
1461 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1462 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1463 dmxdev->dvbdev->users == 1); in dvb_dmxdev_release()
1465 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1466 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1467 dmxdev->dvr_dvbdev->users == 1); in dvb_dmxdev_release()
1470 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1471 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1473 vfree(dmxdev->filter); in dvb_dmxdev_release()
1474 dmxdev->filter = NULL; in dvb_dmxdev_release()
1475 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()