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:

zatwierdzone przez
Gerrit - the friendly Code Review server

rodzic
5bd891e4e2
commit
8fa5ad6a2b
@@ -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
|
||||
|
Reference in New Issue
Block a user