Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: bridge: Pass drm_display_info to drm_bridge_funcs .mode_valid()

When validating a mode, bridges may need to do so in the context of a
display, as specified by drm_display_info. An example is the meson
dw-hdmi bridge that needs to consider the YUV 4:2:0 output format to
perform clock calculations.

Bridges that need the display info currently retrieve it from the
drm_connector created by the bridge. This gets in the way of moving
connector creation out of bridge drivers. To make this possible, pass
the drm_display_info to drm_bridge_funcs .mode_valid().

Changes to the bridge drivers have been performed with the following
coccinelle semantic patch and have been compile-tested.

@ rule1 @
identifier funcs;
identifier fn;
@@
struct drm_bridge_funcs funcs = {
...,
.mode_valid = fn
};

@ depends on rule1 @
identifier rule1.fn;
identifier bridge;
identifier mode;
@@
enum drm_mode_status fn(
struct drm_bridge *bridge,
+ const struct drm_display_info *info,
const struct drm_display_mode *mode
)
{
...
}

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Guido Günther <agx@sigxcpu.org> # for the nwl-dsi part:
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-11-laurent.pinchart+renesas@ideasonboard.com

authored by

Laurent Pinchart and committed by
Sam Ravnborg
12c683e1 192a3aa0

+28 -3
+1
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
··· 585 585 586 586 static enum drm_mode_status 587 587 anx6345_bridge_mode_valid(struct drm_bridge *bridge, 588 + const struct drm_display_info *info, 588 589 const struct drm_display_mode *mode) 589 590 { 590 591 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+1
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
··· 944 944 945 945 static enum drm_mode_status 946 946 anx78xx_bridge_mode_valid(struct drm_bridge *bridge, 947 + const struct drm_display_info *info, 947 948 const struct drm_display_mode *mode) 948 949 { 949 950 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+1
drivers/gpu/drm/bridge/cdns-dsi.c
··· 663 663 664 664 static enum drm_mode_status 665 665 cdns_dsi_bridge_mode_valid(struct drm_bridge *bridge, 666 + const struct drm_display_info *info, 666 667 const struct drm_display_mode *mode) 667 668 { 668 669 struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge);
+1
drivers/gpu/drm/bridge/chrontel-ch7033.c
··· 317 317 } 318 318 319 319 static enum drm_mode_status ch7033_bridge_mode_valid(struct drm_bridge *bridge, 320 + const struct drm_display_info *info, 320 321 const struct drm_display_mode *mode) 321 322 { 322 323 if (mode->clock > 165000)
+1
drivers/gpu/drm/bridge/nwl-dsi.c
··· 818 818 819 819 static enum drm_mode_status 820 820 nwl_dsi_bridge_mode_valid(struct drm_bridge *bridge, 821 + const struct drm_display_info *info, 821 822 const struct drm_display_mode *mode) 822 823 { 823 824 struct nwl_dsi *dsi = bridge_to_dsi(bridge);
+1
drivers/gpu/drm/bridge/sii9234.c
··· 873 873 } 874 874 875 875 static enum drm_mode_status sii9234_mode_valid(struct drm_bridge *bridge, 876 + const struct drm_display_info *info, 876 877 const struct drm_display_mode *mode) 877 878 { 878 879 if (mode->clock > MHL1_MAX_CLK)
+1
drivers/gpu/drm/bridge/sil-sii8620.c
··· 2244 2244 } 2245 2245 2246 2246 static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge, 2247 + const struct drm_display_info *info, 2247 2248 const struct drm_display_mode *mode) 2248 2249 { 2249 2250 struct sii8620 *ctx = bridge_to_sii8620(bridge);
+1
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
··· 2767 2767 2768 2768 static enum drm_mode_status 2769 2769 dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge, 2770 + const struct drm_display_info *info, 2770 2771 const struct drm_display_mode *mode) 2771 2772 { 2772 2773 struct dw_hdmi *hdmi = bridge->driver_private;
+1
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
··· 924 924 925 925 static enum drm_mode_status 926 926 dw_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge, 927 + const struct drm_display_info *info, 927 928 const struct drm_display_mode *mode) 928 929 { 929 930 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
+1
drivers/gpu/drm/bridge/tc358767.c
··· 1306 1306 } 1307 1307 1308 1308 static enum drm_mode_status tc_mode_valid(struct drm_bridge *bridge, 1309 + const struct drm_display_info *info, 1309 1310 const struct drm_display_mode *mode) 1310 1311 { 1311 1312 struct tc_data *tc = bridge_to_tc(bridge);
+1
drivers/gpu/drm/bridge/tc358768.c
··· 529 529 530 530 static enum drm_mode_status 531 531 tc358768_bridge_mode_valid(struct drm_bridge *bridge, 532 + const struct drm_display_info *info, 532 533 const struct drm_display_mode *mode) 533 534 { 534 535 struct tc358768_priv *priv = bridge_to_tc358768(bridge);
+1
drivers/gpu/drm/bridge/thc63lvd1024.c
··· 51 51 } 52 52 53 53 static enum drm_mode_status thc63_mode_valid(struct drm_bridge *bridge, 54 + const struct drm_display_info *info, 54 55 const struct drm_display_mode *mode) 55 56 { 56 57 struct thc63_dev *thc63 = to_thc63(bridge);
+1
drivers/gpu/drm/bridge/ti-tfp410.c
··· 192 192 } 193 193 194 194 static enum drm_mode_status tfp410_mode_valid(struct drm_bridge *bridge, 195 + const struct drm_display_info *info, 195 196 const struct drm_display_mode *mode) 196 197 { 197 198 if (mode->clock < 25000)
+2 -1
drivers/gpu/drm/drm_atomic_helper.c
··· 506 506 } 507 507 508 508 bridge = drm_bridge_chain_get_first_bridge(encoder); 509 - ret = drm_bridge_chain_mode_valid(bridge, mode); 509 + ret = drm_bridge_chain_mode_valid(bridge, &connector->display_info, 510 + mode); 510 511 if (ret != MODE_OK) { 511 512 DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n"); 512 513 return ret;
+3 -1
drivers/gpu/drm/drm_bridge.c
··· 377 377 * drm_bridge_chain_mode_valid - validate the mode against all bridges in the 378 378 * encoder chain. 379 379 * @bridge: bridge control structure 380 + * @info: display info against which the mode shall be validated 380 381 * @mode: desired mode to be validated 381 382 * 382 383 * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder ··· 391 390 */ 392 391 enum drm_mode_status 393 392 drm_bridge_chain_mode_valid(struct drm_bridge *bridge, 393 + const struct drm_display_info *info, 394 394 const struct drm_display_mode *mode) 395 395 { 396 396 struct drm_encoder *encoder; ··· 406 404 if (!bridge->funcs->mode_valid) 407 405 continue; 408 406 409 - ret = bridge->funcs->mode_valid(bridge, mode); 407 + ret = bridge->funcs->mode_valid(bridge, info, mode); 410 408 if (ret != MODE_OK) 411 409 return ret; 412 410 }
+3 -1
drivers/gpu/drm/drm_probe_helper.c
··· 114 114 } 115 115 116 116 bridge = drm_bridge_chain_get_first_bridge(encoder); 117 - ret = drm_bridge_chain_mode_valid(bridge, mode); 117 + ret = drm_bridge_chain_mode_valid(bridge, 118 + &connector->display_info, 119 + mode); 118 120 if (ret != MODE_OK) { 119 121 /* There is also no point in continuing for crtc check 120 122 * here. */
+1
drivers/gpu/drm/i2c/tda998x_drv.c
··· 1379 1379 } 1380 1380 1381 1381 static enum drm_mode_status tda998x_bridge_mode_valid(struct drm_bridge *bridge, 1382 + const struct drm_display_info *info, 1382 1383 const struct drm_display_mode *mode) 1383 1384 { 1384 1385 /* TDA19988 dotclock can go up to 165MHz */
+1
drivers/gpu/drm/omapdrm/dss/dpi.c
··· 434 434 435 435 static enum drm_mode_status 436 436 dpi_bridge_mode_valid(struct drm_bridge *bridge, 437 + const struct drm_display_info *info, 437 438 const struct drm_display_mode *mode) 438 439 { 439 440 struct dpi_data *dpi = drm_bridge_to_dpi(bridge);
+1
drivers/gpu/drm/omapdrm/dss/sdi.c
··· 140 140 141 141 static enum drm_mode_status 142 142 sdi_bridge_mode_valid(struct drm_bridge *bridge, 143 + const struct drm_display_info *info, 143 144 const struct drm_display_mode *mode) 144 145 { 145 146 struct sdi_device *sdi = drm_bridge_to_sdi(bridge);
+1
drivers/gpu/drm/omapdrm/dss/venc.c
··· 548 548 549 549 static enum drm_mode_status 550 550 venc_bridge_mode_valid(struct drm_bridge *bridge, 551 + const struct drm_display_info *info, 551 552 const struct drm_display_mode *mode) 552 553 { 553 554 switch (venc_get_videomode(mode)) {
+3
include/drm/drm_bridge.h
··· 35 35 struct drm_bridge; 36 36 struct drm_bridge_timings; 37 37 struct drm_connector; 38 + struct drm_display_info; 38 39 struct drm_panel; 39 40 struct edid; 40 41 struct i2c_adapter; ··· 113 112 * drm_mode_status Enum 114 113 */ 115 114 enum drm_mode_status (*mode_valid)(struct drm_bridge *bridge, 115 + const struct drm_display_info *info, 116 116 const struct drm_display_mode *mode); 117 117 118 118 /** ··· 838 836 struct drm_display_mode *adjusted_mode); 839 837 enum drm_mode_status 840 838 drm_bridge_chain_mode_valid(struct drm_bridge *bridge, 839 + const struct drm_display_info *info, 841 840 const struct drm_display_mode *mode); 842 841 void drm_bridge_chain_disable(struct drm_bridge *bridge); 843 842 void drm_bridge_chain_post_disable(struct drm_bridge *bridge);