Skip to content

Commit 47a574f

Browse files
mszyprowjoergroedel
authored andcommitted
iommu/exynos: Simplify internal enable/disable functions
Remove remaining leftovers of the ref-count related code in the __sysmmu_enable/disable functions inline __sysmmu_enable/disable_nocount to them. Suspend/resume callbacks now checks if master device is set for given SYSMMU controller instead of relying on the activation count. Signed-off-by: Marek Szyprowski <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
1 parent b0d4c86 commit 47a574f

File tree

1 file changed

+29
-75
lines changed

1 file changed

+29
-75
lines changed

drivers/iommu/exynos-iommu.c

Lines changed: 29 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ struct sysmmu_drvdata {
268268
struct clk *aclk; /* SYSMMU's aclk clock */
269269
struct clk *pclk; /* SYSMMU's pclk clock */
270270
struct clk *clk_master; /* master's device clock */
271-
int activations; /* number of calls to sysmmu_enable */
272271
spinlock_t lock; /* lock for modyfying state */
272+
bool active; /* current status */
273273
struct exynos_iommu_domain *domain; /* domain we belong to */
274274
struct list_head domain_node; /* node for domain clients list */
275275
struct list_head owner_node; /* node for owner controllers list */
@@ -282,25 +282,6 @@ static struct exynos_iommu_domain *to_exynos_domain(struct iommu_domain *dom)
282282
return container_of(dom, struct exynos_iommu_domain, domain);
283283
}
284284

285-
static bool set_sysmmu_active(struct sysmmu_drvdata *data)
286-
{
287-
/* return true if the System MMU was not active previously
288-
and it needs to be initialized */
289-
return ++data->activations == 1;
290-
}
291-
292-
static bool set_sysmmu_inactive(struct sysmmu_drvdata *data)
293-
{
294-
/* return true if the System MMU is needed to be disabled */
295-
BUG_ON(data->activations < 1);
296-
return --data->activations == 0;
297-
}
298-
299-
static bool is_sysmmu_active(struct sysmmu_drvdata *data)
300-
{
301-
return data->activations > 0;
302-
}
303-
304285
static void sysmmu_unblock(struct sysmmu_drvdata *data)
305286
{
306287
writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL);
@@ -419,7 +400,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
419400
unsigned short reg_status, reg_clear;
420401
int ret = -ENOSYS;
421402

422-
WARN_ON(!is_sysmmu_active(data));
403+
WARN_ON(!data->active);
423404

424405
if (MMU_MAJ_VER(data->version) < 5) {
425406
reg_status = REG_INT_STATUS;
@@ -465,37 +446,19 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
465446
return IRQ_HANDLED;
466447
}
467448

468-
static void __sysmmu_disable_nocount(struct sysmmu_drvdata *data)
449+
static void __sysmmu_disable(struct sysmmu_drvdata *data)
469450
{
451+
unsigned long flags;
452+
470453
clk_enable(data->clk_master);
471454

455+
spin_lock_irqsave(&data->lock, flags);
472456
writel(CTRL_DISABLE, data->sfrbase + REG_MMU_CTRL);
473457
writel(0, data->sfrbase + REG_MMU_CFG);
474-
475-
__sysmmu_disable_clocks(data);
476-
}
477-
478-
static bool __sysmmu_disable(struct sysmmu_drvdata *data)
479-
{
480-
bool disabled;
481-
unsigned long flags;
482-
483-
spin_lock_irqsave(&data->lock, flags);
484-
485-
disabled = set_sysmmu_inactive(data);
486-
487-
if (disabled) {
488-
data->pgtable = 0;
489-
data->domain = NULL;
490-
491-
__sysmmu_disable_nocount(data);
492-
493-
dev_dbg(data->sysmmu, "Disabled\n");
494-
}
495-
458+
data->active = false;
496459
spin_unlock_irqrestore(&data->lock, flags);
497460

498-
return disabled;
461+
__sysmmu_disable_clocks(data);
499462
}
500463

501464
static void __sysmmu_init_config(struct sysmmu_drvdata *data)
@@ -514,17 +477,19 @@ static void __sysmmu_init_config(struct sysmmu_drvdata *data)
514477
writel(cfg, data->sfrbase + REG_MMU_CFG);
515478
}
516479

517-
static void __sysmmu_enable_nocount(struct sysmmu_drvdata *data)
480+
static void __sysmmu_enable(struct sysmmu_drvdata *data)
518481
{
482+
unsigned long flags;
483+
519484
__sysmmu_enable_clocks(data);
520485

486+
spin_lock_irqsave(&data->lock, flags);
521487
writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL);
522-
523488
__sysmmu_init_config(data);
524-
525489
__sysmmu_set_ptbase(data, data->pgtable);
526-
527490
writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL);
491+
data->active = true;
492+
spin_unlock_irqrestore(&data->lock, flags);
528493

