summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/tegra/dc.c
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2018-05-04 15:02:24 +0200
committerThierry Reding <treding@nvidia.com>2018-05-17 14:08:40 +0200
commit0c407de5ed1a329468122cbf4f3e727e0c1e3f36 (patch)
tree3f96f17886dcfc453e117f3820fb3c24f80133f1 /drivers/gpu/drm/tegra/dc.c
parentdrm/tegra: gr3d: Properly clean up resources (diff)
downloadlinux-0c407de5ed1a329468122cbf4f3e727e0c1e3f36.tar.xz
linux-0c407de5ed1a329468122cbf4f3e727e0c1e3f36.zip
drm/tegra: Refactor IOMMU attach/detach
Attaching to and detaching from an IOMMU uses the same code sequence in every driver, so factor it out into separate helpers. Reviewed-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/gpu/drm/tegra/dc.c')
-rw-r--r--drivers/gpu/drm/tegra/dc.c42
1 files changed, 7 insertions, 35 deletions
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index c843f11043db..3e7ec3937346 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -1837,21 +1837,11 @@ static int tegra_dc_init(struct host1x_client *client)
if (!dc->syncpt)
dev_warn(dc->dev, "failed to allocate syncpoint\n");
- if (tegra->domain) {
- dc->group = iommu_group_get(client->dev);
-
- if (dc->group && dc->group != tegra->group) {
- err = iommu_attach_group(tegra->domain, dc->group);
- if (err < 0) {
- dev_err(dc->dev,
- "failed to attach to domain: %d\n",
- err);
- iommu_group_put(dc->group);
- return err;
- }
-
- tegra->group = dc->group;
- }
+ dc->group = host1x_client_iommu_attach(client, true);
+ if (IS_ERR(dc->group)) {
+ err = PTR_ERR(dc->group);
+ dev_err(client->dev, "failed to attach to domain: %d\n", err);
+ return err;
}
if (dc->soc->wgrps)
@@ -1916,15 +1906,7 @@ cleanup:
if (!IS_ERR(primary))
drm_plane_cleanup(primary);
- if (dc->group) {
- if (dc->group == tegra->group) {
- iommu_detach_group(tegra->domain, dc->group);
- tegra->group = NULL;
- }
-
- iommu_group_put(dc->group);
- }
-
+ host1x_client_iommu_detach(client, dc->group);
host1x_syncpt_free(dc->syncpt);
return err;
@@ -1932,9 +1914,7 @@ cleanup:
static int tegra_dc_exit(struct host1x_client *client)
{
- struct drm_device *drm = dev_get_drvdata(client->parent);
struct tegra_dc *dc = host1x_client_to_dc(client);
- struct tegra_drm *tegra = drm->dev_private;
int err;
devm_free_irq(dc->dev, dc->irq, dc);
@@ -1945,15 +1925,7 @@ static int tegra_dc_exit(struct host1x_client *client)
return err;
}
- if (dc->group) {
- if (dc->group == tegra->group) {
- iommu_detach_group(tegra->domain, dc->group);
- tegra->group = NULL;
- }
-
- iommu_group_put(dc->group);
- }
-
+ host1x_client_iommu_detach(client, dc->group);
host1x_syncpt_free(dc->syncpt);
return 0;