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

drm/komeda: Reordered the komeda's de-init functions

The de-init routine should be doing the following in order:-
1. Unregister the drm device
2. Shut down the crtcs - failing to do this might cause a connector leakage
See the 'commit 109c4d18e574 ("drm/arm/malidp: Ensure that the crtcs are
shutdown before removing any encoder/connector")'
3. Disable the interrupts
4. Unbind the components
5. Free up DRM mode_config info

Changes from v1:-
1. Re-ordered the header files inclusion
2. Rebased on top of the latest drm-misc-fixes

Signed-off-by:. Ayan Kumar Halder <Ayan.Halder@arm.com>
Reviewed-by: Mihail Atanassov <mihail.atanassov@arm.com>
Reviewed-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Link: https://patchwork.freedesktop.org/patch/327606/

authored by

Ayan Kumar Halder and committed by
Ayan kumar halder
6978bce0 51a44a28

+15 -8
+15 -8
drivers/gpu/drm/arm/display/komeda/komeda_kms.c
··· 14 14 #include <drm/drm_gem_cma_helper.h> 15 15 #include <drm/drm_gem_framebuffer_helper.h> 16 16 #include <drm/drm_irq.h> 17 - #include <drm/drm_vblank.h> 18 17 #include <drm/drm_probe_helper.h> 18 + #include <drm/drm_vblank.h> 19 19 20 20 #include "komeda_dev.h" 21 21 #include "komeda_framebuffer.h" ··· 306 306 komeda_kms_irq_handler, IRQF_SHARED, 307 307 drm->driver->name, drm); 308 308 if (err) 309 - goto cleanup_mode_config; 309 + goto free_component_binding; 310 310 311 311 err = mdev->funcs->enable_irq(mdev); 312 312 if (err) 313 - goto cleanup_mode_config; 313 + goto free_component_binding; 314 314 315 315 drm->irq_enabled = true; 316 316 ··· 318 318 319 319 err = drm_dev_register(drm, 0); 320 320 if (err) 321 - goto cleanup_mode_config; 321 + goto free_interrupts; 322 322 323 323 return kms; 324 324 325 - cleanup_mode_config: 325 + free_interrupts: 326 326 drm_kms_helper_poll_fini(drm); 327 327 drm->irq_enabled = false; 328 + mdev->funcs->disable_irq(mdev); 329 + free_component_binding: 330 + component_unbind_all(mdev->dev, drm); 331 + cleanup_mode_config: 328 332 drm_mode_config_cleanup(drm); 329 333 komeda_kms_cleanup_private_objs(kms); 334 + drm->dev_private = NULL; 335 + drm_dev_put(drm); 330 336 free_kms: 331 337 kfree(kms); 332 338 return ERR_PTR(err); ··· 343 337 struct drm_device *drm = &kms->base; 344 338 struct komeda_dev *mdev = drm->dev_private; 345 339 346 - drm->irq_enabled = false; 347 - mdev->funcs->disable_irq(mdev); 348 340 drm_dev_unregister(drm); 349 341 drm_kms_helper_poll_fini(drm); 342 + drm_atomic_helper_shutdown(drm); 343 + drm->irq_enabled = false; 344 + mdev->funcs->disable_irq(mdev); 350 345 component_unbind_all(mdev->dev, drm); 351 - komeda_kms_cleanup_private_objs(kms); 352 346 drm_mode_config_cleanup(drm); 347 + komeda_kms_cleanup_private_objs(kms); 353 348 drm->dev_private = NULL; 354 349 drm_dev_put(drm); 355 350 }