--- margi2/cvdv.c 2001/03/15 15:58:16 1.10 +++ margi2/cvdv.c 2001/03/19 23:49:15 1.11 @@ -546,15 +546,11 @@ int DecoderWriteBlock(struct cvdv_cards // Char Device Procedures // // // ////////////////////////////// -static long margi_write(struct video_device *dev, const char *data, +static long margi_write(struct cvdv_cards *card, const char *data, unsigned long count, int nonblock) { - struct cvdv_cards *card = (struct cvdv_cards*)dev; - struct StreamSetup *setup = &card->setup; -// int i; -// int laststart=-1; -// int B3=0, B5=0, C0=0, E0=0, BD=0, BF=0; + int res; int channel=0; long int out=0; @@ -569,7 +565,7 @@ static long margi_write(struct video_dev if ((setup->streamtype != stream_ES) && (setup->streamtype != stream_PES)) channel = 0; -// only ES and PES come in separate streams + switch (channel) { case 0: if (!card->use_ring) @@ -584,10 +580,6 @@ static long margi_write(struct video_dev } if (card->nonblock) { out = MargiPush(card, count, data); - if (card->DMAABusy){ - interruptible_sleep_on(&card->wqA); - } - } break; @@ -612,7 +604,7 @@ static ssize_t PSwrite(struct file *file { struct cvdv_cards *card = minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 - return margi_write((struct video_device *)card, data, count, 0); + return margi_write(card, data, count, 1); } @@ -622,8 +614,7 @@ static unsigned int PSpoll(struct file * minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 if (card != NULL) { poll_wait(file, &card->wqA , table); - if ( ring_write_rest(&(card->rbuf)) && - card->videostate.playState==VIDEO_PLAYING) + if ( ring_write_rest(&(card->rbuf)) ) return POLLOUT | POLLWRNORM; else return 0; } else @@ -631,13 +622,6 @@ static unsigned int PSpoll(struct file * } -static int margi_ioctl(struct video_device *dev, unsigned int cmd, void *arg) -{ - // struct cvdv_cards *card = (struct cvdv_cards*)dev; - return 0; -} - - static int PSioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { @@ -731,8 +715,6 @@ static int PSioctl(struct inode *inode, } case IOCTL_DECODER: command = (struct decodercmd *) arg; - printk(KERN_DEBUG LOGNAME ":IOCTL: _IOC_TYPE:%d IOC_NR:%d cmd:%d\n", - _IOC_TYPE(cmd),_IOC_NR(cmd),command->cmd); switch (command->cmd) { case Decoder_CSS: @@ -955,10 +937,8 @@ static int PSmmap(struct file *file, str -static int margi_open(struct video_device *dev, int flags) +static int margi_open(struct cvdv_cards *card, int flags) { - struct cvdv_cards *card = (struct cvdv_cards*)dev; - int closed; if (card != NULL) { printk(KERN_DEBUG LOGNAME ": -- open \n"); @@ -982,7 +962,7 @@ static int margi_open(struct video_devic VideoSetBackground(card, 1, 0, 0, 0); // black } card->open++; - //MOD_INC_USE_COUNT; + MOD_INC_USE_COUNT; return 0; } else { printk(KERN_ERR LOGNAME @@ -995,52 +975,26 @@ static int margi_open(struct video_devic static int PSopen(struct inode *inode, struct file *file) { - struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16 - return margi_open((struct video_device *) card,1); + struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; + return margi_open(card,0); } -static int all_margi_close(struct video_device *dev) +static int all_margi_close(struct cvdv_cards *card) { - struct cvdv_cards *card = (struct cvdv_cards*)dev; - - int closed; - int count; - count = ring_read_rest(&(card->rbuf)); - if (count > 0 ) card->DMAABusy = 1; + if (card != NULL) { printk(KERN_DEBUG LOGNAME ": -- PSrelease\n"); - if (!card->open) + if (card->open <= 0) printk(KERN_DEBUG LOGNAME ": PSrelease - not open\n"); card->open--; - //MOD_DEC_USE_COUNT; + MOD_DEC_USE_COUNT; if (!card->open) { - closed = 1; - if (closed) { // last close() for this card? - printk(KERN_DEBUG LOGNAME - ": PSrelease - last close\n"); - // flush remaining data - - card->channelApos = 0; - card->channelBpos = 0; - - if ((card->DMAABusy || card->DMABBusy - || count >1000 ) && - (card->intdecodestatus)) { - // ongoing DMA? - printk(KERN_DEBUG LOGNAME - ": Delayed closing: A=%d B=%d\n", - card->DMAABusy, - card->DMABBusy); - card->closing = 1; // then delay closing until DMA finished, - } else { // otherwise - CloseCard(card); // close immediately - printk(KERN_DEBUG LOGNAME - ": closing now\n"); - } - } + printk(KERN_DEBUG LOGNAME + ": PSrelease - last close\n"); + CloseCard(card); // close immediately } return 0; } else { @@ -1051,16 +1005,10 @@ static int all_margi_close(struct video } - -static void margi_close(struct video_device *dev) -{ - all_margi_close(dev); -} - static int PSrelease(struct inode *inode, struct file *file) { struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16 - return all_margi_close((struct video_device *)card); + return all_margi_close(card); } ////////////////////////// @@ -1079,30 +1027,6 @@ struct file_operations cvdv_fileops = { release: PSrelease, }; -static int margi_init_done(struct video_device *dev) -{ - printk(KERN_ERR "margi: margi_init_done called\n"); - return 0; -} - -static int margi_mmap(struct video_device *dev, - const char *adr, unsigned long size) -{ - return 0; -} - -static struct video_device margi_template = { - name: "Margi MPEG2 Decoder", - type: (VID_TYPE_MPEG_DECODER|VID_TYPE_OVERLAY), - open: margi_open, - close: margi_close, - write: margi_write, - ioctl: margi_ioctl, - mmap: margi_mmap, - initialize: margi_init_done, -}; - - #ifdef DVB @@ -1139,7 +1063,7 @@ dvbdev_open(struct dvb_device *dvbdev, i card->video_blank=true; card->audiostate.AVSyncState=true; card->videostate.streamSource=VIDEO_SOURCE_DEMUX; - margi_open((struct video_device *) card, 0); + margi_open(card, 0); break; case DVB_DEVICE_AUDIO_0: @@ -1181,12 +1105,10 @@ dvbdev_close(struct dvb_device *dvbdev, switch (type) { case DVB_DEVICE_VIDEO_0: - all_margi_close((struct video_device *)card); - break; - case DVB_DEVICE_AUDIO_0: - all_margi_close((struct video_device *)card); - break; + if (card->open) + all_margi_close(card); + break; case DVB_DEVICE_DEMUX_0: ret=DmxDevFilterFree(&card->dmxdev, file); @@ -1220,7 +1142,7 @@ dvbdev_write(struct dvb_device *dvbdev, case DVB_DEVICE_VIDEO_0: if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY) return -EPERM; - return margi_write((struct video_device *)card, buf, count, + return margi_write(card, buf, count, file->f_flags&O_NONBLOCK); case DVB_DEVICE_AUDIO_0: @@ -1535,16 +1457,6 @@ dvbdev_device_type(struct dvb_device *dv ******************************************************************************/ -void v4l_init(struct cvdv_cards *card) -{ - - memcpy( &card->video, &margi_template, sizeof(struct video_device)); - - if( 0 > (video_register_device(&card->video, VFL_TYPE_GRABBER))) { - printk(KERN_ERR "margi: can't register videodevice\n"); - } -} - #ifdef DVB #define INFU 32768