Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c6ce3c1 authored by Shubhashree Dhar's avatar Shubhashree Dhar
Browse files

msm/sde: prevent double register of input handler



During Dynamic mode switch case, input_register_handler
is called even after it is registered leading to
list double add warnings and panic.

Change-Id: I312112deb08c998af516252f2117bc629eb13b37
Signed-off-by: default avatarShubhashree Dhar <dhar@codeaurora.org>
parent 0baefc97
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -259,6 +259,7 @@ struct sde_encoder_virt {
	struct kthread_work input_event_work;
	struct kthread_work esd_trigger_work;
	struct input_handler *input_handler;
	bool input_handler_registered;
	struct msm_display_topology topology;
	bool vblank_enabled;

@@ -743,6 +744,7 @@ void sde_encoder_destroy(struct drm_encoder *drm_enc)
	if (sde_enc->input_handler) {
		kfree(sde_enc->input_handler);
		sde_enc->input_handler = NULL;
		sde_enc->input_handler_registered = false;
	}

	kfree(sde_enc);
@@ -2634,6 +2636,7 @@ static int _sde_encoder_input_handler(
	input_handler->private = sde_enc;

	sde_enc->input_handler = input_handler;
	sde_enc->input_handler_registered = false;

	return rc;
}
@@ -2755,12 +2758,14 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
		return;
	}

	if (sde_enc->input_handler) {
	if (sde_enc->input_handler && !sde_enc->input_handler_registered) {
		ret = _sde_encoder_input_handler_register(
				sde_enc->input_handler);
		if (ret)
			SDE_ERROR(
			"input handler registration failed, rc = %d\n", ret);
		else
			sde_enc->input_handler_registered = true;
	}

	ret = sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_KICKOFF);
@@ -2838,8 +2843,11 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)

	SDE_EVT32(DRMID(drm_enc));

	if (sde_enc->input_handler)
	if (sde_enc->input_handler && sde_enc->input_handler_registered) {
		input_unregister_handler(sde_enc->input_handler);
		sde_enc->input_handler_registered = false;
	}


	/* wait for idle */
	sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);