aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/host1x/dev.c
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2013-10-14 08:43:22 -0400
committerThierry Reding <treding@nvidia.com>2013-10-31 04:55:33 -0400
commit776dc38403676f499a73d32e2e7c61eb5b42f736 (patch)
tree5c9f8d670b51d743c5bbab45ec401e30f22579c1 /drivers/gpu/host1x/dev.c
parent35d747a81d7eb824bd0c3476cd0c564b52ad5353 (diff)
drm/tegra: Move subdevice infrastructure to host1x
The Tegra DRM driver currently uses some infrastructure to defer the DRM core initialization until all required devices have registered. The same infrastructure can potentially be used by any other driver that requires more than a single sub-device of the host1x module. Make the infrastructure more generic and keep only the DRM specific code in the DRM part of the driver. Eventually this will make it easy to move the DRM driver part back to the DRM subsystem. Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/gpu/host1x/dev.c')
-rw-r--r--drivers/gpu/host1x/dev.c60
1 files changed, 17 insertions, 43 deletions
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index 105aa4ed665a..de0fd552710d 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -27,24 +27,12 @@
27#define CREATE_TRACE_POINTS 27#define CREATE_TRACE_POINTS
28#include <trace/events/host1x.h> 28#include <trace/events/host1x.h>
29 29
30#include "bus.h"
30#include "dev.h" 31#include "dev.h"
31#include "intr.h" 32#include "intr.h"
32#include "channel.h" 33#include "channel.h"
33#include "debug.h" 34#include "debug.h"
34#include "hw/host1x01.h" 35#include "hw/host1x01.h"
35#include "host1x_client.h"
36
37void host1x_set_drm_data(struct device *dev, void *data)
38{
39 struct host1x *host1x = dev_get_drvdata(dev);
40 host1x->drm_data = data;
41}
42
43void *host1x_get_drm_data(struct device *dev)
44{
45 struct host1x *host1x = dev_get_drvdata(dev);
46 return host1x ? host1x->drm_data : NULL;
47}
48 36
49void host1x_sync_writel(struct host1x *host1x, u32 v, u32 r) 37void host1x_sync_writel(struct host1x *host1x, u32 v, u32 r)
50{ 38{
@@ -114,6 +102,9 @@ static int host1x_probe(struct platform_device *pdev)
114 if (!host) 102 if (!host)
115 return -ENOMEM; 103 return -ENOMEM;
116 104
105 mutex_init(&host->devices_lock);
106 INIT_LIST_HEAD(&host->devices);
107 INIT_LIST_HEAD(&host->list);
117 host->dev = &pdev->dev; 108 host->dev = &pdev->dev;
118 host->info = id->data; 109 host->info = id->data;
119 110
@@ -163,10 +154,14 @@ static int host1x_probe(struct platform_device *pdev)
163 154
164 host1x_debug_init(host); 155 host1x_debug_init(host);
165 156
166 tegra_drm_alloc(pdev); 157 err = host1x_register(host);
158 if (err < 0)
159 goto fail_deinit_intr;
167 160
168 return 0; 161 return 0;
169 162
163fail_deinit_intr:
164 host1x_intr_deinit(host);
170fail_deinit_syncpt: 165fail_deinit_syncpt:
171 host1x_syncpt_deinit(host); 166 host1x_syncpt_deinit(host);
172 return err; 167 return err;
@@ -176,6 +171,7 @@ static int host1x_remove(struct platform_device *pdev)
176{ 171{
177 struct host1x *host = platform_get_drvdata(pdev); 172 struct host1x *host = platform_get_drvdata(pdev);
178 173
174 host1x_unregister(host);
179 host1x_intr_deinit(host); 175 host1x_intr_deinit(host);
180 host1x_syncpt_deinit(host); 176 host1x_syncpt_deinit(host);
181 clk_disable_unprepare(host->clk); 177 clk_disable_unprepare(host->clk);
@@ -196,46 +192,24 @@ static int __init tegra_host1x_init(void)
196{ 192{
197 int err; 193 int err;
198 194
199 err = platform_driver_register(&tegra_host1x_driver); 195 err = host1x_bus_init();
200 if (err < 0) 196 if (err < 0)
201 return err; 197 return err;
202 198
203#ifdef CONFIG_DRM_TEGRA 199 err = platform_driver_register(&tegra_host1x_driver);
204 err = platform_driver_register(&tegra_dc_driver); 200 if (err < 0) {
205 if (err < 0) 201 host1x_bus_exit();
206 goto unregister_host1x; 202 return err;
207 203 }
208 err = platform_driver_register(&tegra_hdmi_driver);
209 if (err < 0)
210 goto unregister_dc;
211
212 err = platform_driver_register(&tegra_gr2d_driver);
213 if (err < 0)
214 goto unregister_hdmi;
215#endif
216 204
217 return 0; 205 return 0;
218
219#ifdef CONFIG_DRM_TEGRA
220unregister_hdmi:
221 platform_driver_unregister(&tegra_hdmi_driver);
222unregister_dc:
223 platform_driver_unregister(&tegra_dc_driver);
224unregister_host1x:
225 platform_driver_unregister(&tegra_host1x_driver);
226 return err;
227#endif
228} 206}
229module_init(tegra_host1x_init); 207module_init(tegra_host1x_init);
230 208
231static void __exit tegra_host1x_exit(void) 209static void __exit tegra_host1x_exit(void)
232{ 210{
233#ifdef CONFIG_DRM_TEGRA
234 platform_driver_unregister(&tegra_gr2d_driver);
235 platform_driver_unregister(&tegra_hdmi_driver);
236 platform_driver_unregister(&tegra_dc_driver);
237#endif
238 platform_driver_unregister(&tegra_host1x_driver); 211 platform_driver_unregister(&tegra_host1x_driver);
212 host1x_bus_exit();
239} 213}
240module_exit(tegra_host1x_exit); 214module_exit(tegra_host1x_exit);
241 215