root/drivers/uio/uio_cif.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. hilscher_handler
  2. hilscher_pci_probe
  3. hilscher_pci_remove

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * UIO Hilscher CIF card driver
   4  *
   5  * (C) 2007 Hans J. Koch <hjk@hansjkoch.de>
   6  * Original code (C) 2005 Benedikt Spranger <b.spranger@linutronix.de>
   7  */
   8 
   9 #include <linux/device.h>
  10 #include <linux/module.h>
  11 #include <linux/pci.h>
  12 #include <linux/slab.h>
  13 #include <linux/uio_driver.h>
  14 
  15 #include <asm/io.h>
  16 
  17 #define PLX9030_INTCSR          0x4C
  18 #define INTSCR_INT1_ENABLE      0x01
  19 #define INTSCR_INT1_STATUS      0x04
  20 #define INT1_ENABLED_AND_ACTIVE (INTSCR_INT1_ENABLE | INTSCR_INT1_STATUS)
  21 
  22 #define PCI_SUBVENDOR_ID_PEP    0x1518
  23 #define CIF_SUBDEVICE_PROFIBUS  0x430
  24 #define CIF_SUBDEVICE_DEVICENET 0x432
  25 
  26 
  27 static irqreturn_t hilscher_handler(int irq, struct uio_info *dev_info)
  28 {
  29         void __iomem *plx_intscr = dev_info->mem[0].internal_addr
  30                                         + PLX9030_INTCSR;
  31 
  32         if ((ioread8(plx_intscr) & INT1_ENABLED_AND_ACTIVE)
  33             != INT1_ENABLED_AND_ACTIVE)
  34                 return IRQ_NONE;
  35 
  36         /* Disable interrupt */
  37         iowrite8(ioread8(plx_intscr) & ~INTSCR_INT1_ENABLE, plx_intscr);
  38         return IRQ_HANDLED;
  39 }
  40 
  41 static int hilscher_pci_probe(struct pci_dev *dev,
  42                                         const struct pci_device_id *id)
  43 {
  44         struct uio_info *info;
  45 
  46         info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
  47         if (!info)
  48                 return -ENOMEM;
  49 
  50         if (pci_enable_device(dev))
  51                 goto out_free;
  52 
  53         if (pci_request_regions(dev, "hilscher"))
  54                 goto out_disable;
  55 
  56         info->mem[0].addr = pci_resource_start(dev, 0);
  57         if (!info->mem[0].addr)
  58                 goto out_release;
  59         info->mem[0].internal_addr = pci_ioremap_bar(dev, 0);
  60         if (!info->mem[0].internal_addr)
  61                 goto out_release;
  62 
  63         info->mem[0].size = pci_resource_len(dev, 0);
  64         info->mem[0].memtype = UIO_MEM_PHYS;
  65         info->mem[1].addr = pci_resource_start(dev, 2);
  66         info->mem[1].size = pci_resource_len(dev, 2);
  67         info->mem[1].memtype = UIO_MEM_PHYS;
  68         switch (id->subdevice) {
  69                 case CIF_SUBDEVICE_PROFIBUS:
  70                         info->name = "CIF_Profibus";
  71                         break;
  72                 case CIF_SUBDEVICE_DEVICENET:
  73                         info->name = "CIF_Devicenet";
  74                         break;
  75                 default:
  76                         info->name = "CIF_???";
  77         }
  78         info->version = "0.0.1";
  79         info->irq = dev->irq;
  80         info->irq_flags = IRQF_SHARED;
  81         info->handler = hilscher_handler;
  82 
  83         if (uio_register_device(&dev->dev, info))
  84                 goto out_unmap;
  85 
  86         pci_set_drvdata(dev, info);
  87 
  88         return 0;
  89 out_unmap:
  90         iounmap(info->mem[0].internal_addr);
  91 out_release:
  92         pci_release_regions(dev);
  93 out_disable:
  94         pci_disable_device(dev);
  95 out_free:
  96         kfree (info);
  97         return -ENODEV;
  98 }
  99 
 100 static void hilscher_pci_remove(struct pci_dev *dev)
 101 {
 102         struct uio_info *info = pci_get_drvdata(dev);
 103 
 104         uio_unregister_device(info);
 105         pci_release_regions(dev);
 106         pci_disable_device(dev);
 107         iounmap(info->mem[0].internal_addr);
 108 
 109         kfree (info);
 110 }
 111 
 112 static struct pci_device_id hilscher_pci_ids[] = {
 113         {
 114                 .vendor =       PCI_VENDOR_ID_PLX,
 115                 .device =       PCI_DEVICE_ID_PLX_9030,
 116                 .subvendor =    PCI_SUBVENDOR_ID_PEP,
 117                 .subdevice =    CIF_SUBDEVICE_PROFIBUS,
 118         },
 119         {
 120                 .vendor =       PCI_VENDOR_ID_PLX,
 121                 .device =       PCI_DEVICE_ID_PLX_9030,
 122                 .subvendor =    PCI_SUBVENDOR_ID_PEP,
 123                 .subdevice =    CIF_SUBDEVICE_DEVICENET,
 124         },
 125         { 0, }
 126 };
 127 
 128 static struct pci_driver hilscher_pci_driver = {
 129         .name = "hilscher",
 130         .id_table = hilscher_pci_ids,
 131         .probe = hilscher_pci_probe,
 132         .remove = hilscher_pci_remove,
 133 };
 134 
 135 module_pci_driver(hilscher_pci_driver);
 136 MODULE_DEVICE_TABLE(pci, hilscher_pci_ids);
 137 MODULE_LICENSE("GPL v2");
 138 MODULE_AUTHOR("Hans J. Koch, Benedikt Spranger");

/* [<][>][^][v][top][bottom][index][help] */