To make the attach a bit cleaner, factor the board init code
out of attach_pci() into a new function.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/s626.c | 246 +++++++++++++++++-----------------
 1 file changed, 126 insertions(+), 120 deletions(-)

diff --git a/drivers/staging/comedi/drivers/s626.c 
b/drivers/staging/comedi/drivers/s626.c
index 4ad3f27..cbae8e4 100644
--- a/drivers/staging/comedi/drivers/s626.c
+++ b/drivers/staging/comedi/drivers/s626.c
@@ -2464,7 +2464,7 @@ static int s626_allocate_dma_buffers(struct comedi_device 
*dev)
        return 0;
 }
 
-static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev)
+static void s626_initialize(struct comedi_device *dev)
 {
 /*   uint8_t   PollList; */
 /*   uint16_t  AdcData; */
@@ -2472,125 +2472,6 @@ static int s626_attach_pci(struct comedi_device *dev, 
struct pci_dev *pcidev)
 /*   uint16_t  index; */
 /*   unsigned int data[16]; */
        int i;
-       int ret;
-       struct comedi_subdevice *s;
-
-       comedi_set_hw_dev(dev, &pcidev->dev);
-       dev->board_name = dev->driver->driver_name;
-
-       if (alloc_private(dev, sizeof(struct s626_private)) < 0)
-               return -ENOMEM;
-
-       ret = comedi_pci_enable(pcidev, dev->board_name);
-       if (ret)
-               return ret;
-       dev->iobase = 1;        /* detach needs this */
-
-       devpriv->base_addr = ioremap(pci_resource_start(pcidev, 0),
-                                    pci_resource_len(pcidev, 0));
-       if (!devpriv->base_addr)
-               return -ENOMEM;
-
-       /* disable master interrupt */
-       writel(0, devpriv->base_addr + P_IER);
-
-       /* soft reset */
-       writel(MC1_SOFT_RESET, devpriv->base_addr + P_MC1);
-
-       /* DMA FIXME DMA// */
-
-       ret = s626_allocate_dma_buffers(dev);
-       if (ret)
-               return ret;
-
-       if (pcidev->irq) {
-               ret = request_irq(pcidev->irq, s626_irq_handler, IRQF_SHARED,
-                                 dev->board_name, dev);
-
-               if (ret == 0)
-                       dev->irq = pcidev->irq;
-       }
-
-       ret = comedi_alloc_subdevices(dev, 6);
-       if (ret)
-               return ret;
-
-       s = dev->subdevices + 0;
-       /* analog input subdevice */
-       dev->read_subdev = s;
-       /* we support single-ended (ground) and differential */
-       s->type = COMEDI_SUBD_AI;
-       s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_CMD_READ;
-       s->n_chan = S626_ADC_CHANNELS;
-       s->maxdata = (0xffff >> 2);
-       s->range_table = &s626_range_table;
-       s->len_chanlist = S626_ADC_CHANNELS;
-       s->insn_config = s626_ai_insn_config;
-       s->insn_read = s626_ai_insn_read;
-       s->do_cmd = s626_ai_cmd;
-       s->do_cmdtest = s626_ai_cmdtest;
-       s->cancel = s626_ai_cancel;
-
-       s = dev->subdevices + 1;
-       /* analog output subdevice */
-       s->type = COMEDI_SUBD_AO;
-       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
-       s->n_chan = S626_DAC_CHANNELS;
-       s->maxdata = (0x3fff);
-       s->range_table = &range_bipolar10;
-       s->insn_write = s626_ao_winsn;
-       s->insn_read = s626_ao_rinsn;
-
-       s = dev->subdevices + 2;
-       /* digital I/O subdevice */
-       s->type = COMEDI_SUBD_DIO;
-       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
-       s->n_chan = 16;
-       s->maxdata = 1;
-       s->io_bits = 0xffff;
-       s->private = &dio_private_A;
-       s->range_table = &range_digital;
-       s->insn_config = s626_dio_insn_config;
-       s->insn_bits = s626_dio_insn_bits;
-
-       s = dev->subdevices + 3;
-       /* digital I/O subdevice */
-       s->type = COMEDI_SUBD_DIO;
-       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
-       s->n_chan = 16;
-       s->maxdata = 1;
-       s->io_bits = 0xffff;
-       s->private = &dio_private_B;
-       s->range_table = &range_digital;
-       s->insn_config = s626_dio_insn_config;
-       s->insn_bits = s626_dio_insn_bits;
-
-       s = dev->subdevices + 4;
-       /* digital I/O subdevice */
-       s->type = COMEDI_SUBD_DIO;
-       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
-       s->n_chan = 16;
-       s->maxdata = 1;
-       s->io_bits = 0xffff;
-       s->private = &dio_private_C;
-       s->range_table = &range_digital;
-       s->insn_config = s626_dio_insn_config;
-       s->insn_bits = s626_dio_insn_bits;
-
-       s = dev->subdevices + 5;
-       /* encoder (counter) subdevice */
-       s->type = COMEDI_SUBD_COUNTER;
-       s->subdev_flags = SDF_WRITABLE | SDF_READABLE | SDF_LSAMPL;
-       s->n_chan = S626_ENCODER_CHANNELS;
-       s->private = enc_private_data;
-       s->insn_config = s626_enc_insn_config;
-       s->insn_read = s626_enc_insn_read;
-       s->insn_write = s626_enc_insn_write;
-       s->maxdata = 0xffffff;
-       s->range_table = &range_unknown;
-
-       /* stop ai_command */
-       devpriv->ai_cmd_running = 0;
 
        if (devpriv->allocatedBuf == 2) {
                dma_addr_t pPhysBuf;
@@ -2846,6 +2727,131 @@ static int s626_attach_pci(struct comedi_device *dev, 
struct pci_dev *pcidev)
                /* enable interrupt test */
                /*  writel(IRQ_GPIO3 | IRQ_RPS1,devpriv->base_addr+P_IER); */
        }
+}
+
+static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev)
+{
+       struct comedi_subdevice *s;
+       int ret;
+
+       comedi_set_hw_dev(dev, &pcidev->dev);
+       dev->board_name = dev->driver->driver_name;
+
+       if (alloc_private(dev, sizeof(struct s626_private)) < 0)
+               return -ENOMEM;
+
+       ret = comedi_pci_enable(pcidev, dev->board_name);
+       if (ret)
+               return ret;
+       dev->iobase = 1;        /* detach needs this */
+
+       devpriv->base_addr = ioremap(pci_resource_start(pcidev, 0),
+                                    pci_resource_len(pcidev, 0));
+       if (!devpriv->base_addr)
+               return -ENOMEM;
+
+       /* disable master interrupt */
+       writel(0, devpriv->base_addr + P_IER);
+
+       /* soft reset */
+       writel(MC1_SOFT_RESET, devpriv->base_addr + P_MC1);
+
+       /* DMA FIXME DMA// */
+
+       ret = s626_allocate_dma_buffers(dev);
+       if (ret)
+               return ret;
+
+       if (pcidev->irq) {
+               ret = request_irq(pcidev->irq, s626_irq_handler, IRQF_SHARED,
+                                 dev->board_name, dev);
+
+               if (ret == 0)
+                       dev->irq = pcidev->irq;
+       }
+
+       ret = comedi_alloc_subdevices(dev, 6);
+       if (ret)
+               return ret;
+
+       s = dev->subdevices + 0;
+       /* analog input subdevice */
+       dev->read_subdev = s;
+       /* we support single-ended (ground) and differential */
+       s->type = COMEDI_SUBD_AI;
+       s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_CMD_READ;
+       s->n_chan = S626_ADC_CHANNELS;
+       s->maxdata = (0xffff >> 2);
+       s->range_table = &s626_range_table;
+       s->len_chanlist = S626_ADC_CHANNELS;
+       s->insn_config = s626_ai_insn_config;
+       s->insn_read = s626_ai_insn_read;
+       s->do_cmd = s626_ai_cmd;
+       s->do_cmdtest = s626_ai_cmdtest;
+       s->cancel = s626_ai_cancel;
+
+       s = dev->subdevices + 1;
+       /* analog output subdevice */
+       s->type = COMEDI_SUBD_AO;
+       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
+       s->n_chan = S626_DAC_CHANNELS;
+       s->maxdata = (0x3fff);
+       s->range_table = &range_bipolar10;
+       s->insn_write = s626_ao_winsn;
+       s->insn_read = s626_ao_rinsn;
+
+       s = dev->subdevices + 2;
+       /* digital I/O subdevice */
+       s->type = COMEDI_SUBD_DIO;
+       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
+       s->n_chan = 16;
+       s->maxdata = 1;
+       s->io_bits = 0xffff;
+       s->private = &dio_private_A;
+       s->range_table = &range_digital;
+       s->insn_config = s626_dio_insn_config;
+       s->insn_bits = s626_dio_insn_bits;
+
+       s = dev->subdevices + 3;
+       /* digital I/O subdevice */
+       s->type = COMEDI_SUBD_DIO;
+       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
+       s->n_chan = 16;
+       s->maxdata = 1;
+       s->io_bits = 0xffff;
+       s->private = &dio_private_B;
+       s->range_table = &range_digital;
+       s->insn_config = s626_dio_insn_config;
+       s->insn_bits = s626_dio_insn_bits;
+
+       s = dev->subdevices + 4;
+       /* digital I/O subdevice */
+       s->type = COMEDI_SUBD_DIO;
+       s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
+       s->n_chan = 16;
+       s->maxdata = 1;
+       s->io_bits = 0xffff;
+       s->private = &dio_private_C;
+       s->range_table = &range_digital;
+       s->insn_config = s626_dio_insn_config;
+       s->insn_bits = s626_dio_insn_bits;
+
+       s = dev->subdevices + 5;
+       /* encoder (counter) subdevice */
+       s->type = COMEDI_SUBD_COUNTER;
+       s->subdev_flags = SDF_WRITABLE | SDF_READABLE | SDF_LSAMPL;
+       s->n_chan = S626_ENCODER_CHANNELS;
+       s->private = enc_private_data;
+       s->insn_config = s626_enc_insn_config;
+       s->insn_read = s626_enc_insn_read;
+       s->insn_write = s626_enc_insn_write;
+       s->maxdata = 0xffffff;
+       s->range_table = &range_unknown;
+
+       /* stop ai_command */
+       devpriv->ai_cmd_running = 0;
+
+       s626_initialize(dev);
 
        return 1;
 }
-- 
1.7.11

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to