static int contec_attach(struct comedi_device *dev, struct comedi_devconfig *it) { struct pci_dev *pcidev; struct comedi_subdevice *s; int ret; printk("comedi%d: contec: ", dev->minor); dev->board_name = thisboard->name; ret = comedi_alloc_subdevices(dev, 2); if (ret) return ret; pcidev = contec_find_pci_dev(dev, it); if (!pcidev) return -EIO; comedi_set_hw_dev(dev, &pcidev->dev); if (comedi_pci_enable(pcidev, "contec_pci_dio")) { printk("error enabling PCI device and request regions!\n"); return -EIO; } dev->iobase = pci_resource_start(pcidev, 0); printk(" base addr %lx ", dev->iobase); s = dev->subdevices + 0; s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE; s->n_chan = 16; s->maxdata = 1; s->range_table = &range_digital; s->insn_bits = contec_di_insn_bits; s = dev->subdevices + 1; s->type = COMEDI_SUBD_DO; s->subdev_flags = SDF_WRITABLE; s->n_chan = 16; s->maxdata = 1; s->range_table = &range_digital; s->insn_bits = contec_do_insn_bits; printk("attached\n"); return 1; }
static int nidio_attach(struct comedi_device *dev, struct comedi_devconfig *it) { struct comedi_subdevice *s; int i; int ret; int n_subdevices; unsigned int irq; printk("comedi%d: nidio:", dev->minor); if ((ret = alloc_private(dev, sizeof(struct nidio96_private))) < 0) return ret; spin_lock_init(&devpriv->mite_channel_lock); ret = nidio_find_device(dev, it->options[0], it->options[1]); if (ret < 0) return ret; ret = mite_setup(devpriv->mite); if (ret < 0) { printk("error setting up mite\n"); return ret; } comedi_set_hw_dev(dev, &devpriv->mite->pcidev->dev); devpriv->di_mite_ring = mite_alloc_ring(devpriv->mite); if (devpriv->di_mite_ring == NULL) return -ENOMEM; dev->board_name = this_board->name; irq = mite_irq(devpriv->mite); printk(" %s", dev->board_name); if (this_board->uses_firmware) { ret = pci_6534_upload_firmware(dev, it->options); if (ret < 0) return ret; } if (!this_board->is_diodaq) { n_subdevices = this_board->n_8255; } else { n_subdevices = 1; } if ((ret = alloc_subdevices(dev, n_subdevices)) < 0) return ret; if (!this_board->is_diodaq) { for (i = 0; i < this_board->n_8255; i++) { subdev_8255_init(dev, dev->subdevices + i, nidio96_8255_cb, (unsigned long)(devpriv->mite-> daq_io_addr + NIDIO_8255_BASE(i))); } } else { printk(" rev=%d", readb(devpriv->mite->daq_io_addr + Chip_Version)); s = dev->subdevices + 0; dev->read_subdev = s; s->type = COMEDI_SUBD_DIO; s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_LSAMPL | SDF_PACKED | SDF_CMD_READ; s->n_chan = 32; s->range_table = &range_digital; s->maxdata = 1; s->insn_config = &ni_pcidio_insn_config; s->insn_bits = &ni_pcidio_insn_bits; s->do_cmd = &ni_pcidio_cmd; s->do_cmdtest = &ni_pcidio_cmdtest; s->cancel = &ni_pcidio_cancel; s->len_chanlist = 32; s->buf_change = &ni_pcidio_change; s->async_dma_dir = DMA_BIDIRECTIONAL; writel(0, devpriv->mite->daq_io_addr + Port_IO(0)); writel(0, devpriv->mite->daq_io_addr + Port_Pin_Directions(0)); writel(0, devpriv->mite->daq_io_addr + Port_Pin_Mask(0)); writeb(0x00, devpriv->mite->daq_io_addr + Master_DMA_And_Interrupt_Control); ret = request_irq(irq, nidio_interrupt, IRQF_SHARED, "ni_pcidio", dev); if (ret < 0) { printk(" irq not available"); } dev->irq = irq; } printk("\n"); return 0; }
static int ni_atmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) { const struct ni_board_struct *boardtype; struct pnp_dev *isapnp_dev; int ret; unsigned long iobase; int board; unsigned int irq; ret = ni_alloc_private(dev); if (ret) return ret; iobase = it->options[0]; irq = it->options[1]; isapnp_dev = NULL; if (iobase == 0) { ret = ni_isapnp_find_board(&isapnp_dev); if (ret < 0) return ret; iobase = pnp_port_start(isapnp_dev, 0); irq = pnp_irq(isapnp_dev, 0); comedi_set_hw_dev(dev, &isapnp_dev->dev); } ret = comedi_request_region(dev, iobase, 0x20); if (ret) return ret; /* get board type */ board = ni_getboardtype(dev); if (board < 0) return -EIO; dev->board_ptr = ni_boards + board; boardtype = dev->board_ptr; dev->board_name = boardtype->name; /* irq stuff */ if (irq != 0) { if (irq > 15 || ni_irqpin[irq] == -1) return -EINVAL; ret = request_irq(irq, ni_E_interrupt, 0, dev->board_name, dev); if (ret < 0) return -EINVAL; dev->irq = irq; } /* generic E series stuff in ni_mio_common.c */ ret = ni_E_init(dev, ni_irqpin[dev->irq], 0); if (ret < 0) return ret; return 0; }