Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/display: bridge-connector: hook in CEC notifier support

Allow HDMI DRM bridges to create CEC notifier. Physical address is
handled automatically by drm_atomic_helper_connector_hdmi_hotplug()
being called from .detect() path.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250517-drm-hdmi-connector-cec-v6-8-35651db6f19b@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+35
+24
drivers/gpu/drm/display/drm_bridge_connector.c
··· 20 20 #include <drm/drm_print.h> 21 21 #include <drm/drm_probe_helper.h> 22 22 #include <drm/display/drm_hdmi_audio_helper.h> 23 + #include <drm/display/drm_hdmi_cec_helper.h> 23 24 #include <drm/display/drm_hdmi_helper.h> 24 25 #include <drm/display/drm_hdmi_state_helper.h> 25 26 ··· 114 113 * &DRM_BRIDGE_OP_DP_AUDIO). 115 114 */ 116 115 struct drm_bridge *bridge_dp_audio; 116 + /** 117 + * @bridge_hdmi_cec: 118 + * 119 + * The bridge in the chain that implements CEC support, if any (see 120 + * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER). 121 + */ 122 + struct drm_bridge *bridge_hdmi_cec; 117 123 }; 118 124 119 125 #define to_drm_bridge_connector(x) \ ··· 670 662 bridge_connector->bridge_dp_audio = bridge; 671 663 } 672 664 665 + if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { 666 + if (bridge_connector->bridge_hdmi_cec) 667 + return ERR_PTR(-EBUSY); 668 + 669 + bridge_connector->bridge_hdmi_cec = bridge; 670 + } 671 + 673 672 if (!drm_bridge_get_next_bridge(bridge)) 674 673 connector_type = bridge->type; 675 674 ··· 735 720 bridge->hdmi_audio_i2s_formats, 736 721 bridge->hdmi_audio_spdif_playback, 737 722 bridge->hdmi_audio_dai_port); 723 + if (ret) 724 + return ERR_PTR(ret); 725 + } 726 + 727 + if (bridge_connector->bridge_hdmi_cec && 728 + bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { 729 + ret = drmm_connector_hdmi_cec_notifier_register(connector, 730 + NULL, 731 + bridge->hdmi_cec_dev); 738 732 if (ret) 739 733 return ERR_PTR(ret); 740 734 }
+11
include/drm/drm_bridge.h
··· 907 907 * flag. 908 908 */ 909 909 DRM_BRIDGE_OP_DP_AUDIO = BIT(6), 910 + /** 911 + * @DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER: The bridge requires CEC notifier 912 + * to be present. 913 + */ 914 + DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER = BIT(7), 910 915 }; 911 916 912 917 /** ··· 1007 1002 * @DRM_BRIDGE_OP_HDMI is set. 1008 1003 */ 1009 1004 unsigned int max_bpc; 1005 + 1006 + /** 1007 + * @hdmi_cec_dev: device to be used as a containing device for CEC 1008 + * functions. 1009 + */ 1010 + struct device *hdmi_cec_dev; 1010 1011 1011 1012 /** 1012 1013 * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if