Skip to content

Commit 9b565ed

Browse files
committed
drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
LVDS support in MDP4 driver makes use of drm_connector directly. However LCDC encoder and LVDS connector are wrappers around drm_panel. Switch them to use drm_panel_bridge/drm_bridge_connector. This allows using standard interface for the drm_panel and also inserting additional bridges between encoder and panel. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/650290/ Link: https://lore.kernel.org/r/20250425-fd-mdp4-lvds-v4-6-6b212160b44c@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
1 parent f26b803 commit 9b565ed

File tree

5 files changed

+28
-133
lines changed

5 files changed

+28
-133
lines changed

drivers/gpu/drm/msm/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ msm-display-$(CONFIG_DRM_MSM_MDP4) += \
4848
disp/mdp4/mdp4_dsi_encoder.o \
4949
disp/mdp4/mdp4_dtv_encoder.o \
5050
disp/mdp4/mdp4_lcdc_encoder.o \
51-
disp/mdp4/mdp4_lvds_connector.o \
5251
disp/mdp4/mdp4_lvds_pll.o \
5352
disp/mdp4/mdp4_irq.o \
5453
disp/mdp4/mdp4_kms.o \

drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include <linux/delay.h>
88

9+
#include <drm/drm_bridge.h>
10+
#include <drm/drm_bridge_connector.h>
911
#include <drm/drm_vblank.h>
1012

1113
#include "msm_drv.h"
@@ -189,7 +191,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
189191
struct msm_drm_private *priv = dev->dev_private;
190192
struct drm_encoder *encoder;
191193
struct drm_connector *connector;
192-
struct device_node *panel_node;
194+
struct drm_bridge *next_bridge;
193195
int dsi_id;
194196
int ret;
195197

@@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
199201
* bail out early if there is no panel node (no need to
200202
* initialize LCDC encoder and LVDS connector)
201203
*/
202-
panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
203-
if (!panel_node)
204-
return 0;
204+
next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
205+
if (IS_ERR(next_bridge)) {
206+
ret = PTR_ERR(next_bridge);
207+
if (ret == -ENODEV)
208+
return 0;
209+
return ret;
210+
}
205211

206-
encoder = mdp4_lcdc_encoder_init(dev, panel_node);
212+
encoder = mdp4_lcdc_encoder_init(dev);
207213
if (IS_ERR(encoder)) {
208214
DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
209-
of_node_put(panel_node);
210215
return PTR_ERR(encoder);
211216
}
212217

213218
/* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
214219
encoder->possible_crtcs = 1 << DMA_P;
215220

216-
connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
221+
ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
222+
if (ret) {
223+
DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
224+
225+
return ret;
226+
}
227+
228+
connector = drm_bridge_connector_init(dev, encoder);
217229
if (IS_ERR(connector)) {
218230
DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
219-
of_node_put(panel_node);
220231
return PTR_ERR(connector);
221232
}
222233

234+
ret = drm_connector_attach_encoder(connector, encoder);
235+
if (ret) {
236+
DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
237+
238+
return ret;
239+
}
240+
223241
break;
224242
case DRM_MODE_ENCODER_TMDS:
225243
encoder = mdp4_dtv_encoder_init(dev);

drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,7 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev,
191191
long mdp4_dtv_round_pixclk(struct drm_encoder *encoder, unsigned long rate);
192192
struct drm_encoder *mdp4_dtv_encoder_init(struct drm_device *dev);
193193

194-
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
195-
struct device_node *panel_node);
196-
197-
struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
198-
struct device_node *panel_node, struct drm_encoder *encoder);
194+
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev);
199195

200196
#ifdef CONFIG_DRM_MSM_DSI
201197
struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev);

drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
struct mdp4_lcdc_encoder {
1616
struct drm_encoder base;
17-
struct device_node *panel_node;
1817
struct drm_panel *panel;
1918
struct clk *lcdc_clk;
2019
unsigned long int pixclock;
@@ -262,19 +261,12 @@ static void mdp4_lcdc_encoder_disable(struct drm_encoder *encoder)
262261
struct mdp4_lcdc_encoder *mdp4_lcdc_encoder =
263262
to_mdp4_lcdc_encoder(encoder);
264263
struct mdp4_kms *mdp4_kms = get_kms(encoder);
265-
struct drm_panel *panel;
266264

267265
if (WARN_ON(!mdp4_lcdc_encoder->enabled))
268266
return;
269267

270268
mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 0);
271269

272-
panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
273-
if (!IS_ERR(panel)) {
274-
drm_panel_disable(panel);
275-
drm_panel_unprepare(panel);
276-
}
277-
278270
/*
279271
* Wait for a vsync so we know the ENABLE=0 latched before
280272
* the (connector) source of the vsync's gets disabled,
@@ -300,7 +292,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
300292
to_mdp4_lcdc_encoder(encoder);
301293
unsigned long pc = mdp4_lcdc_encoder->pixclock;
302294
struct mdp4_kms *mdp4_kms = get_kms(encoder);
303-
struct drm_panel *panel;
304295
uint32_t config;
305296
int ret;
306297

@@ -335,12 +326,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
335326
if (ret)
336327
DRM_DEV_ERROR(dev->dev, "failed to enable lcdc_clk: %d\n", ret);
337328

338-
panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
339-
if (!IS_ERR(panel)) {
340-
drm_panel_prepare(panel);
341-
drm_panel_enable(panel);
342-
}
343-
344329
setup_phy(encoder);
345330

346331
mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 1);
@@ -375,8 +360,7 @@ static const struct drm_encoder_helper_funcs mdp4_lcdc_encoder_helper_funcs = {
375360
};
376361

377362
/* initialize encoder */
378-
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
379-
struct device_node *panel_node)
363+
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev)
380364
{
381365
struct drm_encoder *encoder;
382366
struct mdp4_lcdc_encoder *mdp4_lcdc_encoder;
@@ -387,8 +371,6 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
387371
if (IS_ERR(mdp4_lcdc_encoder))
388372
return ERR_CAST(mdp4_lcdc_encoder);
389373

390-
mdp4_lcdc_encoder->panel_node = panel_node;
391-
392374
encoder = &mdp4_lcdc_encoder->base;
393375

394376
drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);

drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c

Lines changed: 0 additions & 100 deletions
This file was deleted.

0 commit comments

Comments
 (0)