]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00293234 PXP: let irq_pending variable to be atomic
authorFancy Fang <B47543@freescale.com>
Tue, 24 Dec 2013 09:42:22 +0000 (17:42 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:06:51 +0000 (10:06 +0200)
Change irq_pending field in struct pxp_irq_info to a atomic
type. So the spin lock in pxp_irq_info is unnecessary.

Signed-off-by: Fancy Fang <B47543@freescale.com>
drivers/dma/pxp/pxp_device.c
include/linux/pxp_device.h

index 43c3fa8fee5bd02a60e2b510eaac8243d11dd950..2b101d684b6c87e8add5474807529b3d7b957f53 100644 (file)
@@ -282,14 +282,11 @@ static void pxp_dma_done(void *arg)
        struct dma_chan *chan = tx_desc->txd.chan;
        struct pxp_channel *pxp_chan = to_pxp_channel(chan);
        int chan_id = pxp_chan->dma_chan.chan_id;
-       unsigned long flags;
 
        pr_debug("DMA Done ISR, chan_id %d\n", chan_id);
 
-       spin_lock_irqsave(&(irq_info[chan_id].lock), flags);
-       irq_info[chan_id].irq_pending--;
+       atomic_dec(&irq_info[chan_id].irq_pending);
        irq_info[chan_id].hist_status = tx_desc->hist_status;
-       spin_unlock_irqrestore(&(irq_info[chan_id].lock), flags);
 
        wake_up_interruptible(&(irq_info[chan_id].waitq));
 }
@@ -303,7 +300,6 @@ static int pxp_ioc_config_chan(struct pxp_file *priv, unsigned long arg)
        dma_cookie_t cookie;
        int handle, chan_id;
        int i, length, ret;
-       unsigned long flags;
        struct dma_chan *chan;
        struct pxp_chan_obj *obj;
 
@@ -366,9 +362,7 @@ static int pxp_ioc_config_chan(struct pxp_file *priv, unsigned long arg)
                return -EIO;
        }
 
-       spin_lock_irqsave(&(irq_info[chan_id].lock), flags);
-       irq_info[chan_id].irq_pending++;
-       spin_unlock_irqrestore(&(irq_info[chan_id].lock), flags);
+       atomic_inc(&irq_info[chan_id].irq_pending);
 
        return 0;
 }
@@ -638,7 +632,7 @@ static long pxp_device_ioctl(struct file *filp,
 
                        ret = wait_event_interruptible
                            (irq_info[chan_id].waitq,
-                            (irq_info[chan_id].irq_pending == 0));
+                            (atomic_read(&irq_info[chan_id].irq_pending) == 0));
                        if (ret < 0) {
                                printk(KERN_WARNING
                                       "WAIT4CMPLT: signal received.\n");
@@ -675,15 +669,12 @@ static struct miscdevice pxp_device_miscdev = {
 
 int register_pxp_device(void)
 {
-       int i, ret;
+       int ret;
 
        ret = misc_register(&pxp_device_miscdev);
        if (ret)
                return ret;
 
-       for (i = 0; i < NR_PXP_VIRT_CHANNEL; i++)
-               spin_lock_init(&(irq_info[i].lock));
-
        ret = pxp_ht_create(&bufhash, BUFFER_HASH_ORDER);
        if (ret)
                return ret;
index 5881deb0e03071c8668c21c5870f858a0df36e12..df185c49d0172751d9a26f039d0f1286b3215294 100644 (file)
@@ -25,9 +25,8 @@
 
 struct pxp_irq_info {
        wait_queue_head_t waitq;
-       int irq_pending;
+       atomic_t irq_pending;
        int hist_status;
-       spinlock_t lock;
 };
 
 struct pxp_buffer_hash {