Lines Matching refs:dmxdev

126 	struct dmxdev *dmxdev = dvbdev->priv;  in dvb_dvr_open()  local
131 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_open()
134 if (dmxdev->exit) { in dvb_dvr_open()
135 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
140 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { in dvb_dvr_open()
141 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
149 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
154 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
157 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); in dvb_dvr_open()
162 dmxdev->dvr_orig_fe = dmxdev->demux->frontend; in dvb_dvr_open()
164 if (!dmxdev->demux->write) { in dvb_dvr_open()
165 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
169 front = get_fe(dmxdev->demux, DMX_MEMORY_FE); in dvb_dvr_open()
172 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
175 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_open()
176 dmxdev->demux->connect_frontend(dmxdev->demux, front); in dvb_dvr_open()
179 mutex_unlock(&dmxdev->mutex); in dvb_dvr_open()
186 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_release() local
188 mutex_lock(&dmxdev->mutex); in dvb_dvr_release()
191 dmxdev->demux->disconnect_frontend(dmxdev->demux); in dvb_dvr_release()
192 dmxdev->demux->connect_frontend(dmxdev->demux, in dvb_dvr_release()
193 dmxdev->dvr_orig_fe); in dvb_dvr_release()
197 if (dmxdev->dvr_buffer.data) { in dvb_dvr_release()
198 void *mem = dmxdev->dvr_buffer.data; in dvb_dvr_release()
200 spin_lock_irq(&dmxdev->lock); in dvb_dvr_release()
201 dmxdev->dvr_buffer.data = NULL; in dvb_dvr_release()
202 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_release()
208 if (dvbdev->users == 1 && dmxdev->exit == 1) { in dvb_dvr_release()
209 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
212 mutex_unlock(&dmxdev->mutex); in dvb_dvr_release()
221 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_write() local
224 if (!dmxdev->demux->write) in dvb_dvr_write()
228 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_write()
231 if (dmxdev->exit) { in dvb_dvr_write()
232 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
235 ret = dmxdev->demux->write(dmxdev->demux, buf, count); in dvb_dvr_write()
236 mutex_unlock(&dmxdev->mutex); in dvb_dvr_write()
244 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_read() local
246 if (dmxdev->exit) in dvb_dvr_read()
249 return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, in dvb_dvr_read()
254 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, in dvb_dvr_set_buffer_size() argument
257 struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer; in dvb_dvr_set_buffer_size()
274 spin_lock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
280 spin_unlock_irq(&dmxdev->lock); in dvb_dvr_set_buffer_size()
476 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_feed_restart() local
479 for (i = 0; i < dmxdev->filternum; i++) in dvb_dmxdev_feed_restart()
480 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_feed_restart()
481 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_feed_restart()
482 dmxdev->filter[i].params.sec.pid == pid) { in dvb_dmxdev_feed_restart()
483 dvb_dmxdev_feed_start(&dmxdev->filter[i]); in dvb_dmxdev_feed_restart()
487 filter->dev->demux->release_section_feed(dmxdev->demux, in dvb_dmxdev_feed_restart()
557 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, in dvb_dmxdev_start_feed() argument
586 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts, in dvb_dmxdev_start_feed()
596 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
602 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
611 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_filter_start() local
645 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_filter_start()
646 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_filter_start()
647 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_filter_start()
648 dmxdev->filter[i].params.sec.pid == para->pid) { in dvb_dmxdev_filter_start()
649 *secfeed = dmxdev->filter[i].feed.sec; in dvb_dmxdev_filter_start()
656 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, in dvb_dmxdev_filter_start()
711 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_filter_start()
729 struct dmxdev *dmxdev = dvbdev->priv; in dvb_demux_open() local
733 if (!dmxdev->filter) in dvb_demux_open()
736 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_open()
739 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
740 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
743 if (i == dmxdev->filternum) { in dvb_demux_open()
744 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
748 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
759 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
763 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
766 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
775 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
777 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
784 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
796 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
818 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
823 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
845 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
866 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
885 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
962 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
966 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
972 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
984 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
993 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
996 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1002 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1005 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1011 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1019 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1023 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1027 if (!dmxdev->demux->get_caps) { in dvb_demux_do_ioctl()
1031 ret = dmxdev->demux->get_caps(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1035 if (!dmxdev->demux->set_source) { in dvb_demux_do_ioctl()
1039 ret = dmxdev->demux->set_source(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1043 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1047 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1058 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1067 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1075 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1112 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1116 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1118 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1119 dmxdev->dvbdev->users--; in dvb_demux_release()
1120 if(dmxdev->dvbdev->users==1 && dmxdev->exit==1) { in dvb_demux_release()
1121 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1122 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1124 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1153 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1157 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1162 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1169 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1182 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1187 if (dmxdev->exit) in dvb_dvr_poll()
1190 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1193 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1196 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1224 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1228 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1231 dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter)); in dvb_dmxdev_init()
1232 if (!dmxdev->filter) in dvb_dmxdev_init()
1235 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1236 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1237 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1238 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1239 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1240 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1244 dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1246 dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1247 dmxdev, DVB_DEVICE_DVR); in dvb_dmxdev_init()
1249 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1256 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1258 dmxdev->exit=1; in dvb_dmxdev_release()
1259 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1260 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1261 dmxdev->dvbdev->users==1); in dvb_dmxdev_release()
1263 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1264 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1265 dmxdev->dvr_dvbdev->users==1); in dvb_dmxdev_release()
1268 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1269 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1271 vfree(dmxdev->filter); in dvb_dmxdev_release()
1272 dmxdev->filter = NULL; in dvb_dmxdev_release()
1273 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()