Lines Matching refs:dmxdev
129 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_open() local
135 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_open()
138 if (dmxdev->exit) { in dvb_dvr_open()
139 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
143 dmxdev->may_do_mmap = 0; in dvb_dvr_open()
158 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { in dvb_dvr_open()
160 dmxdev->may_do_mmap = 1; in dvb_dvr_open()
163 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
173 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
178 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
181 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); in dvb_dvr_open()
182 if (dmxdev->may_do_mmap) in dvb_dvr_open()
183 dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr", in dvb_dvr_open()
189 dmxdev->dvr_orig_fe = dmxdev->demux->frontend; in dvb_dvr_open()
191 if (!dmxdev->demux->write) { in dvb_dvr_open()
192 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
196 front = get_fe(dmxdev->demux, DMX_MEMORY_FE); in dvb_dvr_open()
199 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
202 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_open()
203 dmxdev->demux->connect_frontend(dmxdev->demux, front); in dvb_dvr_open()
206 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
213 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_release() local
215 mutex_lock(&dmxdev->mutex); in dvb_dvr_release()
218 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_release()
219 dmxdev->demux->connect_frontend(dmxdev->demux, in dvb_dvr_release()
220 dmxdev->dvr_orig_fe); in dvb_dvr_release()
224 dmxdev->may_do_mmap) { in dvb_dvr_release()
225 if (dmxdev->may_do_mmap) { in dvb_dvr_release()
226 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_release()
227 dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx); in dvb_dvr_release()
228 dvb_vb2_release(&dmxdev->dvr_vb2_ctx); in dvb_dvr_release()
231 if (dmxdev->dvr_buffer.data) { in dvb_dvr_release()
232 void *mem = dmxdev->dvr_buffer.data; in dvb_dvr_release()
235 spin_lock_irq(&dmxdev->lock); in dvb_dvr_release()
236 dmxdev->dvr_buffer.data = NULL; in dvb_dvr_release()
237 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_release()
243 if (dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_dvr_release()
244 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
247 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
256 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_write() local
259 if (!dmxdev->demux->write) in dvb_dvr_write()
263 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_write()
266 if (dmxdev->exit) { in dvb_dvr_write()
267 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
270 ret = dmxdev->demux->write(dmxdev->demux, buf, count); in dvb_dvr_write()
271 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
279 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_read() local
281 if (dmxdev->exit) in dvb_dvr_read()
284 return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, in dvb_dvr_read()
289 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, in dvb_dvr_set_buffer_size() argument
292 struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer; in dvb_dvr_set_buffer_size()
309 spin_lock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
315 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
540 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_feed_restart() local
543 for (i = 0; i < dmxdev->filternum; i++) in dvb_dmxdev_feed_restart()
544 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_feed_restart()
545 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_feed_restart()
546 dmxdev->filter[i].params.sec.pid == pid) { in dvb_dmxdev_feed_restart()
547 dvb_dmxdev_feed_start(&dmxdev->filter[i]); in dvb_dmxdev_feed_restart()
551 filter->dev->demux->release_section_feed(dmxdev->demux, in dvb_dmxdev_feed_restart()
621 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, in dvb_dmxdev_start_feed() argument
650 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts, in dvb_dmxdev_start_feed()
660 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
666 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
675 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_filter_start() local
709 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_filter_start()
710 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_filter_start()
711 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_filter_start()
712 dmxdev->filter[i].params.sec.pid == para->pid) { in dvb_dmxdev_filter_start()
713 *secfeed = dmxdev->filter[i].feed.sec; in dvb_dmxdev_filter_start()
720 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, in dvb_dmxdev_filter_start()
775 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_filter_start()
793 struct dmxdev *dmxdev = dvbdev->priv; in dvb_demux_open() local
797 if (!dmxdev->filter) in dvb_demux_open()
800 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_open()
803 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
804 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
807 if (i == dmxdev->filternum) { in dvb_demux_open()
808 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
812 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
817 dmxdev->may_do_mmap = 1; in dvb_demux_open()
819 dmxdev->may_do_mmap = 0; in dvb_demux_open()
831 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
835 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
838 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
851 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
853 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
860 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
872 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
894 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
899 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
921 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
942 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
961 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
1038 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
1042 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
1048 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1060 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1069 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1072 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1078 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1081 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1087 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1095 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1099 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1103 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1107 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1118 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1127 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1134 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1143 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1152 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1161 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1172 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1183 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1223 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_mmap() local
1226 if (!dmxdev->may_do_mmap) in dvb_demux_mmap()
1229 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_mmap()
1233 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1239 mutex_unlock(&dmxdev->mutex); in dvb_demux_mmap()
1248 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1251 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1253 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1254 dmxdev->dvbdev->users--; in dvb_demux_release()
1255 if (dmxdev->dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_demux_release()
1256 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1257 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1259 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1292 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1296 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1301 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1306 ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1310 ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1314 ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1318 ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1319 if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_do_ioctl()
1320 ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx); in dvb_dvr_do_ioctl()
1324 ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg); in dvb_dvr_do_ioctl()
1331 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1344 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1349 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1351 if (dmxdev->exit) in dvb_dvr_poll()
1353 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) in dvb_dvr_poll()
1354 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait); in dvb_dvr_poll()
1357 dmxdev->may_do_mmap) { in dvb_dvr_poll()
1358 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1361 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1373 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_mmap() local
1376 if (!dmxdev->may_do_mmap) in dvb_dvr_mmap()
1379 if (dmxdev->exit) in dvb_dvr_mmap()
1382 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_mmap()
1385 ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma); in dvb_dvr_mmap()
1386 mutex_unlock(&dmxdev->mutex); in dvb_dvr_mmap()
1414 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1418 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1421 dmxdev->filter = vmalloc(array_size(sizeof(struct dmxdev_filter), in dvb_dmxdev_init()
1422 dmxdev->filternum)); in dvb_dmxdev_init()
1423 if (!dmxdev->filter) in dvb_dmxdev_init()
1426 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1427 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1428 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1429 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1430 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1431 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1435 dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1436 DVB_DEVICE_DEMUX, dmxdev->filternum); in dvb_dmxdev_init()
1437 dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1438 dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); in dvb_dmxdev_init()
1440 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1447 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1449 dmxdev->exit = 1; in dvb_dmxdev_release()
1450 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1451 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1452 dmxdev->dvbdev->users == 1); in dvb_dmxdev_release()
1454 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1455 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1456 dmxdev->dvr_dvbdev->users == 1); in dvb_dmxdev_release()
1459 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1460 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1462 vfree(dmxdev->filter); in dvb_dmxdev_release()
1463 dmxdev->filter = NULL; in dvb_dmxdev_release()
1464 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()