mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 19:26:01 -04:00
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: Abhinav Kumar <quic_abhinavk@quicinc.com> Signed-off-by: Dmitry 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: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,31 +647,24 @@ 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);
|
||||
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) {
|
||||
DPU_ERROR("dpu_writeback_init, rc = %d\n", rc);
|
||||
drm_encoder_cleanup(encoder);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
rc = dpu_writeback_init(dev, encoder, wb_formats,
|
||||
n_formats);
|
||||
if (rc) {
|
||||
DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
|
||||
encoder->base.id, rc);
|
||||
DPU_ERROR("dpu_writeback_init, rc = %d\n", rc);
|
||||
drm_encoder_cleanup(encoder);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user