aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2013-10-31 08:28:50 -0400
committerThierry Reding <treding@nvidia.com>2013-12-20 09:56:05 -0500
commit60c2f709d9b41184e0279d7538a5217885da8dde (patch)
tree502bf1bd5dc39ed3adfa5b8270381d40e40403e3
parentd30a91f8e22bc388e071044c4b774fde485ba91e (diff)
drm/tegra: Make legacy fbdev support optional
A lot of the modern userspace is capable of working without the legacy fbdev support. kmscon can be used as a replacement for the framebuffer console, and KMS X drivers create their own framebuffers. Most people don't have a system where all of this works yet, though, so leave support enabled by default. Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/drm/tegra/Kconfig16
-rw-r--r--drivers/gpu/drm/tegra/drm.c2
-rw-r--r--drivers/gpu/drm/tegra/drm.h6
-rw-r--r--drivers/gpu/drm/tegra/fb.c41
4 files changed, 45 insertions, 20 deletions
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
index ce214c3f4ef5..354ddb29231f 100644
--- a/drivers/gpu/drm/tegra/Kconfig
+++ b/drivers/gpu/drm/tegra/Kconfig
@@ -3,13 +3,9 @@ config DRM_TEGRA
3 depends on ARCH_TEGRA || (ARM && COMPILE_TEST) 3 depends on ARCH_TEGRA || (ARM && COMPILE_TEST)
4 depends on DRM 4 depends on DRM
5 depends on RESET_CONTROLLER 5 depends on RESET_CONTROLLER
6 select DRM_KMS_FB_HELPER
7 select DRM_KMS_HELPER 6 select DRM_KMS_HELPER
8 select DRM_MIPI_DSI 7 select DRM_MIPI_DSI
9 select DRM_PANEL 8 select DRM_PANEL
10 select FB_SYS_FILLRECT
11 select FB_SYS_COPYAREA
12 select FB_SYS_IMAGEBLIT
13 select TEGRA_HOST1X 9 select TEGRA_HOST1X
14 help 10 help
15 Choose this option if you have an NVIDIA Tegra SoC. 11 Choose this option if you have an NVIDIA Tegra SoC.
@@ -19,6 +15,18 @@ config DRM_TEGRA
19 15
20if DRM_TEGRA 16if DRM_TEGRA
21 17
18config DRM_TEGRA_FBDEV
19 bool "Enable legacy fbdev support"
20 select DRM_KMS_FB_HELPER
21 select FB_SYS_FILLRECT
22 select FB_SYS_COPYAREA
23 select FB_SYS_IMAGEBLIT
24 default y
25 help
26 Choose this option if you have a need for the legacy fbdev support.
27 Note that this support also provides the Linux console on top of
28 the Tegra modesetting driver.
29
22config DRM_TEGRA_DEBUG 30config DRM_TEGRA_DEBUG
23 bool "NVIDIA Tegra DRM debug support" 31 bool "NVIDIA Tegra DRM debug support"
24 help 32 help
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 08e9e3740c13..a0b34816298c 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -104,9 +104,11 @@ static void tegra_drm_context_free(struct tegra_drm_context *context)
104 104
105static void tegra_drm_lastclose(struct drm_device *drm) 105static void tegra_drm_lastclose(struct drm_device *drm)
106{ 106{
107#ifdef CONFIG_TEGRA_DRM_FBDEV
107 struct tegra_drm *tegra = drm->dev_private; 108 struct tegra_drm *tegra = drm->dev_private;
108 109
109 tegra_fbdev_restore_mode(tegra->fbdev); 110 tegra_fbdev_restore_mode(tegra->fbdev);
111#endif
110} 112}
111 113
112static struct host1x_bo * 114static struct host1x_bo *
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index ddaa937836de..6b293c88a8ca 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -27,10 +27,12 @@ struct tegra_fb {
27 unsigned int num_planes; 27 unsigned int num_planes;
28}; 28};
29 29
30#ifdef CONFIG_DRM_TEGRA_FBDEV
30struct tegra_fbdev { 31struct tegra_fbdev {
31 struct drm_fb_helper base; 32 struct drm_fb_helper base;
32 struct tegra_fb *fb; 33 struct tegra_fb *fb;
33}; 34};
35#endif
34 36
35struct tegra_drm { 37struct tegra_drm {
36 struct drm_device *drm; 38 struct drm_device *drm;
@@ -38,7 +40,9 @@ struct tegra_drm {
38 struct mutex clients_lock; 40 struct mutex clients_lock;
39 struct list_head clients; 41 struct list_head clients;
40 42
43#ifdef CONFIG_DRM_TEGRA_FBDEV
41 struct tegra_fbdev *fbdev; 44 struct tegra_fbdev *fbdev;
45#endif
42}; 46};
43 47
44struct tegra_drm_client; 48struct tegra_drm_client;
@@ -265,7 +269,9 @@ bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
265bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer); 269bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer);
266extern int tegra_drm_fb_init(struct drm_device *drm); 270extern int tegra_drm_fb_init(struct drm_device *drm);
267extern void tegra_drm_fb_exit(struct drm_device *drm); 271extern void tegra_drm_fb_exit(struct drm_device *drm);
272#ifdef CONFIG_DRM_TEGRA_FBDEV
268extern void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev); 273extern void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev);
274#endif
269 275
270extern struct platform_driver tegra_dc_driver; 276extern struct platform_driver tegra_dc_driver;
271extern struct platform_driver tegra_dsi_driver; 277extern struct platform_driver tegra_dsi_driver;
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index a3835e7de184..bd4bf210f469 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -18,10 +18,12 @@ static inline struct tegra_fb *to_tegra_fb(struct drm_framebuffer *fb)
18 return container_of(fb, struct tegra_fb, base); 18 return container_of(fb, struct tegra_fb, base);
19} 19}
20 20
21#ifdef CONFIG_DRM_TEGRA_FBDEV
21static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper) 22static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper)
22{ 23{
23 return container_of(helper, struct tegra_fbdev, base); 24 return container_of(helper, struct tegra_fbdev, base);
24} 25}
26#endif
25 27
26struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer, 28struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
27 unsigned int index) 29 unsigned int index)
@@ -172,6 +174,7 @@ unreference:
172 return ERR_PTR(err); 174 return ERR_PTR(err);
173} 175}
174 176
177#ifdef CONFIG_DRM_TEGRA_FBDEV
175static struct fb_ops tegra_fb_ops = { 178static struct fb_ops tegra_fb_ops = {
176 .owner = THIS_MODULE, 179 .owner = THIS_MODULE,
177 .fb_fillrect = sys_fillrect, 180 .fb_fillrect = sys_fillrect,
@@ -339,6 +342,15 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
339 kfree(fbdev); 342 kfree(fbdev);
340} 343}
341 344
345void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev)
346{
347 if (fbdev) {
348 drm_modeset_lock_all(fbdev->base.dev);
349 drm_fb_helper_restore_fbdev_mode(&fbdev->base);
350 drm_modeset_unlock_all(fbdev->base.dev);
351 }
352}
353
342static void tegra_fb_output_poll_changed(struct drm_device *drm) 354static void tegra_fb_output_poll_changed(struct drm_device *drm)
343{ 355{
344 struct tegra_drm *tegra = drm->dev_private; 356 struct tegra_drm *tegra = drm->dev_private;
@@ -346,16 +358,20 @@ static void tegra_fb_output_poll_changed(struct drm_device *drm)
346 if (tegra->fbdev) 358 if (tegra->fbdev)
347 drm_fb_helper_hotplug_event(&tegra->fbdev->base); 359 drm_fb_helper_hotplug_event(&tegra->fbdev->base);
348} 360}
361#endif
349 362
350static const struct drm_mode_config_funcs tegra_drm_mode_funcs = { 363static const struct drm_mode_config_funcs tegra_drm_mode_funcs = {
351 .fb_create = tegra_fb_create, 364 .fb_create = tegra_fb_create,
365#ifdef CONFIG_DRM_TEGRA_FBDEV
352 .output_poll_changed = tegra_fb_output_poll_changed, 366 .output_poll_changed = tegra_fb_output_poll_changed,
367#endif
353}; 368};
354 369
355int tegra_drm_fb_init(struct drm_device *drm) 370int tegra_drm_fb_init(struct drm_device *drm)
356{ 371{
372#ifdef CONFIG_DRM_TEGRA_FBDEV
357 struct tegra_drm *tegra = drm->dev_private; 373 struct tegra_drm *tegra = drm->dev_private;
358 struct tegra_fbdev *fbdev; 374#endif
359 375
360 drm->mode_config.min_width = 0; 376 drm->mode_config.min_width = 0;
361 drm->mode_config.min_height = 0; 377 drm->mode_config.min_height = 0;
@@ -365,28 +381,21 @@ int tegra_drm_fb_init(struct drm_device *drm)
365 381
366 drm->mode_config.funcs = &tegra_drm_mode_funcs; 382 drm->mode_config.funcs = &tegra_drm_mode_funcs;
367 383
368 fbdev = tegra_fbdev_create(drm, 32, drm->mode_config.num_crtc, 384#ifdef CONFIG_DRM_TEGRA_FBDEV
369 drm->mode_config.num_connector); 385 tegra->fbdev = tegra_fbdev_create(drm, 32, drm->mode_config.num_crtc,
370 if (IS_ERR(fbdev)) 386 drm->mode_config.num_connector);
371 return PTR_ERR(fbdev); 387 if (IS_ERR(tegra->fbdev))
372 388 return PTR_ERR(tegra->fbdev);
373 tegra->fbdev = fbdev; 389#endif
374 390
375 return 0; 391 return 0;
376} 392}
377 393
378void tegra_drm_fb_exit(struct drm_device *drm) 394void tegra_drm_fb_exit(struct drm_device *drm)
379{ 395{
396#ifdef CONFIG_DRM_TEGRA_FBDEV
380 struct tegra_drm *tegra = drm->dev_private; 397 struct tegra_drm *tegra = drm->dev_private;
381 398
382 tegra_fbdev_free(tegra->fbdev); 399 tegra_fbdev_free(tegra->fbdev);
383} 400#endif
384
385void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev)
386{
387 if (fbdev) {
388 drm_modeset_lock_all(fbdev->base.dev);
389 drm_fb_helper_restore_fbdev_mode(&fbdev->base);
390 drm_modeset_unlock_all(fbdev->base.dev);
391 }
392} 401}