static int dio200_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 {
        const struct dio200_board *thisboard = comedi_board(dev);
-       struct dio200_private *devpriv;
        unsigned int irq;
        int ret;
 
        irq = it->options[1];
 
-       devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
-       if (!devpriv)
-               return -ENOMEM;
-
        ret = comedi_request_region(dev, it->options[0], thisboard->mainsize);
        if (ret)
                return ret;
 
 static irqreturn_t dio200_interrupt(int irq, void *d)
 {
        struct comedi_device *dev = d;
-       struct dio200_private *devpriv = dev->private;
-       struct comedi_subdevice *s;
+       struct comedi_subdevice *s = dev->read_subdev;
        int handled;
 
        if (!dev->attached)
                return IRQ_NONE;
 
-       if (devpriv->intr_sd >= 0) {
-               s = &dev->subdevices[devpriv->intr_sd];
-               handled = dio200_handle_read_intr(dev, s);
-       } else {
-               handled = 0;
-       }
+       handled = dio200_handle_read_intr(dev, s);
 
        return IRQ_RETVAL(handled);
 }
                               unsigned long req_irq_flags)
 {
        const struct dio200_board *thisboard = comedi_board(dev);
-       struct dio200_private *devpriv = dev->private;
        const struct dio200_layout *layout = dio200_board_layout(thisboard);
        struct comedi_subdevice *s;
-       int sdx;
        unsigned int n;
        int ret;
 
-       devpriv->intr_sd = -1;
-
        ret = comedi_alloc_subdevices(dev, layout->n_subdevs);
        if (ret)
                return ret;
                        break;
                case sd_intr:
                        /* 'INTERRUPT' subdevice */
-                       if (irq) {
+                       if (irq && !dev->read_subdev) {
                                ret = dio200_subdev_intr_init(dev, s,
                                                              DIO200_INT_SCE,
                                                              layout->sdinfo[n]
                                                             );
                                if (ret < 0)
                                        return ret;
-                               devpriv->intr_sd = n;
+                               dev->read_subdev = s;
                        } else {
                                s->type = COMEDI_SUBD_UNUSED;
                        }
                        break;
                }
        }
-       sdx = devpriv->intr_sd;
-       if (sdx >= 0 && sdx < dev->n_subdevices)
-               dev->read_subdev = &dev->subdevices[sdx];
-       if (irq) {
+
+       if (irq && dev->read_subdev) {
                if (request_irq(irq, dio200_interrupt, req_irq_flags,
                                dev->board_name, dev) >= 0) {
                        dev->irq = irq;
 
 {
        struct pci_dev *pci_dev = comedi_to_pci_dev(dev);
        const struct dio200_board *thisboard = NULL;
-       struct dio200_private *devpriv;
        unsigned int bar;
        int ret;
 
        dev_info(dev->class_dev, "%s: attach pci %s (%s)\n",
                 dev->driver->driver_name, pci_name(pci_dev), dev->board_name);
 
-       devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
-       if (!devpriv)
-               return -ENOMEM;
-
        ret = comedi_pci_enable(dev);
        if (ret)
                return ret;