From 49bfddeec8237f177506e16d502d018057d3e80f Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Wed, 22 Feb 2023 10:34:30 +0000 Subject: [PATCH] drm/bridge/synopsys: dw-hdmi-qp: Add support for drm_panel usage Signed-off-by: Wyon Bi Change-Id: Id83f74260fe1d91eb891d3a1b86beab0634910d2 --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c index 8dd26b10c6ea..071709d1848d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -220,6 +221,7 @@ struct dw_hdmi_phy_data { struct dw_hdmi_qp { struct drm_connector connector; struct drm_bridge bridge; + struct drm_panel *panel; struct platform_device *hdcp_dev; struct platform_device *audio; struct platform_device *cec; @@ -2013,6 +2015,9 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force) hdmi->force = DRM_FORCE_UNSPECIFIED; mutex_unlock(&hdmi->mutex); + if (hdmi->panel) + return connector_status_connected; + if (hdmi->plat_data->left) secondary = hdmi->plat_data->left; else if (hdmi->plat_data->right) @@ -2092,6 +2097,9 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) void *data = hdmi->plat_data->phy_data; int i, ret = 0; + if (hdmi->panel) + return drm_panel_get_modes(hdmi->panel, connector); + if (!hdmi->ddc) return 0; @@ -2587,6 +2595,9 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge, struct dw_hdmi_qp *hdmi = bridge->driver_private; void *data = hdmi->plat_data->phy_data; + if (hdmi->panel) + drm_panel_disable(hdmi->panel); + /* set avmute */ hdmi_writel(hdmi, 1, PKTSCHED_PKT_CONTROL0); mdelay(50); @@ -2617,6 +2628,9 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge, hdmi->curr_conn = NULL; hdmi->disabled = true; mutex_unlock(&hdmi->mutex); + + if (hdmi->panel) + drm_panel_unprepare(hdmi->panel); } static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, @@ -2627,6 +2641,9 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_connector *connector; void *data = hdmi->plat_data->phy_data; + if (hdmi->panel) + drm_panel_prepare(hdmi->panel); + connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); @@ -2650,6 +2667,9 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); handle_plugged_change(hdmi, true); + + if (hdmi->panel) + drm_panel_enable(hdmi->panel); } static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = { @@ -3166,13 +3186,19 @@ __dw_hdmi_probe(struct platform_device *pdev, struct platform_device_info pdevinfo; struct dw_hdmi_qp_cec_data cec; struct resource *iores = NULL; + struct drm_panel *panel = NULL; int irq; int ret; + ret = drm_of_find_panel_or_bridge(np, 1, -1, &panel, NULL); + if (ret < 0 && ret != -ENODEV) + return ERR_PTR(ret); + hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); if (!hdmi) return ERR_PTR(-ENOMEM); + hdmi->panel = panel; hdmi->connector.stereo_allowed = 1; hdmi->plat_data = plat_data; hdmi->dev = dev;