summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/omapdrm/omap_encoder.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-09-04 17:22:27 +0300
committerTomi Valkeinen <tomi.valkeinen@ti.com>2019-03-18 12:42:11 +0300
commitb80bfc66b0eeaf887f49c9cdb92ebba5ec0a94aa (patch)
tree13af115876421e3f593813351c150e2ee5bde1b9 /drivers/gpu/drm/omapdrm/omap_encoder.c
parentd2c53162f55798f7a6353ea021793b3a8e411914 (diff)
downloadlinux-b80bfc66b0eeaf887f49c9cdb92ebba5ec0a94aa.tar.xz
drm/omap: Move common display enable/disable code to encoder
All .enable() and .disable() handlers for panels and connectors share common code that validates and updates the device's state. Move it to common locations in the omap_encoder_enable() and omap_encoder_disable() handlers. The enabled check in the .disable() handler is left untouched, it will be addressed separately. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com> 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.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 0d85b3a35767..5427c0b3ff9e 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -147,21 +147,45 @@ static void omap_encoder_disable(struct drm_encoder *encoder)
{
struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
struct omap_dss_device *dssdev = omap_encoder->display;
+ struct drm_device *dev = encoder->dev;
+
+ dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
+
+ if (!omapdss_device_is_enabled(dssdev))
+ return;
dssdev->ops->disable(dssdev);
+
+ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
}
static void omap_encoder_enable(struct drm_encoder *encoder)
{
struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
struct omap_dss_device *dssdev = omap_encoder->display;
+ struct drm_device *dev = encoder->dev;
int r;
+ dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
+
+ if (!omapdss_device_is_connected(dssdev)) {
+ r = -ENODEV;
+ goto error;
+ }
+
+ if (omapdss_device_is_enabled(dssdev))
+ return;
+
r = dssdev->ops->enable(dssdev);
if (r)
- dev_err(encoder->dev->dev,
- "Failed to enable display '%s': %d\n",
- dssdev->name, r);
+ goto error;
+
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+ return;
+
+error:
+ dev_err(dev->dev, "Failed to enable display '%s': %d\n",
+ dssdev->name, r);
}
static int omap_encoder_atomic_check(struct drm_encoder *encoder,