#include <linux/device.h>
#include <linux/module.h>
#include <linux/uio_driver.h>
#define PLX9030_INTCSR 0x4C
#define INTSCR_INT1_ENABLE 0x01
#define INTSCR_INT1_STATUS 0x04
#define INT1_ENABLED_AND_ACTIVE (INTSCR_INT1_ENABLE | INTSCR_INT1_STATUS)
#define PCI_SUBVENDOR_ID_PEP 0x1518
#define CIF_SUBDEVICE_PROFIBUS 0x430
#define CIF_SUBDEVICE_DEVICENET 0x432
static irqreturn_t hilscher_handler(int irq, struct uio_info *dev_info)
void __iomem *plx_intscr = dev_info->mem[0].internal_addr
if ((ioread8(plx_intscr) & INT1_ENABLED_AND_ACTIVE)
!= INT1_ENABLED_AND_ACTIVE)
iowrite8(ioread8(plx_intscr) & ~INTSCR_INT1_ENABLE, plx_intscr);
static int hilscher_pci_probe(struct pci_dev *dev,
const struct pci_device_id *id)
info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
if (pci_enable_device(dev))
if (pci_request_regions(dev, "hilscher"))
info->mem[0].addr = pci_resource_start(dev, 0);
info->mem[0].internal_addr = pci_ioremap_bar(dev, 0);
if (!info->mem[0].internal_addr)
info->mem[0].size = pci_resource_len(dev, 0);