• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/media/dvb/dvb-core/

Lines Matching defs:dmxdev

2  * dmxdev.c - DVB demultiplexer device
34 #include "dmxdev.h"
55 dprintk("dmxdev: buffer overflow\n");
128 struct dmxdev *dmxdev = dvbdev->priv;
133 if (mutex_lock_interruptible(&dmxdev->mutex))
136 if (dmxdev->exit) {
137 mutex_unlock(&dmxdev->mutex);
142 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) {
143 mutex_unlock(&dmxdev->mutex);
151 mutex_unlock(&dmxdev->mutex);
156 mutex_unlock(&dmxdev->mutex);
159 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
164 dmxdev->dvr_orig_fe = dmxdev->demux->frontend;
166 if (!dmxdev->demux->write) {
167 mutex_unlock(&dmxdev->mutex);
171 front = get_fe(dmxdev->demux, DMX_MEMORY_FE);
174 mutex_unlock(&dmxdev->mutex);
177 dmxdev->demux->disconnect_frontend(dmxdev->demux);
178 dmxdev->demux->connect_frontend(dmxdev->demux, front);
181 mutex_unlock(&dmxdev->mutex);
188 struct dmxdev *dmxdev = dvbdev->priv;
190 mutex_lock(&dmxdev->mutex);
193 dmxdev->demux->disconnect_frontend(dmxdev->demux);
194 dmxdev->demux->connect_frontend(dmxdev->demux,
195 dmxdev->dvr_orig_fe);
199 if (dmxdev->dvr_buffer.data) {
200 void *mem = dmxdev->dvr_buffer.data;
202 spin_lock_irq(&dmxdev->lock);
203 dmxdev->dvr_buffer.data = NULL;
204 spin_unlock_irq(&dmxdev->lock);
210 if (dvbdev->users == 1 && dmxdev->exit == 1) {
213 mutex_unlock(&dmxdev->mutex);
216 mutex_unlock(&dmxdev->mutex);
225 struct dmxdev *dmxdev = dvbdev->priv;
228 if (!dmxdev->demux->write)
232 if (mutex_lock_interruptible(&dmxdev->mutex))
235 if (dmxdev->exit) {
236 mutex_unlock(&dmxdev->mutex);
239 ret = dmxdev->demux->write(dmxdev->demux, buf, count);
240 mutex_unlock(&dmxdev->mutex);
248 struct dmxdev *dmxdev = dvbdev->priv;
250 if (dmxdev->exit)
253 return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer,
258 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev,
261 struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer;
278 spin_lock_irq(&dmxdev->lock);
284 spin_unlock_irq(&dmxdev->lock);
375 dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n",
486 struct dmxdev *dmxdev = filter->dev;
489 for (i = 0; i < dmxdev->filternum; i++)
490 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
491 dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
492 dmxdev->filter[i].params.sec.pid == pid) {
493 dvb_dmxdev_feed_start(&dmxdev->filter[i]);
497 filter->dev->demux->release_section_feed(dmxdev->demux,
567 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
596 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts,
606 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
612 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
621 struct dmxdev *dmxdev = filter->dev;
655 for (i = 0; i < dmxdev->filternum; i++) {
656 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
657 dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
658 dmxdev->filter[i].params.sec.pid == para->pid) {
659 *secfeed = dmxdev->filter[i].feed.sec;
666 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux,
721 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed);
739 struct dmxdev *dmxdev = dvbdev->priv;
743 if (!dmxdev->filter)
746 if (mutex_lock_interruptible(&dmxdev->mutex))
749 for (i = 0; i < dmxdev->filternum; i++)
750 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE)
753 if (i == dmxdev->filternum) {
754 mutex_unlock(&dmxdev->mutex);
758 dmxdevfilter = &dmxdev->filter[i];
769 mutex_unlock(&dmxdev->mutex);
773 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev,
776 mutex_lock(&dmxdev->mutex);
785 spin_lock_irq(&dmxdev->lock);
787 spin_unlock_irq(&dmxdev->lock);
794 mutex_unlock(&dmxdev->mutex);
806 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev,
828 return dvb_dmxdev_start_feed(dmxdev, filter, feed);
833 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev,
855 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev,
875 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev,
894 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter,
971 struct dmxdev *dmxdev = dmxdevfilter->dev;
975 if (mutex_lock_interruptible(&dmxdev->mutex))
981 mutex_unlock(&dmxdev->mutex);
993 mutex_unlock(&dmxdev->mutex);
1002 mutex_unlock(&dmxdev->mutex);
1005 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg);
1011 mutex_unlock(&dmxdev->mutex);
1014 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg);
1020 mutex_unlock(&dmxdev->mutex);
1028 if (!dmxdev->demux->get_pes_pids) {
1032 dmxdev->demux->get_pes_pids(dmxdev->demux, parg);
1036 if (!dmxdev->demux->get_caps) {
1040 ret = dmxdev->demux->get_caps(dmxdev->demux, parg);
1044 if (!dmxdev->demux->set_source) {
1048 ret = dmxdev->demux->set_source(dmxdev->demux, parg);
1052 if (!dmxdev->demux->get_stc) {
1056 ret = dmxdev->demux->get_stc(dmxdev->demux,
1067 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1076 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1084 mutex_unlock(&dmxdev->mutex);
1127 struct dmxdev *dmxdev = dmxdevfilter->dev;
1131 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
1133 mutex_lock(&dmxdev->mutex);
1134 dmxdev->dvbdev->users--;
1135 if(dmxdev->dvbdev->users==1 && dmxdev->exit==1) {
1138 mutex_unlock(&dmxdev->mutex);
1139 wake_up(&dmxdev->dvbdev->wait_queue);
1141 mutex_unlock(&dmxdev->mutex);
1166 struct dmxdev *dmxdev = dvbdev->priv;
1170 if (mutex_lock_interruptible(&dmxdev->mutex))
1175 ret = dvb_dvr_set_buffer_size(dmxdev, arg);
1182 mutex_unlock(&dmxdev->mutex);
1201 struct dmxdev *dmxdev = dvbdev->priv;
1206 poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
1209 if (dmxdev->dvr_buffer.error)
1212 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer))
1237 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
1241 if (dmxdev->demux->open(dmxdev->demux) < 0)
1244 dmxdev->filter = vmalloc(dmxdev->filternum * sizeof(struct dmxdev_filter));
1245 if (!dmxdev->filter)
1248 mutex_init(&dmxdev->mutex);
1249 spin_lock_init(&dmxdev->lock);
1250 for (i = 0; i < dmxdev->filternum; i++) {
1251 dmxdev->filter[i].dev = dmxdev;
1252 dmxdev->filter[i].buffer.data = NULL;
1253 dvb_dmxdev_filter_state_set(&dmxdev->filter[i],
1257 dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev,
1259 dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr,
1260 dmxdev, DVB_DEVICE_DVR);
1262 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
1269 void dvb_dmxdev_release(struct dmxdev *dmxdev)
1271 dmxdev->exit=1;
1272 if (dmxdev->dvbdev->users > 1) {
1273 wait_event(dmxdev->dvbdev->wait_queue,
1274 dmxdev->dvbdev->users==1);
1276 if (dmxdev->dvr_dvbdev->users > 1) {
1277 wait_event(dmxdev->dvr_dvbdev->wait_queue,
1278 dmxdev->dvr_dvbdev->users==1);
1281 dvb_unregister_device(dmxdev->dvbdev);
1282 dvb_unregister_device(dmxdev->dvr_dvbdev);
1284 vfree(dmxdev->filter);
1285 dmxdev->filter = NULL;
1286 dmxdev->demux->close(dmxdev->demux);