Maxime Ripard <maxime@xxxxxxxxxx> 于2021年12月3日周五 18:38写道: > > On Mon, Oct 25, 2021 at 05:34:18PM +0800, Kevin Tang wrote: > > @@ -618,9 +619,25 @@ static void sprd_crtc_mode_set_nofb(struct drm_crtc *crtc) > > { > > struct sprd_dpu *dpu = to_sprd_crtc(crtc); > > struct drm_display_mode *mode = &crtc->state->adjusted_mode; > > + struct drm_encoder *encoder; > > + struct mipi_dsi_device *slave; > > + struct sprd_dsi *dsi; > > > > drm_display_mode_to_videomode(mode, &dpu->ctx.vm); > > > > + drm_for_each_encoder(encoder, crtc->dev) { > > + if (encoder->crtc != crtc) > > + continue; > > encoder->crtc is deprecated. You should be using > encoder->drm_for_each_encoder_mask, using the encoder_mask in > encoder->drm_crtc_state. Use drm_for_each_encoder_mask to replace drm_for_each_encoder? like this: drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { dsi = encoder_to_dsi(encoder); slave = dsi->slave; if (slave->mode_flags & MIPI_DSI_MODE_VIDEO) dpu->ctx.if_type = SPRD_DPU_IF_DPI; else dpu->ctx.if_type = SPRD_DPU_IF_EDPI; } > > > +static int sprd_dsi_probe(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct sprd_dsi *dsi; > > + > > + dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); > > + if (!dsi) > > + return -ENOMEM; > > + > > + dev_set_drvdata(dev, dsi); > > + > > + dsi->host.ops = &sprd_dsi_host_ops; > > + dsi->host.dev = dev; > > + mipi_dsi_host_register(&dsi->host); > > + > > + return component_add(&pdev->dev, &dsi_component_ops); > > component_add must be run in the mipi_dsi_host.attach hook. Got it, will be fixed on patch v8. > > Maxime