summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/pcl812.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi/drivers/pcl812.c')
-rw-r--r--drivers/staging/comedi/drivers/pcl812.c65
1 files changed, 19 insertions, 46 deletions
diff --git a/drivers/staging/comedi/drivers/pcl812.c b/drivers/staging/comedi/drivers/pcl812.c
index 560930e6a8e9..cd02786702c8 100644
--- a/drivers/staging/comedi/drivers/pcl812.c
+++ b/drivers/staging/comedi/drivers/pcl812.c
@@ -1041,28 +1041,6 @@ static void start_pacer(struct comedi_device *dev, int mode,
/*
==============================================================================
*/
-static void free_resources(struct comedi_device *dev)
-{
- const struct pcl812_board *board = comedi_board(dev);
- struct pcl812_private *devpriv = dev->private;
-
- if (devpriv) {
- if (devpriv->dmabuf[0])
- free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
- if (devpriv->dmabuf[1])
- free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
- if (devpriv->dma)
- free_dma(devpriv->dma);
- }
- if (dev->irq)
- free_irq(dev->irq, dev);
- if (dev->iobase)
- release_region(dev->iobase, board->io_range);
-}
-
-/*
-==============================================================================
-*/
static int pcl812_ai_cancel(struct comedi_device *dev,
struct comedi_subdevice *s)
{
@@ -1122,32 +1100,21 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
const struct pcl812_board *board = comedi_board(dev);
struct pcl812_private *devpriv;
int ret, subdev;
- unsigned long iobase;
unsigned int irq;
unsigned int dma;
unsigned long pages;
struct comedi_subdevice *s;
int n_subdevices;
- iobase = it->options[0];
- printk(KERN_INFO "comedi%d: pcl812: board=%s, ioport=0x%03lx",
- dev->minor, board->name, iobase);
-
- if (!request_region(iobase, board->io_range, "pcl812")) {
- printk("I/O port conflict\n");
- return -EIO;
- }
- dev->iobase = iobase;
+ ret = comedi_request_region(dev, it->options[0], board->io_range);
+ if (ret)
+ return ret;
devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
- if (!devpriv) {
- free_resources(dev);
+ if (!devpriv)
return -ENOMEM;
- }
dev->private = devpriv;
- dev->board_name = board->name;
-
irq = 0;
if (board->IRQbits != 0) { /* board support IRQ */
irq = it->options[1];
@@ -1158,8 +1125,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
"DISABLING IT", irq);
irq = 0; /* Bad IRQ */
} else {
- if (request_irq
- (irq, interrupt_pcl812, 0, "pcl812", dev)) {
+ if (request_irq(irq, interrupt_pcl812, 0,
+ dev->board_name, dev)) {
printk
(", unable to allocate IRQ %u, "
"DISABLING IT", irq);
@@ -1183,7 +1150,7 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
printk(", DMA is out of allowed range, FAIL!\n");
return -EINVAL; /* Bad DMA */
}
- ret = request_dma(dma, "pcl812");
+ ret = request_dma(dma, dev->board_name);
if (ret) {
printk(KERN_ERR ", unable to allocate DMA %u, FAIL!\n",
dma);
@@ -1199,7 +1166,6 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
* maybe experiment with try_to_free_pages()
* will help ....
*/
- free_resources(dev);
return -EBUSY; /* no buffer :-( */
}
devpriv->dmapages[0] = pages;
@@ -1208,7 +1174,6 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
devpriv->dmabuf[1] = __get_dma_pages(GFP_KERNEL, pages);
if (!devpriv->dmabuf[1]) {
printk(KERN_ERR ", unable to allocate DMA buffer, FAIL!\n");
- free_resources(dev);
return -EBUSY;
}
devpriv->dmapages[1] = pages;
@@ -1228,10 +1193,8 @@ no_dma:
n_subdevices++;
ret = comedi_alloc_subdevices(dev, n_subdevices);
- if (ret) {
- free_resources(dev);
+ if (ret)
return ret;
- }
subdev = 0;
@@ -1465,7 +1428,17 @@ no_dma:
static void pcl812_detach(struct comedi_device *dev)
{
- free_resources(dev);
+ struct pcl812_private *devpriv = dev->private;
+
+ if (devpriv) {
+ if (devpriv->dmabuf[0])
+ free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
+ if (devpriv->dmabuf[1])
+ free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
+ if (devpriv->dma)
+ free_dma(devpriv->dma);
+ }
+ comedi_legacy_detach(dev);
}
static const struct pcl812_board boardtypes[] = {