staging: comedi: das16m1: tidy up the irq support in das16m1_attach()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 26 Nov 2013 23:41:43 +0000 (16:41 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Dec 2013 17:20:20 +0000 (09:20 -0800)
An irq is only needed by this driver in order to support async commands.
Since it is optional, modify the attach so that if an invalid irq is
selected by the user, or the request_irq() fails, the attach does not
fail.

Remove all the printk noise about the irq.

Only hookup the async command support if the request_irq() was successful.

Tidy up das16m1_irq_bits() a bit. This helper returns the value that needs
to be written to the DAS16M1_INTR_CONTROL register to setup the irq routing.

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 fce9acfe8084596d8c6f9b5c522c276a9ac0dd24..0081ee4f4dc11af36e7f4af551940799dd6d5591 100644 (file)
@@ -508,38 +508,26 @@ static irqreturn_t das16m1_interrupt(int irq, void *d)
 
 static int das16m1_irq_bits(unsigned int irq)
 {
-       int ret;
-
        switch (irq) {
        case 10:
-               ret = 0x0;
-               break;
+               return 0x0;
        case 11:
-               ret = 0x1;
-               break;
+               return 0x1;
        case 12:
-               ret = 0x2;
-               break;
+               return 0x2;
        case 15:
-               ret = 0x3;
-               break;
+               return 0x3;
        case 2:
-               ret = 0x4;
-               break;
+               return 0x4;
        case 3:
-               ret = 0x5;
-               break;
+               return 0x5;
        case 5:
-               ret = 0x6;
-               break;
+               return 0x6;
        case 7:
-               ret = 0x7;
-               break;
+               return 0x7;
        default:
-               return -1;
-               break;
+               return 0x0;
        }
-       return ret << 4;
 }
 
 /*
@@ -553,7 +541,6 @@ static int das16m1_attach(struct comedi_device *dev,
        struct das16m1_private_struct *devpriv;
        struct comedi_subdevice *s;
        int ret;
-       unsigned int irq;
 
        devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
        if (!devpriv)
@@ -569,24 +556,12 @@ static int das16m1_attach(struct comedi_device *dev,
                return ret;
        devpriv->extra_iobase = dev->iobase + DAS16M1_82C55;
 
-       /* now for the irq */
-       irq = it->options[1];
-       /*  make sure it is valid */
-       if (das16m1_irq_bits(irq) >= 0) {
-               ret = request_irq(irq, das16m1_interrupt, 0,
-                                 dev->driver->driver_name, dev);
-               if (ret < 0)
-                       return ret;
-               dev->irq = irq;
-               printk
-                   ("irq %u\n", irq);
-       } else if (irq == 0) {
-               printk
-                   (", no irq\n");
-       } else {
-               comedi_error(dev, "invalid irq\n"
-                            " valid irqs are 2, 3, 5, 7, 10, 11, 12, or 15\n");
-               return -EINVAL;
+       /* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */
+       if ((1 << it->options[1]) & 0xdcfc) {
+               ret = request_irq(it->options[1], das16m1_interrupt, 0,
+                                 dev->board_name, dev);
+               if (ret == 0)
+                       dev->irq = it->options[1];
        }
 
        ret = comedi_alloc_subdevices(dev, 4);
@@ -594,20 +569,22 @@ static int das16m1_attach(struct comedi_device *dev,
                return ret;
 
        s = &dev->subdevices[0];
-       dev->read_subdev = s;
        /* ai */
        s->type = COMEDI_SUBD_AI;
-       s->subdev_flags = SDF_READABLE | SDF_CMD_READ;
+       s->subdev_flags = SDF_READABLE | SDF_DIFF;
        s->n_chan = 8;
-       s->subdev_flags = SDF_DIFF;
-       s->len_chanlist = 256;
        s->maxdata = (1 << 12) - 1;
        s->range_table = &range_das16m1;
        s->insn_read = das16m1_ai_rinsn;
-       s->do_cmdtest = das16m1_cmd_test;
-       s->do_cmd = das16m1_cmd_exec;
-       s->cancel = das16m1_cancel;
-       s->poll = das16m1_poll;
+       if (dev->irq) {
+               dev->read_subdev = s;
+               s->subdev_flags |= SDF_CMD_READ;
+               s->len_chanlist = 256;
+               s->do_cmdtest = das16m1_cmd_test;
+               s->do_cmd = das16m1_cmd_exec;
+               s->cancel = das16m1_cancel;
+               s->poll = das16m1_poll;
+       }
 
        s = &dev->subdevices[1];
        /* di */
@@ -640,10 +617,7 @@ static int das16m1_attach(struct comedi_device *dev,
        outb(0, dev->iobase + DAS16M1_DIO);
 
        /* set the interrupt level */
-       if (dev->irq)
-               devpriv->control_state = das16m1_irq_bits(dev->irq);
-       else
-               devpriv->control_state = 0;
+       devpriv->control_state = das16m1_irq_bits(dev->irq) << 4;
        outb(devpriv->control_state, dev->iobase + DAS16M1_INTR_CONTROL);
 
        return 0;