Andrew, there are suggested changes in the attached patch. Maybe merge it with
misc-add-sensable-phantom-driver.patch if possible.

--

phantom, diff to -v3

Signed-off-by: Jiri Slaby <[EMAIL PROTECTED]>

---
commit b5c1fc64195b18d3919bfa7dddfb76e9f2a05786
tree 0d7e83a45f816b146b3b99ea0fe096ff1456b72f
parent d8cb58f904b80e250383e68832204fafaf02da8b
author Jiri Slaby <[EMAIL PROTECTED]> Thu, 03 May 2007 16:45:33 +0200
committer Jiri Slaby <[EMAIL PROTECTED]> Thu, 03 May 2007 16:45:33 +0200

 drivers/misc/phantom.c |   24 ++++++++++++++----------
 include/linux/Kbuild   |    1 +
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/misc/phantom.c b/drivers/misc/phantom.c
index bca00a0..35b139b 100644
--- a/drivers/misc/phantom.c
+++ b/drivers/misc/phantom.c
@@ -21,6 +21,7 @@
 #include <linux/cdev.h>
 #include <linux/phantom.h>
 
+#include <asm/atomic.h>
 #include <asm/io.h>
 
 #define PHANTOM_VERSION                "n0.9.5"
@@ -40,7 +41,7 @@ struct phantom_device {
        u32 __iomem *iaddr;
        u32 __iomem *oaddr;
        unsigned long status;
-       unsigned int counter;
+       atomic_t counter;
 
        wait_queue_head_t wait;
        struct cdev cdev;
@@ -55,6 +56,7 @@ static int phantom_status(struct phantom_device *dev, 
unsigned long newstat)
        pr_debug("phantom_status %lx %lx\n", dev->status, newstat);
 
        if (!(dev->status & PHB_RUNNING) && (newstat & PHB_RUNNING)) {
+               atomic_set(&dev->counter, 0);
                iowrite32(PHN_CTL_IRQ, dev->iaddr + PHN_CONTROL);
                iowrite32(0x43, dev->caddr + PHN_IRQCTL);
        } else if ((dev->status & PHB_RUNNING) && !(newstat & PHB_RUNNING))
@@ -145,6 +147,8 @@ static int phantom_open(struct inode *inode, struct file 
*file)
        struct phantom_device *dev = container_of(inode->i_cdev,
                        struct phantom_device, cdev);
 
+       nonseekable_open(inode, file);
+
        if (mutex_lock_interruptible(&dev->open_lock))
                return -ERESTARTSYS;
 
@@ -165,8 +169,7 @@ static int phantom_release(struct inode *inode, struct file 
*file)
 {
        struct phantom_device *dev = file->private_data;
 
-       if (mutex_lock_interruptible(&dev->open_lock))
-               return -ERESTARTSYS;
+       mutex_lock(&dev->open_lock);
 
        dev->opened = 0;
        phantom_status(dev, dev->status & ~PHB_RUNNING);
@@ -181,14 +184,14 @@ static unsigned int phantom_poll(struct file *file, 
poll_table *wait)
        struct phantom_device *dev = file->private_data;
        unsigned int mask = 0;
 
-       pr_debug("phantom_poll: %u\n", dev->counter);
+       pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter));
        poll_wait(file, &dev->wait, wait);
-       if (dev->counter) {
+       if (atomic_read(&dev->counter)) {
                mask = POLLIN | POLLRDNORM;
-               dev->counter--;
+               atomic_dec(&dev->counter);
        } else if ((dev->status & PHB_RUNNING) == 0)
                mask = POLLIN | POLLRDNORM | POLLERR;
-       pr_debug("phantom_poll end: %x/%u\n", mask, dev->counter);
+       pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter));
 
        return mask;
 }
@@ -210,7 +213,7 @@ static irqreturn_t phantom_isr(int irq, void *data)
        iowrite32(0, dev->iaddr);
        iowrite32(0xc0, dev->iaddr);
 
-       dev->counter++;
+       atomic_inc(&dev->counter);
        wake_up_interruptible(&dev->wait);
 
        return IRQ_HANDLED;
@@ -367,6 +370,9 @@ static int phantom_resume(struct pci_dev *pdev)
 
        return 0;
 }
+#else
+#define phantom_suspend        NULL
+#define phantom_resume NULL
 #endif
 
 static struct pci_device_id phantom_pci_tbl[] __devinitdata = {
@@ -381,10 +387,8 @@ static struct pci_driver phantom_pci_driver = {
        .id_table = phantom_pci_tbl,
        .probe = phantom_probe,
        .remove = __devexit_p(phantom_remove),
-#ifdef CONFIG_PM
        .suspend = phantom_suspend,
        .resume = phantom_resume
-#endif
 };
 
 static ssize_t phantom_show_version(struct class *cls, char *buf)
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
index e81badd..0aa1c55 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
@@ -122,6 +122,7 @@ header-y += pci_regs.h
 header-y += personality.h
 header-y += pfkeyv2.h
 header-y += pg.h
+header-y += phantom.h
 header-y += pkt_cls.h
 header-y += pkt_sched.h
 header-y += posix_types.h
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to