| // 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); |