mirror of https://gitee.com/openkylin/linux.git
staging: comedi: s626: factor out the board init code
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 <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8c7e4277c1
commit
80ec951029
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue