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:

committed by
Gerrit - the friendly Code Review server

parent
5bd891e4e2
commit
8fa5ad6a2b
@@ -890,7 +890,8 @@ static int sde_encoder_virt_atomic_check(
|
|||||||
sde_conn_state = to_sde_connector_state(conn_state);
|
sde_conn_state = to_sde_connector_state(conn_state);
|
||||||
sde_crtc_state = to_sde_crtc_state(crtc_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,
|
ret = _sde_encoder_atomic_check_phys_enc(sde_enc, crtc_state,
|
||||||
conn_state);
|
conn_state);
|
||||||
@@ -2293,19 +2294,41 @@ static const struct input_device_id sde_input_ids[] = {
|
|||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int _sde_encoder_input_handler_register(
|
static void _sde_encoder_input_handler_register(
|
||||||
struct input_handler *input_handler)
|
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 (!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
|
||||||
if (rc) {
|
return;
|
||||||
pr_err("input_register_handler failed, rc= %d\n", rc);
|
|
||||||
kfree(input_handler);
|
if (sde_enc->input_handler && !sde_enc->input_handler->private) {
|
||||||
return rc;
|
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(
|
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->disconnect = _sde_encoder_input_disconnect;
|
||||||
input_handler->name = "sde";
|
input_handler->name = "sde";
|
||||||
input_handler->id_table = sde_input_ids;
|
input_handler->id_table = sde_input_ids;
|
||||||
input_handler->private = sde_enc;
|
|
||||||
|
|
||||||
sde_enc->input_handler = input_handler;
|
sde_enc->input_handler = input_handler;
|
||||||
|
|
||||||
@@ -2545,16 +2567,7 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register input handler if not already registered */
|
_sde_encoder_input_handler_register(drm_enc);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(msm_is_mode_seamless_vrr(cur_mode)
|
if (!(msm_is_mode_seamless_vrr(cur_mode)
|
||||||
|| msm_is_mode_seamless_dms(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 */
|
/* wait for idle */
|
||||||
sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
||||||
|
|
||||||
if (sde_enc->input_handler &&
|
_sde_encoder_input_handler_unregister(drm_enc);
|
||||||
sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
|
|
||||||
input_unregister_handler(sde_enc->input_handler);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For primary command mode and video mode encoders, execute the
|
* For primary command mode and video mode encoders, execute the
|
||||||
|
Reference in New Issue
Block a user