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()
474 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_feed_restart() local
477 for (i = 0; i < dmxdev->filternum; i++) in dvb_dmxdev_feed_restart()
478 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_feed_restart()
479 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_feed_restart()
480 dmxdev->filter[i].params.sec.pid == pid) { in dvb_dmxdev_feed_restart()
481 dvb_dmxdev_feed_start(&dmxdev->filter[i]); in dvb_dmxdev_feed_restart()
485 filter->dev->demux->release_section_feed(dmxdev->demux, in dvb_dmxdev_feed_restart()
555 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, in dvb_dmxdev_start_feed() argument
584 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts, in dvb_dmxdev_start_feed()
594 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
600 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); in dvb_dmxdev_start_feed()
609 struct dmxdev *dmxdev = filter->dev; in dvb_dmxdev_filter_start() local
643 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_filter_start()
644 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO && in dvb_dmxdev_filter_start()
645 dmxdev->filter[i].type == DMXDEV_TYPE_SEC && in dvb_dmxdev_filter_start()
646 dmxdev->filter[i].params.sec.pid == para->pid) { in dvb_dmxdev_filter_start()
647 *secfeed = dmxdev->filter[i].feed.sec; in dvb_dmxdev_filter_start()
654 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux, in dvb_dmxdev_filter_start()
709 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_filter_start()
727 struct dmxdev *dmxdev = dvbdev->priv; in dvb_demux_open() local
731 if (!dmxdev->filter) in dvb_demux_open()
734 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_open()
737 for (i = 0; i < dmxdev->filternum; i++) in dvb_demux_open()
738 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) in dvb_demux_open()
741 if (i == dmxdev->filternum) { in dvb_demux_open()
742 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
746 dmxdevfilter = &dmxdev->filter[i]; in dvb_demux_open()
757 mutex_unlock(&dmxdev->mutex); in dvb_demux_open()
761 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, in dvb_dmxdev_filter_free() argument
764 mutex_lock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
773 spin_lock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
775 spin_unlock_irq(&dmxdev->lock); in dvb_dmxdev_filter_free()
782 mutex_unlock(&dmxdev->mutex); in dvb_dmxdev_filter_free()
794 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev, in dvb_dmxdev_add_pid() argument
816 return dvb_dmxdev_start_feed(dmxdev, filter, feed); in dvb_dmxdev_add_pid()
821 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev, in dvb_dmxdev_remove_pid() argument
843 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_filter_set() argument
864 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, in dvb_dmxdev_pes_filter_set() argument
883 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, in dvb_dmxdev_pes_filter_set()
960 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_do_ioctl() local
964 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_demux_do_ioctl()
970 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
982 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
991 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
994 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1000 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1003 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg); in dvb_demux_do_ioctl()
1009 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1017 if (!dmxdev->demux->get_pes_pids) { in dvb_demux_do_ioctl()
1021 dmxdev->demux->get_pes_pids(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1028 if (!dmxdev->demux->get_caps) { in dvb_demux_do_ioctl()
1032 ret = dmxdev->demux->get_caps(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1036 if (!dmxdev->demux->set_source) { in dvb_demux_do_ioctl()
1040 ret = dmxdev->demux->set_source(dmxdev->demux, parg); in dvb_demux_do_ioctl()
1045 if (!dmxdev->demux->get_stc) { in dvb_demux_do_ioctl()
1049 ret = dmxdev->demux->get_stc(dmxdev->demux, in dvb_demux_do_ioctl()
1060 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1069 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg); in dvb_demux_do_ioctl()
1077 mutex_unlock(&dmxdev->mutex); in dvb_demux_do_ioctl()
1114 struct dmxdev *dmxdev = dmxdevfilter->dev; in dvb_demux_release() local
1118 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter); in dvb_demux_release()
1120 mutex_lock(&dmxdev->mutex); in dvb_demux_release()
1121 dmxdev->dvbdev->users--; in dvb_demux_release()
1122 if(dmxdev->dvbdev->users==1 && dmxdev->exit==1) { in dvb_demux_release()
1123 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1124 wake_up(&dmxdev->dvbdev->wait_queue); in dvb_demux_release()
1126 mutex_unlock(&dmxdev->mutex); in dvb_demux_release()
1155 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_do_ioctl() local
1159 if (mutex_lock_interruptible(&dmxdev->mutex)) in dvb_dvr_do_ioctl()
1164 ret = dvb_dvr_set_buffer_size(dmxdev, arg); in dvb_dvr_do_ioctl()
1171 mutex_unlock(&dmxdev->mutex); in dvb_dvr_do_ioctl()
1184 struct dmxdev *dmxdev = dvbdev->priv; in dvb_dvr_poll() local
1189 if (dmxdev->exit) in dvb_dvr_poll()
1192 poll_wait(file, &dmxdev->dvr_buffer.queue, wait); in dvb_dvr_poll()
1195 if (dmxdev->dvr_buffer.error) in dvb_dvr_poll()
1198 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer)) in dvb_dvr_poll()
1226 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) in dvb_dmxdev_init() argument
1230 if (dmxdev->demux->open(dmxdev->demux) < 0) in dvb_dmxdev_init()
1233 dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter)); in dvb_dmxdev_init()
1234 if (!dmxdev->filter) in dvb_dmxdev_init()
1237 mutex_init(&dmxdev->mutex); in dvb_dmxdev_init()
1238 spin_lock_init(&dmxdev->lock); in dvb_dmxdev_init()
1239 for (i = 0; i < dmxdev->filternum; i++) { in dvb_dmxdev_init()
1240 dmxdev->filter[i].dev = dmxdev; in dvb_dmxdev_init()
1241 dmxdev->filter[i].buffer.data = NULL; in dvb_dmxdev_init()
1242 dvb_dmxdev_filter_state_set(&dmxdev->filter[i], in dvb_dmxdev_init()
1246 dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, in dvb_dmxdev_init()
1248 dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, in dvb_dmxdev_init()
1249 dmxdev, DVB_DEVICE_DVR); in dvb_dmxdev_init()
1251 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); in dvb_dmxdev_init()
1258 void dvb_dmxdev_release(struct dmxdev *dmxdev) in dvb_dmxdev_release() argument
1260 dmxdev->exit=1; in dvb_dmxdev_release()
1261 if (dmxdev->dvbdev->users > 1) { in dvb_dmxdev_release()
1262 wait_event(dmxdev->dvbdev->wait_queue, in dvb_dmxdev_release()
1263 dmxdev->dvbdev->users==1); in dvb_dmxdev_release()
1265 if (dmxdev->dvr_dvbdev->users > 1) { in dvb_dmxdev_release()
1266 wait_event(dmxdev->dvr_dvbdev->wait_queue, in dvb_dmxdev_release()
1267 dmxdev->dvr_dvbdev->users==1); in dvb_dmxdev_release()
1270 dvb_unregister_device(dmxdev->dvbdev); in dvb_dmxdev_release()
1271 dvb_unregister_device(dmxdev->dvr_dvbdev); in dvb_dmxdev_release()
1273 vfree(dmxdev->filter); in dvb_dmxdev_release()
1274 dmxdev->filter = NULL; in dvb_dmxdev_release()
1275 dmxdev->demux->close(dmxdev->demux); in dvb_dmxdev_release()