Lines Matching +full:dp +full:- +full:bridge

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
19 * msm_dp_bridge_detect - callback to determine if connector is connected
20 * @bridge: Pointer to drm bridge structure
21 * Returns: Bridge's 'is connected' status
24 msm_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector) in msm_dp_bridge_detect() argument
26 struct msm_dp *dp; in msm_dp_bridge_detect() local
28 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_detect()
30 drm_dbg_dp(dp->drm_dev, "link_ready = %s\n", in msm_dp_bridge_detect()
31 str_true_false(dp->link_ready)); in msm_dp_bridge_detect()
33 return (dp->link_ready) ? connector_status_connected : in msm_dp_bridge_detect()
37 static int msm_dp_bridge_atomic_check(struct drm_bridge *bridge, in msm_dp_bridge_atomic_check() argument
42 struct msm_dp *dp; in msm_dp_bridge_atomic_check() local
44 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_atomic_check()
46 drm_dbg_dp(dp->drm_dev, "link_ready = %s\n", in msm_dp_bridge_atomic_check()
47 str_true_false(dp->link_ready)); in msm_dp_bridge_atomic_check()
53 * crtc->active is still true. Any attempt to set the mode or manually in msm_dp_bridge_atomic_check()
60 if (bridge->ops & DRM_BRIDGE_OP_HPD) in msm_dp_bridge_atomic_check()
61 return (dp->link_ready) ? 0 : -ENOTCONN; in msm_dp_bridge_atomic_check()
68 * msm_dp_bridge_get_modes - callback to add drm modes via drm_mode_probed_add()
69 * @bridge: Poiner to drm bridge
73 static int msm_dp_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector) in msm_dp_bridge_get_modes() argument
76 struct msm_dp *dp; in msm_dp_bridge_get_modes() local
81 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_get_modes()
84 if (dp->link_ready) { in msm_dp_bridge_get_modes()
85 rc = msm_dp_display_get_modes(dp); in msm_dp_bridge_get_modes()
87 DRM_ERROR("failed to get DP sink modes, rc=%d\n", rc); in msm_dp_bridge_get_modes()
91 drm_dbg_dp(connector->dev, "No sink connected\n"); in msm_dp_bridge_get_modes()
96 static void msm_dp_bridge_debugfs_init(struct drm_bridge *bridge, struct dentry *root) in msm_dp_bridge_debugfs_init() argument
98 struct msm_dp *dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_debugfs_init() local
100 msm_dp_display_debugfs_init(dp, root, false); in msm_dp_bridge_debugfs_init()
129 struct msm_dp *dp = to_dp_bridge(drm_bridge)->msm_dp_display; in msm_edp_bridge_atomic_check() local
132 return -ENODEV; in msm_edp_bridge_atomic_check()
134 conn_state->self_refresh_aware = dp->psr_supported; in msm_edp_bridge_atomic_check()
136 if (!conn_state->crtc || !crtc_state) in msm_edp_bridge_atomic_check()
139 if (crtc_state->self_refresh_active && !dp->psr_supported) in msm_edp_bridge_atomic_check()
140 return -EINVAL; in msm_edp_bridge_atomic_check()
151 struct msm_dp *dp = msm_dp_bridge->msm_dp_display; in msm_edp_bridge_atomic_enable() local
157 * bridge enable sequence. in msm_edp_bridge_atomic_enable()
160 drm_bridge->encoder); in msm_edp_bridge_atomic_enable()
166 if (old_crtc_state && old_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_enable()
167 msm_dp_display_set_psr(dp, false); in msm_edp_bridge_atomic_enable()
180 struct msm_dp *dp = msm_dp_bridge->msm_dp_display; in msm_edp_bridge_atomic_disable() local
183 drm_bridge->encoder); in msm_edp_bridge_atomic_disable()
206 if (new_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_disable()
207 msm_dp_display_set_psr(dp, true); in msm_edp_bridge_atomic_disable()
209 } else if (old_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_disable()
210 msm_dp_display_set_psr(dp, false); in msm_edp_bridge_atomic_disable()
225 drm_bridge->encoder); in msm_edp_bridge_atomic_post_disable()
236 if (new_crtc_state->self_refresh_active) in msm_edp_bridge_atomic_post_disable()
243 * msm_edp_bridge_mode_valid - callback to determine if specified mode is valid
244 * @bridge: Pointer to drm bridge structure
249 static enum drm_mode_status msm_edp_bridge_mode_valid(struct drm_bridge *bridge, in msm_edp_bridge_mode_valid() argument
253 struct msm_dp *dp; in msm_edp_bridge_mode_valid() local
254 int mode_pclk_khz = mode->clock; in msm_edp_bridge_mode_valid()
256 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_edp_bridge_mode_valid()
258 if (!dp || !mode_pclk_khz || !dp->connector) { in msm_edp_bridge_mode_valid()
260 return -EINVAL; in msm_edp_bridge_mode_valid()
263 if (msm_dp_wide_bus_available(dp)) in msm_edp_bridge_mode_valid()
277 static void msm_edp_bridge_debugfs_init(struct drm_bridge *bridge, struct dentry *root) in msm_edp_bridge_debugfs_init() argument
279 struct msm_dp *dp = to_dp_bridge(bridge)->msm_dp_display; in msm_edp_bridge_debugfs_init() local
281 msm_dp_display_debugfs_init(dp, root, true); in msm_edp_bridge_debugfs_init()
302 struct drm_bridge *bridge; in msm_dp_bridge_init() local
304 msm_dp_bridge = devm_drm_bridge_alloc(dev->dev, struct msm_dp_bridge, bridge, in msm_dp_bridge_init()
305 msm_dp_display->is_edp ? &msm_edp_bridge_ops : in msm_dp_bridge_init()
310 msm_dp_bridge->msm_dp_display = msm_dp_display; in msm_dp_bridge_init()
312 bridge = &msm_dp_bridge->bridge; in msm_dp_bridge_init()
313 bridge->type = msm_dp_display->connector_type; in msm_dp_bridge_init()
314 bridge->ycbcr_420_allowed = yuv_supported; in msm_dp_bridge_init()
317 * Many ops only make sense for DP. Why? in msm_dp_bridge_init()
318 * - Detect/HPD are used by DRM to know if a display is _physically_ in msm_dp_bridge_init()
323 * - Currently eDP mode reading is driven by the panel driver. This in msm_dp_bridge_init()
327 if (!msm_dp_display->is_edp) { in msm_dp_bridge_init()
328 bridge->ops = in msm_dp_bridge_init()
333 bridge->hdmi_audio_dev = &msm_dp_display->pdev->dev; in msm_dp_bridge_init()
334 bridge->hdmi_audio_max_i2s_playback_channels = 8; in msm_dp_bridge_init()
335 bridge->hdmi_audio_dai_port = -1; in msm_dp_bridge_init()
338 rc = devm_drm_bridge_add(dev->dev, bridge); in msm_dp_bridge_init()
340 DRM_ERROR("failed to add bridge, rc=%d\n", rc); in msm_dp_bridge_init()
345 rc = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); in msm_dp_bridge_init()
347 DRM_ERROR("failed to attach bridge, rc=%d\n", rc); in msm_dp_bridge_init()
352 if (msm_dp_display->next_bridge) { in msm_dp_bridge_init()
354 msm_dp_display->next_bridge, bridge, in msm_dp_bridge_init()
357 DRM_ERROR("failed to attach panel bridge: %d\n", rc); in msm_dp_bridge_init()
371 connector = drm_bridge_connector_init(msm_dp_display->drm_dev, encoder); in msm_dp_drm_connector_init()
375 if (!msm_dp_display->is_edp) in msm_dp_drm_connector_init()