@@ -268,8 +268,8 @@ struct sysmmu_drvdata {
268
268
struct clk * aclk ; /* SYSMMU's aclk clock */
269
269
struct clk * pclk ; /* SYSMMU's pclk clock */
270
270
struct clk * clk_master ; /* master's device clock */
271
- int activations ; /* number of calls to sysmmu_enable */
272
271
spinlock_t lock ; /* lock for modyfying state */
272
+ bool active ; /* current status */
273
273
struct exynos_iommu_domain * domain ; /* domain we belong to */
274
274
struct list_head domain_node ; /* node for domain clients list */
275
275
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)
282
282
return container_of (dom , struct exynos_iommu_domain , domain );
283
283
}
284
284
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
-
304
285
static void sysmmu_unblock (struct sysmmu_drvdata * data )
305
286
{
306
287
writel (CTRL_ENABLE , data -> sfrbase + REG_MMU_CTRL );
@@ -419,7 +400,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
419
400
unsigned short reg_status , reg_clear ;
420
401
int ret = - ENOSYS ;
421
402
422
- WARN_ON (!is_sysmmu_active ( data ) );
403
+ WARN_ON (!data -> active );
423
404
424
405
if (MMU_MAJ_VER (data -> version ) < 5 ) {
425
406
reg_status = REG_INT_STATUS ;
@@ -465,37 +446,19 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
465
446
return IRQ_HANDLED ;
466
447
}
467
448
468
- static void __sysmmu_disable_nocount (struct sysmmu_drvdata * data )
449
+ static void __sysmmu_disable (struct sysmmu_drvdata * data )
469
450
{
451
+ unsigned long flags ;
452
+
470
453
clk_enable (data -> clk_master );
471
454
455
+ spin_lock_irqsave (& data -> lock , flags );
472
456
writel (CTRL_DISABLE , data -> sfrbase + REG_MMU_CTRL );
473
457
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;
496
459
spin_unlock_irqrestore (& data -> lock , flags );
497
460
498
- return disabled ;
461
+ __sysmmu_disable_clocks ( data ) ;
499
462
}
500
463
501
464
static void __sysmmu_init_config (struct sysmmu_drvdata * data )
@@ -514,17 +477,19 @@ static void __sysmmu_init_config(struct sysmmu_drvdata *data)
514
477
writel (cfg , data -> sfrbase + REG_MMU_CFG );
515
478
}
516
479
517
- static void __sysmmu_enable_nocount (struct sysmmu_drvdata * data )
480
+ static void __sysmmu_enable (struct sysmmu_drvdata * data )
518
481
{
482
+ unsigned long flags ;
483
+
519
484
__sysmmu_enable_clocks (data );
520
485
486
+ spin_lock_irqsave (& data -> lock , flags );
521
487
writel (CTRL_BLOCK , data -> sfrbase + REG_MMU_CTRL );
522
-
523
488
__sysmmu_init_config (data );
524
-
525
489
__sysmmu_set_ptbase (data , data -> pgtable );
526
-
527
490
writel (CTRL_ENABLE , data -> sfrbase + REG_MMU_CTRL );
491
+ data -> active = true;
492
+ spin_unlock_irqrestore (& data -> lock , flags );
528
493
529
494
/*
530
495
* SYSMMU driver keeps master's clock enabled only for the short
@@ -535,37 +500,18 @@ static void __sysmmu_enable_nocount(struct sysmmu_drvdata *data)
535
500
clk_disable (data -> clk_master );
536
501
}
537
502
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
-
555
503
static void sysmmu_tlb_invalidate_flpdcache (struct sysmmu_drvdata * data ,
556
504
sysmmu_iova_t iova )
557
505
{
558
506
unsigned long flags ;
559
507
560
-
561
508
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 )) {
563
510
clk_enable (data -> clk_master );
564
511
__sysmmu_tlb_invalidate_entry (data , iova , 1 );
565
512
clk_disable (data -> clk_master );
566
513
}
567
514
spin_unlock_irqrestore (& data -> lock , flags );
568
-
569
515
}
570
516
571
517
static void sysmmu_tlb_invalidate_entry (struct sysmmu_drvdata * data ,
@@ -574,7 +520,7 @@ static void sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
574
520
unsigned long flags ;
575
521
576
522
spin_lock_irqsave (& data -> lock , flags );
577
- if (is_sysmmu_active ( data ) ) {
523
+ if (data -> active ) {
578
524
unsigned int num_inv = 1 ;
579
525
580
526
clk_enable (data -> clk_master );
@@ -690,10 +636,11 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev)
690
636
static int exynos_sysmmu_suspend (struct device * dev )
691
637
{
692
638
struct sysmmu_drvdata * data = dev_get_drvdata (dev );
639
+ struct device * master = data -> master ;
693
640
694
641
dev_dbg (dev , "suspend\n" );
695
- if (is_sysmmu_active ( data ) ) {
696
- __sysmmu_disable_nocount (data );
642
+ if (master ) {
643
+ __sysmmu_disable (data );
697
644
pm_runtime_put (dev );
698
645
}
699
646
return 0 ;
@@ -702,11 +649,12 @@ static int exynos_sysmmu_suspend(struct device *dev)
702
649
static int exynos_sysmmu_resume (struct device * dev )
703
650
{
704
651
struct sysmmu_drvdata * data = dev_get_drvdata (dev );
652
+ struct device * master = data -> master ;
705
653
706
654
dev_dbg (dev , "resume\n" );
707
- if (is_sysmmu_active ( data ) ) {
655
+ if (master ) {
708
656
pm_runtime_get_sync (dev );
709
- __sysmmu_enable_nocount (data );
657
+ __sysmmu_enable (data );
710
658
}
711
659
return 0 ;
712
660
}
@@ -818,6 +766,8 @@ static void exynos_iommu_domain_free(struct iommu_domain *iommu_domain)
818
766
819
767
list_for_each_entry_safe (data , next , & domain -> clients , domain_node ) {
820
768
__sysmmu_disable (data );
769
+ data -> pgtable = 0 ;
770
+ data -> domain = NULL ;
821
771
data -> master = NULL ;
822
772
list_del_init (& data -> domain_node );
823
773
}
@@ -861,6 +811,8 @@ static void exynos_iommu_detach_device(struct iommu_domain *iommu_domain,
861
811
list_for_each_entry_safe (data , next , & domain -> clients , domain_node ) {
862
812
__sysmmu_disable (data );
863
813
data -> master = NULL ;
814
+ data -> pgtable = 0 ;
815
+ data -> domain = NULL ;
864
816
list_del_init (& data -> domain_node );
865
817
pm_runtime_put (data -> sysmmu );
866
818
}
@@ -888,8 +840,10 @@ static int exynos_iommu_attach_device(struct iommu_domain *iommu_domain,
888
840
exynos_iommu_detach_device (owner -> domain , dev );
889
841
890
842
list_for_each_entry (data , & owner -> controllers , owner_node ) {
843
+ data -> pgtable = pagetable ;
844
+ data -> domain = domain ;
891
845
pm_runtime_get_sync (data -> sysmmu );
892
- __sysmmu_enable (data , pagetable , domain );
846
+ __sysmmu_enable (data );
893
847
data -> master = dev ;
894
848
895
849
spin_lock_irqsave (& domain -> lock , flags );
0 commit comments