disp: msm: sde: fix input_handler operations for various usecases

Input event handler can be unregistered without being
registered in the case where DMS or DYN_CLK flags
are enabled on first commit, add changes to handle
this sequence.

Change-Id: Idf4f9f310b5d56df396bfa5c6477e94d4fae7a9f
Signed-off-by: Jayaprakash <jmadiset@codeaurora.org>
This commit is contained in:
Jayaprakash
2020-01-10 15:51:56 +05:30
zatwierdzone przez Gerrit - the friendly Code Review server
rodzic 5bd891e4e2
commit 8fa5ad6a2b

Wyświetl plik

@@ -890,7 +890,8 @@ static int sde_encoder_virt_atomic_check(
sde_conn_state = to_sde_connector_state(conn_state);
sde_crtc_state = to_sde_crtc_state(crtc_state);
SDE_EVT32(DRMID(drm_enc), drm_atomic_crtc_needs_modeset(crtc_state));
SDE_EVT32(DRMID(drm_enc), crtc_state->mode_changed,
crtc_state->active_changed, crtc_state->connectors_changed);
ret = _sde_encoder_atomic_check_phys_enc(sde_enc, crtc_state,
conn_state);
@@ -2293,19 +2294,41 @@ static const struct input_device_id sde_input_ids[] = {
{ },
};
static int _sde_encoder_input_handler_register(
struct input_handler *input_handler)
static void _sde_encoder_input_handler_register(
struct drm_encoder *drm_enc)
{
int rc = 0;
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
int rc;
rc = input_register_handler(input_handler);
if (rc) {
pr_err("input_register_handler failed, rc= %d\n", rc);
kfree(input_handler);
return rc;
if (!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
return;
if (sde_enc->input_handler && !sde_enc->input_handler->private) {
sde_enc->input_handler->private = sde_enc;
/* register input handler if not already registered */
rc = input_register_handler(sde_enc->input_handler);
if (rc) {
SDE_ERROR("input_handler_register failed, rc= %d\n",
rc);
kfree(sde_enc->input_handler);
}
}
}
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;
}
return rc;
}
static int _sde_encoder_input_handler(
@@ -2329,7 +2352,6 @@ static int _sde_encoder_input_handler(
input_handler->disconnect = _sde_encoder_input_disconnect;
input_handler->name = "sde";
input_handler->id_table = sde_input_ids;
input_handler->private = sde_enc;
sde_enc->input_handler = input_handler;
@@ -2545,16 +2567,7 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
return;
}
/* register input handler if not already registered */
if (sde_enc->input_handler && !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)) {
ret = _sde_encoder_input_handler_register(
sde_enc->input_handler);
if (ret)
SDE_ERROR(
"input handler registration failed, rc = %d\n", ret);
}
_sde_encoder_input_handler_register(drm_enc);
if (!(msm_is_mode_seamless_vrr(cur_mode)
|| msm_is_mode_seamless_dms(cur_mode)
@@ -2655,9 +2668,7 @@ 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 &&
sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
input_unregister_handler(sde_enc->input_handler);
_sde_encoder_input_handler_unregister(drm_enc);
/*
* For primary command mode and video mode encoders, execute the