]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Important bugfixes. Module is able to load & unload. Everything seems to be ok.
authorRostislav Lisovy <lisovy@gmail.com>
Tue, 22 Mar 2011 17:03:55 +0000 (18:03 +0100)
committerRostislav Lisovy <lisovy@gmail.com>
Tue, 22 Mar 2011 17:03:55 +0000 (18:03 +0100)
src/uio/mf624/kernel/mf624.c

index a275db5c360047e757604582b1c27a2e2b64956d..bbde9cdec884b77992beaf9c22cf08201212a80b 100755 (executable)
@@ -10,7 +10,7 @@
 #define PCI_VENDOR_ID_HUMUSOFT         0x186c
 #define PCI_DEVICE_ID_MF624            0x0624
 #define PCI_SUBVENDOR_ID_HUMUSOFT      0x186c
-#define PCI_SUBDEVICE_DEVICE           0x0000
+#define PCI_SUBDEVICE_DEVICE           0x0624
 
 #define INTCSR                         0x4C
 #define INTCSR_ADINT_ENABLE            (1 << 0)
@@ -66,14 +66,14 @@ static irqreturn_t mf624_irq_handler(int irq, struct uio_info *info)
 {
        u32 *INTCSR_reg = ((u32*) info->mem[0].internal_addr) + INTCSR;
 
-       if ((*INTCSR_reg & INTCSR_ADINT_ENABLE) && (*INTCSR_reg & INTCSR_ADINT_STATUS))
+       if (((*INTCSR_reg & INTCSR_ADINT_ENABLE) > 0) && ((*INTCSR_reg & INTCSR_ADINT_STATUS) > 0))
        {
                //disable interrupt
                mf624_disable_interrupt(ADC, info);
                return IRQ_HANDLED;
        }
 
-       if ((*INTCSR_reg & INTCSR_CTR4INT_ENABLE) && (*INTCSR_reg & INTCSR_CTR4INT_STATUS))
+       if (((*INTCSR_reg & INTCSR_CTR4INT_ENABLE) > 0) && ((*INTCSR_reg & INTCSR_CTR4INT_STATUS) > 0))
        {
                //disable interrupt
                mf624_disable_interrupt(CTR4, info);
@@ -113,7 +113,6 @@ static int __devinit mf624_pci_probe(struct pci_dev *dev,
        info->name = "MF624";
        info->version = "0.0.1";
 
-
        info->mem[0].name = "PCI chipset, interrupts, status bits, special functions";
        info->mem[0].addr = pci_resource_start(dev, 0);
        if (!info->mem[0].addr)
@@ -131,7 +130,7 @@ static int __devinit mf624_pci_probe(struct pci_dev *dev,
                goto out_release;
        info->mem[1].size = pci_resource_len(dev, 1);
        info->mem[1].memtype = UIO_MEM_PHYS;
-       info->mem[1].internal_addr = pci_ioremap_bar(dev, 1);
+       info->mem[1].internal_addr = pci_ioremap_bar(dev, 2);
        if (!info->mem[1].internal_addr)
                goto out_release;
 
@@ -142,7 +141,7 @@ static int __devinit mf624_pci_probe(struct pci_dev *dev,
                goto out_release;
        info->mem[2].size = pci_resource_len(dev, 2);
        info->mem[2].memtype = UIO_MEM_PHYS;
-       info->mem[2].internal_addr = pci_ioremap_bar(dev, 2);
+       info->mem[2].internal_addr = pci_ioremap_bar(dev, 4);
        if (!info->mem[2].internal_addr)
                goto out_release;
 
@@ -154,12 +153,17 @@ static int __devinit mf624_pci_probe(struct pci_dev *dev,
        info->irqcontrol = mf624_irqcontrol;
 
        if(uio_register_device(&dev->dev, info))
-               goto out_release;
+               goto out_unmap;
 
        pci_set_drvdata(dev, info);
 
        return 0;
 
+
+out_unmap:
+       iounmap(info->mem[0].internal_addr);
+       iounmap(info->mem[1].internal_addr);
+       iounmap(info->mem[2].internal_addr);
 out_release:
        pci_release_regions(dev);
 out_disable: