]> Pileus Git - ~andy/linux/commitdiff
iommu/shmobile: Turn the flush_lock mutex into a spinlock
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 17 Dec 2013 17:18:50 +0000 (18:18 +0100)
committerJoerg Roedel <joro@8bytes.org>
Tue, 7 Jan 2014 14:35:25 +0000 (15:35 +0100)
The lock is taken in atomic context, replace it with a spinlock.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/shmobile-ipmmu.c
drivers/iommu/shmobile-ipmmu.h

index 8321f89596c493909ac36c3ce24a7b2bc245884e..e3bc2e19b6dd8f2cd7bd91b30120ecbba477abe3 100644 (file)
@@ -35,12 +35,12 @@ void ipmmu_tlb_flush(struct shmobile_ipmmu *ipmmu)
        if (!ipmmu)
                return;
 
-       mutex_lock(&ipmmu->flush_lock);
+       spin_lock(&ipmmu->flush_lock);
        if (ipmmu->tlb_enabled)
                ipmmu_reg_write(ipmmu, IMCTR1, IMCTR1_FLUSH | IMCTR1_TLBEN);
        else
                ipmmu_reg_write(ipmmu, IMCTR1, IMCTR1_FLUSH);
-       mutex_unlock(&ipmmu->flush_lock);
+       spin_unlock(&ipmmu->flush_lock);
 }
 
 void ipmmu_tlb_set(struct shmobile_ipmmu *ipmmu, unsigned long phys, int size,
@@ -49,7 +49,7 @@ void ipmmu_tlb_set(struct shmobile_ipmmu *ipmmu, unsigned long phys, int size,
        if (!ipmmu)
                return;
 
-       mutex_lock(&ipmmu->flush_lock);
+       spin_lock(&ipmmu->flush_lock);
        switch (size) {
        default:
                ipmmu->tlb_enabled = 0;
@@ -85,7 +85,7 @@ void ipmmu_tlb_set(struct shmobile_ipmmu *ipmmu, unsigned long phys, int size,
        }
        ipmmu_reg_write(ipmmu, IMTTBR, phys);
        ipmmu_reg_write(ipmmu, IMASID, asid);
-       mutex_unlock(&ipmmu->flush_lock);
+       spin_unlock(&ipmmu->flush_lock);
 }
 
 static int ipmmu_probe(struct platform_device *pdev)
@@ -104,7 +104,7 @@ static int ipmmu_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "cannot allocate device data\n");
                return -ENOMEM;
        }
-       mutex_init(&ipmmu->flush_lock);
+       spin_lock_init(&ipmmu->flush_lock);
        ipmmu->dev = &pdev->dev;
        ipmmu->ipmmu_base = devm_ioremap_nocache(&pdev->dev, res->start,
                                                resource_size(res));
index 4d53684673e1ff1649c0bc1f44a0d819975d9cc6..9524743ca1fba781a695b4a15c950a12fcd87b18 100644 (file)
@@ -14,7 +14,7 @@ struct shmobile_ipmmu {
        struct device *dev;
        void __iomem *ipmmu_base;
        int tlb_enabled;
-       struct mutex flush_lock;
+       spinlock_t flush_lock;
        const char * const *dev_names;
        unsigned int num_dev_names;
 };