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
This commit is contained in:
Prashant Singh authored and Michael Bestas committed 2024-06-11 19:47:29 +03:00
1 parent 5bfed396fa
commit aab8bf69cb
1 file changed
+20 -17
+20 -17
View File
@@ -285,6 +285,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;
@@ -772,6 +773,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);
}
@@ -3204,21 +3206,6 @@ static void _sde_encoder_input_handler_register(
}
}
static void _sde_encoder_input_handler_unregister(
struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
if (!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
return;
if (sde_enc->input_handler && sde_enc->input_handler->private) {
input_unregister_handler(sde_enc->input_handler);
sde_enc->input_handler->private = NULL;
}
}
static int _sde_encoder_input_handler(
struct sde_encoder_virt *sde_enc)
{
@@ -3242,6 +3229,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;
}
@@ -3398,7 +3386,18 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
return;
}
_sde_encoder_input_handler_register(drm_enc);
/* 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 &&
@@ -3529,7 +3528,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