]> rtime.felk.cvut.cz Git - mf6xx.git/blob - mf614.c
Initialization sequence should be complete
[mf6xx.git] / mf614.c
1 #include <linux/module.h>
2 #include <linux/pci.h>
3 #include <linux/uio_driver.h>
4
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
9
10
11 static irqreturn_t mf614_irq_handler(int irq, struct uio_info *dev_info)
12
13 static int __devinit mf614_pci_probe(struct pci_dev *dev,
14                                      const struct pci_device_id *id)
15 {
16         struct uio_info *info;
17
18         info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
19         if (!info)
20                 return -ENOMEM;
21         
22         if (pci_enable_device(dev)) //FIXME what is return value??
23                 goto out_free
24
25         if (pci_request_regions(dev, "mf614"))
26                 goto out_disable
27         
28         info->name = "MF614";
29         info->version = "0.0.1";
30         
31         info->port[0].porttype = UIO_PORT_X86;
32         info->port[0].start = pci_resource_start(dev, 0);
33         if (!info->port[0].start)
34                 goto out_release;
35         info->port[0].size = pci_resource_len(dev, 0);
36         
37         info->mem[1].addr = pci_resource_start(dev, 4);
38         if (!info->mem[1].addr)
39                 goto out_release;
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)
44                 goto out_release;
45         
46         info->irq = dev->irq;
47         info->irq_flags = IRQF_SHARED;
48         info->handler = mf614_irq_handler;
49
50         if(uio_register_device(&dev->dev, info))
51                 goto out_unmap;
52
53         pci_set_drvdata(dev, info);
54
55         return 0;
56
57 out_unmap:
58         iounmap(info->mem[1].internal_addr);
59 out_release:
60         pci_release_regions(dev);
61 out_disable:
62         pci_disable_device(dev);
63 out_free:
64         kfree(info);
65         return -ENODEV;
66 }
67
68 static void mf614_pci_remove(struct pci_dev *dev)
69 {
70
71 }
72
73 static struct pci_device_id mf614_pci_id[] __devinitdata = {
74         {
75                 .vendor = PCI_VENDOR_ID_HUMUSOFT,
76                 .device = PCI_DEVICE_ID_MF614,
77                 .subvendor = PCI_SUBVENDOR_ID_HUMUSOFT,
78                 .subdevice = PCI_SUBDEVICE_DEVICE,
79         },
80         { 0, }
81 };
82
83 static struct pci_driver mf614_pci_driver = {
84         .name = "mf614",
85         .id_table = mf614_pci_id,
86         .probe = mf614_pci_probe, 
87         .remove = mf614_pci_remove,
88 };
89
90 static int __init mf614_init_module(void)
91 {
92         return pci_register_driver(&mf614_pci_driver);
93 }
94
95 static void __exit mf614_exit_module(void)
96 {
97         pci_unregister_driver(&mf614_pci_driver);
98 }
99
100 module_init(mf614_init_module);
101 module_exit(mf614_exit_module);
102
103 MODULE_LICENSE("GPL v2");
104 MODULE_AUTHOR("Rostislav Lisovy");