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

drm/msm: Centralize connector registration/unregistration

Move the drm_connector registration from the encoder(HDMI/DSI etc) drivers
to the msm platform driver. This will simplify the task of ensuring that
the connectors are registered only after the drm_device itself is
registered.

The connectors' destroy ops are made to use kzalloc instead of
devm_kzalloc to ensure that that the connectors can be successfully
unregistered when the msm driver module is removed. The memory for the
connectors is unallocated when drm_mode_config_cleanup() is called
during either during an error or during driver remove.

Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>

authored by

Archit Taneja and committed by
Rob Clark
8208ed93 c899f935

+26 -62
+9 -18
drivers/gpu/drm/msm/dsi/dsi_manager.c
··· 198 198 199 199 static void dsi_mgr_connector_destroy(struct drm_connector *connector) 200 200 { 201 + struct dsi_connector *dsi_connector = to_dsi_connector(connector); 202 + 201 203 DBG(""); 202 - drm_connector_unregister(connector); 204 + 203 205 drm_connector_cleanup(connector); 206 + 207 + kfree(dsi_connector); 204 208 } 205 209 206 210 static void dsi_dual_connector_fix_modes(struct drm_connector *connector) ··· 542 538 struct dsi_connector *dsi_connector; 543 539 int ret, i; 544 540 545 - dsi_connector = devm_kzalloc(msm_dsi->dev->dev, 546 - sizeof(*dsi_connector), GFP_KERNEL); 547 - if (!dsi_connector) { 548 - ret = -ENOMEM; 549 - goto fail; 550 - } 541 + dsi_connector = kzalloc(sizeof(*dsi_connector), GFP_KERNEL); 542 + if (!dsi_connector) 543 + return ERR_PTR(-ENOMEM); 551 544 552 545 dsi_connector->id = id; 553 546 ··· 553 552 ret = drm_connector_init(msm_dsi->dev, connector, 554 553 &dsi_mgr_connector_funcs, DRM_MODE_CONNECTOR_DSI); 555 554 if (ret) 556 - goto fail; 555 + return ERR_PTR(ret); 557 556 558 557 drm_connector_helper_add(connector, &dsi_mgr_conn_helper_funcs); 559 558 ··· 566 565 connector->interlace_allowed = 0; 567 566 connector->doublescan_allowed = 0; 568 567 569 - ret = drm_connector_register(connector); 570 - if (ret) 571 - goto fail; 572 - 573 568 for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) 574 569 drm_mode_connector_attach_encoder(connector, 575 570 msm_dsi->encoders[i]); 576 571 577 572 return connector; 578 - 579 - fail: 580 - if (connector) 581 - dsi_mgr_connector_destroy(connector); 582 - 583 - return ERR_PTR(ret); 584 573 } 585 574 586 575 /* initialize bridge */
+4 -16
drivers/gpu/drm/msm/edp/edp_connector.c
··· 37 37 struct edp_connector *edp_connector = to_edp_connector(connector); 38 38 39 39 DBG(""); 40 - drm_connector_unregister(connector); 40 + 41 41 drm_connector_cleanup(connector); 42 42 43 43 kfree(edp_connector); ··· 124 124 int ret; 125 125 126 126 edp_connector = kzalloc(sizeof(*edp_connector), GFP_KERNEL); 127 - if (!edp_connector) { 128 - ret = -ENOMEM; 129 - goto fail; 130 - } 127 + if (!edp_connector) 128 + return ERR_PTR(-ENOMEM); 131 129 132 130 edp_connector->edp = edp; 133 131 ··· 134 136 ret = drm_connector_init(edp->dev, connector, &edp_connector_funcs, 135 137 DRM_MODE_CONNECTOR_eDP); 136 138 if (ret) 137 - goto fail; 139 + return ERR_PTR(ret); 138 140 139 141 drm_connector_helper_add(connector, &edp_connector_helper_funcs); 140 142 ··· 145 147 connector->interlace_allowed = false; 146 148 connector->doublescan_allowed = false; 147 149 148 - ret = drm_connector_register(connector); 149 - if (ret) 150 - goto fail; 151 - 152 150 drm_mode_connector_attach_encoder(connector, edp->encoder); 153 151 154 152 return connector; 155 - 156 - fail: 157 - if (connector) 158 - edp_connector_destroy(connector); 159 - 160 - return ERR_PTR(ret); 161 153 }
+3 -14
drivers/gpu/drm/msm/hdmi/hdmi_connector.c
··· 346 346 347 347 hdp_disable(hdmi_connector); 348 348 349 - drm_connector_unregister(connector); 350 349 drm_connector_cleanup(connector); 351 350 352 351 kfree(hdmi_connector); ··· 437 438 int ret; 438 439 439 440 hdmi_connector = kzalloc(sizeof(*hdmi_connector), GFP_KERNEL); 440 - if (!hdmi_connector) { 441 - ret = -ENOMEM; 442 - goto fail; 443 - } 441 + if (!hdmi_connector) 442 + return ERR_PTR(-ENOMEM); 444 443 445 444 hdmi_connector->hdmi = hdmi; 446 445 INIT_WORK(&hdmi_connector->hpd_work, msm_hdmi_hotplug_work); ··· 455 458 connector->interlace_allowed = 0; 456 459 connector->doublescan_allowed = 0; 457 460 458 - drm_connector_register(connector); 459 - 460 461 ret = hpd_enable(hdmi_connector); 461 462 if (ret) { 462 463 dev_err(&hdmi->pdev->dev, "failed to enable HPD: %d\n", ret); 463 - goto fail; 464 + return ERR_PTR(ret); 464 465 } 465 466 466 467 drm_mode_connector_attach_encoder(connector, hdmi->encoder); 467 468 468 469 return connector; 469 - 470 - fail: 471 - if (connector) 472 - hdmi_connector_destroy(connector); 473 - 474 - return ERR_PTR(ret); 475 470 }
+2 -14
drivers/gpu/drm/msm/mdp/mdp4/mdp4_lvds_connector.c
··· 48 48 struct mdp4_lvds_connector *mdp4_lvds_connector = 49 49 to_mdp4_lvds_connector(connector); 50 50 51 - drm_connector_unregister(connector); 52 51 drm_connector_cleanup(connector); 53 52 54 53 kfree(mdp4_lvds_connector); ··· 120 121 { 121 122 struct drm_connector *connector = NULL; 122 123 struct mdp4_lvds_connector *mdp4_lvds_connector; 123 - int ret; 124 124 125 125 mdp4_lvds_connector = kzalloc(sizeof(*mdp4_lvds_connector), GFP_KERNEL); 126 - if (!mdp4_lvds_connector) { 127 - ret = -ENOMEM; 128 - goto fail; 129 - } 126 + if (!mdp4_lvds_connector) 127 + return ERR_PTR(-ENOMEM); 130 128 131 129 mdp4_lvds_connector->encoder = encoder; 132 130 mdp4_lvds_connector->panel_node = panel_node; ··· 139 143 connector->interlace_allowed = 0; 140 144 connector->doublescan_allowed = 0; 141 145 142 - drm_connector_register(connector); 143 - 144 146 drm_mode_connector_attach_encoder(connector, encoder); 145 147 146 148 return connector; 147 - 148 - fail: 149 - if (connector) 150 - mdp4_lvds_connector_destroy(connector); 151 - 152 - return ERR_PTR(ret); 153 149 }
+8
drivers/gpu/drm/msm/msm_drv.c
··· 199 199 200 200 drm_kms_helper_poll_fini(dev); 201 201 202 + drm_connector_unregister_all(dev); 203 + 202 204 #ifdef CONFIG_DRM_FBDEV_EMULATION 203 205 if (fbdev && priv->fbdev) 204 206 msm_fbdev_free(dev); ··· 413 411 pm_runtime_put_sync(dev->dev); 414 412 if (ret < 0) { 415 413 dev_err(dev->dev, "failed to install IRQ handler\n"); 414 + goto fail; 415 + } 416 + 417 + ret = drm_connector_register_all(dev); 418 + if (ret) { 419 + dev_err(dev->dev, "failed to register connectors\n"); 416 420 goto fail; 417 421 } 418 422