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>
@@ -577,11 +578,13 @@ static void apple_dart_domain_flush_tlb(struct apple_dart_domain *domain)
577578 for (j = 0 ; j < BITS_TO_LONGS (stream_map .dart -> num_streams ); j ++ )
578579 stream_map .sidmap [j ] = atomic_long_read (& domain_stream_map -> sidmap [j ]);
579580
581+ WARN_ON (pm_runtime_get_sync (stream_map .dart -> dev ) < 0 );
580582
581583 if (stream_map .dart -> locked )
582584 apple_dart_hw_sync_locked (& stream_map );
583585
584586 stream_map .dart -> hw -> invalidate_tlb (& stream_map );
587+ pm_runtime_put (stream_map .dart -> dev );
585588 }
586589}
587590
@@ -814,17 +817,23 @@ static int apple_dart_attach_dev_paging(struct iommu_domain *domain,
814817 struct apple_dart_master_cfg * cfg = dev_iommu_priv_get (dev );
815818 struct apple_dart_domain * dart_domain = to_dart_domain (domain );
816819
820+ for_each_stream_map (i , cfg , stream_map )
821+ WARN_ON (pm_runtime_get_sync (stream_map -> dart -> dev ) < 0 );
822+
817823 ret = apple_dart_finalize_domain (dart_domain , dev , cfg );
818824 if (ret )
819- return ret ;
825+ goto err ;
820826
821827 ret = apple_dart_domain_add_streams (dart_domain , cfg );
822828 if (ret )
823- return ret ;
829+ goto err ;
824830
825831 for_each_stream_map (i , cfg , stream_map )
826832 apple_dart_setup_translation (dart_domain , stream_map );
827- return 0 ;
833+ err :
834+ for_each_stream_map (i , cfg , stream_map )
835+ pm_runtime_put (stream_map -> dart -> dev );
836+ return ret ;
828837}
829838
830839static int apple_dart_attach_dev_identity (struct iommu_domain * domain ,
@@ -840,8 +849,14 @@ static int apple_dart_attach_dev_identity(struct iommu_domain *domain,
840849 if (cfg -> stream_maps [0 ].dart -> locked )
841850 return - EINVAL ;
842851
852+ for_each_stream_map (i , cfg , stream_map )
853+ WARN_ON (pm_runtime_get_sync (stream_map -> dart -> dev ) < 0 );
854+
843855 for_each_stream_map (i , cfg , stream_map )
844856 apple_dart_hw_enable_bypass (stream_map );
857+
858+ for_each_stream_map (i , cfg , stream_map )
859+ pm_runtime_put (stream_map -> dart -> dev );
845860 return 0 ;
846861}
847862
@@ -861,8 +876,14 @@ static int apple_dart_attach_dev_blocked(struct iommu_domain *domain,
861876 struct apple_dart_stream_map * stream_map ;
862877 int i ;
863878
879+ for_each_stream_map (i , cfg , stream_map )
880+ WARN_ON (pm_runtime_get_sync (stream_map -> dart -> dev ) < 0 );
881+
864882 for_each_stream_map (i , cfg , stream_map )
865883 apple_dart_hw_disable_dma (stream_map );
884+
885+ for_each_stream_map (i , cfg , stream_map )
886+ pm_runtime_put (stream_map -> dart -> dev );
866887 return 0 ;
867888}
868889
@@ -1282,6 +1303,14 @@ static int apple_dart_probe(struct platform_device *pdev)
12821303 if (ret )
12831304 return ret ;
12841305
1306+ pm_runtime_get_noresume (dev );
1307+ pm_runtime_set_active (dev );
1308+ pm_runtime_irq_safe (dev );
1309+
1310+ ret = devm_pm_runtime_enable (dev );
1311+ if (ret )
1312+ goto err_clk_disable ;
1313+
12851314 dart_params [0 ] = readl (dart -> regs + DART_PARAMS1 );
12861315 dart_params [1 ] = readl (dart -> regs + DART_PARAMS2 );
12871316 dart -> pgsize = 1 << FIELD_GET (DART_PARAMS1_PAGE_SHIFT , dart_params [0 ]);
@@ -1334,6 +1363,8 @@ static int apple_dart_probe(struct platform_device *pdev)
13341363 if (ret )
13351364 goto err_sysfs_remove ;
13361365
1366+ pm_runtime_put (dev );
1367+
13371368 dev_info (
13381369 & pdev -> dev ,
13391370 "DART [pagesize %x, %d streams, bypass support: %d, bypass forced: %d, locked: %d] initialized\n" ,
@@ -1346,6 +1377,7 @@ static int apple_dart_probe(struct platform_device *pdev)
13461377err_free_irq :
13471378 free_irq (dart -> irq , dart );
13481379err_clk_disable :
1380+ pm_runtime_put (dev );
13491381 clk_bulk_disable_unprepare (dart -> num_clks , dart -> clks );
13501382
13511383 return ret ;
@@ -1510,7 +1542,7 @@ static __maybe_unused int apple_dart_resume(struct device *dev)
15101542 return 0 ;
15111543}
15121544
1513- static DEFINE_SIMPLE_DEV_PM_OPS (apple_dart_pm_ops , apple_dart_suspend , apple_dart_resume ) ;
1545+ static DEFINE_RUNTIME_DEV_PM_OPS (apple_dart_pm_ops , apple_dart_suspend , apple_dart_resume , NULL ) ;
15141546
15151547static const struct of_device_id apple_dart_of_match [] = {
15161548 { .compatible = "apple,t8103-dart" , .data = & apple_dart_hw_t8103 },
@@ -1526,7 +1558,7 @@ static struct platform_driver apple_dart_driver = {
15261558 .name = "apple-dart" ,
15271559 .of_match_table = apple_dart_of_match ,
15281560 .suppress_bind_attrs = true,
1529- .pm = pm_sleep_ptr (& apple_dart_pm_ops ),
1561+ .pm = pm_ptr (& apple_dart_pm_ops ),
15301562 },
15311563 .probe = apple_dart_probe ,
15321564 .remove_new = apple_dart_remove ,
0 commit comments