2828#include <linux/of_platform.h>
2929#include <linux/pci.h>
3030#include <linux/platform_device.h>
31+ #include <linux/pm_runtime.h>
3132#include <linux/slab.h>
3233#include <linux/swab.h>
3334#include <linux/types.h>
@@ -576,11 +577,13 @@ static void apple_dart_domain_flush_tlb(struct apple_dart_domain *domain)
576577 for (j = 0 ; j < BITS_TO_LONGS (stream_map .dart -> num_streams ); j ++ )
577578 stream_map .sidmap [j ] = atomic_long_read (& domain_stream_map -> sidmap [j ]);
578579
580+ WARN_ON (pm_runtime_get_sync (stream_map .dart -> dev ) < 0 );
579581
580582 if (stream_map .dart -> locked )
581583 apple_dart_hw_sync_locked (& stream_map );
582584
583585 stream_map .dart -> hw -> invalidate_tlb (& stream_map );
586+ pm_runtime_put (stream_map .dart -> dev );
584587 }
585588}
586589
@@ -818,15 +821,18 @@ static int apple_dart_attach_dev(struct iommu_domain *domain,
818821 domain -> type != IOMMU_DOMAIN_UNMANAGED )
819822 return - EINVAL ;
820823
824+ for_each_stream_map (i , cfg , stream_map )
825+ WARN_ON (pm_runtime_get_sync (stream_map -> dart -> dev ) < 0 );
826+
821827 ret = apple_dart_finalize_domain (domain , dev , cfg );
822828 if (ret )
823- return ret ;
829+ goto err ;
824830
825831 switch (domain -> type ) {
826832 default :
827833 ret = apple_dart_domain_add_streams (dart_domain , cfg );
828834 if (ret )
829- return ret ;
835+ goto err ;
830836
831837 for_each_stream_map (i , cfg , stream_map )
832838 apple_dart_setup_translation (dart_domain , stream_map );
@@ -841,6 +847,9 @@ static int apple_dart_attach_dev(struct iommu_domain *domain,
841847 break ;
842848 }
843849
850+ err :
851+ for_each_stream_map (i , cfg , stream_map )
852+ pm_runtime_put (stream_map -> dart -> dev );
844853 return ret ;
845854}
846855
@@ -1251,6 +1260,14 @@ static int apple_dart_probe(struct platform_device *pdev)
12511260 if (ret )
12521261 return ret ;
12531262
1263+ pm_runtime_get_noresume (dev );
1264+ pm_runtime_set_active (dev );
1265+ pm_runtime_irq_safe (dev );
1266+
1267+ ret = devm_pm_runtime_enable (dev );
1268+ if (ret )
1269+ goto err_clk_disable ;
1270+
12541271 dart_params [0 ] = readl (dart -> regs + DART_PARAMS1 );
12551272 dart_params [1 ] = readl (dart -> regs + DART_PARAMS2 );
12561273 dart -> pgsize = 1 << FIELD_GET (DART_PARAMS1_PAGE_SHIFT , dart_params [0 ]);
@@ -1305,6 +1322,8 @@ static int apple_dart_probe(struct platform_device *pdev)
13051322 if (ret )
13061323 goto err_sysfs_remove ;
13071324
1325+ pm_runtime_put (dev );
1326+
13081327 dev_info (
13091328 & pdev -> dev ,
13101329 "DART [pagesize %x, %d streams, bypass support: %d, bypass forced: %d, locked: %d] initialized\n" ,
@@ -1316,6 +1335,7 @@ static int apple_dart_probe(struct platform_device *pdev)
13161335err_free_irq :
13171336 free_irq (dart -> irq , dart );
13181337err_clk_disable :
1338+ pm_runtime_put (dev );
13191339 clk_bulk_disable_unprepare (dart -> num_clks , dart -> clks );
13201340
13211341 return ret ;
@@ -1453,7 +1473,7 @@ static __maybe_unused int apple_dart_resume(struct device *dev)
14531473 return 0 ;
14541474}
14551475
1456- static DEFINE_SIMPLE_DEV_PM_OPS (apple_dart_pm_ops , apple_dart_suspend , apple_dart_resume ) ;
1476+ static DEFINE_RUNTIME_DEV_PM_OPS (apple_dart_pm_ops , apple_dart_suspend , apple_dart_resume , NULL ) ;
14571477
14581478static const struct of_device_id apple_dart_of_match [] = {
14591479 { .compatible = "apple,t8103-dart" , .data = & apple_dart_hw_t8103 },
@@ -1468,7 +1488,7 @@ static struct platform_driver apple_dart_driver = {
14681488 .name = "apple-dart" ,
14691489 .of_match_table = apple_dart_of_match ,
14701490 .suppress_bind_attrs = true,
1471- .pm = pm_sleep_ptr (& apple_dart_pm_ops ),
1491+ .pm = pm_ptr (& apple_dart_pm_ops ),
14721492 },
14731493 .probe = apple_dart_probe ,
14741494 .remove_new = apple_dart_remove ,
0 commit comments