Lines Matching +full:display +full:- +full:bridge
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
17 * msm_dp_bridge_detect - callback to determine if connector is connected
18 * @bridge: Pointer to drm bridge structure
19 * Returns: Bridge's 'is connected' status
21 static enum drm_connector_status msm_dp_bridge_detect(struct drm_bridge *bridge) in msm_dp_bridge_detect() argument
25 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_detect()
27 drm_dbg_dp(dp->drm_dev, "link_ready = %s\n", in msm_dp_bridge_detect()
28 (dp->link_ready) ? "true" : "false"); in msm_dp_bridge_detect()
30 return (dp->link_ready) ? connector_status_connected : in msm_dp_bridge_detect()
34 static int msm_dp_bridge_atomic_check(struct drm_bridge *bridge, in msm_dp_bridge_atomic_check() argument
41 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_atomic_check()
43 drm_dbg_dp(dp->drm_dev, "link_ready = %s\n", in msm_dp_bridge_atomic_check()
44 (dp->link_ready) ? "true" : "false"); in msm_dp_bridge_atomic_check()
47 * There is no protection in the DRM framework to check if the display in msm_dp_bridge_atomic_check()
50 * crtc->active is still true. Any attempt to set the mode or manually in msm_dp_bridge_atomic_check()
57 if (bridge->ops & DRM_BRIDGE_OP_HPD) in msm_dp_bridge_atomic_check()
58 return (dp->link_ready) ? 0 : -ENOTCONN; in msm_dp_bridge_atomic_check()
65 * msm_dp_bridge_get_modes - callback to add drm modes via drm_mode_probed_add()
66 * @bridge: Poiner to drm bridge
70 static int msm_dp_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector) in msm_dp_bridge_get_modes() argument
78 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_get_modes()
81 if (dp->link_ready) { in msm_dp_bridge_get_modes()
88 drm_dbg_dp(connector->dev, "No sink connected\n"); in msm_dp_bridge_get_modes()
93 static void msm_dp_bridge_debugfs_init(struct drm_bridge *bridge, struct dentry *root) in msm_dp_bridge_debugfs_init() argument
95 struct msm_dp *dp = to_dp_bridge(bridge)->msm_dp_display; in msm_dp_bridge_debugfs_init()
123 struct msm_dp *dp = to_dp_bridge(drm_bridge)->msm_dp_display; in msm_edp_bridge_atomic_check()
126 return -ENODEV; in msm_edp_bridge_atomic_check()
128 conn_state->self_refresh_aware = dp->psr_supported; in msm_edp_bridge_atomic_check()
130 if (!conn_state->crtc || !crtc_state) in msm_edp_bridge_atomic_check()
133 if (crtc_state->self_refresh_active && !dp->psr_supported) in msm_edp_bridge_atomic_check()
134 return -EINVAL; in msm_edp_bridge_atomic_check()
142 struct drm_atomic_state *atomic_state = old_bridge_state->base.state; in msm_edp_bridge_atomic_enable()
146 struct msm_dp *dp = msm_dp_bridge->msm_dp_display; in msm_edp_bridge_atomic_enable()
152 * bridge enable sequence. in msm_edp_bridge_atomic_enable()
155 drm_bridge->encoder); in msm_edp_bridge_atomic_enable()
161 if (old_crtc_state && old_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_enable()
172 struct drm_atomic_state *atomic_state = old_bridge_state->base.state; in msm_edp_bridge_atomic_disable()
176 struct msm_dp *dp = msm_dp_bridge->msm_dp_display; in msm_edp_bridge_atomic_disable()
179 drm_bridge->encoder); in msm_edp_bridge_atomic_disable()
194 * If old crtc state is active, then this is a display disable in msm_edp_bridge_atomic_disable()
200 * when display disable occurs while the sink is in psr state. in msm_edp_bridge_atomic_disable()
202 if (new_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_disable()
205 } else if (old_crtc_state->self_refresh_active) { in msm_edp_bridge_atomic_disable()
217 struct drm_atomic_state *atomic_state = old_bridge_state->base.state; in msm_edp_bridge_atomic_post_disable()
222 drm_bridge->encoder); in msm_edp_bridge_atomic_post_disable()
233 if (new_crtc_state->self_refresh_active) in msm_edp_bridge_atomic_post_disable()
240 * msm_edp_bridge_mode_valid - callback to determine if specified mode is valid
241 * @bridge: Pointer to drm bridge structure
242 * @info: display info
246 static enum drm_mode_status msm_edp_bridge_mode_valid(struct drm_bridge *bridge, in msm_edp_bridge_mode_valid() argument
251 int mode_pclk_khz = mode->clock; in msm_edp_bridge_mode_valid()
253 dp = to_dp_bridge(bridge)->msm_dp_display; in msm_edp_bridge_mode_valid()
255 if (!dp || !mode_pclk_khz || !dp->connector) { in msm_edp_bridge_mode_valid()
257 return -EINVAL; in msm_edp_bridge_mode_valid()
274 static void msm_edp_bridge_debugfs_init(struct drm_bridge *bridge, struct dentry *root) in msm_edp_bridge_debugfs_init() argument
276 struct msm_dp *dp = to_dp_bridge(bridge)->msm_dp_display; in msm_edp_bridge_debugfs_init()
299 struct drm_bridge *bridge; in msm_dp_bridge_init() local
301 msm_dp_bridge = devm_kzalloc(dev->dev, sizeof(*msm_dp_bridge), GFP_KERNEL); in msm_dp_bridge_init()
303 return -ENOMEM; in msm_dp_bridge_init()
305 msm_dp_bridge->msm_dp_display = msm_dp_display; in msm_dp_bridge_init()
307 bridge = &msm_dp_bridge->bridge; in msm_dp_bridge_init()
308 bridge->funcs = msm_dp_display->is_edp ? &msm_edp_bridge_ops : &msm_dp_bridge_ops; in msm_dp_bridge_init()
309 bridge->type = msm_dp_display->connector_type; in msm_dp_bridge_init()
310 bridge->ycbcr_420_allowed = yuv_supported; in msm_dp_bridge_init()
314 * - Detect/HPD are used by DRM to know if a display is _physically_ in msm_dp_bridge_init()
315 * there, not whether the display is powered on / finished initting. in msm_dp_bridge_init()
316 * On eDP we assume the display is always there because you can't in msm_dp_bridge_init()
318 * assume our display is always there. in msm_dp_bridge_init()
319 * - Currently eDP mode reading is driven by the panel driver. This in msm_dp_bridge_init()
323 if (!msm_dp_display->is_edp) { in msm_dp_bridge_init()
324 bridge->ops = in msm_dp_bridge_init()
330 rc = devm_drm_bridge_add(dev->dev, bridge); in msm_dp_bridge_init()
332 DRM_ERROR("failed to add bridge, rc=%d\n", rc); in msm_dp_bridge_init()
337 rc = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); in msm_dp_bridge_init()
339 DRM_ERROR("failed to attach bridge, rc=%d\n", rc); in msm_dp_bridge_init()
344 if (msm_dp_display->next_bridge) { in msm_dp_bridge_init()
346 msm_dp_display->next_bridge, bridge, in msm_dp_bridge_init()
349 DRM_ERROR("failed to attach panel bridge: %d\n", rc); in msm_dp_bridge_init()
363 connector = drm_bridge_connector_init(msm_dp_display->drm_dev, encoder); in msm_dp_drm_connector_init()
367 if (!msm_dp_display->is_edp) in msm_dp_drm_connector_init()