diff options
author | Dave Airlie <airlied@redhat.com> | 2018-08-09 20:44:20 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-08-09 21:13:36 -0400 |
commit | 4abfe15e2a0a700eb36587dc3b3b1c29a609e4fb (patch) | |
tree | e7206245d3c0d0916d18afd748fd3b777baf838f /drivers/gpu/drm/imx/imx-drm-core.c | |
parent | 824da016fde1de98ab92c5b9df1b52433edd1594 (diff) | |
parent | 5c41bb6071257ba668a2b8933a8654e69aea1cee (diff) |
Merge tag 'imx-drm-next-2018-08-03' of git://git.pengutronix.de/git/pza/linux into drm-next
drm/imx: use suspend/resume helpers, add ipu-v3 V4L2 XRGB32/XBGR32 support
- Convert imx_drm_suspend/resume to use the
drm_mode_config_helper_suspend/ resume functions.
- Add support for V4L2_PIX_FMT_XRGB32/XBGR32, corresponding to
DRM_FORMAT_XRGB8888/BGRX8888, respectively.
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Philipp Zabel <p.zabel@pengutronix.de>
Link: https://patchwork.freedesktop.org/patch/msgid/1533552701.4204.15.camel@pengutronix.de
Diffstat (limited to 'drivers/gpu/drm/imx/imx-drm-core.c')
-rw-r--r-- | drivers/gpu/drm/imx/imx-drm-core.c | 42 |
1 files changed, 2 insertions, 40 deletions
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c index f0122afcf2a8..5ea0c82f9957 100644 --- a/drivers/gpu/drm/imx/imx-drm-core.c +++ b/drivers/gpu/drm/imx/imx-drm-core.c | |||
@@ -35,11 +35,6 @@ | |||
35 | 35 | ||
36 | #define MAX_CRTC 4 | 36 | #define MAX_CRTC 4 |
37 | 37 | ||
38 | struct imx_drm_device { | ||
39 | struct drm_device *drm; | ||
40 | struct drm_atomic_state *state; | ||
41 | }; | ||
42 | |||
43 | #if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) | 38 | #if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) |
44 | static int legacyfb_depth = 16; | 39 | static int legacyfb_depth = 16; |
45 | module_param(legacyfb_depth, int, 0444); | 40 | module_param(legacyfb_depth, int, 0444); |
@@ -218,22 +213,12 @@ static int compare_of(struct device *dev, void *data) | |||
218 | static int imx_drm_bind(struct device *dev) | 213 | static int imx_drm_bind(struct device *dev) |
219 | { | 214 | { |
220 | struct drm_device *drm; | 215 | struct drm_device *drm; |
221 | struct imx_drm_device *imxdrm; | ||
222 | int ret; | 216 | int ret; |
223 | 217 | ||
224 | drm = drm_dev_alloc(&imx_drm_driver, dev); | 218 | drm = drm_dev_alloc(&imx_drm_driver, dev); |
225 | if (IS_ERR(drm)) | 219 | if (IS_ERR(drm)) |
226 | return PTR_ERR(drm); | 220 | return PTR_ERR(drm); |
227 | 221 | ||
228 | imxdrm = devm_kzalloc(dev, sizeof(*imxdrm), GFP_KERNEL); | ||
229 | if (!imxdrm) { | ||
230 | ret = -ENOMEM; | ||
231 | goto err_put; | ||
232 | } | ||
233 | |||
234 | imxdrm->drm = drm; | ||
235 | drm->dev_private = imxdrm; | ||
236 | |||
237 | /* | 222 | /* |
238 | * enable drm irq mode. | 223 | * enable drm irq mode. |
239 | * - with irq_enabled = true, we can use the vblank feature. | 224 | * - with irq_enabled = true, we can use the vblank feature. |
@@ -305,7 +290,6 @@ err_unbind: | |||
305 | component_unbind_all(drm->dev, drm); | 290 | component_unbind_all(drm->dev, drm); |
306 | err_kms: | 291 | err_kms: |
307 | drm_mode_config_cleanup(drm); | 292 | drm_mode_config_cleanup(drm); |
308 | err_put: | ||
309 | drm_dev_put(drm); | 293 | drm_dev_put(drm); |
310 | 294 | ||
311 | return ret; | 295 | return ret; |
@@ -354,37 +338,15 @@ static int imx_drm_platform_remove(struct platform_device *pdev) | |||
354 | static int imx_drm_suspend(struct device *dev) | 338 | static int imx_drm_suspend(struct device *dev) |
355 | { | 339 | { |
356 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 340 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
357 | struct imx_drm_device *imxdrm; | ||
358 | |||
359 | /* The drm_dev is NULL before .load hook is called */ | ||
360 | if (drm_dev == NULL) | ||
361 | return 0; | ||
362 | |||
363 | drm_kms_helper_poll_disable(drm_dev); | ||
364 | 341 | ||
365 | imxdrm = drm_dev->dev_private; | 342 | return drm_mode_config_helper_suspend(drm_dev); |
366 | imxdrm->state = drm_atomic_helper_suspend(drm_dev); | ||
367 | if (IS_ERR(imxdrm->state)) { | ||
368 | drm_kms_helper_poll_enable(drm_dev); | ||
369 | return PTR_ERR(imxdrm->state); | ||
370 | } | ||
371 | |||
372 | return 0; | ||
373 | } | 343 | } |
374 | 344 | ||
375 | static int imx_drm_resume(struct device *dev) | 345 | static int imx_drm_resume(struct device *dev) |
376 | { | 346 | { |
377 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 347 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
378 | struct imx_drm_device *imx_drm; | ||
379 | 348 | ||
380 | if (drm_dev == NULL) | 349 | return drm_mode_config_helper_resume(drm_dev); |
381 | return 0; | ||
382 | |||
383 | imx_drm = drm_dev->dev_private; | ||
384 | drm_atomic_helper_resume(drm_dev, imx_drm->state); | ||
385 | drm_kms_helper_poll_enable(drm_dev); | ||
386 | |||
387 | return 0; | ||
388 | } | 350 | } |
389 | #endif | 351 | #endif |
390 | 352 | ||