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

Commit 00b3c02e authored by Prashant Singh's avatar Prashant Singh Committed by MajorP93
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
parent e31235ba
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -308,6 +308,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;
#if defined(OPLUS_FEATURE_PXLW_IRIS5)
	struct kthread_work disable_autorefresh_work;
#endif
@@ -798,6 +799,7 @@ void sde_encoder_destroy(struct drm_encoder *drm_enc)

	kfree(sde_enc->input_handler);
	sde_enc->input_handler = NULL;
	sde_enc->input_handler_registered = false;

	kfree(sde_enc);
}
@@ -3349,6 +3351,7 @@ static int _sde_encoder_input_handler(
	input_handler->id_table = sde_input_ids;

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

	return rc;
}
@@ -3505,7 +3508,18 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
		return;
	}

	/* register input handler if not already registered */
	if (sde_enc->input_handler && !sde_enc->input_handler_registered &&
			!msm_is_mode_seamless_dms(cur_mode) &&
		sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE) &&
			!msm_is_mode_seamless_dyn_clk(cur_mode)) {
		_sde_encoder_input_handler_register(drm_enc);
		if (!sde_enc->input_handler || !sde_enc->input_handler->private)
			SDE_ERROR(
			"input handler registration failed, rc = %d\n", ret);
		else
			sde_enc->input_handler_registered = true;
	}

	if ((drm_enc->crtc && drm_enc->crtc->state &&
			drm_enc->crtc->state->connectors_changed &&
@@ -3636,7 +3650,11 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
	if (!sde_encoder_in_clone_mode(drm_enc))
		sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);

	_sde_encoder_input_handler_unregister(drm_enc);
	if (sde_enc->input_handler && sde_enc->input_handler_registered &&
		sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE)) {
		input_unregister_handler(sde_enc->input_handler);
		sde_enc->input_handler_registered = false;
	}

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