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

drm/amdgpu/display: split dp connector registration (v4)

Split into init and register functions to avoid a segfault
in some configs when the load/unload callbacks are removed.

v2:
- add back accidently dropped has_aux setting
- set dev in late_register

v3:
- fix dp cec ordering

v4:
- squash in kdev reference fix

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Tested-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+25 -10
+16
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
··· 1461 1461 return MODE_OK; 1462 1462 } 1463 1463 1464 + static int 1465 + amdgpu_connector_late_register(struct drm_connector *connector) 1466 + { 1467 + struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 1468 + int r = 0; 1469 + 1470 + if (amdgpu_connector->ddc_bus->has_aux) { 1471 + amdgpu_connector->ddc_bus->aux.dev = amdgpu_connector->base.kdev; 1472 + r = drm_dp_aux_register(&amdgpu_connector->ddc_bus->aux); 1473 + } 1474 + 1475 + return r; 1476 + } 1477 + 1464 1478 static const struct drm_connector_helper_funcs amdgpu_connector_dp_helper_funcs = { 1465 1479 .get_modes = amdgpu_connector_dp_get_modes, 1466 1480 .mode_valid = amdgpu_connector_dp_mode_valid, ··· 1489 1475 .early_unregister = amdgpu_connector_unregister, 1490 1476 .destroy = amdgpu_connector_destroy, 1491 1477 .force = amdgpu_connector_dvi_force, 1478 + .late_register = amdgpu_connector_late_register, 1492 1479 }; 1493 1480 1494 1481 static const struct drm_connector_funcs amdgpu_connector_edp_funcs = { ··· 1500 1485 .early_unregister = amdgpu_connector_unregister, 1501 1486 .destroy = amdgpu_connector_destroy, 1502 1487 .force = amdgpu_connector_dvi_force, 1488 + .late_register = amdgpu_connector_late_register, 1503 1489 }; 1504 1490 1505 1491 void
+2 -8
drivers/gpu/drm/amd/amdgpu/atombios_dp.c
··· 186 186 187 187 void amdgpu_atombios_dp_aux_init(struct amdgpu_connector *amdgpu_connector) 188 188 { 189 - int ret; 190 - 191 189 amdgpu_connector->ddc_bus->rec.hpd = amdgpu_connector->hpd.hpd; 192 - amdgpu_connector->ddc_bus->aux.dev = amdgpu_connector->base.kdev; 193 190 amdgpu_connector->ddc_bus->aux.transfer = amdgpu_atombios_dp_aux_transfer; 194 - ret = drm_dp_aux_register(&amdgpu_connector->ddc_bus->aux); 195 - if (!ret) 196 - amdgpu_connector->ddc_bus->has_aux = true; 197 - 198 - WARN(ret, "drm_dp_aux_register_i2c_bus() failed with error %d\n", ret); 191 + drm_dp_aux_init(&amdgpu_connector->ddc_bus->aux); 192 + amdgpu_connector->ddc_bus->has_aux = true; 199 193 } 200 194 201 195 /***** general DP utility functions *****/
+7 -2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
··· 155 155 struct amdgpu_dm_connector *amdgpu_dm_connector = 156 156 to_amdgpu_dm_connector(connector); 157 157 struct drm_dp_mst_port *port = amdgpu_dm_connector->port; 158 + int r; 159 + 160 + amdgpu_dm_connector->dm_dp_aux.aux.dev = connector->kdev; 161 + r = drm_dp_aux_register(&amdgpu_dm_connector->dm_dp_aux.aux); 162 + if (r) 163 + return r; 158 164 159 165 #if defined(CONFIG_DEBUG_FS) 160 166 connector_debugfs_init(amdgpu_dm_connector); ··· 486 480 struct amdgpu_dm_connector *aconnector) 487 481 { 488 482 aconnector->dm_dp_aux.aux.name = "dmdc"; 489 - aconnector->dm_dp_aux.aux.dev = aconnector->base.kdev; 490 483 aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer; 491 484 aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc; 492 485 493 - drm_dp_aux_register(&aconnector->dm_dp_aux.aux); 486 + drm_dp_aux_init(&aconnector->dm_dp_aux.aux); 494 487 drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux, 495 488 &aconnector->base); 496 489