gr3d.c (caccddcfc4b4de75930df2e8f7fd0c66556b13ff) gr3d.c (aacdf19849734d1be5e407932228ae101ba5b92f)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2013 Avionic Design GmbH
4 * Copyright (C) 2013 NVIDIA Corporation
5 */
6
7#include <linux/clk.h>
8#include <linux/host1x.h>

--- 9 unchanged lines hidden (view full) ---

18#include "gem.h"
19#include "gr3d.h"
20
21struct gr3d_soc {
22 unsigned int version;
23};
24
25struct gr3d {
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2013 Avionic Design GmbH
4 * Copyright (C) 2013 NVIDIA Corporation
5 */
6
7#include <linux/clk.h>
8#include <linux/host1x.h>

--- 9 unchanged lines hidden (view full) ---

18#include "gem.h"
19#include "gr3d.h"
20
21struct gr3d_soc {
22 unsigned int version;
23};
24
25struct gr3d {
26 struct iommu_group *group;
27 struct tegra_drm_client client;
28 struct host1x_channel *channel;
29 struct clk *clk_secondary;
30 struct clk *clk;
31 struct reset_control *rst_secondary;
32 struct reset_control *rst;
33
34 const struct gr3d_soc *soc;

--- 20 unchanged lines hidden (view full) ---

55
56 client->syncpts[0] = host1x_syncpt_request(client, flags);
57 if (!client->syncpts[0]) {
58 err = -ENOMEM;
59 dev_err(client->dev, "failed to request syncpoint: %d\n", err);
60 goto put;
61 }
62
26 struct tegra_drm_client client;
27 struct host1x_channel *channel;
28 struct clk *clk_secondary;
29 struct clk *clk;
30 struct reset_control *rst_secondary;
31 struct reset_control *rst;
32
33 const struct gr3d_soc *soc;

--- 20 unchanged lines hidden (view full) ---

54
55 client->syncpts[0] = host1x_syncpt_request(client, flags);
56 if (!client->syncpts[0]) {
57 err = -ENOMEM;
58 dev_err(client->dev, "failed to request syncpoint: %d\n", err);
59 goto put;
60 }
61
63 gr3d->group = host1x_client_iommu_attach(client, false);
64 if (IS_ERR(gr3d->group)) {
65 err = PTR_ERR(gr3d->group);
62 err = host1x_client_iommu_attach(client, false);
63 if (err < 0) {
66 dev_err(client->dev, "failed to attach to domain: %d\n", err);
67 goto free;
68 }
69
70 err = tegra_drm_register_client(dev->dev_private, drm);
71 if (err < 0) {
72 dev_err(client->dev, "failed to register client: %d\n", err);
73 goto detach;
74 }
75
76 return 0;
77
78detach:
64 dev_err(client->dev, "failed to attach to domain: %d\n", err);
65 goto free;
66 }
67
68 err = tegra_drm_register_client(dev->dev_private, drm);
69 if (err < 0) {
70 dev_err(client->dev, "failed to register client: %d\n", err);
71 goto detach;
72 }
73
74 return 0;
75
76detach:
79 host1x_client_iommu_detach(client, gr3d->group);
77 host1x_client_iommu_detach(client);
80free:
81 host1x_syncpt_free(client->syncpts[0]);
82put:
83 host1x_channel_put(gr3d->channel);
84 return err;
85}
86
87static int gr3d_exit(struct host1x_client *client)
88{
89 struct tegra_drm_client *drm = host1x_to_drm_client(client);
90 struct drm_device *dev = dev_get_drvdata(client->parent);
91 struct gr3d *gr3d = to_gr3d(drm);
92 int err;
93
94 err = tegra_drm_unregister_client(dev->dev_private, drm);
95 if (err < 0)
96 return err;
97
78free:
79 host1x_syncpt_free(client->syncpts[0]);
80put:
81 host1x_channel_put(gr3d->channel);
82 return err;
83}
84
85static int gr3d_exit(struct host1x_client *client)
86{
87 struct tegra_drm_client *drm = host1x_to_drm_client(client);
88 struct drm_device *dev = dev_get_drvdata(client->parent);
89 struct gr3d *gr3d = to_gr3d(drm);
90 int err;
91
92 err = tegra_drm_unregister_client(dev->dev_private, drm);
93 if (err < 0)
94 return err;
95
98 host1x_client_iommu_detach(client, gr3d->group);
96 host1x_client_iommu_detach(client);
99 host1x_syncpt_free(client->syncpts[0]);
100 host1x_channel_put(gr3d->channel);
101
102 return 0;
103}
104
105static const struct host1x_client_ops gr3d_client_ops = {
106 .init = gr3d_init,

--- 297 unchanged lines hidden ---
97 host1x_syncpt_free(client->syncpts[0]);
98 host1x_channel_put(gr3d->channel);
99
100 return 0;
101}
102
103static const struct host1x_client_ops gr3d_client_ops = {
104 .init = gr3d_init,

--- 297 unchanged lines hidden ---