Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/imx: imx-ldb: use drm managed resources

Use drmm_simple_encoder_alloc() to align encoder memory lifetime with
the drm device. drm_encoder_cleanup() is called automatically before
the memory is freed.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>

+22 -9
+22 -9
drivers/gpu/drm/imx/imx-ldb.c
··· 22 22 #include <drm/drm_atomic_helper.h> 23 23 #include <drm/drm_bridge.h> 24 24 #include <drm/drm_fb_helper.h> 25 + #include <drm/drm_managed.h> 25 26 #include <drm/drm_of.h> 26 27 #include <drm/drm_panel.h> 27 28 #include <drm/drm_print.h> ··· 48 47 #define LDB_DI1_VS_POL_ACT_LOW (1 << 10) 49 48 #define LDB_BGREF_RMODE_INT (1 << 15) 50 49 50 + struct imx_ldb_channel; 51 + 52 + struct imx_ldb_encoder { 53 + struct drm_connector connector; 54 + struct drm_encoder encoder; 55 + struct imx_ldb_channel *channel; 56 + }; 57 + 51 58 struct imx_ldb; 52 59 53 60 struct imx_ldb_channel { 54 61 struct imx_ldb *ldb; 55 - struct drm_connector connector; 56 - struct drm_encoder encoder; 57 62 58 63 /* Defines what is connected to the ldb, only one at a time */ 59 64 struct drm_panel *panel; ··· 77 70 78 71 static inline struct imx_ldb_channel *con_to_imx_ldb_ch(struct drm_connector *c) 79 72 { 80 - return container_of(c, struct imx_ldb_channel, connector); 73 + return container_of(c, struct imx_ldb_encoder, connector)->channel; 81 74 } 82 75 83 76 static inline struct imx_ldb_channel *enc_to_imx_ldb_ch(struct drm_encoder *e) 84 77 { 85 - return container_of(e, struct imx_ldb_channel, encoder); 78 + return container_of(e, struct imx_ldb_encoder, encoder)->channel; 86 79 } 87 80 88 81 struct bus_mux { ··· 418 411 struct imx_ldb_channel *imx_ldb_ch) 419 412 { 420 413 struct imx_ldb *ldb = imx_ldb_ch->ldb; 421 - struct drm_connector *connector = &imx_ldb_ch->connector; 422 - struct drm_encoder *encoder = &imx_ldb_ch->encoder; 414 + struct imx_ldb_encoder *ldb_encoder; 415 + struct drm_connector *connector; 416 + struct drm_encoder *encoder; 423 417 int ret; 424 418 425 - memset(connector, 0, sizeof(*connector)); 426 - memset(encoder, 0, sizeof(*encoder)); 419 + ldb_encoder = drmm_simple_encoder_alloc(drm, struct imx_ldb_encoder, 420 + encoder, DRM_MODE_ENCODER_LVDS); 421 + if (IS_ERR(ldb_encoder)) 422 + return PTR_ERR(ldb_encoder); 423 + 424 + ldb_encoder->channel = imx_ldb_ch; 425 + connector = &ldb_encoder->connector; 426 + encoder = &ldb_encoder->encoder; 427 427 428 428 ret = imx_drm_encoder_parse_of(drm, encoder, imx_ldb_ch->child); 429 429 if (ret) ··· 447 433 } 448 434 449 435 drm_encoder_helper_add(encoder, &imx_ldb_encoder_helper_funcs); 450 - drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_LVDS); 451 436 452 437 if (imx_ldb_ch->bridge) { 453 438 ret = drm_bridge_attach(encoder, imx_ldb_ch->bridge, NULL, 0);