| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // SPDX-License-Identifier: GPL-2.0-or-later
- #include <linux/export.h>
- #include <drm/drm_atomic.h>
- #include <drm/drm_atomic_helper.h>
- #include <drm/drm_bridge.h>
- #include <drm/drm_bridge_helper.h>
- #include <drm/drm_modeset_lock.h>
- /**
- * drm_bridge_helper_reset_crtc - Reset the pipeline feeding a bridge
- * @bridge: DRM bridge to reset
- * @ctx: lock acquisition context
- *
- * Reset a @bridge pipeline. It will power-cycle all active components
- * between the CRTC and connector that bridge is connected to.
- *
- * As it relies on drm_atomic_helper_reset_crtc(), the same limitations
- * apply.
- *
- * Returns:
- *
- * 0 on success or a negative error code on failure. If the error
- * returned is EDEADLK, the whole atomic sequence must be restarted.
- */
- int drm_bridge_helper_reset_crtc(struct drm_bridge *bridge,
- struct drm_modeset_acquire_ctx *ctx)
- {
- struct drm_connector *connector;
- struct drm_encoder *encoder = bridge->encoder;
- struct drm_device *dev = encoder->dev;
- struct drm_crtc *crtc;
- int ret;
- ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
- if (ret)
- return ret;
- connector = drm_atomic_get_connector_for_encoder(encoder, ctx);
- if (IS_ERR(connector)) {
- ret = PTR_ERR(connector);
- goto out;
- }
- if (!connector->state) {
- ret = -EINVAL;
- goto out;
- }
- crtc = connector->state->crtc;
- ret = drm_atomic_helper_reset_crtc(crtc, ctx);
- if (ret)
- goto out;
- out:
- drm_modeset_unlock(&dev->mode_config.connection_mutex);
- return ret;
- }
- EXPORT_SYMBOL(drm_bridge_helper_reset_crtc);
|