Lines Matching +full:hot +full:- +full:plug
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
44 * [ CRTC ---> ] Encoder ---> Bridge A ---> Bridge B
75 * drm_atomic_helper_commit_modeset_disables() (either directly in hand-rolled
76 * commit check and commit tail handlers, or through the higher-level
85 * connector-related operations exposed by the bridge (see the overview
98 * drm_bridge_add - add the given bridge to the global bridge list
104 mutex_init(&bridge->hpd_mutex); in drm_bridge_add()
107 list_add_tail(&bridge->list, &bridge_list); in drm_bridge_add()
113 * drm_bridge_remove - remove the given bridge from the global bridge list
120 list_del_init(&bridge->list); in drm_bridge_remove()
123 mutex_destroy(&bridge->hpd_mutex); in drm_bridge_remove()
133 state = bridge->funcs->atomic_duplicate_state(bridge); in drm_bridge_atomic_duplicate_priv_state()
134 return state ? &state->base : NULL; in drm_bridge_atomic_duplicate_priv_state()
144 bridge->funcs->atomic_destroy_state(bridge, state); in drm_bridge_atomic_destroy_priv_state()
153 * drm_bridge_attach - attach the bridge to an encoder's chain
165 * If non-NULL the previous bridge must be already attached by a call to this
168 * Note that bridges attached to encoders are auto-detached during encoder
182 return -EINVAL; in drm_bridge_attach()
184 if (previous && (!previous->dev || previous->encoder != encoder)) in drm_bridge_attach()
185 return -EINVAL; in drm_bridge_attach()
187 if (bridge->dev) in drm_bridge_attach()
188 return -EBUSY; in drm_bridge_attach()
190 bridge->dev = encoder->dev; in drm_bridge_attach()
191 bridge->encoder = encoder; in drm_bridge_attach()
194 list_add(&bridge->chain_node, &previous->chain_node); in drm_bridge_attach()
196 list_add(&bridge->chain_node, &encoder->bridge_chain); in drm_bridge_attach()
198 if (bridge->funcs->attach) { in drm_bridge_attach()
199 ret = bridge->funcs->attach(bridge, flags); in drm_bridge_attach()
204 if (bridge->funcs->atomic_reset) { in drm_bridge_attach()
207 state = bridge->funcs->atomic_reset(bridge); in drm_bridge_attach()
213 drm_atomic_private_obj_init(bridge->dev, &bridge->base, in drm_bridge_attach()
214 &state->base, in drm_bridge_attach()
221 if (bridge->funcs->detach) in drm_bridge_attach()
222 bridge->funcs->detach(bridge); in drm_bridge_attach()
225 bridge->dev = NULL; in drm_bridge_attach()
226 bridge->encoder = NULL; in drm_bridge_attach()
227 list_del(&bridge->chain_node); in drm_bridge_attach()
237 if (WARN_ON(!bridge->dev)) in drm_bridge_detach()
240 if (bridge->funcs->atomic_reset) in drm_bridge_detach()
241 drm_atomic_private_obj_fini(&bridge->base); in drm_bridge_detach()
243 if (bridge->funcs->detach) in drm_bridge_detach()
244 bridge->funcs->detach(bridge); in drm_bridge_detach()
246 list_del(&bridge->chain_node); in drm_bridge_detach()
247 bridge->dev = NULL; in drm_bridge_detach()
258 * - The encoder-related operations support control of the bridges in the
267 * finer-grained control.
274 * Mixing atomic and non-atomic versions of the operations is not supported.
276 * - The bus format negotiation operations
284 * encoder-related operations. This feature is not supported by the legacy
287 * - The connector-related operations support implementing a &drm_connector
298 * an externally-implemented &drm_connector. Those operations are
306 * Bridge drivers shall implement the connector-related operations for all
311 * controller of the SoC. Support for the connector-related operations on the
322 * read-only memory.
326 * connected-related bridge operations. Connector creation is then controlled
340 * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
363 encoder = bridge->encoder; in drm_bridge_chain_mode_fixup()
364 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_fixup()
365 if (!bridge->funcs->mode_fixup) in drm_bridge_chain_mode_fixup()
368 if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode)) in drm_bridge_chain_mode_fixup()
377 * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
402 encoder = bridge->encoder; in drm_bridge_chain_mode_valid()
403 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_valid()
406 if (!bridge->funcs->mode_valid) in drm_bridge_chain_mode_valid()
409 ret = bridge->funcs->mode_valid(bridge, info, mode); in drm_bridge_chain_mode_valid()
419 * drm_bridge_chain_disable - disables all bridges in the encoder chain
436 encoder = bridge->encoder; in drm_bridge_chain_disable()
437 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_disable()
438 if (iter->funcs->disable) in drm_bridge_chain_disable()
439 iter->funcs->disable(iter); in drm_bridge_chain_disable()
448 * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the
465 encoder = bridge->encoder; in drm_bridge_chain_post_disable()
466 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_post_disable()
467 if (bridge->funcs->post_disable) in drm_bridge_chain_post_disable()
468 bridge->funcs->post_disable(bridge); in drm_bridge_chain_post_disable()
474 * drm_bridge_chain_mode_set - set proposed mode for all bridges in the
494 encoder = bridge->encoder; in drm_bridge_chain_mode_set()
495 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_set()
496 if (bridge->funcs->mode_set) in drm_bridge_chain_mode_set()
497 bridge->funcs->mode_set(bridge, mode, adjusted_mode); in drm_bridge_chain_mode_set()
503 * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the
521 encoder = bridge->encoder; in drm_bridge_chain_pre_enable()
522 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_pre_enable()
523 if (iter->funcs->pre_enable) in drm_bridge_chain_pre_enable()
524 iter->funcs->pre_enable(iter); in drm_bridge_chain_pre_enable()
533 * drm_bridge_chain_enable - enables all bridges in the encoder chain
549 encoder = bridge->encoder; in drm_bridge_chain_enable()
550 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_enable()
551 if (bridge->funcs->enable) in drm_bridge_chain_enable()
552 bridge->funcs->enable(bridge); in drm_bridge_chain_enable()
558 * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain
578 encoder = bridge->encoder; in drm_atomic_bridge_chain_disable()
579 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_disable()
580 if (iter->funcs->atomic_disable) { in drm_atomic_bridge_chain_disable()
589 iter->funcs->atomic_disable(iter, old_bridge_state); in drm_atomic_bridge_chain_disable()
590 } else if (iter->funcs->disable) { in drm_atomic_bridge_chain_disable()
591 iter->funcs->disable(iter); in drm_atomic_bridge_chain_disable()
601 * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
621 encoder = bridge->encoder; in drm_atomic_bridge_chain_post_disable()
622 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_post_disable()
623 if (bridge->funcs->atomic_post_disable) { in drm_atomic_bridge_chain_post_disable()
632 bridge->funcs->atomic_post_disable(bridge, in drm_atomic_bridge_chain_post_disable()
634 } else if (bridge->funcs->post_disable) { in drm_atomic_bridge_chain_post_disable()
635 bridge->funcs->post_disable(bridge); in drm_atomic_bridge_chain_post_disable()
642 * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
663 encoder = bridge->encoder; in drm_atomic_bridge_chain_pre_enable()
664 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_pre_enable()
665 if (iter->funcs->atomic_pre_enable) { in drm_atomic_bridge_chain_pre_enable()
674 iter->funcs->atomic_pre_enable(iter, old_bridge_state); in drm_atomic_bridge_chain_pre_enable()
675 } else if (iter->funcs->pre_enable) { in drm_atomic_bridge_chain_pre_enable()
676 iter->funcs->pre_enable(iter); in drm_atomic_bridge_chain_pre_enable()
686 * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain
705 encoder = bridge->encoder; in drm_atomic_bridge_chain_enable()
706 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_enable()
707 if (bridge->funcs->atomic_enable) { in drm_atomic_bridge_chain_enable()
716 bridge->funcs->atomic_enable(bridge, old_bridge_state); in drm_atomic_bridge_chain_enable()
717 } else if (bridge->funcs->enable) { in drm_atomic_bridge_chain_enable()
718 bridge->funcs->enable(bridge); in drm_atomic_bridge_chain_enable()
728 if (bridge->funcs->atomic_check) { in drm_atomic_bridge_check()
732 bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_check()
735 return -EINVAL; in drm_atomic_bridge_check()
737 ret = bridge->funcs->atomic_check(bridge, bridge_state, in drm_atomic_bridge_check()
741 } else if (bridge->funcs->mode_fixup) { in drm_atomic_bridge_check()
742 if (!bridge->funcs->mode_fixup(bridge, &crtc_state->mode, in drm_atomic_bridge_check()
743 &crtc_state->adjusted_mode)) in drm_atomic_bridge_check()
744 return -EINVAL; in drm_atomic_bridge_check()
763 cur_state = drm_atomic_get_new_bridge_state(crtc_state->state, in select_bus_fmt_recursive()
772 if (!cur_bridge->funcs->atomic_get_input_bus_fmts) { in select_bus_fmt_recursive()
787 cur_state->input_bus_cfg.format = MEDIA_BUS_FMT_FIXED; in select_bus_fmt_recursive()
788 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
795 * If the driver implements ->atomic_get_input_bus_fmts() it in select_bus_fmt_recursive()
799 return -EINVAL; in select_bus_fmt_recursive()
801 in_bus_fmts = cur_bridge->funcs->atomic_get_input_bus_fmts(cur_bridge, in select_bus_fmt_recursive()
808 return -ENOTSUPP; in select_bus_fmt_recursive()
810 return -ENOMEM; in select_bus_fmt_recursive()
813 cur_state->input_bus_cfg.format = in_bus_fmts[0]; in select_bus_fmt_recursive()
814 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
823 if (ret != -ENOTSUPP) in select_bus_fmt_recursive()
828 cur_state->input_bus_cfg.format = in_bus_fmts[i]; in select_bus_fmt_recursive()
829 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
848 * support transcoding into a specific output format -ENOTSUPP is returned and
850 * combinations worked, -ENOTSUPP is returned and the atomic modeset will fail.
875 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_select_bus_fmts()
876 struct drm_encoder *encoder = bridge->encoder; in drm_atomic_bridge_chain_select_bus_fmts()
883 last_bridge = list_last_entry(&encoder->bridge_chain, in drm_atomic_bridge_chain_select_bus_fmts()
885 last_bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_chain_select_bus_fmts()
888 if (last_bridge->funcs->atomic_get_output_bus_fmts) { in drm_atomic_bridge_chain_select_bus_fmts()
889 const struct drm_bridge_funcs *funcs = last_bridge->funcs; in drm_atomic_bridge_chain_select_bus_fmts()
892 * If the driver implements ->atomic_get_output_bus_fmts() it in drm_atomic_bridge_chain_select_bus_fmts()
896 return -EINVAL; in drm_atomic_bridge_chain_select_bus_fmts()
898 out_bus_fmts = funcs->atomic_get_output_bus_fmts(last_bridge, in drm_atomic_bridge_chain_select_bus_fmts()
904 return -ENOTSUPP; in drm_atomic_bridge_chain_select_bus_fmts()
906 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
911 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
913 if (conn->display_info.num_bus_formats && in drm_atomic_bridge_chain_select_bus_fmts()
914 conn->display_info.bus_formats) in drm_atomic_bridge_chain_select_bus_fmts()
915 out_bus_fmts[0] = conn->display_info.bus_formats[0]; in drm_atomic_bridge_chain_select_bus_fmts()
923 if (ret != -ENOTSUPP) in drm_atomic_bridge_chain_select_bus_fmts()
960 output_flags = conn->display_info.bus_flags; in drm_atomic_bridge_propagate_bus_flags()
969 output_flags = next_bridge_state->input_bus_cfg.flags; in drm_atomic_bridge_propagate_bus_flags()
972 bridge_state->output_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
980 bridge_state->input_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
984 * drm_atomic_bridge_chain_check() - Do an atomic check on the bridge chain
1002 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_check()
1015 encoder = bridge->encoder; in drm_atomic_bridge_chain_check()
1016 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_check()
1027 crtc_state->state); in drm_atomic_bridge_chain_check()
1042 * drm_bridge_detect - check if anything is attached to the bridge output
1056 if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) in drm_bridge_detect()
1059 return bridge->funcs->detect(bridge); in drm_bridge_detect()
1064 * drm_bridge_get_modes - fill all modes currently valid for the sink into the
1080 if (!(bridge->ops & DRM_BRIDGE_OP_MODES)) in drm_bridge_get_modes()
1083 return bridge->funcs->get_modes(bridge, connector); in drm_bridge_get_modes()
1088 * drm_bridge_get_edid - get the EDID data of the connected display
1102 if (!(bridge->ops & DRM_BRIDGE_OP_EDID)) in drm_bridge_get_edid()
1105 return bridge->funcs->get_edid(bridge, connector); in drm_bridge_get_edid()
1110 * drm_bridge_hpd_enable - enable hot plug detection for the bridge
1112 * @cb: hot-plug detection callback
1113 * @data: data to be passed to the hot-plug detection callback
1116 * and @data as hot plug notification callback. From now on the @cb will be
1118 * until hot plug notification gets disabled with drm_bridge_hpd_disable().
1120 * Hot plug detection is supported only if the DRM_BRIDGE_OP_HPD flag is set in
1121 * bridge->ops. This function shall not be called when the flag is not set.
1123 * Only one hot plug detection callback can be registered at a time, it is an
1124 * error to call this function when hot plug detection is already enabled for
1132 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_enable()
1135 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1137 if (WARN(bridge->hpd_cb, "Hot plug detection already enabled\n")) in drm_bridge_hpd_enable()
1140 bridge->hpd_cb = cb; in drm_bridge_hpd_enable()
1141 bridge->hpd_data = data; in drm_bridge_hpd_enable()
1143 if (bridge->funcs->hpd_enable) in drm_bridge_hpd_enable()
1144 bridge->funcs->hpd_enable(bridge); in drm_bridge_hpd_enable()
1147 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1152 * drm_bridge_hpd_disable - disable hot plug detection for the bridge
1155 * Call &drm_bridge_funcs.hpd_disable if implemented and unregister the hot
1156 * plug detection callback previously registered with drm_bridge_hpd_enable().
1160 * Hot plug detection is supported only if the DRM_BRIDGE_OP_HPD flag is set in
1161 * bridge->ops. This function shall not be called when the flag is not set.
1165 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_disable()
1168 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1169 if (bridge->funcs->hpd_disable) in drm_bridge_hpd_disable()
1170 bridge->funcs->hpd_disable(bridge); in drm_bridge_hpd_disable()
1172 bridge->hpd_cb = NULL; in drm_bridge_hpd_disable()
1173 bridge->hpd_data = NULL; in drm_bridge_hpd_disable()
1174 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1179 * drm_bridge_hpd_notify - notify hot plug detection events
1183 * Bridge drivers shall call this function to report hot plug events when they
1184 * detect a change in the output status, when hot plug detection has been
1192 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1193 if (bridge->hpd_cb) in drm_bridge_hpd_notify()
1194 bridge->hpd_cb(bridge->hpd_data, status); in drm_bridge_hpd_notify()
1195 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1201 * of_drm_find_bridge - find the bridge corresponding to the device node in
1216 if (bridge->of_node == np) { in of_drm_find_bridge()