aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2012-09-24 16:24:27 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-26 12:37:31 -0400
commit80ec9510296224048021793b644eb9057c59df5a (patch)
tree8507be014685010fc2ad26344cc67a91e0f8feab
parent8c7e4277c1197d31c0b34dbaf23e6edddb5978f7 (diff)
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>
-rw-r--r--drivers/staging/comedi/drivers/s626.c246
1 files changed, 126 insertions, 120 deletions
diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c
index 4ad3f27b07c4..cbae8e4ba2e2 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)
2464 return 0; 2464 return 0;
2465} 2465}
2466 2466
2467static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev) 2467static void s626_initialize(struct comedi_device *dev)
2468{ 2468{
2469/* uint8_t PollList; */ 2469/* uint8_t PollList; */
2470/* uint16_t AdcData; */ 2470/* uint16_t AdcData; */
@@ -2472,125 +2472,6 @@ static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev)
2472/* uint16_t index; */ 2472/* uint16_t index; */
2473/* unsigned int data[16]; */ 2473/* unsigned int data[16]; */
2474 int i; 2474 int i;
2475 int ret;
2476 struct comedi_subdevice *s;
2477
2478 comedi_set_hw_dev(dev, &pcidev->dev);
2479 dev->board_name = dev->driver->driver_name;
2480
2481 if (alloc_private(dev, sizeof(struct s626_private)) < 0)
2482 return -ENOMEM;
2483
2484 ret = comedi_pci_enable(pcidev, dev->board_name);
2485 if (ret)
2486 return ret;
2487 dev->iobase = 1; /* detach needs this */
2488
2489 devpriv->base_addr = ioremap(pci_resource_start(pcidev, 0),
2490 pci_resource_len(pcidev, 0));
2491 if (!devpriv->base_addr)
2492 return -ENOMEM;
2493
2494 /* disable master interrupt */
2495 writel(0, devpriv->base_addr + P_IER);
2496
2497 /* soft reset */
2498 writel(MC1_SOFT_RESET, devpriv->base_addr + P_MC1);
2499
2500 /* DMA FIXME DMA// */
2501
2502 ret = s626_allocate_dma_buffers(dev);
2503 if (ret)
2504 return ret;
2505
2506 if (pcidev->irq) {
2507 ret = request_irq(pcidev->irq, s626_irq_handler, IRQF_SHARED,
2508 dev->board_name, dev);
2509
2510 if (ret == 0)
2511 dev->irq = pcidev->irq;
2512 }
2513
2514 ret = comedi_alloc_subdevices(dev, 6);
2515 if (ret)
2516 return ret;
2517
2518 s = dev->subdevices + 0;
2519 /* analog input subdevice */
2520 dev->read_subdev = s;
2521 /* we support single-ended (ground) and differential */
2522 s->type = COMEDI_SUBD_AI;
2523 s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_CMD_READ;
2524 s->n_chan = S626_ADC_CHANNELS;
2525 s->maxdata = (0xffff >> 2);
2526 s->range_table = &s626_range_table;
2527 s->len_chanlist = S626_ADC_CHANNELS;
2528 s->insn_config = s626_ai_insn_config;
2529 s->insn_read = s626_ai_insn_read;
2530 s->do_cmd = s626_ai_cmd;
2531 s->do_cmdtest = s626_ai_cmdtest;
2532 s->cancel = s626_ai_cancel;
2533
2534 s = dev->subdevices + 1;
2535 /* analog output subdevice */
2536 s->type = COMEDI_SUBD_AO;
2537 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2538 s->n_chan = S626_DAC_CHANNELS;
2539 s->maxdata = (0x3fff);
2540 s->range_table = &range_bipolar10;
2541 s->insn_write = s626_ao_winsn;
2542 s->insn_read = s626_ao_rinsn;
2543
2544 s = dev->subdevices + 2;
2545 /* digital I/O subdevice */
2546 s->type = COMEDI_SUBD_DIO;
2547 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2548 s->n_chan = 16;
2549 s->maxdata = 1;
2550 s->io_bits = 0xffff;
2551 s->private = &dio_private_A;
2552 s->range_table = &range_digital;
2553 s->insn_config = s626_dio_insn_config;
2554 s->insn_bits = s626_dio_insn_bits;
2555
2556 s = dev->subdevices + 3;
2557 /* digital I/O subdevice */
2558 s->type = COMEDI_SUBD_DIO;
2559 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2560 s->n_chan = 16;
2561 s->maxdata = 1;
2562 s->io_bits = 0xffff;
2563 s->private = &dio_private_B;
2564 s->range_table = &range_digital;
2565 s->insn_config = s626_dio_insn_config;
2566 s->insn_bits = s626_dio_insn_bits;
2567
2568 s = dev->subdevices + 4;
2569 /* digital I/O subdevice */
2570 s->type = COMEDI_SUBD_DIO;
2571 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2572 s->n_chan = 16;
2573 s->maxdata = 1;
2574 s->io_bits = 0xffff;
2575 s->private = &dio_private_C;
2576 s->range_table = &range_digital;
2577 s->insn_config = s626_dio_insn_config;
2578 s->insn_bits = s626_dio_insn_bits;
2579
2580 s = dev->subdevices + 5;
2581 /* encoder (counter) subdevice */
2582 s->type = COMEDI_SUBD_COUNTER;
2583 s->subdev_flags = SDF_WRITABLE | SDF_READABLE | SDF_LSAMPL;
2584 s->n_chan = S626_ENCODER_CHANNELS;
2585 s->private = enc_private_data;
2586 s->insn_config = s626_enc_insn_config;
2587 s->insn_read = s626_enc_insn_read;
2588 s->insn_write = s626_enc_insn_write;
2589 s->maxdata = 0xffffff;
2590 s->range_table = &range_unknown;
2591
2592 /* stop ai_command */
2593 devpriv->ai_cmd_running = 0;
2594 2475
2595 if (devpriv->allocatedBuf == 2) { 2476 if (devpriv->allocatedBuf == 2) {
2596 dma_addr_t pPhysBuf; 2477 dma_addr_t pPhysBuf;
@@ -2846,6 +2727,131 @@ static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev)
2846 /* enable interrupt test */ 2727 /* enable interrupt test */
2847 /* writel(IRQ_GPIO3 | IRQ_RPS1,devpriv->base_addr+P_IER); */ 2728 /* writel(IRQ_GPIO3 | IRQ_RPS1,devpriv->base_addr+P_IER); */
2848 } 2729 }
2730}
2731
2732static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev)
2733{
2734 struct comedi_subdevice *s;
2735 int ret;
2736
2737 comedi_set_hw_dev(dev, &pcidev->dev);
2738 dev->board_name = dev->driver->driver_name;
2739
2740 if (alloc_private(dev, sizeof(struct s626_private)) < 0)
2741 return -ENOMEM;
2742
2743 ret = comedi_pci_enable(pcidev, dev->board_name);
2744 if (ret)
2745 return ret;
2746 dev->iobase = 1; /* detach needs this */
2747
2748 devpriv->base_addr = ioremap(pci_resource_start(pcidev, 0),
2749 pci_resource_len(pcidev, 0));
2750 if (!devpriv->base_addr)
2751 return -ENOMEM;
2752
2753 /* disable master interrupt */
2754 writel(0, devpriv->base_addr + P_IER);
2755
2756 /* soft reset */
2757 writel(MC1_SOFT_RESET, devpriv->base_addr + P_MC1);
2758
2759 /* DMA FIXME DMA// */
2760
2761 ret = s626_allocate_dma_buffers(dev);
2762 if (ret)
2763 return ret;
2764
2765 if (pcidev->irq) {
2766 ret = request_irq(pcidev->irq, s626_irq_handler, IRQF_SHARED,
2767 dev->board_name, dev);
2768
2769 if (ret == 0)
2770 dev->irq = pcidev->irq;
2771 }
2772
2773 ret = comedi_alloc_subdevices(dev, 6);
2774 if (ret)
2775 return ret;
2776
2777 s = dev->subdevices + 0;
2778 /* analog input subdevice */
2779 dev->read_subdev = s;
2780 /* we support single-ended (ground) and differential */
2781 s->type = COMEDI_SUBD_AI;
2782 s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_CMD_READ;
2783 s->n_chan = S626_ADC_CHANNELS;
2784 s->maxdata = (0xffff >> 2);
2785 s->range_table = &s626_range_table;
2786 s->len_chanlist = S626_ADC_CHANNELS;
2787 s->insn_config = s626_ai_insn_config;
2788 s->insn_read = s626_ai_insn_read;
2789 s->do_cmd = s626_ai_cmd;
2790 s->do_cmdtest = s626_ai_cmdtest;
2791 s->cancel = s626_ai_cancel;
2792
2793 s = dev->subdevices + 1;
2794 /* analog output subdevice */
2795 s->type = COMEDI_SUBD_AO;
2796 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2797 s->n_chan = S626_DAC_CHANNELS;
2798 s->maxdata = (0x3fff);
2799 s->range_table = &range_bipolar10;
2800 s->insn_write = s626_ao_winsn;
2801 s->insn_read = s626_ao_rinsn;
2802
2803 s = dev->subdevices + 2;
2804 /* digital I/O subdevice */
2805 s->type = COMEDI_SUBD_DIO;
2806 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2807 s->n_chan = 16;
2808 s->maxdata = 1;
2809 s->io_bits = 0xffff;
2810 s->private = &dio_private_A;
2811 s->range_table = &range_digital;
2812 s->insn_config = s626_dio_insn_config;
2813 s->insn_bits = s626_dio_insn_bits;
2814
2815 s = dev->subdevices + 3;
2816 /* digital I/O subdevice */
2817 s->type = COMEDI_SUBD_DIO;
2818 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2819 s->n_chan = 16;
2820 s->maxdata = 1;
2821 s->io_bits = 0xffff;
2822 s->private = &dio_private_B;
2823 s->range_table = &range_digital;
2824 s->insn_config = s626_dio_insn_config;
2825 s->insn_bits = s626_dio_insn_bits;
2826
2827 s = dev->subdevices + 4;
2828 /* digital I/O subdevice */
2829 s->type = COMEDI_SUBD_DIO;
2830 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
2831 s->n_chan = 16;
2832 s->maxdata = 1;
2833 s->io_bits = 0xffff;
2834 s->private = &dio_private_C;
2835 s->range_table = &range_digital;
2836 s->insn_config = s626_dio_insn_config;
2837 s->insn_bits = s626_dio_insn_bits;
2838
2839 s = dev->subdevices + 5;
2840 /* encoder (counter) subdevice */
2841 s->type = COMEDI_SUBD_COUNTER;
2842 s->subdev_flags = SDF_WRITABLE | SDF_READABLE | SDF_LSAMPL;
2843 s->n_chan = S626_ENCODER_CHANNELS;
2844 s->private = enc_private_data;
2845 s->insn_config = s626_enc_insn_config;
2846 s->insn_read = s626_enc_insn_read;
2847 s->insn_write = s626_enc_insn_write;
2848 s->maxdata = 0xffffff;
2849 s->range_table = &range_unknown;
2850
2851 /* stop ai_command */
2852 devpriv->ai_cmd_running = 0;
2853
2854 s626_initialize(dev);
2849 2855
2850 return 1; 2856 return 1;
2851} 2857}