Commit 6978bce0 authored by Ayan Kumar Halder's avatar Ayan Kumar Halder Committed by Ayan kumar halder
Browse files

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 109c4d18 ("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: default avatar. Ayan Kumar Halder <Ayan.Halder@arm.com>
Reviewed-by: default avatarMihail Atanassov <mihail.atanassov@arm.com>
Reviewed-by: default avatarJames Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Link: https://patchwork.freedesktop.org/patch/327606/
parent 51a44a28
Loading
Loading
Loading
Loading
+15 −8
Original line number Original line Diff line number Diff line
@@ -14,8 +14,8 @@
#include <drm/drm_gem_cma_helper.h>
#include <drm/drm_gem_cma_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_irq.h>
#include <drm/drm_irq.h>
#include <drm/drm_vblank.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_vblank.h>


#include "komeda_dev.h"
#include "komeda_dev.h"
#include "komeda_framebuffer.h"
#include "komeda_framebuffer.h"
@@ -306,11 +306,11 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev)
			       komeda_kms_irq_handler, IRQF_SHARED,
			       komeda_kms_irq_handler, IRQF_SHARED,
			       drm->driver->name, drm);
			       drm->driver->name, drm);
	if (err)
	if (err)
		goto cleanup_mode_config;
		goto free_component_binding;


	err = mdev->funcs->enable_irq(mdev);
	err = mdev->funcs->enable_irq(mdev);
	if (err)
	if (err)
		goto cleanup_mode_config;
		goto free_component_binding;


	drm->irq_enabled = true;
	drm->irq_enabled = true;


@@ -318,15 +318,21 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev)


	err = drm_dev_register(drm, 0);
	err = drm_dev_register(drm, 0);
	if (err)
	if (err)
		goto cleanup_mode_config;
		goto free_interrupts;


	return kms;
	return kms;


cleanup_mode_config:
free_interrupts:
	drm_kms_helper_poll_fini(drm);
	drm_kms_helper_poll_fini(drm);
	drm->irq_enabled = false;
	drm->irq_enabled = false;
	mdev->funcs->disable_irq(mdev);
free_component_binding:
	component_unbind_all(mdev->dev, drm);
cleanup_mode_config:
	drm_mode_config_cleanup(drm);
	drm_mode_config_cleanup(drm);
	komeda_kms_cleanup_private_objs(kms);
	komeda_kms_cleanup_private_objs(kms);
	drm->dev_private = NULL;
	drm_dev_put(drm);
free_kms:
free_kms:
	kfree(kms);
	kfree(kms);
	return ERR_PTR(err);
	return ERR_PTR(err);
@@ -337,13 +343,14 @@ void komeda_kms_detach(struct komeda_kms_dev *kms)
	struct drm_device *drm = &kms->base;
	struct drm_device *drm = &kms->base;
	struct komeda_dev *mdev = drm->dev_private;
	struct komeda_dev *mdev = drm->dev_private;


	drm->irq_enabled = false;
	mdev->funcs->disable_irq(mdev);
	drm_dev_unregister(drm);
	drm_dev_unregister(drm);
	drm_kms_helper_poll_fini(drm);
	drm_kms_helper_poll_fini(drm);
	drm_atomic_helper_shutdown(drm);
	drm->irq_enabled = false;
	mdev->funcs->disable_irq(mdev);
	component_unbind_all(mdev->dev, drm);
	component_unbind_all(mdev->dev, drm);
	komeda_kms_cleanup_private_objs(kms);
	drm_mode_config_cleanup(drm);
	drm_mode_config_cleanup(drm);
	komeda_kms_cleanup_private_objs(kms);
	drm->dev_private = NULL;
	drm->dev_private = NULL;
	drm_dev_put(drm);
	drm_dev_put(drm);
}
}