aboutsummaryrefslogtreecommitdiffstats
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.c49
1 files changed, 38 insertions, 11 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index d14d465392dd..acdfd2176423 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -146,33 +146,60 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
146static void omap_encoder_disable(struct drm_encoder *encoder) 146static void omap_encoder_disable(struct drm_encoder *encoder)
147{ 147{
148 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 148 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
149 struct omap_dss_device *dssdev = omap_encoder->display; 149 struct omap_dss_device *dssdev = omap_encoder->output;
150 struct drm_device *dev = encoder->dev; 150 struct drm_device *dev = encoder->dev;
151 151
152 dev_dbg(dev->dev, "disable(%s)\n", dssdev->name); 152 dev_dbg(dev->dev, "disable(%s)\n", dssdev->name);
153 153
154 dssdev->ops->disable(dssdev); 154 /*
155 * Disable the chain of external devices, starting at the one at the
156 * internal encoder's output.
157 */
158 omapdss_device_disable(dssdev->next);
159
160 /*
161 * Disable the internal encoder. This will disable the DSS output. The
162 * DSI is treated as an exception as DSI pipelines still use the legacy
163 * flow where the pipeline output controls the encoder.
164 */
165 if (dssdev->output_type != OMAP_DISPLAY_TYPE_DSI) {
166 dssdev->ops->disable(dssdev);
167 dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
168 }
155 169
156 dssdev->state = OMAP_DSS_DISPLAY_DISABLED; 170 /*
171 * Perform the post-disable operations on the chain of external devices
172 * to complete the display pipeline disable.
173 */
174 omapdss_device_post_disable(dssdev->next);
157} 175}
158 176
159static void omap_encoder_enable(struct drm_encoder *encoder) 177static void omap_encoder_enable(struct drm_encoder *encoder)
160{ 178{
161 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 179 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
162 struct omap_dss_device *dssdev = omap_encoder->display; 180 struct omap_dss_device *dssdev = omap_encoder->output;
163 struct drm_device *dev = encoder->dev; 181 struct drm_device *dev = encoder->dev;
164 int r;
165 182
166 dev_dbg(dev->dev, "enable(%s)\n", dssdev->name); 183 dev_dbg(dev->dev, "enable(%s)\n", dssdev->name);
167 184
168 r = dssdev->ops->enable(dssdev); 185 /* Prepare the chain of external devices for pipeline enable. */
169 if (r) { 186 omapdss_device_pre_enable(dssdev->next);
170 dev_err(dev->dev, "Failed to enable display '%s': %d\n", 187
171 dssdev->name, r); 188 /*
172 return; 189 * Enable the internal encoder. This will enable the DSS output. The
190 * DSI is treated as an exception as DSI pipelines still use the legacy
191 * flow where the pipeline output controls the encoder.
192 */
193 if (dssdev->output_type != OMAP_DISPLAY_TYPE_DSI) {
194 dssdev->ops->enable(dssdev);
195 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
173 } 196 }
174 197
175 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 198 /*
199 * Enable the chain of external devices, starting at the one at the
200 * internal encoder's output.
201 */
202 omapdss_device_enable(dssdev->next);
176} 203}
177 204
178static int omap_encoder_atomic_check(struct drm_encoder *encoder, 205static int omap_encoder_atomic_check(struct drm_encoder *encoder,