summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/host1x/dev.c22
-rw-r--r--drivers/gpu/host1x/dev.h1
2 files changed, 16 insertions, 7 deletions
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index 1f916b579e95..03db71173f5d 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -218,19 +218,24 @@ static int host1x_probe(struct platform_device *pdev)
return err;
}
- if (iommu_present(&platform_bus_type)) {
+ host->group = iommu_group_get(&pdev->dev);
+ if (host->group) {
struct iommu_domain_geometry *geometry;
unsigned long order;
host->domain = iommu_domain_alloc(&platform_bus_type);
- if (!host->domain)
- return -ENOMEM;
+ if (!host->domain) {
+ err = -ENOMEM;
+ goto put_group;
+ }
- err = iommu_attach_device(host->domain, &pdev->dev);
+ err = iommu_attach_group(host->domain, host->group);
if (err) {
if (err == -ENODEV) {
iommu_domain_free(host->domain);
host->domain = NULL;
+ iommu_group_put(host->group);
+ host->group = NULL;
goto skip_iommu;
}
@@ -296,13 +301,15 @@ fail_unprepare_disable:
fail_free_channels:
host1x_channel_list_free(&host->channel_list);
fail_detach_device:
- if (host->domain) {
+ if (host->group && host->domain) {
put_iova_domain(&host->iova);
- iommu_detach_device(host->domain, &pdev->dev);
+ iommu_detach_group(host->domain, host->group);
}
fail_free_domain:
if (host->domain)
iommu_domain_free(host->domain);
+put_group:
+ iommu_group_put(host->group);
return err;
}
@@ -319,8 +326,9 @@ static int host1x_remove(struct platform_device *pdev)
if (host->domain) {
put_iova_domain(&host->iova);
- iommu_detach_device(host->domain, &pdev->dev);
+ iommu_detach_group(host->domain, host->group);
iommu_domain_free(host->domain);
+ iommu_group_put(host->group);
}
return 0;
diff --git a/drivers/gpu/host1x/dev.h b/drivers/gpu/host1x/dev.h
index 502769726480..43e9fabb43a1 100644
--- a/drivers/gpu/host1x/dev.h
+++ b/drivers/gpu/host1x/dev.h
@@ -117,6 +117,7 @@ struct host1x {
struct clk *clk;
struct reset_control *rst;
+ struct iommu_group *group;
struct iommu_domain *domain;
struct iova_domain iova;
dma_addr_t iova_end;