summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/omapdrm/omap_encoder.c
diff options
context:
space:
mode:
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,