diff options
author | H Hartley Sweeten <hartleys@visionengravers.com> | 2012-09-24 16:24:27 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-09-26 12:37:31 -0400 |
commit | 80ec9510296224048021793b644eb9057c59df5a (patch) | |
tree | 8507be014685010fc2ad26344cc67a91e0f8feab | |
parent | 8c7e4277c1197d31c0b34dbaf23e6edddb5978f7 (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.c | 246 |
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 | ||
2467 | static int s626_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev) | 2467 | static 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 | |||
2732 | static 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 | } |