diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-06-06 00:55:48 +0300 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2018-09-03 16:13:30 +0300 |
commit | 28120302c2fdf29b515c8cbd4e3a3867cb0cde7d (patch) | |
tree | 0c22f0b50a593be07b929271e073c1d5003fd0a1 /drivers/gpu/drm/omapdrm/omap_encoder.c | |
parent | b4935e3a3cfa456b356e9714e75513be672c227e (diff) | |
download | linux-28120302c2fdf29b515c8cbd4e3a3867cb0cde7d.tar.xz |
drm/omap: Don't call .check_timings() operation recursively
The .check_timings() operation is called recursively from the display
device back to the output device. Most components just forward the
operation to the previous component in the chain, resulting in lots of
duplicated pass-through functions. To avoid that, iterate over the
components manually.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_encoder.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_encoder.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c index a6dce480b2cf..bb010c20d8b8 100644 --- a/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c @@ -98,17 +98,23 @@ static int omap_encoder_update(struct drm_encoder *encoder, { struct drm_device *dev = encoder->dev; struct omap_encoder *omap_encoder = to_omap_encoder(encoder); - struct omap_dss_device *dssdev = omap_encoder->display; + struct omap_dss_device *display = omap_encoder->display; + struct omap_dss_device *dssdev; int ret; - ret = dssdev->ops->check_timings(dssdev, vm); - if (ret) { - dev_err(dev->dev, "invalid timings: %d\n", ret); - return ret; + for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) { + if (!dssdev->ops->check_timings) + continue; + + ret = dssdev->ops->check_timings(dssdev, vm); + if (ret) { + dev_err(dev->dev, "invalid timings: %d\n", ret); + return ret; + } } - if (dssdev->ops->set_timings) - dssdev->ops->set_timings(dssdev, vm); + if (display->ops->set_timings) + display->ops->set_timings(display, vm); return 0; } |