staging: comedi: das16m1: convert munge_sample_array() into a subdevice (*munge)
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 3 May 2016 19:30:01 +0000 (12:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 18 Jun 2016 03:42:21 +0000 (20:42 -0700)
For aesthetics, convert this function into a subdevice (*munge) function and let
the comedi core handle the munging.

Add a comment about why the data needs to be munged.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/das16m1.c

index c0f279638cd87762f46622de3eb89c2bb6b56806..a8030326980f45e99ed16142363a44077469567c 100644 (file)
@@ -127,11 +127,21 @@ static void das16m1_ai_set_queue(struct comedi_device *dev,
        }
 }
 
-static void munge_sample_array(unsigned short *array, unsigned int num_elements)
+static void das16m1_ai_munge(struct comedi_device *dev,
+                            struct comedi_subdevice *s,
+                            void *data, unsigned int num_bytes,
+                            unsigned int start_chan_index)
 {
+       unsigned short *array = data;
+       unsigned int nsamples = comedi_bytes_to_samples(s, num_bytes);
        unsigned int i;
 
-       for (i = 0; i < num_elements; i++)
+       /*
+        * The fifo values have the channel number in the lower 4-bits and
+        * the sample in the upper 12-bits. This just shifts the values
+        * to remove the channel numbers.
+        */
+       for (i = 0; i < nsamples; i++)
                array[i] = DAS16M1_AI_TO_SAMPLE(array[i]);
 }
 
@@ -410,7 +420,6 @@ static void das16m1_handler(struct comedi_device *dev, unsigned int status)
        if (num_samples > DAS16M1_AI_FIFO_SZ)
                num_samples = DAS16M1_AI_FIFO_SZ;
        insw(dev->iobase, devpriv->ai_buffer, num_samples);
-       munge_sample_array(devpriv->ai_buffer, num_samples);
        comedi_buf_write_samples(s, devpriv->ai_buffer, num_samples);
        devpriv->adc_count += num_samples;
 
@@ -560,6 +569,7 @@ static int das16m1_attach(struct comedi_device *dev,
                s->do_cmd       = das16m1_ai_cmd;
                s->cancel       = das16m1_ai_cancel;
                s->poll         = das16m1_ai_poll;
+               s->munge        = das16m1_ai_munge;
        }
 
        /* Digital Input subdevice */