devm_drm_bridge_alloc() is the new API to be used for allocating (and
partially initializing) a private driver struct embedding a struct
drm_bridge.

This driver was missed during the automated conversion in commit
9c399719cfb9 ("drm: convert many bridge drivers from devm_kzalloc() to
devm_drm_bridge_alloc() API") and following commits.

The lack of conversion for this driver is a bug since commit a7748dd127ea
("drm/bridge: get/put the bridge reference in drm_bridge_add/remove()")
which is the first commmit having added a drm_bridge_get/put() pair and
thus exposing the incorrect initial refcount issue.

Fix this by switching the driver to the new API.

Reported-by: Marek Szyprowski <[email protected]>
Closes: 
https://lore.kernel.org/all/[email protected]/
Fixes: a7748dd127ea ("drm/bridge: get/put the bridge reference in 
drm_bridge_add/remove()")
Signed-off-by: Luca Ceresoli <[email protected]>
---
 drivers/gpu/drm/sti/sti_hdmi.c | 26 ++++++++++++--------------
 drivers/gpu/drm/sti/sti_hdmi.h |  2 ++
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index 
37b8d619066ef14a2def26e2e4f90a9c2194238d..4e7c3d78b2b971f8083deae96f3967b44a6499cb
 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -168,6 +168,11 @@ struct sti_hdmi_connector {
 #define to_sti_hdmi_connector(x) \
        container_of(x, struct sti_hdmi_connector, drm_connector)
 
+static struct sti_hdmi *drm_bridge_to_sti_hdmi(struct drm_bridge *bridge)
+{
+       return container_of(bridge, struct sti_hdmi, bridge);
+}
+
 static const struct drm_prop_enum_list colorspace_mode_names[] = {
        { HDMI_COLORSPACE_RGB, "rgb" },
        { HDMI_COLORSPACE_YUV422, "yuv422" },
@@ -749,7 +754,7 @@ static void hdmi_debugfs_init(struct sti_hdmi *hdmi, struct 
drm_minor *minor)
 
 static void sti_hdmi_disable(struct drm_bridge *bridge)
 {
-       struct sti_hdmi *hdmi = bridge->driver_private;
+       struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
 
        u32 val = hdmi_read(hdmi, HDMI_CFG);
 
@@ -881,7 +886,7 @@ static int hdmi_audio_configure(struct sti_hdmi *hdmi)
 
 static void sti_hdmi_pre_enable(struct drm_bridge *bridge)
 {
-       struct sti_hdmi *hdmi = bridge->driver_private;
+       struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
 
        DRM_DEBUG_DRIVER("\n");
 
@@ -936,7 +941,7 @@ static void sti_hdmi_set_mode(struct drm_bridge *bridge,
                              const struct drm_display_mode *mode,
                              const struct drm_display_mode *adjusted_mode)
 {
-       struct sti_hdmi *hdmi = bridge->driver_private;
+       struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
        int ret;
 
        DRM_DEBUG_DRIVER("\n");
@@ -1273,7 +1278,6 @@ static int sti_hdmi_bind(struct device *dev, struct 
device *master, void *data)
        struct sti_hdmi_connector *connector;
        struct cec_connector_info conn_info;
        struct drm_connector *drm_connector;
-       struct drm_bridge *bridge;
        int err;
 
        /* Set the drm device handle */
@@ -1289,13 +1293,7 @@ static int sti_hdmi_bind(struct device *dev, struct 
device *master, void *data)
 
        connector->hdmi = hdmi;
 
-       bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
-       if (!bridge)
-               return -EINVAL;
-
-       bridge->driver_private = hdmi;
-       bridge->funcs = &sti_hdmi_bridge_funcs;
-       drm_bridge_attach(encoder, bridge, NULL, 0);
+       drm_bridge_attach(encoder, &hdmi->bridge, NULL, 0);
 
        connector->encoder = encoder;
 
@@ -1385,9 +1383,9 @@ static int sti_hdmi_probe(struct platform_device *pdev)
 
        DRM_INFO("%s\n", __func__);
 
-       hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
-       if (!hdmi)
-               return -ENOMEM;
+       hdmi = devm_drm_bridge_alloc(dev, struct sti_hdmi, bridge, 
&sti_hdmi_bridge_funcs);
+       if (IS_ERR(hdmi))
+               return PTR_ERR(hdmi);
 
        ddc = of_parse_phandle(pdev->dev.of_node, "ddc", 0);
        if (ddc) {
diff --git a/drivers/gpu/drm/sti/sti_hdmi.h b/drivers/gpu/drm/sti/sti_hdmi.h
index 
6d4c3f57bc46ea7d685682e6635840aaedd94fba..91d43dd46f1393ff182ee19804140897f216a260
 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.h
+++ b/drivers/gpu/drm/sti/sti_hdmi.h
@@ -12,6 +12,7 @@
 
 #include <media/cec-notifier.h>
 
+#include <drm/drm_bridge.h>
 #include <drm/drm_modes.h>
 #include <drm/drm_property.h>
 
@@ -86,6 +87,7 @@ struct sti_hdmi {
        struct hdmi_audio_params audio;
        struct drm_connector *drm_connector;
        struct cec_notifier *notifier;
+       struct drm_bridge bridge;
 };
 
 u32 hdmi_read(struct sti_hdmi *hdmi, int offset);

-- 
2.50.0

Reply via email to