Added support for a cmd_cleanup() callback on subdevices, which
authorFrank Mori Hess <fmhess@speakeasy.net>
Thu, 26 Apr 2007 14:54:10 +0000 (14:54 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Thu, 26 Apr 2007 14:54:10 +0000 (14:54 +0000)
is called when a command is finished.  Will be used to release
mite DMA channels when no longer in use.

comedi/comedi_fops.c
comedi/kcomedilib/kcomedilib_main.c
include/linux/comedidev.h

index d7eea148266108666e19088b42cb5131a2b02754..f9aceb0ba8e5fd7ebd02d971b010cbc819914dc6 100644 (file)
@@ -1550,16 +1550,21 @@ static ssize_t comedi_read(struct file * file,char *buf,size_t nbytes,loff_t *of
 void do_become_nonbusy(comedi_device *dev,comedi_subdevice *s)
 {
        comedi_async *async = s->async;
-       /* we do this because it's useful for the non-standard cases */
-       s->subdev_flags &= ~SDF_RUNNING;
 
+       s->subdev_flags &= ~SDF_RUNNING;
 #ifdef CONFIG_COMEDI_RT
        if(s->runflags&SRF_RT){
                comedi_switch_to_non_rt(dev);
                s->runflags &= ~SRF_RT;
        }
 #endif
-
+       if(s->busy)
+       {
+               if(s->cmd_cleanup)
+               {
+                       (*s->cmd_cleanup)(dev, s);
+               }
+       }
        if(async){
                comedi_reset_async_buf( async );
        }else{
index 195ebe7f9446dc63a047616d937a386d3c0498c0..2902ed891a70ffb4f8a1d7aa1efd1da9ddf2e61f 100644 (file)
@@ -424,7 +424,9 @@ int comedi_cancel(comedi_t *d,unsigned int subdevice)
                s->runflags &= ~SRF_RT;
                comedi_switch_to_non_rt(dev);
        }
-
+       // XXX cmd_cleanup() doesn't really belong here, but comedi_cancel() is the closest thing to
+       // do_become_nonbusy() in kcomedilib.
+       if(s->cmd_cleanup) s->cmd_cleanup(dev, s);
        s->busy=NULL;
 
        return 0;
index 6e33a42dd0391e3fea60fdb57d803911fc452dd0..8ad1e99e83f6598efb5e8e7f9d53bf76e8cc933c 100644 (file)
@@ -132,6 +132,7 @@ struct comedi_subdevice_struct{
 
        int (*do_cmd)(comedi_device *,comedi_subdevice *);
        int (*do_cmdtest)(comedi_device *,comedi_subdevice *,comedi_cmd *);
+       void (*cmd_cleanup)(comedi_device *, comedi_subdevice *);
        int (*poll)(comedi_device *,comedi_subdevice *);
        int (*cancel)(comedi_device *,comedi_subdevice *);
        //int (*do_lock)(comedi_device *,comedi_subdevice *);