1 #include <linux/module.h>
3 #include <linux/uio_driver.h>
5 #define PCI_VENDOR_ID_HUMUSOFT 0x186c
6 #define PCI_DEVICE_ID_MF614 0x0614
7 #define PCI_SUBVENDOR_ID_HUMUSOFT 0x186c
8 #define PCI_SUBDEVICE_DEVICE 0x0000
11 static irqreturn_t mf614_irq_handler(int irq, struct uio_info *dev_info)
13 static int __devinit mf614_pci_probe(struct pci_dev *dev,
14 const struct pci_device_id *id)
16 struct uio_info *info;
18 info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
22 if (pci_enable_device(dev)) //FIXME what is return value??
25 if (pci_request_regions(dev, "mf614"))
29 info->version = "0.0.1";
31 info->port[0].porttype = UIO_PORT_X86;
32 info->port[0].start = pci_resource_start(dev, 0);
33 if (!info->port[0].start)
35 info->port[0].size = pci_resource_len(dev, 0);
37 info->mem[1].addr = pci_resource_start(dev, 4);
38 if (!info->mem[1].addr)
40 info->mem[1].size = pci_resource_len(dev, 4);
41 info->mem[1].memtype = UIO_MEM_PHYS;
42 info->mem[1].internal_addr = pci_ioremap_bar(dev, 4);
43 if (!info->mem[1].internal_addr)
47 info->irq_flags = IRQF_SHARED;
48 info->handler = mf614_irq_handler;
50 if(uio_register_device(&dev->dev, info))
53 pci_set_drvdata(dev, info);
58 iounmap(info->mem[1].internal_addr);
60 pci_release_regions(dev);
62 pci_disable_device(dev);
68 static void mf614_pci_remove(struct pci_dev *dev)
73 static struct pci_device_id mf614_pci_id[] __devinitdata = {
75 .vendor = PCI_VENDOR_ID_HUMUSOFT,
76 .device = PCI_DEVICE_ID_MF614,
77 .subvendor = PCI_SUBVENDOR_ID_HUMUSOFT,
78 .subdevice = PCI_SUBDEVICE_DEVICE,
83 static struct pci_driver mf614_pci_driver = {
85 .id_table = mf614_pci_id,
86 .probe = mf614_pci_probe,
87 .remove = mf614_pci_remove,
90 static int __init mf614_init_module(void)
92 return pci_register_driver(&mf614_pci_driver);
95 static void __exit mf614_exit_module(void)
97 pci_unregister_driver(&mf614_pci_driver);
100 module_init(mf614_init_module);
101 module_exit(mf614_exit_module);
103 MODULE_LICENSE("GPL v2");
104 MODULE_AUTHOR("Rostislav Lisovy");