mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
drm/bridge: chrontel-ch7033: switch to of_drm_get_bridge_by_endpoint()
This driver calls drm_of_find_panel_or_bridge() with a NULL pointer in the @panel parameter, thus using a reduced feature set of that function. Replace this call with the simpler of_drm_get_bridge_by_endpoint(). Since of_drm_get_bridge_by_endpoint() increases the refcount of the returned bridge, ensure it is put on removal. To achieve this, instead of adding an explicit drm_bridge_put(), migrate to the bridge::next_bridge pointer which is automatically put when the bridge is eventually freed. Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Link: https://patch.msgid.link/20260511-drm-bridge-alloc-getput-panel_or_bridge-v6-5-f61c9e498b3f@bootlin.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
This commit is contained in:
parent
f85a3590e3
commit
7783fc0594
|
|
@ -199,7 +199,6 @@ enum {
|
|||
|
||||
struct ch7033_priv {
|
||||
struct regmap *regmap;
|
||||
struct drm_bridge *next_bridge;
|
||||
struct drm_bridge bridge;
|
||||
struct drm_connector connector;
|
||||
};
|
||||
|
|
@ -215,7 +214,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, connector);
|
||||
return drm_bridge_detect(priv->bridge.next_bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_funcs ch7033_connector_funcs = {
|
||||
|
|
@ -233,7 +232,7 @@ static int ch7033_connector_get_modes(struct drm_connector *connector)
|
|||
const struct drm_edid *drm_edid;
|
||||
int ret;
|
||||
|
||||
drm_edid = drm_bridge_edid_read(priv->next_bridge, connector);
|
||||
drm_edid = drm_bridge_edid_read(priv->bridge.next_bridge, connector);
|
||||
drm_edid_connector_update(connector, drm_edid);
|
||||
if (drm_edid) {
|
||||
ret = drm_edid_connector_add_modes(connector);
|
||||
|
|
@ -275,7 +274,7 @@ static int ch7033_bridge_attach(struct drm_bridge *bridge,
|
|||
struct drm_connector *connector = &priv->connector;
|
||||
int ret;
|
||||
|
||||
ret = drm_bridge_attach(encoder, priv->next_bridge, bridge,
|
||||
ret = drm_bridge_attach(encoder, priv->bridge.next_bridge, bridge,
|
||||
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -283,15 +282,15 @@ static int ch7033_bridge_attach(struct drm_bridge *bridge,
|
|||
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
|
||||
return 0;
|
||||
|
||||
if (priv->next_bridge->ops & DRM_BRIDGE_OP_DETECT) {
|
||||
if (priv->bridge.next_bridge->ops & DRM_BRIDGE_OP_DETECT) {
|
||||
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||
} else {
|
||||
connector->polled = DRM_CONNECTOR_POLL_CONNECT |
|
||||
DRM_CONNECTOR_POLL_DISCONNECT;
|
||||
}
|
||||
|
||||
if (priv->next_bridge->ops & DRM_BRIDGE_OP_HPD) {
|
||||
drm_bridge_hpd_enable(priv->next_bridge, ch7033_hpd_event,
|
||||
if (priv->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD) {
|
||||
drm_bridge_hpd_enable(priv->bridge.next_bridge, ch7033_hpd_event,
|
||||
priv);
|
||||
}
|
||||
|
||||
|
|
@ -299,8 +298,8 @@ static int ch7033_bridge_attach(struct drm_bridge *bridge,
|
|||
&ch7033_connector_helper_funcs);
|
||||
ret = drm_connector_init_with_ddc(bridge->dev, &priv->connector,
|
||||
&ch7033_connector_funcs,
|
||||
priv->next_bridge->type,
|
||||
priv->next_bridge->ddc);
|
||||
priv->bridge.next_bridge->type,
|
||||
priv->bridge.next_bridge->ddc);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to initialize connector\n");
|
||||
return ret;
|
||||
|
|
@ -313,8 +312,8 @@ static void ch7033_bridge_detach(struct drm_bridge *bridge)
|
|||
{
|
||||
struct ch7033_priv *priv = bridge_to_ch7033_priv(bridge);
|
||||
|
||||
if (priv->next_bridge->ops & DRM_BRIDGE_OP_HPD)
|
||||
drm_bridge_hpd_disable(priv->next_bridge);
|
||||
if (priv->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD)
|
||||
drm_bridge_hpd_disable(priv->bridge.next_bridge);
|
||||
drm_connector_cleanup(&priv->connector);
|
||||
}
|
||||
|
||||
|
|
@ -543,10 +542,9 @@ static int ch7033_probe(struct i2c_client *client)
|
|||
|
||||
dev_set_drvdata(dev, priv);
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1, NULL,
|
||||
&priv->next_bridge);
|
||||
if (ret)
|
||||
return ret;
|
||||
priv->bridge.next_bridge = of_drm_get_bridge_by_endpoint(dev->of_node, 1, -1);
|
||||
if (IS_ERR(priv->bridge.next_bridge))
|
||||
return PTR_ERR(priv->bridge.next_bridge);
|
||||
|
||||
priv->regmap = devm_regmap_init_i2c(client, &ch7033_regmap_config);
|
||||
if (IS_ERR(priv->regmap)) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user