Skip to content

Commit 719093a

Browse files
lumagrobclark
authored andcommitted
drm/msm/hdmi: switch to devm_drm_bridge_add()
Make MSM HDMI driver use devm_drm_bridge_add() instead of plain drm_bridge_add(). As the driver doesn't require any additional cleanup, stop adding created bridge to the priv->bridges array. Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/561635/ Signed-off-by: Rob Clark <robdclark@chromium.org>
1 parent 5f403fd commit 719093a

4 files changed

Lines changed: 17 additions & 43 deletions

File tree

drivers/gpu/drm/msm/hdmi/hdmi.c

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -160,24 +160,16 @@ static int msm_hdmi_init(struct hdmi *hdmi)
160160
int msm_hdmi_modeset_init(struct hdmi *hdmi,
161161
struct drm_device *dev, struct drm_encoder *encoder)
162162
{
163-
struct msm_drm_private *priv = dev->dev_private;
164163
int ret;
165164

166-
if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) {
167-
DRM_DEV_ERROR(dev->dev, "too many bridges\n");
168-
return -ENOSPC;
169-
}
170-
171165
hdmi->dev = dev;
172166
hdmi->encoder = encoder;
173167

174168
hdmi_audio_infoframe_init(&hdmi->audio.infoframe);
175169

176-
hdmi->bridge = msm_hdmi_bridge_init(hdmi);
177-
if (IS_ERR(hdmi->bridge)) {
178-
ret = PTR_ERR(hdmi->bridge);
170+
ret = msm_hdmi_bridge_init(hdmi);
171+
if (ret) {
179172
DRM_DEV_ERROR(dev->dev, "failed to create HDMI bridge: %d\n", ret);
180-
hdmi->bridge = NULL;
181173
goto fail;
182174
}
183175

@@ -215,16 +207,9 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi,
215207
goto fail;
216208
}
217209

218-
priv->bridges[priv->num_bridges++] = hdmi->bridge;
219-
220210
return 0;
221211

222212
fail:
223-
/* bridge is normally destroyed by drm: */
224-
if (hdmi->bridge) {
225-
msm_hdmi_bridge_destroy(hdmi->bridge);
226-
hdmi->bridge = NULL;
227-
}
228213
if (hdmi->connector) {
229214
hdmi->connector->funcs->destroy(hdmi->connector);
230215
hdmi->connector = NULL;
@@ -395,6 +380,9 @@ static void msm_hdmi_unbind(struct device *dev, struct device *master,
395380
if (priv->hdmi->audio_pdev)
396381
platform_device_unregister(priv->hdmi->audio_pdev);
397382

383+
if (priv->hdmi->bridge)
384+
msm_hdmi_hpd_disable(priv->hdmi);
385+
398386
msm_hdmi_destroy(priv->hdmi);
399387
priv->hdmi = NULL;
400388
}

drivers/gpu/drm/msm/hdmi/hdmi.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,13 @@ void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate);
224224
* hdmi bridge:
225225
*/
226226

227-
struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi);
228-
void msm_hdmi_bridge_destroy(struct drm_bridge *bridge);
227+
int msm_hdmi_bridge_init(struct hdmi *hdmi);
229228

230229
void msm_hdmi_hpd_irq(struct drm_bridge *bridge);
231230
enum drm_connector_status msm_hdmi_bridge_detect(
232231
struct drm_bridge *bridge);
233232
int msm_hdmi_hpd_enable(struct drm_bridge *bridge);
234-
void msm_hdmi_hpd_disable(struct hdmi_bridge *hdmi_bridge);
233+
void msm_hdmi_hpd_disable(struct hdmi *hdmi);
235234

236235
/*
237236
* i2c adapter for ddc:

drivers/gpu/drm/msm/hdmi/hdmi_bridge.c

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,6 @@
1111
#include "msm_kms.h"
1212
#include "hdmi.h"
1313

14-
void msm_hdmi_bridge_destroy(struct drm_bridge *bridge)
15-
{
16-
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
17-
18-
msm_hdmi_hpd_disable(hdmi_bridge);
19-
drm_bridge_remove(bridge);
20-
}
21-
2214
static void msm_hdmi_power_on(struct drm_bridge *bridge)
2315
{
2416
struct drm_device *dev = bridge->dev;
@@ -317,18 +309,16 @@ msm_hdmi_hotplug_work(struct work_struct *work)
317309
}
318310

319311
/* initialize bridge */
320-
struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
312+
int msm_hdmi_bridge_init(struct hdmi *hdmi)
321313
{
322314
struct drm_bridge *bridge = NULL;
323315
struct hdmi_bridge *hdmi_bridge;
324316
int ret;
325317

326318
hdmi_bridge = devm_kzalloc(hdmi->dev->dev,
327319
sizeof(*hdmi_bridge), GFP_KERNEL);
328-
if (!hdmi_bridge) {
329-
ret = -ENOMEM;
330-
goto fail;
331-
}
320+
if (!hdmi_bridge)
321+
return -ENOMEM;
332322

333323
hdmi_bridge->hdmi = hdmi;
334324
INIT_WORK(&hdmi_bridge->hpd_work, msm_hdmi_hotplug_work);
@@ -341,17 +331,15 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
341331
DRM_BRIDGE_OP_DETECT |
342332
DRM_BRIDGE_OP_EDID;
343333

344-
drm_bridge_add(bridge);
334+
ret = devm_drm_bridge_add(&hdmi->pdev->dev, bridge);
335+
if (ret)
336+
return ret;
345337

346338
ret = drm_bridge_attach(hdmi->encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
347339
if (ret)
348-
goto fail;
340+
return ret;
349341

350-
return bridge;
342+
hdmi->bridge = bridge;
351343

352-
fail:
353-
if (bridge)
354-
msm_hdmi_bridge_destroy(bridge);
355-
356-
return ERR_PTR(ret);
344+
return 0;
357345
}

drivers/gpu/drm/msm/hdmi/hdmi_hpd.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,8 @@ int msm_hdmi_hpd_enable(struct drm_bridge *bridge)
147147
return ret;
148148
}
149149

150-
void msm_hdmi_hpd_disable(struct hdmi_bridge *hdmi_bridge)
150+
void msm_hdmi_hpd_disable(struct hdmi *hdmi)
151151
{
152-
struct hdmi *hdmi = hdmi_bridge->hdmi;
153152
const struct hdmi_platform_config *config = hdmi->config;
154153
struct device *dev = &hdmi->pdev->dev;
155154
int ret;

0 commit comments

Comments
 (0)