aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-11-26 18:41:43 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-03 12:20:20 -0500
commit729988507680b2ce934bce61d9ce0ea7b235914c (patch)
tree6824db990591f1680e4948a8bbabd2b1d2eb8d91
parentb8cd7941a028891d2ca3d0927f9ed6ef4cf4c3e0 (diff)
staging: comedi: das16m1: tidy up the irq support in das16m1_attach()
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>
-rw-r--r--drivers/staging/comedi/drivers/das16m1.c78
1 files changed, 26 insertions, 52 deletions
diff --git a/drivers/staging/comedi/drivers/das16m1.c b/drivers/staging/comedi/drivers/das16m1.c
index fce9acfe8084..0081ee4f4dc1 100644
--- a/drivers/staging/comedi/drivers/das16m1.c
+++ b/drivers/staging/comedi/drivers/das16m1.c
@@ -508,38 +508,26 @@ static irqreturn_t das16m1_interrupt(int irq, void *d)
508 508
509static int das16m1_irq_bits(unsigned int irq) 509static int das16m1_irq_bits(unsigned int irq)
510{ 510{
511 int ret;
512
513 switch (irq) { 511 switch (irq) {
514 case 10: 512 case 10:
515 ret = 0x0; 513 return 0x0;
516 break;
517 case 11: 514 case 11:
518 ret = 0x1; 515 return 0x1;
519 break;
520 case 12: 516 case 12:
521 ret = 0x2; 517 return 0x2;
522 break;
523 case 15: 518 case 15:
524 ret = 0x3; 519 return 0x3;
525 break;
526 case 2: 520 case 2:
527 ret = 0x4; 521 return 0x4;
528 break;
529 case 3: 522 case 3:
530 ret = 0x5; 523 return 0x5;
531 break;
532 case 5: 524 case 5:
533 ret = 0x6; 525 return 0x6;
534 break;
535 case 7: 526 case 7:
536 ret = 0x7; 527 return 0x7;
537 break;
538 default: 528 default:
539 return -1; 529 return 0x0;
540 break;
541 } 530 }
542 return ret << 4;
543} 531}
544 532
545/* 533/*
@@ -553,7 +541,6 @@ static int das16m1_attach(struct comedi_device *dev,
553 struct das16m1_private_struct *devpriv; 541 struct das16m1_private_struct *devpriv;
554 struct comedi_subdevice *s; 542 struct comedi_subdevice *s;
555 int ret; 543 int ret;
556 unsigned int irq;
557 544
558 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv)); 545 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
559 if (!devpriv) 546 if (!devpriv)
@@ -569,24 +556,12 @@ static int das16m1_attach(struct comedi_device *dev,
569 return ret; 556 return ret;
570 devpriv->extra_iobase = dev->iobase + DAS16M1_82C55; 557 devpriv->extra_iobase = dev->iobase + DAS16M1_82C55;
571 558
572 /* now for the irq */ 559 /* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */
573 irq = it->options[1]; 560 if ((1 << it->options[1]) & 0xdcfc) {
574 /* make sure it is valid */ 561 ret = request_irq(it->options[1], das16m1_interrupt, 0,
575 if (das16m1_irq_bits(irq) >= 0) { 562 dev->board_name, dev);
576 ret = request_irq(irq, das16m1_interrupt, 0, 563 if (ret == 0)
577 dev->driver->driver_name, dev); 564 dev->irq = it->options[1];
578 if (ret < 0)
579 return ret;
580 dev->irq = irq;
581 printk
582 ("irq %u\n", irq);
583 } else if (irq == 0) {
584 printk
585 (", no irq\n");
586 } else {
587 comedi_error(dev, "invalid irq\n"
588 " valid irqs are 2, 3, 5, 7, 10, 11, 12, or 15\n");
589 return -EINVAL;
590 } 565 }
591 566
592 ret = comedi_alloc_subdevices(dev, 4); 567 ret = comedi_alloc_subdevices(dev, 4);
@@ -594,20 +569,22 @@ static int das16m1_attach(struct comedi_device *dev,
594 return ret; 569 return ret;
595 570
596 s = &dev->subdevices[0]; 571 s = &dev->subdevices[0];
597 dev->read_subdev = s;
598 /* ai */ 572 /* ai */
599 s->type = COMEDI_SUBD_AI; 573 s->type = COMEDI_SUBD_AI;
600 s->subdev_flags = SDF_READABLE | SDF_CMD_READ; 574 s->subdev_flags = SDF_READABLE | SDF_DIFF;
601 s->n_chan = 8; 575 s->n_chan = 8;
602 s->subdev_flags = SDF_DIFF;
603 s->len_chanlist = 256;
604 s->maxdata = (1 << 12) - 1; 576 s->maxdata = (1 << 12) - 1;
605 s->range_table = &range_das16m1; 577 s->range_table = &range_das16m1;
606 s->insn_read = das16m1_ai_rinsn; 578 s->insn_read = das16m1_ai_rinsn;
607 s->do_cmdtest = das16m1_cmd_test; 579 if (dev->irq) {
608 s->do_cmd = das16m1_cmd_exec; 580 dev->read_subdev = s;
609 s->cancel = das16m1_cancel; 581 s->subdev_flags |= SDF_CMD_READ;
610 s->poll = das16m1_poll; 582 s->len_chanlist = 256;
583 s->do_cmdtest = das16m1_cmd_test;
584 s->do_cmd = das16m1_cmd_exec;
585 s->cancel = das16m1_cancel;
586 s->poll = das16m1_poll;
587 }
611 588
612 s = &dev->subdevices[1]; 589 s = &dev->subdevices[1];
613 /* di */ 590 /* di */
@@ -640,10 +617,7 @@ static int das16m1_attach(struct comedi_device *dev,
640 outb(0, dev->iobase + DAS16M1_DIO); 617 outb(0, dev->iobase + DAS16M1_DIO);
641 618
642 /* set the interrupt level */ 619 /* set the interrupt level */
643 if (dev->irq) 620 devpriv->control_state = das16m1_irq_bits(dev->irq) << 4;
644 devpriv->control_state = das16m1_irq_bits(dev->irq);
645 else
646 devpriv->control_state = 0;
647 outb(devpriv->control_state, dev->iobase + DAS16M1_INTR_CONTROL); 621 outb(devpriv->control_state, dev->iobase + DAS16M1_INTR_CONTROL);
648 622
649 return 0; 623 return 0;