Skip to content

Commit 54de489

Browse files
marcanjannau
authored andcommitted
iommu: apple-dart: Enable runtime PM
Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent f67ef07 commit 54de489

1 file changed

Lines changed: 37 additions & 5 deletions

File tree

drivers/iommu/apple-dart.c

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
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

830839
static 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)
13461377
err_free_irq:
13471378
free_irq(dart->irq, dart);
13481379
err_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

15151547
static 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

Comments
 (0)