Hi, On Fri, Jan 11, 2019 at 05:51:00AM +0200, Laurent Pinchart wrote: > The omap_dss_device .check_timings() and .set_timings() operations > operate on struct videomode, while the DRM API operates on struct > drm_display_mode. This forces conversion from to videomode in the > callers. While that's not a problem per se, it creates a difference with > the drm_bridge API. > > Replace the videomode parameter to the .check_timings() and > .set_timings() operations with a drm_display_mode. This pushed the > conversion to videomode down to the DSS devices in some cases. If needed > they will be converted to operate on drm_display_mode natively. > > Signed-off-by: Laurent Pinchart > Tested-by: Sebastian Reichel > --- Reviewed-by: Sebastian Reichel -- Sebastian > .../gpu/drm/omapdrm/displays/panel-dsi-cm.c | 8 +++--- > drivers/gpu/drm/omapdrm/dss/dpi.c | 16 +++++------ > drivers/gpu/drm/omapdrm/dss/hdmi4.c | 6 ++-- > drivers/gpu/drm/omapdrm/dss/hdmi5.c | 6 ++-- > drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 +-- > drivers/gpu/drm/omapdrm/dss/sdi.c | 17 +++++------ > drivers/gpu/drm/omapdrm/dss/venc.c | 28 +++++++++---------- > drivers/gpu/drm/omapdrm/omap_connector.c | 7 ++--- > drivers/gpu/drm/omapdrm/omap_encoder.c | 2 +- > 9 files changed, 46 insertions(+), 48 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c > index ce812094177c..d9f10f41ddfb 100644 > --- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c > +++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c > @@ -1127,20 +1127,20 @@ static int dsicm_get_modes(struct omap_dss_device *dssdev, > } > > static int dsicm_check_timings(struct omap_dss_device *dssdev, > - struct videomode *vm) > + struct drm_display_mode *mode) > { > struct panel_drv_data *ddata = to_panel_data(dssdev); > int ret = 0; > > - if (vm->hactive != ddata->vm.hactive) > + if (mode->hdisplay != ddata->vm.hactive) > ret = -EINVAL; > > - if (vm->vactive != ddata->vm.vactive) > + if (mode->vdisplay != ddata->vm.vactive) > ret = -EINVAL; > > if (ret) { > dev_warn(dssdev->dev, "wrong resolution: %d x %d", > - vm->hactive, vm->vactive); > + mode->hdisplay, mode->vdisplay); > dev_warn(dssdev->dev, "panel resolution: %d x %d", > ddata->vm.hactive, ddata->vm.vactive); > } > diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c > index 0db01cadf09f..0cb3cb72f15f 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dpi.c > +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c > @@ -459,7 +459,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev) > } > > static void dpi_set_timings(struct omap_dss_device *dssdev, > - const struct videomode *vm) > + const struct drm_display_mode *mode) > { > struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); > > @@ -467,13 +467,13 @@ static void dpi_set_timings(struct omap_dss_device *dssdev, > > mutex_lock(&dpi->lock); > > - dpi->vm = *vm; > + drm_display_mode_to_videomode(mode, &dpi->vm); > > mutex_unlock(&dpi->lock); > } > > static int dpi_check_timings(struct omap_dss_device *dssdev, > - struct videomode *vm) > + struct drm_display_mode *mode) > { > struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); > int lck_div, pck_div; > @@ -482,20 +482,20 @@ static int dpi_check_timings(struct omap_dss_device *dssdev, > struct dpi_clk_calc_ctx ctx; > bool ok; > > - if (vm->hactive % 8 != 0) > + if (mode->hdisplay % 8 != 0) > return -EINVAL; > > - if (vm->pixelclock == 0) > + if (mode->clock == 0) > return -EINVAL; > > if (dpi->pll) { > - ok = dpi_pll_clk_calc(dpi, vm->pixelclock, &ctx); > + ok = dpi_pll_clk_calc(dpi, mode->clock * 1000, &ctx); > if (!ok) > return -EINVAL; > > fck = ctx.pll_cinfo.clkout[ctx.clkout_idx]; > } else { > - ok = dpi_dss_clk_calc(dpi, vm->pixelclock, &ctx); > + ok = dpi_dss_clk_calc(dpi, mode->clock * 1000, &ctx); > if (!ok) > return -EINVAL; > > @@ -507,7 +507,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev, > > pck = fck / lck_div / pck_div; > > - vm->pixelclock = pck; > + mode->clock = pck / 1000; > > return 0; > } > diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c > index 60792981a33f..4337380b1bf7 100644 > --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c > +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c > @@ -249,15 +249,15 @@ static void hdmi_power_off_full(struct omap_hdmi *hdmi) > } > > static void hdmi_display_set_timings(struct omap_dss_device *dssdev, > - const struct videomode *vm) > + const struct drm_display_mode *mode) > { > struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev); > > mutex_lock(&hdmi->lock); > > - hdmi->cfg.vm = *vm; > + drm_display_mode_to_videomode(mode, &hdmi->cfg.vm); > > - dispc_set_tv_pclk(hdmi->dss->dispc, vm->pixelclock); > + dispc_set_tv_pclk(hdmi->dss->dispc, mode->clock * 1000); > > mutex_unlock(&hdmi->lock); > } > diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c > index d7d33b4d2bed..b94f884c5c1a 100644 > --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c > +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c > @@ -248,15 +248,15 @@ static void hdmi_power_off_full(struct omap_hdmi *hdmi) > } > > static void hdmi_display_set_timings(struct omap_dss_device *dssdev, > - const struct videomode *vm) > + const struct drm_display_mode *mode) > { > struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev); > > mutex_lock(&hdmi->lock); > > - hdmi->cfg.vm = *vm; > + drm_display_mode_to_videomode(mode, &hdmi->cfg.vm); > > - dispc_set_tv_pclk(hdmi->dss->dispc, vm->pixelclock); > + dispc_set_tv_pclk(hdmi->dss->dispc, mode->clock * 1000); > > mutex_unlock(&hdmi->lock); > } > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h > index 015b2dd9fb99..a63b1d4b7a8a 100644 > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h > @@ -366,9 +366,9 @@ struct omap_dss_device_ops { > void (*post_disable)(struct omap_dss_device *dssdev); > > int (*check_timings)(struct omap_dss_device *dssdev, > - struct videomode *vm); > + struct drm_display_mode *mode); > void (*set_timings)(struct omap_dss_device *dssdev, > - const struct videomode *vm); > + const struct drm_display_mode *mode); > > bool (*detect)(struct omap_dss_device *dssdev); > > diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c > index 58c17566a4cb..f096a7f77e5f 100644 > --- a/drivers/gpu/drm/omapdrm/dss/sdi.c > +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c > @@ -206,36 +206,37 @@ static void sdi_display_disable(struct omap_dss_device *dssdev) > } > > static void sdi_set_timings(struct omap_dss_device *dssdev, > - const struct videomode *vm) > + const struct drm_display_mode *mode) > { > struct sdi_device *sdi = dssdev_to_sdi(dssdev); > > - sdi->vm = *vm; > + drm_display_mode_to_videomode(mode, &sdi->vm); > } > > static int sdi_check_timings(struct omap_dss_device *dssdev, > - struct videomode *vm) > + struct drm_display_mode *mode) > { > struct sdi_device *sdi = dssdev_to_sdi(dssdev); > struct dispc_clock_info dispc_cinfo; > + unsigned long pixelclock = mode->clock * 1000; > unsigned long fck; > unsigned long pck; > int r; > > - if (vm->pixelclock == 0) > + if (pixelclock == 0) > return -EINVAL; > > - r = sdi_calc_clock_div(sdi, vm->pixelclock, &fck, &dispc_cinfo); > + r = sdi_calc_clock_div(sdi, pixelclock, &fck, &dispc_cinfo); > if (r) > return r; > > pck = fck / dispc_cinfo.lck_div / dispc_cinfo.pck_div; > > - if (pck != vm->pixelclock) { > + if (pck != pixelclock) { > DSSWARN("Pixel clock adjusted from %lu Hz to %lu Hz\n", > - vm->pixelclock, pck); > + pixelclock, pck); > > - vm->pixelclock = pck; > + mode->clock = pck / 1000; > } > > return 0; > diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c > index 6cb708e1944e..7bce5898654a 100644 > --- a/drivers/gpu/drm/omapdrm/dss/venc.c > +++ b/drivers/gpu/drm/omapdrm/dss/venc.c > @@ -544,29 +544,29 @@ static int venc_get_modes(struct omap_dss_device *dssdev, > return ARRAY_SIZE(modes); > } > > -static enum venc_videomode venc_get_videomode(const struct videomode *vm) > +static enum venc_videomode venc_get_videomode(const struct drm_display_mode *mode) > { > - if (!(vm->flags & DISPLAY_FLAGS_INTERLACED)) > + if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) > return VENC_MODE_UNKNOWN; > > - if (vm->pixelclock == omap_dss_pal_vm.pixelclock && > - vm->hactive == omap_dss_pal_vm.hactive && > - vm->vactive == omap_dss_pal_vm.vactive) > + if (mode->clock == omap_dss_pal_vm.pixelclock / 1000 && > + mode->hdisplay == omap_dss_pal_vm.hactive && > + mode->vdisplay == omap_dss_pal_vm.vactive) > return VENC_MODE_PAL; > > - if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock && > - vm->hactive == omap_dss_ntsc_vm.hactive && > - vm->vactive == omap_dss_ntsc_vm.vactive) > + if (mode->clock == omap_dss_ntsc_vm.pixelclock / 1000 && > + mode->hdisplay == omap_dss_ntsc_vm.hactive && > + mode->vdisplay == omap_dss_ntsc_vm.vactive) > return VENC_MODE_NTSC; > > return VENC_MODE_UNKNOWN; > } > > static void venc_set_timings(struct omap_dss_device *dssdev, > - const struct videomode *vm) > + const struct drm_display_mode *mode) > { > struct venc_device *venc = dssdev_to_venc(dssdev); > - enum venc_videomode venc_mode = venc_get_videomode(vm); > + enum venc_videomode venc_mode = venc_get_videomode(mode); > > DSSDBG("venc_set_timings\n"); > > @@ -591,17 +591,17 @@ static void venc_set_timings(struct omap_dss_device *dssdev, > } > > static int venc_check_timings(struct omap_dss_device *dssdev, > - struct videomode *vm) > + struct drm_display_mode *mode) > { > DSSDBG("venc_check_timings\n"); > > - switch (venc_get_videomode(vm)) { > + switch (venc_get_videomode(mode)) { > case VENC_MODE_PAL: > - *vm = omap_dss_pal_vm; > + drm_display_mode_from_videomode(&omap_dss_pal_vm, mode); > return 0; > > case VENC_MODE_NTSC: > - *vm = omap_dss_ntsc_vm; > + drm_display_mode_from_videomode(&omap_dss_ntsc_vm, mode); > return 0; > > default: > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c > index b6433c55419e..487603c56b08 100644 > --- a/drivers/gpu/drm/omapdrm/omap_connector.c > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c > @@ -245,22 +245,19 @@ enum drm_mode_status omap_connector_mode_fixup(struct omap_dss_device *dssdev, > const struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > - struct videomode vm = { 0 }; > int ret; > > - drm_display_mode_to_videomode(mode, &vm); > + drm_mode_copy(adjusted_mode, mode); > > for (; dssdev; dssdev = dssdev->next) { > if (!dssdev->ops->check_timings) > continue; > > - ret = dssdev->ops->check_timings(dssdev, &vm); > + ret = dssdev->ops->check_timings(dssdev, adjusted_mode); > if (ret) > return MODE_BAD; > } > > - drm_display_mode_from_videomode(&vm, adjusted_mode); > - > return MODE_OK; > } > > diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c > index 06ca04f130e0..adca1b175941 100644 > --- a/drivers/gpu/drm/omapdrm/omap_encoder.c > +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c > @@ -134,7 +134,7 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, > > for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) { > if (dssdev->ops->set_timings) > - dssdev->ops->set_timings(dssdev, &vm); > + dssdev->ops->set_timings(dssdev, adjusted_mode); > } > > /* Set the HDMI mode and HDMI infoframe if applicable. */ > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel