drm/bridge: Pass down connector to drm bridge detect hook

In some application scenarios, we hope to get the corresponding
connector when the bridge's detect hook is invoked.

In most cases, we can get the connector by drm_atomic_get_connector_for_encoder
if the encoder attached to the bridge is enabled, however there will
still be some scenarios where the detect hook of the bridge is called
but the corresponding encoder has not been enabled yet. For instance,
this occurs when the device is hot plug in for the first time.

Since the call to bridge's detect is initiated by the connector, passing
down the corresponding connector directly will make things simpler.

Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250703125027.311109-3-andyshrk@163.com
[DB: added the chunk to the cdn-dp driver]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
This commit is contained in:
Andy Yan 2025-07-03 20:49:53 +08:00 committed by Dmitry Baryshkov
parent 02bb63d1a5
commit 5d156a9c3d
32 changed files with 69 additions and 40 deletions

View File

@ -864,7 +864,8 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge,
return ret; return ret;
} }
static enum drm_connector_status adv7511_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
adv7511_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct adv7511 *adv = bridge_to_adv7511(bridge); struct adv7511 *adv = bridge_to_adv7511(bridge);

View File

@ -2448,7 +2448,7 @@ anx7625_audio_update_connector_status(struct anx7625_data *ctx,
enum drm_connector_status status); enum drm_connector_status status);
static enum drm_connector_status static enum drm_connector_status
anx7625_bridge_detect(struct drm_bridge *bridge) anx7625_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct anx7625_data *ctx = bridge_to_anx7625(bridge); struct anx7625_data *ctx = bridge_to_anx7625(bridge);
struct device *dev = ctx->dev; struct device *dev = ctx->dev;

View File

@ -2143,7 +2143,8 @@ static int cdns_mhdp_atomic_check(struct drm_bridge *bridge,
return 0; return 0;
} }
static enum drm_connector_status cdns_mhdp_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
cdns_mhdp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge); struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge);

View File

@ -215,7 +215,7 @@ static enum drm_connector_status ch7033_connector_detect(
{ {
struct ch7033_priv *priv = conn_to_ch7033_priv(connector); struct ch7033_priv *priv = conn_to_ch7033_priv(connector);
return drm_bridge_detect(priv->next_bridge); return drm_bridge_detect(priv->next_bridge, connector);
} }
static const struct drm_connector_funcs ch7033_connector_funcs = { static const struct drm_connector_funcs ch7033_connector_funcs = {

View File

@ -40,8 +40,7 @@ static int display_connector_attach(struct drm_bridge *bridge,
return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL; return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL;
} }
static enum drm_connector_status static enum drm_connector_status display_connector_detect(struct drm_bridge *bridge)
display_connector_detect(struct drm_bridge *bridge)
{ {
struct display_connector *conn = to_display_connector(bridge); struct display_connector *conn = to_display_connector(bridge);
@ -82,6 +81,12 @@ display_connector_detect(struct drm_bridge *bridge)
} }
} }
static enum drm_connector_status
display_connector_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{
return display_connector_detect(bridge);
}
static const struct drm_edid *display_connector_edid_read(struct drm_bridge *bridge, static const struct drm_edid *display_connector_edid_read(struct drm_bridge *bridge,
struct drm_connector *connector) struct drm_connector *connector)
{ {
@ -172,7 +177,7 @@ static u32 *display_connector_get_input_bus_fmts(struct drm_bridge *bridge,
static const struct drm_bridge_funcs display_connector_bridge_funcs = { static const struct drm_bridge_funcs display_connector_bridge_funcs = {
.attach = display_connector_attach, .attach = display_connector_attach,
.detect = display_connector_detect, .detect = display_connector_bridge_detect,
.edid_read = display_connector_edid_read, .edid_read = display_connector_edid_read,
.atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts, .atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts,
.atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts, .atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts,

View File

@ -693,7 +693,8 @@ static int it6263_bridge_attach(struct drm_bridge *bridge,
return 0; return 0;
} }
static enum drm_connector_status it6263_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
it6263_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct it6263 *it = bridge_to_it6263(bridge); struct it6263 *it = bridge_to_it6263(bridge);

View File

@ -3238,7 +3238,7 @@ static void it6505_bridge_atomic_post_disable(struct drm_bridge *bridge,
} }
static enum drm_connector_status static enum drm_connector_status
it6505_bridge_detect(struct drm_bridge *bridge) it6505_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct it6505 *it6505 = bridge_to_it6505(bridge); struct it6505 *it6505 = bridge_to_it6505(bridge);

View File

@ -843,7 +843,8 @@ static enum drm_mode_status it66121_bridge_mode_valid(struct drm_bridge *bridge,
return MODE_OK; return MODE_OK;
} }
static enum drm_connector_status it66121_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
it66121_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge);

View File

@ -408,7 +408,7 @@ lt8912_connector_detect(struct drm_connector *connector, bool force)
struct lt8912 *lt = connector_to_lt8912(connector); struct lt8912 *lt = connector_to_lt8912(connector);
if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT) if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
return drm_bridge_detect(lt->hdmi_port); return drm_bridge_detect(lt->hdmi_port, connector);
return lt8912_check_cable_status(lt); return lt8912_check_cable_status(lt);
} }
@ -607,12 +607,12 @@ lt8912_bridge_mode_valid(struct drm_bridge *bridge,
} }
static enum drm_connector_status static enum drm_connector_status
lt8912_bridge_detect(struct drm_bridge *bridge) lt8912_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct lt8912 *lt = bridge_to_lt8912(bridge); struct lt8912 *lt = bridge_to_lt8912(bridge);
if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT) if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
return drm_bridge_detect(lt->hdmi_port); return drm_bridge_detect(lt->hdmi_port, connector);
return lt8912_check_cable_status(lt); return lt8912_check_cable_status(lt);
} }

View File

@ -543,7 +543,8 @@ static int lt9611_regulator_enable(struct lt9611 *lt9611)
return 0; return 0;
} }
static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
lt9611_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct lt9611 *lt9611 = bridge_to_lt9611(bridge); struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
unsigned int reg_val = 0; unsigned int reg_val = 0;

View File

@ -353,7 +353,8 @@ static void lt9611uxc_bridge_mode_set(struct drm_bridge *bridge,
lt9611uxc_unlock(lt9611uxc); lt9611uxc_unlock(lt9611uxc);
} }
static enum drm_connector_status lt9611uxc_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
lt9611uxc_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge); struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
unsigned int reg_val = 0; unsigned int reg_val = 0;

View File

@ -120,7 +120,8 @@ drm_connector_helper_funcs ge_b850v3_lvds_connector_helper_funcs = {
.get_modes = ge_b850v3_lvds_get_modes, .get_modes = ge_b850v3_lvds_get_modes,
}; };
static enum drm_connector_status ge_b850v3_lvds_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
ge_b850v3_lvds_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct i2c_client *stdp4028_i2c = struct i2c_client *stdp4028_i2c =
ge_b850v3_lvds_ptr->stdp4028_i2c; ge_b850v3_lvds_ptr->stdp4028_i2c;

View File

@ -458,7 +458,8 @@ static int sii902x_bridge_attach(struct drm_bridge *bridge,
return 0; return 0;
} }
static enum drm_connector_status sii902x_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
sii902x_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct sii902x *sii902x = bridge_to_sii902x(bridge); struct sii902x *sii902x = bridge_to_sii902x(bridge);

View File

@ -90,7 +90,7 @@ simple_bridge_connector_detect(struct drm_connector *connector, bool force)
{ {
struct simple_bridge *sbridge = drm_connector_to_simple_bridge(connector); struct simple_bridge *sbridge = drm_connector_to_simple_bridge(connector);
return drm_bridge_detect(sbridge->next_bridge); return drm_bridge_detect(sbridge->next_bridge, connector);
} }
static const struct drm_connector_funcs simple_bridge_con_funcs = { static const struct drm_connector_funcs simple_bridge_con_funcs = {

View File

@ -876,7 +876,7 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge,
} }
static enum drm_connector_status static enum drm_connector_status
dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge) dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct dw_hdmi_qp *hdmi = bridge->driver_private; struct dw_hdmi_qp *hdmi = bridge->driver_private;

View File

@ -2978,7 +2978,8 @@ static void dw_hdmi_bridge_atomic_enable(struct drm_bridge *bridge,
mutex_unlock(&hdmi->mutex); mutex_unlock(&hdmi->mutex);
} }
static enum drm_connector_status dw_hdmi_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
dw_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct dw_hdmi *hdmi = bridge->driver_private; struct dw_hdmi *hdmi = bridge->driver_private;

View File

