Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e87c621d authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Joerg Roedel
Browse files

iommu/shmobile: Turn the flush_lock mutex into a spinlock



The lock is taken in atomic context, replace it with a spinlock.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent dc89f797
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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));
+1 −1
Original line number Diff line number Diff line
@@ -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;
};