529494
/*
530495
* SYSMMU driver keeps master's clock enabled only for the short
@@ -535,37 +500,18 @@ static void __sysmmu_enable_nocount(struct sysmmu_drvdata *data)
535500
clk_disable(data->clk_master);
536501
}
537502

538-
static int __sysmmu_enable(struct sysmmu_drvdata *data, phys_addr_t pgtable,
539-
struct exynos_iommu_domain *domain)
540-
{
541-
unsigned long flags;
542-
543-
spin_lock_irqsave(&data->lock, flags);
544-
if (set_sysmmu_active(data)) {
545-
data->pgtable = pgtable;
546-
data->domain = domain;
547-
__sysmmu_enable_nocount(data);
548-
dev_dbg(data->sysmmu, "Enabled\n");
549-
}
550-
spin_unlock_irqrestore(&data->lock, flags);
551-
552-
return 0;
553-
}
554-
555503
static void sysmmu_tlb_invalidate_flpdcache(struct sysmmu_drvdata *data,
556504
sysmmu_iova_t iova)
557505
{
558506
unsigned long flags;
559507

560-
561508
spin_lock_irqsave(&data->lock, flags);
562-
if (is_sysmmu_active(data) && data->version >= MAKE_MMU_VER(3, 3)) {
509+
if (data->active && data->version >= MAKE_MMU_VER(3, 3)) {
563510
clk_enable(data->clk_master);
564511
__sysmmu_tlb_invalidate_entry(data, iova, 1);
565512
clk_disable(data->clk_master);
566513
}
567514
spin_unlock_irqrestore(&data->lock, flags);
568-
569515
}
570516

571517
static void sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
@@ -574,7 +520,7 @@ static void sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
574520
unsigned long flags;
575521

576522
spin_lock_irqsave(&data->lock, flags);
577-
if (is_sysmmu_active(data)) {
523+
if (data->active) {
578524
unsigned int num_inv = 1;
579525

580526
clk_enable(data->clk_master);
@@ -690,10 +636,11 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev)
690636
static int exynos_sysmmu_suspend(struct device *dev)
691637
{
692638
struct sysmmu_drvdata *data = dev_get_drvdata(dev);
639+
struct device *master = data->master;
693640

694641
dev_dbg(dev, "suspend\n");
695-
if (is_sysmmu_active(data)) {
696-
__sysmmu_disable_nocount(data);
642+
if (master) {
643+
__sysmmu_disable(data);
697644
pm_runtime_put(dev);
698645
}
699646
return 0;
@@ -702,11 +649,12 @@ static int exynos_sysmmu_suspend(struct device *dev)
702649
static int exynos_sysmmu_resume(struct device *dev)
703650
{
704651
struct sysmmu_drvdata *data = dev_get_drvdata(dev);
652+
struct device *master = data->master;
705653

706654
dev_dbg(dev, "resume\n");
707-
if (is_sysmmu_active(data)) {
655+
if (master) {
708656
pm_runtime_get_sync(dev);
709-
__sysmmu_enable_nocount(data);
657+
__sysmmu_enable(data);
710658
}
711659
return 0;
712660
}
@@ -818,6 +766,8 @@ static void exynos_iommu_domain_free(struct iommu_domain *iommu_domain)
818766

819767
list_for_each_entry_safe(data, next, &domain->clients, domain_node) {
820768
__sysmmu_disable(data);
769+
data->pgtable = 0;
770+
data->domain = NULL;
821771
data->master = NULL;
822772
list_del_init(&data->domain_node);
823773
}
@@ -861,6 +811,8 @@ static void exynos_iommu_detach_device(struct iommu_domain *iommu_domain,
861811
list_for_each_entry_safe(data, next, &domain->clients, domain_node) {
862812
__sysmmu_disable(data);
863813
data->master = NULL;
814+
data->pgtable = 0;
815+
data->domain = NULL;
864816
list_del_init(&data->domain_node);
865817
pm_runtime_put(data->sysmmu);
866818
}
@@ -888,8 +840,10 @@ static int exynos_iommu_attach_device(struct iommu_domain *iommu_domain,
888840
exynos_iommu_detach_device(owner->domain, dev);
889841

890842
list_for_each_entry(data, &owner->controllers, owner_node) {
843+
data->pgtable = pagetable;
844+
data->domain = domain;
891845
pm_runtime_get_sync(data->sysmmu);
892-
__sysmmu_enable(data, pagetable, domain);
846+
__sysmmu_enable(data);
893847
data->master = dev;
894848

895849
spin_lock_irqsave(&domain->lock, flags);

0 commit comments

Comments
 (0)