From ffbc5b745c72892af85c41b758ca77d6a59e0aeb Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Fri, 2 Jul 2021 15:22:55 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: Add property to show whether sink is DVI Add property output_type_capacity: enums: DVI=0 HDMI=1 Signed-off-by: Algea Cao Change-Id: Iad09b386b55c52e21b01f98e81fadfd5aa1a42d3 --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 6 ++++++ drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 24 +++++++++++++++++++++ include/drm/bridge/dw_hdmi.h | 1 + 3 files changed, 31 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 1bb727fe7229..d02c1bf563cf 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2947,6 +2947,12 @@ bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi) } EXPORT_SYMBOL_GPL(dw_hdmi_get_output_whether_hdmi); +int dw_hdmi_get_output_type_cap(struct dw_hdmi *hdmi) +{ + return hdmi->support_hdmi; +} +EXPORT_SYMBOL_GPL(dw_hdmi_get_output_type_cap); + static void dw_hdmi_connector_force(struct drm_connector *connector) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index b15ceefa6795..47f913ab5972 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -132,6 +132,7 @@ struct rockchip_hdmi { struct drm_property *quant_range; struct drm_property *hdr_panel_metadata_property; struct drm_property *output_hdmi_dvi; + struct drm_property *output_type_capacity; struct drm_property_blob *hdr_panel_blob_ptr; @@ -1000,6 +1001,11 @@ static const struct drm_prop_enum_list output_hdmi_dvi_enum_list[] = { { 2, "force_dvi" }, }; +static const struct drm_prop_enum_list output_type_cap_list[] = { + { 0, "DVI" }, + { 1, "HDMI" }, +}; + static void dw_hdmi_rockchip_attach_properties(struct drm_connector *connector, unsigned int color, int version, @@ -1129,6 +1135,15 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector, drm_object_attach_property(&connector->base, prop, 0); } + prop = drm_property_create_enum(connector->dev, 0, + "output_type_capacity", + output_type_cap_list, + ARRAY_SIZE(output_type_cap_list)); + if (prop) { + hdmi->output_type_capacity = prop; + drm_object_attach_property(&connector->base, prop, 0); + } + prop = connector->dev->mode_config.hdr_output_metadata_property; if (version >= 0x211a) drm_object_attach_property(&connector->base, prop, 0); @@ -1188,6 +1203,12 @@ dw_hdmi_rockchip_destroy_properties(struct drm_connector *connector, hdmi->output_hdmi_dvi); hdmi->output_hdmi_dvi = NULL; } + + if (hdmi->output_type_capacity) { + drm_property_destroy(connector->dev, + hdmi->output_type_capacity); + hdmi->output_type_capacity = NULL; + } } static int @@ -1298,6 +1319,9 @@ dw_hdmi_rockchip_get_property(struct drm_connector *connector, } else if (property == hdmi->output_hdmi_dvi) { *val = hdmi->force_output; return 0; + } else if (property == hdmi->output_type_capacity) { + *val = dw_hdmi_get_output_type_cap(hdmi->hdmi); + return 0; } DRM_ERROR("failed to get rockchip hdmi connector property %s\n", property->name); diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h index 46cd16575473..12451542a2ec 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -219,5 +219,6 @@ void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data); void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi); void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val); bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi); +int dw_hdmi_get_output_type_cap(struct dw_hdmi *hdmi); #endif /* __IMX_HDMI_H__ */