staging: comedi: drivers: propogate errno from subdev_8255_init()

The initialization of the 8255 subdevice can fail due to the allocation
of the private data. Make sure all callers of subdev_8255_init() propogate
the errno.

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>
This commit is contained in:
H Hartley Sweeten 2014-02-03 10:43:25 -07:00 committed by Greg Kroah-Hartman
parent 52a1c19d8b
commit e6439a458a
7 changed files with 38 additions and 21 deletions

View file

@ -1130,10 +1130,12 @@ static int pci_dio_auto_attach(struct comedi_device *dev,
for (i = 0; i < MAX_DIO_SUBDEVG; i++)
for (j = 0; j < this_board->sdio[i].regs; j++) {
s = &dev->subdevices[subdev];
subdev_8255_init(dev, s, NULL,
dev->iobase +
this_board->sdio[i].addr +
SIZE_8255 * j);
ret = subdev_8255_init(dev, s, NULL,
dev->iobase +
this_board->sdio[i].addr +
SIZE_8255 * j);
if (ret)
return ret;
subdev++;
}

View file

@ -3816,16 +3816,19 @@ static int setup_subdevices(struct comedi_device *dev)
if (thisboard->has_8255) {
if (thisboard->layout == LAYOUT_4020) {
dio_8255_iobase = devpriv->main_iobase + I8255_4020_REG;
subdev_8255_init(dev, s, dio_callback_4020,
(unsigned long)dio_8255_iobase);
ret = subdev_8255_init(dev, s, dio_callback_4020,
(unsigned long)dio_8255_iobase);
} else {
dio_8255_iobase =
devpriv->dio_counter_iobase + DIO_8255_OFFSET;
subdev_8255_init(dev, s, dio_callback,
(unsigned long)dio_8255_iobase);
ret = subdev_8255_init(dev, s, dio_callback,
(unsigned long)dio_8255_iobase);
}
} else
if (ret)
return ret;
} else {
s->type = COMEDI_SUBD_UNUSED;
}
/* 8 channel dio for 60xx */
s = &dev->subdevices[5];

View file

@ -247,7 +247,9 @@ static int cb_pcimdas_auto_attach(struct comedi_device *dev,
s = &dev->subdevices[2];
/* digital i/o subdevice */
subdev_8255_init(dev, s, NULL, iobase_8255);
ret = subdev_8255_init(dev, s, NULL, iobase_8255);
if (ret)
return ret;
dev_info(dev->class_dev, "%s attached\n", dev->board_name);

View file

@ -529,9 +529,10 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
s = &dev->subdevices[4];
/* 8255 */
if (thisboard->i8255_offset != 0) {
subdev_8255_init(dev, s, NULL, (unsigned long)(dev->iobase +
thisboard->
i8255_offset));
ret = subdev_8255_init(dev, s, NULL,
dev->iobase + thisboard->i8255_offset);
if (ret)
return ret;
} else {
s->type = COMEDI_SUBD_UNUSED;
}

View file

@ -723,10 +723,13 @@ static int atmio16d_attach(struct comedi_device *dev,
/* 8255 subdevice */
s = &dev->subdevices[3];
if (board->has_8255)
subdev_8255_init(dev, s, NULL, dev->iobase);
else
if (board->has_8255) {
ret = subdev_8255_init(dev, s, NULL, dev->iobase);
if (ret)
return ret;
} else {
s->type = COMEDI_SUBD_UNUSED;
}
/* don't yet know how to deal with counter/timers */
#if 0

View file

@ -4292,10 +4292,14 @@ static int ni_E_init(struct comedi_device *dev)
/* 8255 device */
s = &dev->subdevices[NI_8255_DIO_SUBDEV];
if (board->has_8255)
subdev_8255_init(dev, s, ni_8255_callback, (unsigned long)dev);
else
if (board->has_8255) {
ret = subdev_8255_init(dev, s, ni_8255_callback,
(unsigned long)dev);
if (ret)
return ret;
} else {
s->type = COMEDI_SUBD_UNUSED;
}
/* formerly general purpose counter/timer device, but no longer used */
s = &dev->subdevices[NI_UNUSED_SUBDEV];

View file

@ -225,8 +225,10 @@ static int pcm3724_attach(struct comedi_device *dev,
for (i = 0; i < dev->n_subdevices; i++) {
s = &dev->subdevices[i];
subdev_8255_init(dev, s, subdev_8255_cb,
(unsigned long)(dev->iobase + SIZE_8255 * i));
ret = subdev_8255_init(dev, s, subdev_8255_cb,
dev->iobase + SIZE_8255 * i);
if (ret)
return ret;
s->insn_config = subdev_3724_insn_config;
}
return 0;