Lines Matching +full:e +full:- +full:ddc

1 // SPDX-License-Identifier: GPL-2.0+
47 * operation flags (&drm_bridge->ops) and bridge output type
48 * (&drm_bridge->type), as well as the DRM_BRIDGE_ATTACH_NO_CONNECTOR attach
53 * struct drm_bridge_connector - A connector backed by a chain of bridges
77 * hot-plug detection notification, if any (see &DRM_BRIDGE_OP_HPD).
106 /* -----------------------------------------------------------------------------
107 * Bridge Connector Hot-Plug Handling
118 drm_for_each_bridge_in_chain(bridge_connector->encoder, bridge) { in drm_bridge_connector_hpd_notify()
119 if (bridge->funcs->hpd_notify) in drm_bridge_connector_hpd_notify()
120 bridge->funcs->hpd_notify(bridge, status); in drm_bridge_connector_hpd_notify()
127 struct drm_connector *connector = &drm_bridge_connector->base; in drm_bridge_connector_handle_hpd()
128 struct drm_device *dev = connector->dev; in drm_bridge_connector_handle_hpd()
130 mutex_lock(&dev->mode_config.mutex); in drm_bridge_connector_handle_hpd()
131 connector->status = status; in drm_bridge_connector_handle_hpd()
132 mutex_unlock(&dev->mode_config.mutex); in drm_bridge_connector_handle_hpd()
158 struct drm_bridge *hpd = bridge_connector->bridge_hpd; in drm_bridge_connector_enable_hpd()
169 struct drm_bridge *hpd = bridge_connector->bridge_hpd; in drm_bridge_connector_disable_hpd()
175 /* -----------------------------------------------------------------------------
184 struct drm_bridge *detect = bridge_connector->bridge_detect; in drm_bridge_connector_detect()
185 struct drm_bridge *hdmi = bridge_connector->bridge_hdmi; in drm_bridge_connector_detect()
189 status = detect->funcs->detect(detect); in drm_bridge_connector_detect()
196 switch (connector->connector_type) { in drm_bridge_connector_detect()
216 struct drm_bridge *hdmi = bridge_connector->bridge_hdmi; in drm_bridge_connector_force()
227 struct drm_encoder *encoder = bridge_connector->encoder; in drm_bridge_connector_debugfs_init()
230 list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_connector_debugfs_init()
231 if (bridge->funcs->debugfs_init) in drm_bridge_connector_debugfs_init()
232 bridge->funcs->debugfs_init(bridge, root); in drm_bridge_connector_debugfs_init()
242 if (bridge_connector->bridge_hdmi) in drm_bridge_connector_reset()
244 connector->state); in drm_bridge_connector_reset()
258 /* -----------------------------------------------------------------------------
300 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_get_modes()
308 bridge = bridge_connector->bridge_edid; in drm_bridge_connector_get_modes()
313 * Otherwise if the display pipeline reports modes (e.g. with a fixed in drm_bridge_connector_get_modes()
316 bridge = bridge_connector->bridge_modes; in drm_bridge_connector_get_modes()
318 return bridge->funcs->get_modes(bridge, connector); in drm_bridge_connector_get_modes()
322 * VGA output with the DDC bus unconnected. The KMS core will add the in drm_bridge_connector_get_modes()
335 if (bridge_connector->bridge_hdmi) in drm_bridge_connector_mode_valid()
347 if (bridge_connector->bridge_hdmi) in drm_bridge_connector_atomic_check()
370 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_tmds_char_rate_valid()
374 if (bridge->funcs->hdmi_tmds_char_rate_valid) in drm_bridge_connector_tmds_char_rate_valid()
375 return bridge->funcs->hdmi_tmds_char_rate_valid(bridge, mode, tmds_rate); in drm_bridge_connector_tmds_char_rate_valid()
387 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_clear_infoframe()
389 return -EINVAL; in drm_bridge_connector_clear_infoframe()
391 return bridge->funcs->hdmi_clear_infoframe(bridge, type); in drm_bridge_connector_clear_infoframe()
402 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_write_infoframe()
404 return -EINVAL; in drm_bridge_connector_write_infoframe()
406 return bridge->funcs->hdmi_write_infoframe(bridge, type, buffer, len); in drm_bridge_connector_write_infoframe()
416 bridge = bridge_connector->bridge_edid; in drm_bridge_connector_read_edid()
436 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_audio_startup()
438 return -EINVAL; in drm_bridge_connector_audio_startup()
440 if (!bridge->funcs->hdmi_audio_startup) in drm_bridge_connector_audio_startup()
443 return bridge->funcs->hdmi_audio_startup(connector, bridge); in drm_bridge_connector_audio_startup()
454 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_audio_prepare()
456 return -EINVAL; in drm_bridge_connector_audio_prepare()
458 return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); in drm_bridge_connector_audio_prepare()
467 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_audio_shutdown()
471 bridge->funcs->hdmi_audio_shutdown(connector, bridge); in drm_bridge_connector_audio_shutdown()
481 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_audio_mute_stream()
483 return -EINVAL; in drm_bridge_connector_audio_mute_stream()
485 if (bridge->funcs->hdmi_audio_mute_stream) in drm_bridge_connector_audio_mute_stream()
486 return bridge->funcs->hdmi_audio_mute_stream(connector, bridge, in drm_bridge_connector_audio_mute_stream()
489 return -ENOTSUPP; in drm_bridge_connector_audio_mute_stream()
499 /* -----------------------------------------------------------------------------
504 * drm_bridge_connector_init - Initialise a connector for a chain of bridges
511 * (&drm_bridge->ops) and bridge output type (&drm_bridge->type), and none of
522 struct i2c_adapter *ddc = NULL; in drm_bridge_connector_init() local
531 return ERR_PTR(-ENOMEM); in drm_bridge_connector_init()
533 bridge_connector->encoder = encoder; in drm_bridge_connector_init()
538 connector = &bridge_connector->base; in drm_bridge_connector_init()
539 connector->interlace_allowed = true; in drm_bridge_connector_init()
540 connector->ycbcr_420_allowed = true; in drm_bridge_connector_init()
551 if (!bridge->interlace_allowed) in drm_bridge_connector_init()
552 connector->interlace_allowed = false; in drm_bridge_connector_init()
553 if (!bridge->ycbcr_420_allowed) in drm_bridge_connector_init()
554 connector->ycbcr_420_allowed = false; in drm_bridge_connector_init()
556 if (bridge->ops & DRM_BRIDGE_OP_EDID) in drm_bridge_connector_init()
557 bridge_connector->bridge_edid = bridge; in drm_bridge_connector_init()
558 if (bridge->ops & DRM_BRIDGE_OP_HPD) in drm_bridge_connector_init()
559 bridge_connector->bridge_hpd = bridge; in drm_bridge_connector_init()
560 if (bridge->ops & DRM_BRIDGE_OP_DETECT) in drm_bridge_connector_init()
561 bridge_connector->bridge_detect = bridge; in drm_bridge_connector_init()
562 if (bridge->ops & DRM_BRIDGE_OP_MODES) in drm_bridge_connector_init()
563 bridge_connector->bridge_modes = bridge; in drm_bridge_connector_init()
564 if (bridge->ops & DRM_BRIDGE_OP_HDMI) { in drm_bridge_connector_init()
565 if (bridge_connector->bridge_hdmi) in drm_bridge_connector_init()
566 return ERR_PTR(-EBUSY); in drm_bridge_connector_init()
567 if (!bridge->funcs->hdmi_write_infoframe || in drm_bridge_connector_init()
568 !bridge->funcs->hdmi_clear_infoframe) in drm_bridge_connector_init()
569 return ERR_PTR(-EINVAL); in drm_bridge_connector_init()
571 bridge_connector->bridge_hdmi = bridge; in drm_bridge_connector_init()
573 if (bridge->supported_formats) in drm_bridge_connector_init()
574 supported_formats = bridge->supported_formats; in drm_bridge_connector_init()
575 if (bridge->max_bpc) in drm_bridge_connector_init()
576 max_bpc = bridge->max_bpc; in drm_bridge_connector_init()
580 connector_type = bridge->type; in drm_bridge_connector_init()
584 bridge->of_node) in drm_bridge_connector_init()
585 connector->fwnode = fwnode_handle_get(of_fwnode_handle(bridge->of_node)); in drm_bridge_connector_init()
588 if (bridge->ddc) in drm_bridge_connector_init()
589 ddc = bridge->ddc; in drm_bridge_connector_init()
596 return ERR_PTR(-EINVAL); in drm_bridge_connector_init()
598 if (bridge_connector->bridge_hdmi) { in drm_bridge_connector_init()
599 if (!connector->ycbcr_420_allowed) in drm_bridge_connector_init()
602 bridge = bridge_connector->bridge_hdmi; in drm_bridge_connector_init()
605 bridge_connector->bridge_hdmi->vendor, in drm_bridge_connector_init()
606 bridge_connector->bridge_hdmi->product, in drm_bridge_connector_init()
609 connector_type, ddc, in drm_bridge_connector_init()
615 if (bridge->hdmi_audio_max_i2s_playback_channels || in drm_bridge_connector_init()
616 bridge->hdmi_audio_spdif_playback) { in drm_bridge_connector_init()
617 if (!bridge->funcs->hdmi_audio_prepare || in drm_bridge_connector_init()
618 !bridge->funcs->hdmi_audio_shutdown) in drm_bridge_connector_init()
619 return ERR_PTR(-EINVAL); in drm_bridge_connector_init()
622 bridge->hdmi_audio_dev, in drm_bridge_connector_init()
624 bridge->hdmi_audio_max_i2s_playback_channels, in drm_bridge_connector_init()
625 bridge->hdmi_audio_spdif_playback, in drm_bridge_connector_init()
626 bridge->hdmi_audio_dai_port); in drm_bridge_connector_init()
633 connector_type, ddc); in drm_bridge_connector_init()
640 if (bridge_connector->bridge_hpd) in drm_bridge_connector_init()
641 connector->polled = DRM_CONNECTOR_POLL_HPD; in drm_bridge_connector_init()
642 else if (bridge_connector->bridge_detect) in drm_bridge_connector_init()
643 connector->polled = DRM_CONNECTOR_POLL_CONNECT in drm_bridge_connector_init()