@ -1760,7 +1760,8 @@ static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
.get_modes = tc_connector_get_modes, .get_modes = tc_connector_get_modes,
}; };
static enum drm_connector_status tc_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
tc_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct tc_data *tc = bridge_to_tc(bridge); struct tc_data *tc = bridge_to_tc(bridge);
bool conn; bool conn;
@ -1785,7 +1786,7 @@ tc_connector_detect(struct drm_connector *connector, bool force)
struct tc_data *tc = connector_to_tc(connector); struct tc_data *tc = connector_to_tc(connector);
if (tc->hpd_pin >= 0) if (tc->hpd_pin >= 0)
return tc_bridge_detect(&tc->bridge); return tc_bridge_detect(&tc->bridge, connector);
if (tc->panel_bridge) if (tc->panel_bridge)
return connector_status_connected; return connector_status_connected;

View File

@ -1155,7 +1155,8 @@ static void ti_sn_bridge_atomic_post_disable(struct drm_bridge *bridge,
pm_runtime_put_sync(pdata->dev); pm_runtime_put_sync(pdata->dev);
} }
static enum drm_connector_status ti_sn_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
ti_sn_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge);
int val = 0; int val = 0;

View File

@ -89,7 +89,7 @@ tfp410_connector_detect(struct drm_connector *connector, bool force)
{ {
struct tfp410 *dvi = drm_connector_to_tfp410(connector); struct tfp410 *dvi = drm_connector_to_tfp410(connector);
return drm_bridge_detect(dvi->next_bridge); return drm_bridge_detect(dvi->next_bridge, connector);
} }
static const struct drm_connector_funcs tfp410_con_funcs = { static const struct drm_connector_funcs tfp410_con_funcs = {

View File

@ -77,6 +77,12 @@ static enum drm_connector_status tpd12s015_detect(struct drm_bridge *bridge)
return connector_status_disconnected; return connector_status_disconnected;
} }
static enum drm_connector_status
tpd12s015_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{
return tpd12s015_detect(bridge);
}
static void tpd12s015_hpd_enable(struct drm_bridge *bridge) static void tpd12s015_hpd_enable(struct drm_bridge *bridge)
{ {
struct tpd12s015_device *tpd = to_tpd12s015(bridge); struct tpd12s015_device *tpd = to_tpd12s015(bridge);
@ -94,7 +100,7 @@ static void tpd12s015_hpd_disable(struct drm_bridge *bridge)
static const struct drm_bridge_funcs tpd12s015_bridge_funcs = { static const struct drm_bridge_funcs tpd12s015_bridge_funcs = {
.attach = tpd12s015_attach, .attach = tpd12s015_attach,
.detach = tpd12s015_detach, .detach = tpd12s015_detach,
.detect = tpd12s015_detect, .detect = tpd12s015_bridge_detect,
.hpd_enable = tpd12s015_hpd_enable, .hpd_enable = tpd12s015_hpd_enable,
.hpd_disable = tpd12s015_hpd_disable, .hpd_disable = tpd12s015_hpd_disable,
}; };

View File

@ -210,7 +210,7 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
enum drm_connector_status status; enum drm_connector_status status;
if (detect) { if (detect) {
status = detect->funcs->detect(detect); status = detect->funcs->detect(detect, connector);
if (hdmi) if (hdmi)
drm_atomic_helper_connector_hdmi_hotplug(connector, status); drm_atomic_helper_connector_hdmi_hotplug(connector, status);

View File

@ -1237,12 +1237,13 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_check);
* The detection status on success, or connector_status_unknown if the bridge * The detection status on success, or connector_status_unknown if the bridge
* doesn't support output detection. * doesn't support output detection.
*/ */
enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge) enum drm_connector_status
drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) if (!(bridge->ops & DRM_BRIDGE_OP_DETECT))
return connector_status_unknown; return connector_status_unknown;
return bridge->funcs->detect(bridge); return bridge->funcs->detect(bridge, connector);
} }
EXPORT_SYMBOL_GPL(drm_bridge_detect); EXPORT_SYMBOL_GPL(drm_bridge_detect);

View File

@ -2118,7 +2118,8 @@ static void mtk_dp_update_plugged_status(struct mtk_dp *mtk_dp)
mutex_unlock(&mtk_dp->update_plugged_status_lock); mutex_unlock(&mtk_dp->update_plugged_status_lock);
} }
static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge) static enum drm_connector_status
mtk_dp_bdg_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge); struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;

View File

@ -1174,7 +1174,8 @@ static void mtk_hdmi_hpd_event(bool hpd, struct device *dev)
* Bridge callbacks * Bridge callbacks
*/ */
static enum drm_connector_status mtk_hdmi_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
mtk_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge);

