diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 0fbbb35223..d6bc4cf32e 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -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