Commit 9b930f14 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov
Browse files

drm/msm/dpu: merge dpu_encoder_init() and dpu_encoder_setup()



There is no reason to split the dpu_encoder interface into separate
_init() and _setup() phases. Merge them into a single function.

Reviewed-by: default avatarAbhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Tested-by: Abhinav Kumar <quic_abhinavk@quicinc.com> # sc7280
Patchwork: https://patchwork.freedesktop.org/patch/540628/
Link: https://lore.kernel.org/r/20230601172236.564445-2-dmitry.baryshkov@linaro.org


Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
parent 025e3d97
Loading
Loading
Loading
Loading
+21 −34
Original line number Diff line number Diff line
@@ -2433,7 +2433,8 @@ static const struct drm_encoder_funcs dpu_encoder_funcs = {
		.early_unregister = dpu_encoder_early_unregister,
};

int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
		int drm_enc_mode,
		struct msm_display_info *disp_info)
{
	struct msm_drm_private *priv = dev->dev_private;
@@ -2442,7 +2443,23 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
	struct dpu_encoder_virt *dpu_enc = NULL;
	int ret = 0;

	dpu_enc = to_dpu_encoder_virt(enc);
	dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
	if (!dpu_enc)
		return ERR_PTR(-ENOMEM);

	ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
			       drm_enc_mode, NULL);
	if (ret) {
		devm_kfree(dev->dev, dpu_enc);
		return ERR_PTR(ret);
	}

	drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);

	spin_lock_init(&dpu_enc->enc_spinlock);
	dpu_enc->enabled = false;
	mutex_init(&dpu_enc->enc_lock);
	mutex_init(&dpu_enc->rc_lock);

	ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
	if (ret)
@@ -2471,44 +2488,14 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,

	DPU_DEBUG_ENC(dpu_enc, "created\n");

	return ret;
	return &dpu_enc->base;

fail:
	DPU_ERROR("failed to create encoder\n");
	if (drm_enc)
		dpu_encoder_destroy(drm_enc);

	return ret;


}

struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
		int drm_enc_mode)
{
	struct dpu_encoder_virt *dpu_enc = NULL;
	int rc = 0;

	dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
	if (!dpu_enc)
		return ERR_PTR(-ENOMEM);


	rc = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
							  drm_enc_mode, NULL);
	if (rc) {
		devm_kfree(dev->dev, dpu_enc);
		return ERR_PTR(rc);
	}

	drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);

	spin_lock_init(&dpu_enc->enc_spinlock);
	dpu_enc->enabled = false;
	mutex_init(&dpu_enc->enc_lock);
	mutex_init(&dpu_enc->rc_lock);

	return &dpu_enc->base;
	return ERR_PTR(ret);
}

int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
+3 −11
Original line number Diff line number Diff line
@@ -130,20 +130,12 @@ void dpu_encoder_virt_runtime_resume(struct drm_encoder *encoder);
/**
 * dpu_encoder_init - initialize virtual encoder object
 * @dev:        Pointer to drm device structure
 * @drm_enc_mode: corresponding DRM_MODE_ENCODER_* constant
 * @disp_info:  Pointer to display information structure
 * Returns:     Pointer to newly created drm encoder
 */
struct drm_encoder *dpu_encoder_init(
		struct drm_device *dev,
		int drm_enc_mode);

/**
 * dpu_encoder_setup - setup dpu_encoder for the display probed
 * @dev:		Pointer to drm device structure
 * @enc:		Pointer to the drm_encoder
 * @disp_info:	Pointer to the display info
 */
int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
		int drm_enc_mode,
		struct msm_display_info *disp_info);