View File

@ -20,7 +20,8 @@
* @bridge: Pointer to drm bridge structure * @bridge: Pointer to drm bridge structure
* Returns: Bridge's 'is connected' status * Returns: Bridge's 'is connected' status
*/ */
static enum drm_connector_status msm_dp_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
msm_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct msm_dp *dp; struct msm_dp *dp;

View File

@ -215,7 +215,7 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi);
void msm_hdmi_hpd_irq(struct drm_bridge *bridge); void msm_hdmi_hpd_irq(struct drm_bridge *bridge);
enum drm_connector_status msm_hdmi_bridge_detect( enum drm_connector_status msm_hdmi_bridge_detect(
struct drm_bridge *bridge); struct drm_bridge *bridge, struct drm_connector *connector);
void msm_hdmi_hpd_enable(struct drm_bridge *bridge); void msm_hdmi_hpd_enable(struct drm_bridge *bridge);
void msm_hdmi_hpd_disable(struct drm_bridge *bridge); void msm_hdmi_hpd_disable(struct drm_bridge *bridge);

View File

@ -475,7 +475,7 @@ msm_hdmi_hotplug_work(struct work_struct *work)
container_of(work, struct hdmi_bridge, hpd_work); container_of(work, struct hdmi_bridge, hpd_work);
struct drm_bridge *bridge = &hdmi_bridge->base; struct drm_bridge *bridge = &hdmi_bridge->base;
drm_bridge_hpd_notify(bridge, drm_bridge_detect(bridge)); drm_bridge_hpd_notify(bridge, drm_bridge_detect(bridge, hdmi_bridge->hdmi->connector));
} }
/* initialize bridge */ /* initialize bridge */

View File

@ -177,8 +177,8 @@ static enum drm_connector_status detect_gpio(struct hdmi *hdmi)
connector_status_disconnected; connector_status_disconnected;
} }
enum drm_connector_status msm_hdmi_bridge_detect( enum drm_connector_status
struct drm_bridge *bridge) msm_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = hdmi_bridge->hdmi; struct hdmi *hdmi = hdmi_bridge->hdmi;

View File

@ -233,7 +233,7 @@ static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp)
} }
static enum drm_connector_status static enum drm_connector_status
cdn_dp_bridge_detect(struct drm_bridge *bridge) cdn_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct cdn_dp_device *dp = bridge_to_dp(bridge); struct cdn_dp_device *dp = bridge_to_dp(bridge);
enum drm_connector_status status = connector_status_disconnected; enum drm_connector_status status = connector_status_disconnected;

View File

@ -450,7 +450,7 @@ struct drm_encoder_helper_funcs rk3066_hdmi_encoder_helper_funcs = {
}; };
static enum drm_connector_status static enum drm_connector_status
rk3066_hdmi_bridge_detect(struct drm_bridge *bridge) rk3066_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct rk3066_hdmi *hdmi = bridge_to_rk3066_hdmi(bridge); struct rk3066_hdmi *hdmi = bridge_to_rk3066_hdmi(bridge);

View File

@ -1720,7 +1720,8 @@ static enum drm_connector_status __zynqmp_dp_bridge_detect(struct zynqmp_dp *dp)
return connector_status_disconnected; return connector_status_disconnected;
} }
static enum drm_connector_status zynqmp_dp_bridge_detect(struct drm_bridge *bridge) static enum drm_connector_status
zynqmp_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{ {
struct zynqmp_dp *dp = bridge_to_dp(bridge); struct zynqmp_dp *dp = bridge_to_dp(bridge);

View File

@ -660,7 +660,8 @@ struct drm_bridge_funcs {
* *
* drm_connector_status indicating the bridge output status. * drm_connector_status indicating the bridge output status.
*/ */
enum drm_connector_status (*detect)(struct drm_bridge *bridge); enum drm_connector_status (*detect)(struct drm_bridge *bridge,
struct drm_connector *connector);
/** /**
* @get_modes: * @get_modes:
@ -1382,7 +1383,8 @@ drm_atomic_helper_bridge_propagate_bus_fmt(struct drm_bridge *bridge,
u32 output_fmt, u32 output_fmt,
unsigned int *num_input_fmts); unsigned int *num_input_fmts);
enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge); enum drm_connector_status
drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector);
int drm_bridge_get_modes(struct drm_bridge *bridge, int drm_bridge_get_modes(struct drm_bridge *bridge,
struct drm_connector *connector); struct drm_connector *connector);
const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge, const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,