mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-28 00:19:36 +00:00
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:
parent
02bb63d1a5
commit
5d156a9c3d
@ -864,7 +864,8 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge,
|
||||
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);
|
||||
|
||||
|
@ -2448,7 +2448,7 @@ anx7625_audio_update_connector_status(struct anx7625_data *ctx,
|
||||
enum drm_connector_status 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 device *dev = ctx->dev;
|
||||
|
@ -2143,7 +2143,8 @@ static int cdns_mhdp_atomic_check(struct drm_bridge *bridge,
|
||||
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);
|
||||
|
||||
|
@ -215,7 +215,7 @@ static enum drm_connector_status ch7033_connector_detect(
|
||||
{
|
||||
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 = {
|
||||
|
@ -40,8 +40,7 @@ static int display_connector_attach(struct drm_bridge *bridge,
|
||||
return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
display_connector_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status display_connector_detect(struct drm_bridge *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,
|
||||
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 = {
|
||||
.attach = display_connector_attach,
|
||||
.detect = display_connector_detect,
|
||||
.detect = display_connector_bridge_detect,
|
||||
.edid_read = display_connector_edid_read,
|
||||
.atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts,
|
||||
.atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts,
|
||||
|
@ -693,7 +693,8 @@ static int it6263_bridge_attach(struct drm_bridge *bridge,
|
||||
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);
|
||||
|
||||
|
@ -3238,7 +3238,7 @@ static void it6505_bridge_atomic_post_disable(struct drm_bridge *bridge,
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
@ -843,7 +843,8 @@ static enum drm_mode_status it66121_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
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);
|
||||
|
||||
|
@ -408,7 +408,7 @@ lt8912_connector_detect(struct drm_connector *connector, bool force)
|
||||
struct lt8912 *lt = connector_to_lt8912(connector);
|
||||
|
||||
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);
|
||||
}
|
||||
@ -607,12 +607,12 @@ lt8912_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -543,7 +543,8 @@ static int lt9611_regulator_enable(struct lt9611 *lt9611)
|
||||
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);
|
||||
unsigned int reg_val = 0;
|
||||
|
@ -353,7 +353,8 @@ static void lt9611uxc_bridge_mode_set(struct drm_bridge *bridge,
|
||||
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);
|
||||
unsigned int reg_val = 0;
|
||||
|
@ -120,7 +120,8 @@ drm_connector_helper_funcs ge_b850v3_lvds_connector_helper_funcs = {
|
||||
.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 =
|
||||
ge_b850v3_lvds_ptr->stdp4028_i2c;
|
||||
|
@ -458,7 +458,8 @@ static int sii902x_bridge_attach(struct drm_bridge *bridge,
|
||||
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);
|
||||
|
||||
|
@ -90,7 +90,7 @@ simple_bridge_connector_detect(struct drm_connector *connector, bool force)
|
||||
{
|
||||
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 = {
|
||||
|
@ -876,7 +876,7 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge,
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
|
@ -2978,7 +2978,8 @@ static void dw_hdmi_bridge_atomic_enable(struct drm_bridge *bridge,
|
||||
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;
|
||||
|
||||
|
@ -1760,7 +1760,8 @@ static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
|
||||
.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);
|
||||
bool conn;
|
||||
@ -1785,7 +1786,7 @@ tc_connector_detect(struct drm_connector *connector, bool force)
|
||||
struct tc_data *tc = connector_to_tc(connector);
|
||||
|
||||
if (tc->hpd_pin >= 0)
|
||||
return tc_bridge_detect(&tc->bridge);
|
||||
return tc_bridge_detect(&tc->bridge, connector);
|
||||
|
||||
if (tc->panel_bridge)
|
||||
return connector_status_connected;
|
||||
|
@ -1155,7 +1155,8 @@ static void ti_sn_bridge_atomic_post_disable(struct drm_bridge *bridge,
|
||||
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);
|
||||
int val = 0;
|
||||
|
@ -89,7 +89,7 @@ tfp410_connector_detect(struct drm_connector *connector, bool force)
|
||||
{
|
||||
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 = {
|
||||
|
@ -77,6 +77,12 @@ static enum drm_connector_status tpd12s015_detect(struct drm_bridge *bridge)
|
||||
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)
|
||||
{
|
||||
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 = {
|
||||
.attach = tpd12s015_attach,
|
||||
.detach = tpd12s015_detach,
|
||||
.detect = tpd12s015_detect,
|
||||
.detect = tpd12s015_bridge_detect,
|
||||
.hpd_enable = tpd12s015_hpd_enable,
|
||||
.hpd_disable = tpd12s015_hpd_disable,
|
||||
};
|
||||
|
@ -210,7 +210,7 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
|
||||
enum drm_connector_status status;
|
||||
|
||||
if (detect) {
|
||||
status = detect->funcs->detect(detect);
|
||||
status = detect->funcs->detect(detect, connector);
|
||||
|
||||
if (hdmi)
|
||||
drm_atomic_helper_connector_hdmi_hotplug(connector, status);
|
||||
|
@ -1237,12 +1237,13 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_check);
|
||||
* The detection status on success, or connector_status_unknown if the bridge
|
||||
* 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))
|
||||
return connector_status_unknown;
|
||||
|
||||
return bridge->funcs->detect(bridge);
|
||||
return bridge->funcs->detect(bridge, connector);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_bridge_detect);
|
||||
|
||||
|
@ -2118,7 +2118,8 @@ static void mtk_dp_update_plugged_status(struct mtk_dp *mtk_dp)
|
||||
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);
|
||||
enum drm_connector_status ret = connector_status_disconnected;
|
||||
|
@ -1174,7 +1174,8 @@ static void mtk_hdmi_hpd_event(bool hpd, struct device *dev)
|
||||
* 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);
|
||||
|
||||
|
@ -20,7 +20,8 @@
|
||||
* @bridge: Pointer to drm bridge structure
|
||||
* 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;
|
||||
|
||||
|
@ -215,7 +215,7 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi);
|
||||
|
||||
void msm_hdmi_hpd_irq(struct drm_bridge *bridge);
|
||||
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_disable(struct drm_bridge *bridge);
|
||||
|
||||
|
@ -475,7 +475,7 @@ msm_hdmi_hotplug_work(struct work_struct *work)
|
||||
container_of(work, struct hdmi_bridge, hpd_work);
|
||||
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 */
|
||||
|
@ -177,8 +177,8 @@ static enum drm_connector_status detect_gpio(struct hdmi *hdmi)
|
||||
connector_status_disconnected;
|
||||
}
|
||||
|
||||
enum drm_connector_status msm_hdmi_bridge_detect(
|
||||
struct drm_bridge *bridge)
|
||||
enum drm_connector_status
|
||||
msm_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
|
||||
struct hdmi *hdmi = hdmi_bridge->hdmi;
|
||||
|
@ -233,7 +233,7 @@ static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp)
|
||||
}
|
||||
|
||||
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);
|
||||
enum drm_connector_status status = connector_status_disconnected;
|
||||
|
@ -450,7 +450,7 @@ struct drm_encoder_helper_funcs rk3066_hdmi_encoder_helper_funcs = {
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
|
@ -1720,7 +1720,8 @@ static enum drm_connector_status __zynqmp_dp_bridge_detect(struct zynqmp_dp *dp)
|
||||
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);
|
||||
|
||||
|
@ -660,7 +660,8 @@ struct drm_bridge_funcs {
|
||||
*
|
||||
* 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:
|
||||
@ -1382,7 +1383,8 @@ drm_atomic_helper_bridge_propagate_bus_fmt(struct drm_bridge *bridge,
|
||||
u32 output_fmt,
|
||||
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,
|
||||
struct drm_connector *connector);
|
||||
const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,
|
||||
|
Loading…
Reference in New Issue
Block a user