linux/drivers/staging/comedi/drivers/ni_labpc_pci.c
<<
>>
Prefs
   1/*
   2 * comedi/drivers/ni_labpc_pci.c
   3 * Driver for National Instruments Lab-PC PCI-1200
   4 * Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 */
  16
  17/*
  18 * Driver: ni_labpc_pci
  19 * Description: National Instruments Lab-PC PCI-1200
  20 * Devices: [National Instruments] PCI-1200 (ni_pci-1200)
  21 * Author: Frank Mori Hess <fmhess@users.sourceforge.net>
  22 * Status: works
  23 *
  24 * This is the PCI-specific support split off from the ni_labpc driver.
  25 *
  26 * Configuration Options: not applicable, uses PCI auto config
  27 *
  28 * NI manuals:
  29 * 340914a (pci-1200)
  30 */
  31
  32#include <linux/module.h>
  33#include <linux/interrupt.h>
  34
  35#include "../comedi_pci.h"
  36
  37#include "ni_labpc.h"
  38
  39enum labpc_pci_boardid {
  40        BOARD_NI_PCI1200,
  41};
  42
  43static const struct labpc_boardinfo labpc_pci_boards[] = {
  44        [BOARD_NI_PCI1200] = {
  45                .name                   = "ni_pci-1200",
  46                .ai_speed               = 10000,
  47                .ai_scan_up             = 1,
  48                .has_ao                 = 1,
  49                .is_labpc1200           = 1,
  50        },
  51};
  52
  53/* ripped from mite.h and mite_setup2() to avoid mite dependency */
  54#define MITE_IODWBSR    0xc0     /* IO Device Window Base Size Register */
  55#define WENAB           (1 << 7) /* window enable */
  56
  57static int labpc_pci_mite_init(struct pci_dev *pcidev)
  58{
  59        void __iomem *mite_base;
  60        u32 main_phys_addr;
  61
  62        /* ioremap the MITE registers (BAR 0) temporarily */
  63        mite_base = pci_ioremap_bar(pcidev, 0);
  64        if (!mite_base)
  65                return -ENOMEM;
  66
  67        /* set data window to main registers (BAR 1) */
  68        main_phys_addr = pci_resource_start(pcidev, 1);
  69        writel(main_phys_addr | WENAB, mite_base + MITE_IODWBSR);
  70
  71        /* finished with MITE registers */
  72        iounmap(mite_base);
  73        return 0;
  74}
  75
  76static int labpc_pci_auto_attach(struct comedi_device *dev,
  77                                 unsigned long context)
  78{
  79        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
  80        const struct labpc_boardinfo *board = NULL;
  81        int ret;
  82
  83        if (context < ARRAY_SIZE(labpc_pci_boards))
  84                board = &labpc_pci_boards[context];
  85        if (!board)
  86                return -ENODEV;
  87        dev->board_ptr = board;
  88        dev->board_name = board->name;
  89
  90        ret = comedi_pci_enable(dev);
  91        if (ret)
  92                return ret;
  93
  94        ret = labpc_pci_mite_init(pcidev);
  95        if (ret)
  96                return ret;
  97
  98        dev->mmio = pci_ioremap_bar(pcidev, 1);
  99        if (!dev->mmio)
 100                return -ENOMEM;
 101
 102        return labpc_common_attach(dev, pcidev->irq, IRQF_SHARED);
 103}
 104
 105static void labpc_pci_detach(struct comedi_device *dev)
 106{
 107        labpc_common_detach(dev);
 108        comedi_pci_detach(dev);
 109}
 110
 111static struct comedi_driver labpc_pci_comedi_driver = {
 112        .driver_name    = "labpc_pci",
 113        .module         = THIS_MODULE,
 114        .auto_attach    = labpc_pci_auto_attach,
 115        .detach         = labpc_pci_detach,
 116};
 117
 118static const struct pci_device_id labpc_pci_table[] = {
 119        { PCI_VDEVICE(NI, 0x161), BOARD_NI_PCI1200 },
 120        { 0 }
 121};
 122MODULE_DEVICE_TABLE(pci, labpc_pci_table);
 123
 124static int labpc_pci_probe(struct pci_dev *dev,
 125                           const struct pci_device_id *id)
 126{
 127        return comedi_pci_auto_config(dev, &labpc_pci_comedi_driver,
 128                                      id->driver_data);
 129}
 130
 131static struct pci_driver labpc_pci_driver = {
 132        .name           = "labpc_pci",
 133        .id_table       = labpc_pci_table,
 134        .probe          = labpc_pci_probe,
 135        .remove         = comedi_pci_auto_unconfig,
 136};
 137module_comedi_pci_driver(labpc_pci_comedi_driver, labpc_pci_driver);
 138
 139MODULE_DESCRIPTION("Comedi: National Instruments Lab-PC PCI-1200 driver");
 140MODULE_AUTHOR("Comedi http://www.comedi.org");
 141MODULE_LICENSE("GPL");
 142