Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1496c04e authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 80a42363 75740611
Loading
Loading
Loading
Loading
+36 −25
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -1103,7 +1103,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);
@@ -3083,19 +3084,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 (!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) {
		pr_err("input_register_handler failed, rc= %d\n", rc);
		kfree(input_handler);
		return 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(
@@ -3119,7 +3142,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;

@@ -3278,16 +3300,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)
@@ -3387,9 +3400,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