mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-25 10:53:34 -04: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:
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user