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

Commit 2024bcc8 authored by Prashant Singh's avatar Prashant Singh
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 avatarPrashant Singh <prasin@codeaurora.org>
parent 67a2970b
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -273,6 +273,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;
	bool idle_pc_restore;
@@ -807,6 +808,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);
@@ -3024,6 +3026,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;
}
@@ -3187,13 +3190,16 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
	}

	/* register input handler if not already registered */
	if (sde_enc->input_handler && !msm_is_mode_seamless_dms(cur_mode) &&
	if (sde_enc->input_handler && !sde_enc->input_handler_registered &&
			!msm_is_mode_seamless_dms(cur_mode) &&
			!msm_is_mode_seamless_dyn_clk(cur_mode)) {
		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;
	}

	if (!(msm_is_mode_seamless_vrr(cur_mode)
@@ -3295,8 +3301,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
	/* wait for idle */
	sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);

	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;
	}

	/*
	 * For primary command mode and video mode encoders, execute the