/**
+32 −55
Original line number Diff line number Diff line
@@ -535,15 +535,23 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
		    !msm_dsi_is_master_dsi(priv->dsi[i]))
			continue;

		encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI);
		memset(&info, 0, sizeof(info));
		info.intf_type = INTF_DSI;

		info.h_tile_instance[info.num_of_h_tiles++] = i;
		if (msm_dsi_is_bonded_dsi(priv->dsi[i]))
			info.h_tile_instance[info.num_of_h_tiles++] = other;

		info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);

		info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);

		encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI, &info);
		if (IS_ERR(encoder)) {
			DPU_ERROR("encoder init failed for dsi display\n");
			return PTR_ERR(encoder);
		}

		memset(&info, 0, sizeof(info));
		info.intf_type = INTF_DSI;

		rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder);
		if (rc) {
			DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n",
@@ -551,11 +559,6 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
			break;
		}

		info.h_tile_instance[info.num_of_h_tiles++] = i;
		info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);

		info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);

		if (msm_dsi_is_bonded_dsi(priv->dsi[i]) && priv->dsi[other]) {
			rc = msm_dsi_modeset_init(priv->dsi[other], dev, encoder);
			if (rc) {
@@ -563,14 +566,7 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
					other, rc);
				break;
			}

			info.h_tile_instance[info.num_of_h_tiles++] = other;
		}

		rc = dpu_encoder_setup(dev, encoder, &info);
		if (rc)
			DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
				  encoder->base.id, rc);
	}

	return rc;
@@ -589,29 +585,23 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
		if (!priv->dp[i])
			continue;

		encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS);
		memset(&info, 0, sizeof(info));
		info.num_of_h_tiles = 1;
		info.h_tile_instance[0] = i;
		info.intf_type = INTF_DP;

		encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
		if (IS_ERR(encoder)) {
			DPU_ERROR("encoder init failed for dsi display\n");
			return PTR_ERR(encoder);
		}

		memset(&info, 0, sizeof(info));
		rc = msm_dp_modeset_init(priv->dp[i], dev, encoder);
		if (rc) {
			DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
			drm_encoder_cleanup(encoder);
			return rc;
		}

		info.num_of_h_tiles = 1;
		info.h_tile_instance[0] = i;
		info.intf_type = INTF_DP;
		rc = dpu_encoder_setup(dev, encoder, &info);
		if (rc) {
			DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
				  encoder->base.id, rc);
			return rc;
		}
	}

	return 0;
@@ -628,13 +618,17 @@ static int _dpu_kms_initialize_hdmi(struct drm_device *dev,
	if (!priv->hdmi)
		return 0;

	encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS);
	memset(&info, 0, sizeof(info));
	info.num_of_h_tiles = 1;
	info.h_tile_instance[0] = 0;
	info.intf_type = INTF_HDMI;

	encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
	if (IS_ERR(encoder)) {
		DPU_ERROR("encoder init failed for HDMI display\n");
		return PTR_ERR(encoder);
	}

	memset(&info, 0, sizeof(info));
	rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder);
	if (rc) {
		DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
@@ -642,16 +636,6 @@ static int _dpu_kms_initialize_hdmi(struct drm_device *dev,
		return rc;
	}

	info.num_of_h_tiles = 1;
	info.h_tile_instance[0] = 0;
	info.intf_type = INTF_HDMI;
	rc = dpu_encoder_setup(dev, encoder, &info);
	if (rc) {
		DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
			  encoder->base.id, rc);
		return rc;
	}

	return 0;
}

@@ -663,14 +647,19 @@ static int _dpu_kms_initialize_writeback(struct drm_device *dev,
	struct msm_display_info info;
	int rc;

	encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL);
	memset(&info, 0, sizeof(info));

	info.num_of_h_tiles = 1;
	/* use only WB idx 2 instance for DPU */
	info.h_tile_instance[0] = WB_2;
	info.intf_type = INTF_WB;

	encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL, &info);
	if (IS_ERR(encoder)) {
		DPU_ERROR("encoder init failed for dsi display\n");
		return PTR_ERR(encoder);
	}

	memset(&info, 0, sizeof(info));

	rc = dpu_writeback_init(dev, encoder, wb_formats,
			n_formats);
	if (rc) {
@@ -679,18 +668,6 @@ static int _dpu_kms_initialize_writeback(struct drm_device *dev,
		return rc;
	}

	info.num_of_h_tiles = 1;
	/* use only WB idx 2 instance for DPU */
	info.h_tile_instance[0] = WB_2;
	info.intf_type = INTF_WB;

	rc = dpu_encoder_setup(dev, encoder, &info);
	if (rc) {
		DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
				  encoder->base.id, rc);
		return rc;
	}

	return 0;
}