diff options
author | Thierry Reding <treding@nvidia.com> | 2013-10-31 08:28:50 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2013-12-20 09:56:05 -0500 |
commit | 60c2f709d9b41184e0279d7538a5217885da8dde (patch) | |
tree | 502bf1bd5dc39ed3adfa5b8270381d40e40403e3 | |
parent | d30a91f8e22bc388e071044c4b774fde485ba91e (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/Kconfig | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/tegra/drm.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/tegra/fb.c | 41 |
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 | ||
20 | if DRM_TEGRA | 16 | if DRM_TEGRA |
21 | 17 | ||
18 | config 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 | |||
22 | config DRM_TEGRA_DEBUG | 30 | config 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 | ||
105 | static void tegra_drm_lastclose(struct drm_device *drm) | 105 | static 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 | ||
112 | static struct host1x_bo * | 114 | static 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 | ||
30 | struct tegra_fbdev { | 31 | struct 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 | ||
35 | struct tegra_drm { | 37 | struct 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 | ||
44 | struct tegra_drm_client; | 48 | struct tegra_drm_client; |
@@ -265,7 +269,9 @@ bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer); | |||
265 | bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer); | 269 | bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer); |
266 | extern int tegra_drm_fb_init(struct drm_device *drm); | 270 | extern int tegra_drm_fb_init(struct drm_device *drm); |
267 | extern void tegra_drm_fb_exit(struct drm_device *drm); | 271 | extern void tegra_drm_fb_exit(struct drm_device *drm); |
272 | #ifdef CONFIG_DRM_TEGRA_FBDEV | ||
268 | extern void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev); | 273 | extern void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev); |
274 | #endif | ||
269 | 275 | ||
270 | extern struct platform_driver tegra_dc_driver; | 276 | extern struct platform_driver tegra_dc_driver; |
271 | extern struct platform_driver tegra_dsi_driver; | 277 | extern 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 | ||
21 | static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper) | 22 | static 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 | ||
26 | struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer, | 28 | struct 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 | ||
175 | static struct fb_ops tegra_fb_ops = { | 178 | static 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 | ||
345 | void 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 | |||
342 | static void tegra_fb_output_poll_changed(struct drm_device *drm) | 354 | static 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 | ||
350 | static const struct drm_mode_config_funcs tegra_drm_mode_funcs = { | 363 | static 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 | ||
355 | int tegra_drm_fb_init(struct drm_device *drm) | 370 | int 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 | ||
378 | void tegra_drm_fb_exit(struct drm_device *drm) | 394 | void 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 | |||
385 | void 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 | } |