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 | } |
