struct pci9111_private_data *dev_private = dev->private;
        struct comedi_cmd *async_cmd = &s->async->cmd;
 
-       if (!dev->irq) {
-               comedi_error(dev,
-                            "no irq assigned for PCI9111, cannot do hardware conversion");
-               return -1;
-       }
        /*  Set channel scan limit */
        /*  PCI9111 allows only scanning from channel 0 to channel n */
        /*  TODO: handle the case of an external multiplexer */
 
        pci9111_reset(dev);
 
-       if (pcidev->irq > 0) {
+       if (pcidev->irq) {
                ret = request_irq(pcidev->irq, pci9111_interrupt,
                                  IRQF_SHARED, dev->board_name, dev);
-               if (ret)
-                       return ret;
-               dev->irq = pcidev->irq;
+               if (ret == 0)
+                       dev->irq = pcidev->irq;
        }
 
        ret = comedi_alloc_subdevices(dev, 4);
                return ret;
 
        s = &dev->subdevices[0];
-       dev->read_subdev = s;
        s->type         = COMEDI_SUBD_AI;
-       s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_CMD_READ;
+       s->subdev_flags = SDF_READABLE | SDF_COMMON;
        s->n_chan       = 16;
        s->maxdata      = 0xffff;
-       s->len_chanlist = 16;
        s->range_table  = &pci9111_ai_range;
-       s->cancel       = pci9111_ai_cancel;
        s->insn_read    = pci9111_ai_insn_read;
-       s->do_cmdtest   = pci9111_ai_do_cmd_test;
-       s->do_cmd       = pci9111_ai_do_cmd;
-       s->munge        = pci9111_ai_munge;
+       if (dev->irq) {
+               dev->read_subdev = s;
+               s->subdev_flags |= SDF_CMD_READ;
+               s->len_chanlist = s->n_chan;
+               s->do_cmdtest   = pci9111_ai_do_cmd_test;
+               s->do_cmd       = pci9111_ai_do_cmd;
+               s->cancel       = pci9111_ai_cancel;
+               s->munge        = pci9111_ai_munge;
+       }
 
        s = &dev->subdevices[1];
        s->type         = COMEDI_SUBD_AO;