diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_display.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_display.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index cf1c5c0a0abe..9d7928f40fdf 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -34,10 +34,6 @@ static void | |||
34 | nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb) | 34 | nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb) |
35 | { | 35 | { |
36 | struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); | 36 | struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); |
37 | struct drm_device *dev = drm_fb->dev; | ||
38 | |||
39 | if (drm_fb->fbdev) | ||
40 | nouveau_fbcon_remove(dev, drm_fb); | ||
41 | 37 | ||
42 | if (fb->nvbo) | 38 | if (fb->nvbo) |
43 | drm_gem_object_unreference_unlocked(fb->nvbo->gem); | 39 | drm_gem_object_unreference_unlocked(fb->nvbo->gem); |
@@ -61,27 +57,20 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = { | |||
61 | .create_handle = nouveau_user_framebuffer_create_handle, | 57 | .create_handle = nouveau_user_framebuffer_create_handle, |
62 | }; | 58 | }; |
63 | 59 | ||
64 | struct drm_framebuffer * | 60 | int |
65 | nouveau_framebuffer_create(struct drm_device *dev, struct nouveau_bo *nvbo, | 61 | nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb, |
66 | struct drm_mode_fb_cmd *mode_cmd) | 62 | struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo) |
67 | { | 63 | { |
68 | struct nouveau_framebuffer *fb; | ||
69 | int ret; | 64 | int ret; |
70 | 65 | ||
71 | fb = kzalloc(sizeof(struct nouveau_framebuffer), GFP_KERNEL); | 66 | ret = drm_framebuffer_init(dev, &nouveau_fb->base, &nouveau_framebuffer_funcs); |
72 | if (!fb) | ||
73 | return NULL; | ||
74 | |||
75 | ret = drm_framebuffer_init(dev, &fb->base, &nouveau_framebuffer_funcs); | ||
76 | if (ret) { | 67 | if (ret) { |
77 | kfree(fb); | 68 | return ret; |
78 | return NULL; | ||
79 | } | 69 | } |
80 | 70 | ||
81 | drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd); | 71 | drm_helper_mode_fill_fb_struct(&nouveau_fb->base, mode_cmd); |
82 | 72 | nouveau_fb->nvbo = nvbo; | |
83 | fb->nvbo = nvbo; | 73 | return 0; |
84 | return &fb->base; | ||
85 | } | 74 | } |
86 | 75 | ||
87 | static struct drm_framebuffer * | 76 | static struct drm_framebuffer * |
@@ -89,24 +78,28 @@ nouveau_user_framebuffer_create(struct drm_device *dev, | |||
89 | struct drm_file *file_priv, | 78 | struct drm_file *file_priv, |
90 | struct drm_mode_fb_cmd *mode_cmd) | 79 | struct drm_mode_fb_cmd *mode_cmd) |
91 | { | 80 | { |
92 | struct drm_framebuffer *fb; | 81 | struct nouveau_framebuffer *nouveau_fb; |
93 | struct drm_gem_object *gem; | 82 | struct drm_gem_object *gem; |
83 | int ret; | ||
94 | 84 | ||
95 | gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle); | 85 | gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle); |
96 | if (!gem) | 86 | if (!gem) |
97 | return NULL; | 87 | return NULL; |
98 | 88 | ||
99 | fb = nouveau_framebuffer_create(dev, nouveau_gem_object(gem), mode_cmd); | 89 | nouveau_fb = kzalloc(sizeof(struct nouveau_framebuffer), GFP_KERNEL); |
100 | if (!fb) { | 90 | if (!nouveau_fb) |
91 | return NULL; | ||
92 | |||
93 | ret = nouveau_framebuffer_init(dev, nouveau_fb, mode_cmd, nouveau_gem_object(gem)); | ||
94 | if (ret) { | ||
101 | drm_gem_object_unreference(gem); | 95 | drm_gem_object_unreference(gem); |
102 | return NULL; | 96 | return NULL; |
103 | } | 97 | } |
104 | 98 | ||
105 | return fb; | 99 | return &nouveau_fb->base; |
106 | } | 100 | } |
107 | 101 | ||
108 | const struct drm_mode_config_funcs nouveau_mode_config_funcs = { | 102 | const struct drm_mode_config_funcs nouveau_mode_config_funcs = { |
109 | .fb_create = nouveau_user_framebuffer_create, | 103 | .fb_create = nouveau_user_framebuffer_create, |
110 | .fb_changed = nouveau_fbcon_probe, | ||
111 | }; | 104 | }; |
112 | 105 | ||