diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-25 19:39:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-25 19:39:51 -0400 |
commit | 9e15400180a17c3b41b86a03bb96b2aebed86e64 (patch) | |
tree | e2b54b5819571a5928669f6cc94d10b2cfe9b09e | |
parent | 90a6cd503982bfd33ce8c70eb49bd2dd33bc6325 (diff) | |
parent | da6119797705c2270f17b287660a1e7bd782a1eb (diff) |
Merge tag 'drm-fixes-for-v4.13-rc7' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"Fixes for rc7, nothing too crazy, some core, i915, and sunxi fixes,
Intel CI has been responsible for some of these fixes being required"
* tag 'drm-fixes-for-v4.13-rc7' of git://people.freedesktop.org/~airlied/linux:
drm/i915/gvt: Fix the kernel null pointer error
drm: Release driver tracking before making the object available again
drm/i915: Clear lost context-switch interrupts across reset
drm/i915/bxt: use NULL for GPIO connection ID
drm/i915/cnl: Fix LSPCON support.
drm/i915/vbt: ignore extraneous child devices for a port
drm/i915: Initialize 'data' in intel_dsi_dcs_backlight.c
drm/atomic: If the atomic check fails, return its value first
drm/atomic: Handle -EDEADLK with out-fences correctly
drm: Fix framebuffer leak
drm/imx: ipuv3-plane: fix YUV framebuffer scanout on the base plane
gpu: ipu-v3: add DRM dependency
drm/rockchip: Fix suspend crash when drm is not bound
drm/sun4i: Implement drm_driver lastclose to restore fbdev console
-rw-r--r-- | drivers/gpu/drm/drm_atomic.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_gem.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_plane.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_vbt.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lspcon.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/ipuv3-plane.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/sun4i/sun4i_drv.c | 8 | ||||
-rw-r--r-- | drivers/gpu/ipu-v3/Kconfig | 1 |
13 files changed, 69 insertions, 24 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index c0f336d23f9c..aed25c4183bb 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c | |||
@@ -1655,6 +1655,9 @@ int drm_atomic_check_only(struct drm_atomic_state *state) | |||
1655 | if (config->funcs->atomic_check) | 1655 | if (config->funcs->atomic_check) |
1656 | ret = config->funcs->atomic_check(state->dev, state); | 1656 | ret = config->funcs->atomic_check(state->dev, state); |
1657 | 1657 | ||
1658 | if (ret) | ||
1659 | return ret; | ||
1660 | |||
1658 | if (!state->allow_modeset) { | 1661 | if (!state->allow_modeset) { |
1659 | for_each_new_crtc_in_state(state, crtc, crtc_state, i) { | 1662 | for_each_new_crtc_in_state(state, crtc, crtc_state, i) { |
1660 | if (drm_atomic_crtc_needs_modeset(crtc_state)) { | 1663 | if (drm_atomic_crtc_needs_modeset(crtc_state)) { |
@@ -1665,7 +1668,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state) | |||
1665 | } | 1668 | } |
1666 | } | 1669 | } |
1667 | 1670 | ||
1668 | return ret; | 1671 | return 0; |
1669 | } | 1672 | } |
1670 | EXPORT_SYMBOL(drm_atomic_check_only); | 1673 | EXPORT_SYMBOL(drm_atomic_check_only); |
1671 | 1674 | ||
@@ -2167,10 +2170,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, | |||
2167 | struct drm_atomic_state *state; | 2170 | struct drm_atomic_state *state; |
2168 | struct drm_modeset_acquire_ctx ctx; | 2171 | struct drm_modeset_acquire_ctx ctx; |
2169 | struct drm_plane *plane; | 2172 | struct drm_plane *plane; |
2170 | struct drm_out_fence_state *fence_state = NULL; | 2173 | struct drm_out_fence_state *fence_state; |
2171 | unsigned plane_mask; | 2174 | unsigned plane_mask; |
2172 | int ret = 0; | 2175 | int ret = 0; |
2173 | unsigned int i, j, num_fences = 0; | 2176 | unsigned int i, j, num_fences; |
2174 | 2177 | ||
2175 | /* disallow for drivers not supporting atomic: */ | 2178 | /* disallow for drivers not supporting atomic: */ |
2176 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) | 2179 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) |
@@ -2211,6 +2214,8 @@ retry: | |||
2211 | plane_mask = 0; | 2214 | plane_mask = 0; |
2212 | copied_objs = 0; | 2215 | copied_objs = 0; |
2213 | copied_props = 0; | 2216 | copied_props = 0; |
2217 | fence_state = NULL; | ||
2218 | num_fences = 0; | ||
2214 | 2219 | ||
2215 | for (i = 0; i < arg->count_objs; i++) { | 2220 | for (i = 0; i < arg->count_objs; i++) { |
2216 | uint32_t obj_id, count_props; | 2221 | uint32_t obj_id, count_props; |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 8dc11064253d..cdaac37907b1 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -255,13 +255,13 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) | |||
255 | struct drm_gem_object *obj = ptr; | 255 | struct drm_gem_object *obj = ptr; |
256 | struct drm_device *dev = obj->dev; | 256 | struct drm_device *dev = obj->dev; |
257 | 257 | ||
258 | if (dev->driver->gem_close_object) | ||
259 | dev->driver->gem_close_object(obj, file_priv); | ||
260 | |||
258 | if (drm_core_check_feature(dev, DRIVER_PRIME)) | 261 | if (drm_core_check_feature(dev, DRIVER_PRIME)) |
259 | drm_gem_remove_prime_handles(obj, file_priv); | 262 | drm_gem_remove_prime_handles(obj, file_priv); |
260 | drm_vma_node_revoke(&obj->vma_node, file_priv); | 263 | drm_vma_node_revoke(&obj->vma_node, file_priv); |
261 | 264 | ||
262 | if (dev->driver->gem_close_object) | ||
263 | dev->driver->gem_close_object(obj, file_priv); | ||
264 | |||
265 | drm_gem_object_handle_put_unlocked(obj); | 265 | drm_gem_object_handle_put_unlocked(obj); |
266 | 266 | ||
267 | return 0; | 267 | return 0; |
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 5dc8c4350602..e40c12fabbde 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c | |||
@@ -601,6 +601,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data, | |||
601 | 601 | ||
602 | crtc = drm_crtc_find(dev, plane_req->crtc_id); | 602 | crtc = drm_crtc_find(dev, plane_req->crtc_id); |
603 | if (!crtc) { | 603 | if (!crtc) { |
604 | drm_framebuffer_put(fb); | ||
604 | DRM_DEBUG_KMS("Unknown crtc ID %d\n", | 605 | DRM_DEBUG_KMS("Unknown crtc ID %d\n", |
605 | plane_req->crtc_id); | 606 | plane_req->crtc_id); |
606 | return -ENOENT; | 607 | return -ENOENT; |
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 713848c36349..e556a46cd4c2 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
@@ -2714,7 +2714,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx) | |||
2714 | unmap_src: | 2714 | unmap_src: |
2715 | i915_gem_object_unpin_map(obj); | 2715 | i915_gem_object_unpin_map(obj); |
2716 | put_obj: | 2716 | put_obj: |
2717 | i915_gem_object_put(wa_ctx->indirect_ctx.obj); | 2717 | i915_gem_object_put(obj); |
2718 | return ret; | 2718 | return ret; |
2719 | } | 2719 | } |
2720 | 2720 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 639d45c1dd2e..7ea7fd1e8856 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -1120,8 +1120,8 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, | |||
1120 | bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; | 1120 | bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; |
1121 | uint8_t aux_channel, ddc_pin; | 1121 | uint8_t aux_channel, ddc_pin; |
1122 | /* Each DDI port can have more than one value on the "DVO Port" field, | 1122 | /* Each DDI port can have more than one value on the "DVO Port" field, |
1123 | * so look for all the possible values for each port and abort if more | 1123 | * so look for all the possible values for each port. |
1124 | * than one is found. */ | 1124 | */ |
1125 | int dvo_ports[][3] = { | 1125 | int dvo_ports[][3] = { |
1126 | {DVO_PORT_HDMIA, DVO_PORT_DPA, -1}, | 1126 | {DVO_PORT_HDMIA, DVO_PORT_DPA, -1}, |
1127 | {DVO_PORT_HDMIB, DVO_PORT_DPB, -1}, | 1127 | {DVO_PORT_HDMIB, DVO_PORT_DPB, -1}, |
@@ -1130,7 +1130,10 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, | |||
1130 | {DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE}, | 1130 | {DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE}, |
1131 | }; | 1131 | }; |
1132 | 1132 | ||
1133 | /* Find the child device to use, abort if more than one found. */ | 1133 | /* |
1134 | * Find the first child device to reference the port, report if more | ||
1135 | * than one found. | ||
1136 | */ | ||
1134 | for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { | 1137 | for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { |
1135 | it = dev_priv->vbt.child_dev + i; | 1138 | it = dev_priv->vbt.child_dev + i; |
1136 | 1139 | ||
@@ -1140,11 +1143,11 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, | |||
1140 | 1143 | ||
1141 | if (it->common.dvo_port == dvo_ports[port][j]) { | 1144 | if (it->common.dvo_port == dvo_ports[port][j]) { |
1142 | if (child) { | 1145 | if (child) { |
1143 | DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n", | 1146 | DRM_DEBUG_KMS("More than one child device for port %c in VBT, using the first.\n", |
1144 | port_name(port)); | 1147 | port_name(port)); |
1145 | return; | 1148 | } else { |
1149 | child = it; | ||
1146 | } | 1150 | } |
1147 | child = it; | ||
1148 | } | 1151 | } |
1149 | } | 1152 | } |
1150 | } | 1153 | } |
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c index 6e09ceb71500..150a156f3b1e 100644 --- a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c +++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | |||
@@ -46,7 +46,7 @@ static u32 dcs_get_backlight(struct intel_connector *connector) | |||
46 | struct intel_encoder *encoder = connector->encoder; | 46 | struct intel_encoder *encoder = connector->encoder; |
47 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 47 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
48 | struct mipi_dsi_device *dsi_device; | 48 | struct mipi_dsi_device *dsi_device; |
49 | u8 data; | 49 | u8 data = 0; |
50 | enum port port; | 50 | enum port port; |
51 | 51 | ||
52 | /* FIXME: Need to take care of 16 bit brightness level */ | 52 | /* FIXME: Need to take care of 16 bit brightness level */ |
diff --git a/drivers/gpu/drm/i915/intel_dsi_vbt.c b/drivers/gpu/drm/i915/intel_dsi_vbt.c index 7158c7ce9c09..91c07b0c8db9 100644 --- a/drivers/gpu/drm/i915/intel_dsi_vbt.c +++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c | |||
@@ -306,7 +306,7 @@ static void bxt_exec_gpio(struct drm_i915_private *dev_priv, | |||
306 | 306 | ||
307 | if (!gpio_desc) { | 307 | if (!gpio_desc) { |
308 | gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, | 308 | gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, |
309 | "panel", gpio_index, | 309 | NULL, gpio_index, |
310 | value ? GPIOD_OUT_LOW : | 310 | value ? GPIOD_OUT_LOW : |
311 | GPIOD_OUT_HIGH); | 311 | GPIOD_OUT_HIGH); |
312 | 312 | ||
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 7404cf2aac28..2afa4daa88e8 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c | |||
@@ -1221,6 +1221,14 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine) | |||
1221 | return ret; | 1221 | return ret; |
1222 | } | 1222 | } |
1223 | 1223 | ||
1224 | static u8 gtiir[] = { | ||
1225 | [RCS] = 0, | ||
1226 | [BCS] = 0, | ||
1227 | [VCS] = 1, | ||
1228 | [VCS2] = 1, | ||
1229 | [VECS] = 3, | ||
1230 | }; | ||
1231 | |||
1224 | static int gen8_init_common_ring(struct intel_engine_cs *engine) | 1232 | static int gen8_init_common_ring(struct intel_engine_cs *engine) |
1225 | { | 1233 | { |
1226 | struct drm_i915_private *dev_priv = engine->i915; | 1234 | struct drm_i915_private *dev_priv = engine->i915; |
@@ -1245,9 +1253,22 @@ static int gen8_init_common_ring(struct intel_engine_cs *engine) | |||
1245 | 1253 | ||
1246 | DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name); | 1254 | DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name); |
1247 | 1255 | ||
1248 | /* After a GPU reset, we may have requests to replay */ | 1256 | GEM_BUG_ON(engine->id >= ARRAY_SIZE(gtiir)); |
1257 | |||
1258 | /* | ||
1259 | * Clear any pending interrupt state. | ||
1260 | * | ||
1261 | * We do it twice out of paranoia that some of the IIR are double | ||
1262 | * buffered, and if we only reset it once there may still be | ||
1263 | * an interrupt pending. | ||
1264 | */ | ||
1265 | I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]), | ||
1266 | GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift); | ||
1267 | I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]), | ||
1268 | GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift); | ||
1249 | clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); | 1269 | clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); |
1250 | 1270 | ||
1271 | /* After a GPU reset, we may have requests to replay */ | ||
1251 | submit = false; | 1272 | submit = false; |
1252 | for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) { | 1273 | for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) { |
1253 | if (!port_isset(&port[n])) | 1274 | if (!port_isset(&port[n])) |
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c index 5abef482eacf..beb9baaf2f2e 100644 --- a/drivers/gpu/drm/i915/intel_lspcon.c +++ b/drivers/gpu/drm/i915/intel_lspcon.c | |||
@@ -210,8 +210,8 @@ bool lspcon_init(struct intel_digital_port *intel_dig_port) | |||
210 | struct drm_device *dev = intel_dig_port->base.base.dev; | 210 | struct drm_device *dev = intel_dig_port->base.base.dev; |
211 | struct drm_i915_private *dev_priv = to_i915(dev); | 211 | struct drm_i915_private *dev_priv = to_i915(dev); |
212 | 212 | ||
213 | if (!IS_GEN9(dev_priv)) { | 213 | if (!HAS_LSPCON(dev_priv)) { |
214 | DRM_ERROR("LSPCON is supported on GEN9 only\n"); | 214 | DRM_ERROR("LSPCON is not supported on this platform\n"); |
215 | return false; | 215 | return false; |
216 | } | 216 | } |
217 | 217 | ||
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c index 6276bb834b4f..d3845989a29d 100644 --- a/drivers/gpu/drm/imx/ipuv3-plane.c +++ b/drivers/gpu/drm/imx/ipuv3-plane.c | |||
@@ -545,15 +545,13 @@ static void ipu_plane_atomic_update(struct drm_plane *plane, | |||
545 | return; | 545 | return; |
546 | } | 546 | } |
547 | 547 | ||
548 | ics = ipu_drm_fourcc_to_colorspace(fb->format->format); | ||
548 | switch (ipu_plane->dp_flow) { | 549 | switch (ipu_plane->dp_flow) { |
549 | case IPU_DP_FLOW_SYNC_BG: | 550 | case IPU_DP_FLOW_SYNC_BG: |
550 | ipu_dp_setup_channel(ipu_plane->dp, | 551 | ipu_dp_setup_channel(ipu_plane->dp, ics, IPUV3_COLORSPACE_RGB); |
551 | IPUV3_COLORSPACE_RGB, | ||
552 | IPUV3_COLORSPACE_RGB); | ||
553 | ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); | 552 | ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); |
554 | break; | 553 | break; |
555 | case IPU_DP_FLOW_SYNC_FG: | 554 | case IPU_DP_FLOW_SYNC_FG: |
556 | ics = ipu_drm_fourcc_to_colorspace(state->fb->format->format); | ||
557 | ipu_dp_setup_channel(ipu_plane->dp, ics, | 555 | ipu_dp_setup_channel(ipu_plane->dp, ics, |
558 | IPUV3_COLORSPACE_UNKNOWN); | 556 | IPUV3_COLORSPACE_UNKNOWN); |
559 | /* Enable local alpha on partial plane */ | 557 | /* Enable local alpha on partial plane */ |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index c6b1b7f3a2a3..c16bc0a7115b 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | |||
@@ -275,11 +275,15 @@ static void rockchip_drm_fb_resume(struct drm_device *drm) | |||
275 | static int rockchip_drm_sys_suspend(struct device *dev) | 275 | static int rockchip_drm_sys_suspend(struct device *dev) |
276 | { | 276 | { |
277 | struct drm_device *drm = dev_get_drvdata(dev); | 277 | struct drm_device *drm = dev_get_drvdata(dev); |
278 | struct rockchip_drm_private *priv = drm->dev_private; | 278 | struct rockchip_drm_private *priv; |
279 | |||
280 | if (!drm) | ||
281 | return 0; | ||
279 | 282 | ||
280 | drm_kms_helper_poll_disable(drm); | 283 | drm_kms_helper_poll_disable(drm); |
281 | rockchip_drm_fb_suspend(drm); | 284 | rockchip_drm_fb_suspend(drm); |
282 | 285 | ||
286 | priv = drm->dev_private; | ||
283 | priv->state = drm_atomic_helper_suspend(drm); | 287 | priv->state = drm_atomic_helper_suspend(drm); |
284 | if (IS_ERR(priv->state)) { | 288 | if (IS_ERR(priv->state)) { |
285 | rockchip_drm_fb_resume(drm); | 289 | rockchip_drm_fb_resume(drm); |
@@ -293,8 +297,12 @@ static int rockchip_drm_sys_suspend(struct device *dev) | |||
293 | static int rockchip_drm_sys_resume(struct device *dev) | 297 | static int rockchip_drm_sys_resume(struct device *dev) |
294 | { | 298 | { |
295 | struct drm_device *drm = dev_get_drvdata(dev); | 299 | struct drm_device *drm = dev_get_drvdata(dev); |
296 | struct rockchip_drm_private *priv = drm->dev_private; | 300 | struct rockchip_drm_private *priv; |
301 | |||
302 | if (!drm) | ||
303 | return 0; | ||
297 | 304 | ||
305 | priv = drm->dev_private; | ||
298 | drm_atomic_helper_resume(drm, priv->state); | 306 | drm_atomic_helper_resume(drm, priv->state); |
299 | rockchip_drm_fb_resume(drm); | 307 | rockchip_drm_fb_resume(drm); |
300 | drm_kms_helper_poll_enable(drm); | 308 | drm_kms_helper_poll_enable(drm); |
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c index abc7d8fe06b4..a45a627283a1 100644 --- a/drivers/gpu/drm/sun4i/sun4i_drv.c +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c | |||
@@ -25,12 +25,20 @@ | |||
25 | #include "sun4i_framebuffer.h" | 25 | #include "sun4i_framebuffer.h" |
26 | #include "sun4i_tcon.h" | 26 | #include "sun4i_tcon.h" |
27 | 27 | ||
28 | static void sun4i_drv_lastclose(struct drm_device *dev) | ||
29 | { | ||
30 | struct sun4i_drv *drv = dev->dev_private; | ||
31 | |||
32 | drm_fbdev_cma_restore_mode(drv->fbdev); | ||
33 | } | ||
34 | |||
28 | DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops); | 35 | DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops); |
29 | 36 | ||
30 | static struct drm_driver sun4i_drv_driver = { | 37 | static struct drm_driver sun4i_drv_driver = { |
31 | .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC, | 38 | .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC, |
32 | 39 | ||
33 | /* Generic Operations */ | 40 | /* Generic Operations */ |
41 | .lastclose = sun4i_drv_lastclose, | ||
34 | .fops = &sun4i_drv_fops, | 42 | .fops = &sun4i_drv_fops, |
35 | .name = "sun4i-drm", | 43 | .name = "sun4i-drm", |
36 | .desc = "Allwinner sun4i Display Engine", | 44 | .desc = "Allwinner sun4i Display Engine", |
diff --git a/drivers/gpu/ipu-v3/Kconfig b/drivers/gpu/ipu-v3/Kconfig index 08766c6e7856..87a20b3dcf7a 100644 --- a/drivers/gpu/ipu-v3/Kconfig +++ b/drivers/gpu/ipu-v3/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config IMX_IPUV3_CORE | 1 | config IMX_IPUV3_CORE |
2 | tristate "IPUv3 core support" | 2 | tristate "IPUv3 core support" |
3 | depends on SOC_IMX5 || SOC_IMX6Q || ARCH_MULTIPLATFORM | 3 | depends on SOC_IMX5 || SOC_IMX6Q || ARCH_MULTIPLATFORM |
4 | depends on DRM || !DRM # if DRM=m, this can't be 'y' | ||
4 | select GENERIC_IRQ_CHIP | 5 | select GENERIC_IRQ_CHIP |
5 | help | 6 | help |
6 | Choose this if you have a i.MX5/6 system and want to use the Image | 7 | Choose this if you have a i.MX5/6 system and want to use the Image |