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

drm/imx: imx-tve: 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.
Also fold imx_tve_register() into imx_tve_bind().

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

+39 -35
+39 -35
drivers/gpu/drm/imx/imx-tve.c
··· 19 19 20 20 #include <drm/drm_atomic_helper.h> 21 21 #include <drm/drm_fb_helper.h> 22 + #include <drm/drm_managed.h> 22 23 #include <drm/drm_probe_helper.h> 23 24 #include <drm/drm_simple_kms_helper.h> 24 25 ··· 100 99 TVE_MODE_VGA, 101 100 }; 102 101 103 - struct imx_tve { 102 + struct imx_tve_encoder { 104 103 struct drm_connector connector; 105 104 struct drm_encoder encoder; 105 + struct imx_tve *tve; 106 + }; 107 + 108 + struct imx_tve { 106 109 struct device *dev; 107 110 int mode; 108 111 int di_hsync_pin; ··· 123 118 124 119 static inline struct imx_tve *con_to_tve(struct drm_connector *c) 125 120 { 126 - return container_of(c, struct imx_tve, connector); 121 + return container_of(c, struct imx_tve_encoder, connector)->tve; 127 122 } 128 123 129 124 static inline struct imx_tve *enc_to_tve(struct drm_encoder *e) 130 125 { 131 - return container_of(e, struct imx_tve, encoder); 126 + return container_of(e, struct imx_tve_encoder, encoder)->tve; 132 127 } 133 128 134 129 static void tve_enable(struct imx_tve *tve) ··· 433 428 return 0; 434 429 } 435 430 436 - static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve) 437 - { 438 - struct drm_encoder *encoder = &tve->encoder; 439 - struct drm_connector *connector = &tve->connector; 440 - int encoder_type; 441 - int ret; 442 - 443 - encoder_type = tve->mode == TVE_MODE_VGA ? 444 - DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC; 445 - 446 - memset(connector, 0, sizeof(*connector)); 447 - memset(encoder, 0, sizeof(*encoder)); 448 - 449 - ret = imx_drm_encoder_parse_of(drm, encoder, tve->dev->of_node); 450 - if (ret) 451 - return ret; 452 - 453 - drm_encoder_helper_add(encoder, &imx_tve_encoder_helper_funcs); 454 - drm_simple_encoder_init(drm, encoder, encoder_type); 455 - 456 - drm_connector_helper_add(connector, &imx_tve_connector_helper_funcs); 457 - drm_connector_init_with_ddc(drm, connector, 458 - &imx_tve_connector_funcs, 459 - DRM_MODE_CONNECTOR_VGA, 460 - tve->ddc); 461 - 462 - drm_connector_attach_encoder(connector, encoder); 463 - 464 - return 0; 465 - } 466 - 467 431 static void imx_tve_disable_regulator(void *data) 468 432 { 469 433 struct imx_tve *tve = data; ··· 482 508 { 483 509 struct drm_device *drm = data; 484 510 struct imx_tve *tve = dev_get_drvdata(dev); 511 + struct imx_tve_encoder *tvee; 512 + struct drm_encoder *encoder; 513 + struct drm_connector *connector; 514 + int encoder_type; 515 + int ret; 485 516 486 - return imx_tve_register(drm, tve); 517 + encoder_type = tve->mode == TVE_MODE_VGA ? 518 + DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC; 519 + 520 + tvee = drmm_simple_encoder_alloc(drm, struct imx_tve_encoder, encoder, 521 + encoder_type); 522 + if (IS_ERR(tvee)) 523 + return PTR_ERR(tvee); 524 + 525 + tvee->tve = tve; 526 + encoder = &tvee->encoder; 527 + connector = &tvee->connector; 528 + 529 + ret = imx_drm_encoder_parse_of(drm, encoder, tve->dev->of_node); 530 + if (ret) 531 + return ret; 532 + 533 + drm_encoder_helper_add(encoder, &imx_tve_encoder_helper_funcs); 534 + 535 + drm_connector_helper_add(connector, &imx_tve_connector_helper_funcs); 536 + ret = drm_connector_init_with_ddc(drm, connector, 537 + &imx_tve_connector_funcs, 538 + DRM_MODE_CONNECTOR_VGA, tve->ddc); 539 + if (ret) 540 + return ret; 541 + 542 + return drm_connector_attach_encoder(connector, encoder); 487 543 } 488 544 489 545 static const struct component_ops imx_tve_ops = {