drm: bridge: Pass drm_display_info to drm_bridge_funcs .mode_valid()
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 26 May 2020 01:14:48 +0000 (04:14 +0300)
committerSam Ravnborg <sam@ravnborg.org>
Tue, 23 Jun 2020 17:53:27 +0000 (19:53 +0200)
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
21 files changed:
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
drivers/gpu/drm/bridge/cdns-dsi.c
drivers/gpu/drm/bridge/chrontel-ch7033.c
drivers/gpu/drm/bridge/nwl-dsi.c
drivers/gpu/drm/bridge/sii9234.c
drivers/gpu/drm/bridge/sil-sii8620.c
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
drivers/gpu/drm/bridge/tc358767.c
drivers/gpu/drm/bridge/tc358768.c
drivers/gpu/drm/bridge/thc63lvd1024.c
drivers/gpu/drm/bridge/ti-tfp410.c
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_bridge.c
drivers/gpu/drm/drm_probe_helper.c
drivers/gpu/drm/i2c/tda998x_drv.c
drivers/gpu/drm/omapdrm/dss/dpi.c
drivers/gpu/drm/omapdrm/dss/sdi.c
drivers/gpu/drm/omapdrm/dss/venc.c
include/drm/drm_bridge.h

index 2bc6e4f85171697a9fb7ff29831eb5316bba05af..371f4a9f866d1cf6a46a567f047e2f66283ddb10 100644 (file)
@@ -585,6 +585,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 anx6345_bridge_mode_valid(struct drm_bridge *bridge,
+                         const struct drm_display_info *info,
                          const struct drm_display_mode *mode)
 {
        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
index 0d5a5ad0c9ee44981327d02f43c2b00c0a5356ea..81debd02c1693a97fc3f6456efe232b60e999fe9 100644 (file)
@@ -944,6 +944,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 anx78xx_bridge_mode_valid(struct drm_bridge *bridge,
+                         const struct drm_display_info *info,
                          const struct drm_display_mode *mode)
 {
        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
index 69c3892caee52e7b1e4661560ffa06080481c7fb..76373e31df92dc444b82733b7b7c6730f27efade 100644 (file)
@@ -663,6 +663,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 cdns_dsi_bridge_mode_valid(struct drm_bridge *bridge,
+                          const struct drm_display_info *info,
                           const struct drm_display_mode *mode)
 {
        struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge);
index f8675d82974bc01692880558563603f2475e8a2b..486f405c2e1648ed50aa72d2bd40887084ce3485 100644 (file)
@@ -317,6 +317,7 @@ static void ch7033_bridge_detach(struct drm_bridge *bridge)
 }
 
 static enum drm_mode_status ch7033_bridge_mode_valid(struct drm_bridge *bridge,
+                                    const struct drm_display_info *info,
                                     const struct drm_display_mode *mode)
 {
        if (mode->clock > 165000)
index b14d725bf609d55c46aa07f42d291c7b9401de20..77a79af709147ea03b3dfc58f571278b31b4444a 100644 (file)
@@ -818,6 +818,7 @@ static bool nwl_dsi_bridge_mode_fixup(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 nwl_dsi_bridge_mode_valid(struct drm_bridge *bridge,
+                         const struct drm_display_info *info,
                          const struct drm_display_mode *mode)
 {
        struct nwl_dsi *dsi = bridge_to_dsi(bridge);
index b1258f0ed20551b85072138bf0ad3c9cb56fd3bc..15c98a7bd81c408a511615f88e0089ff6169027a 100644 (file)
@@ -873,6 +873,7 @@ static inline struct sii9234 *bridge_to_sii9234(struct drm_bridge *bridge)
 }
 
 static enum drm_mode_status sii9234_mode_valid(struct drm_bridge *bridge,
+                                        const struct drm_display_info *info,
                                         const struct drm_display_mode *mode)
 {
        if (mode->clock > MHL1_MAX_CLK)
index 92acd336aa894bd40a435df5a2c77116ccd94455..7c0c93c7e61f2bb8ca224296b8ec0572dd85c15b 100644 (file)
@@ -2244,6 +2244,7 @@ static int sii8620_is_packing_required(struct sii8620 *ctx,
 }
 
 static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge,
+                                        const struct drm_display_info *info,
                                         const struct drm_display_mode *mode)
 {
        struct sii8620 *ctx = bridge_to_sii8620(bridge);
index 30681398cfb0576af7698219aa0ec7693f72ad2f..b535354150db943f450b6dc6c5abaef5204f30ee 100644 (file)
@@ -2767,6 +2767,7 @@ static void dw_hdmi_bridge_detach(struct drm_bridge *bridge)
 
 static enum drm_mode_status
 dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
+                         const struct drm_display_info *info,
                          const struct drm_display_mode *mode)
 {
        struct dw_hdmi *hdmi = bridge->driver_private;
index 5ef0f154aa7bd00f9b67a71e8123e970fae989c5..c223fb9a04cbf2da2a6ccc45ed103c95094ca673 100644 (file)
@@ -924,6 +924,7 @@ static void dw_mipi_dsi_bridge_enable(struct drm_bridge *bridge)
 
 static enum drm_mode_status
 dw_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,
+                             const struct drm_display_info *info,
                              const struct drm_display_mode *mode)
 {
        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
index e4c0ea03ae3a42bb52c90e402196f5e59ac28fe0..c2777b226c7505967002e0660b1dc7fdc4699aa2 100644 (file)
@@ -1306,6 +1306,7 @@ static bool tc_bridge_mode_fixup(struct drm_bridge *bridge,
 }
 
 static enum drm_mode_status tc_mode_valid(struct drm_bridge *bridge,
+                                         const struct drm_display_info *info,
                                          const struct drm_display_mode *mode)
 {
        struct tc_data *tc = bridge_to_tc(bridge);
index 6650fe4cfc20f79585eb1591f3437425dc033d5a..4a463fadf7437d0ad38f788d51447c861c01319d 100644 (file)
@@ -529,6 +529,7 @@ static int tc358768_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 tc358768_bridge_mode_valid(struct drm_bridge *bridge,
+                          const struct drm_display_info *info,
                           const struct drm_display_mode *mode)
 {
        struct tc358768_priv *priv = bridge_to_tc358768(bridge);
index 97d8129760e97fb0b5591d54af8af4f5a8cd37b5..86b06975bfdd43e1892b0c744ba1720cf1937eac 100644 (file)
@@ -51,6 +51,7 @@ static int thc63_attach(struct drm_bridge *bridge,
 }
 
 static enum drm_mode_status thc63_mode_valid(struct drm_bridge *bridge,
+                                       const struct drm_display_info *info,
                                        const struct drm_display_mode *mode)
 {
        struct thc63_dev *thc63 = to_thc63(bridge);
index 6467e6f2f1fa8e83698f71e41bff636adb55b106..ba3fa2a9b8a418d04bb54de4a57414861f0ba68a 100644 (file)
@@ -192,6 +192,7 @@ static void tfp410_disable(struct drm_bridge *bridge)
 }
 
 static enum drm_mode_status tfp410_mode_valid(struct drm_bridge *bridge,
+                                             const struct drm_display_info *info,
                                              const struct drm_display_mode *mode)
 {
        if (mode->clock < 25000)
index a1898c58ae3ccd72e4d50a352510d15b70459f04..f68c69a45752a232ecc79f763617cdca6fd25608 100644 (file)
@@ -506,7 +506,8 @@ static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
        }
 
        bridge = drm_bridge_chain_get_first_bridge(encoder);
-       ret = drm_bridge_chain_mode_valid(bridge, mode);
+       ret = drm_bridge_chain_mode_valid(bridge, &connector->display_info,
+                                         mode);
        if (ret != MODE_OK) {
                DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n");
                return ret;
index fe1e3460b486d7ee45fc30f4e1479d98c1606c07..64f0effb52ac1210dd54da79640c3361da3a825f 100644 (file)
@@ -377,6 +377,7 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
  * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
  *                              encoder chain.
  * @bridge: bridge control structure
+ * @info: display info against which the mode shall be validated
  * @mode: desired mode to be validated
  *
  * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder
@@ -390,6 +391,7 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
  */
 enum drm_mode_status
 drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
+                           const struct drm_display_info *info,
                            const struct drm_display_mode *mode)
 {
        struct drm_encoder *encoder;
@@ -404,7 +406,7 @@ drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
                if (!bridge->funcs->mode_valid)
                        continue;
 
-               ret = bridge->funcs->mode_valid(bridge, mode);
+               ret = bridge->funcs->mode_valid(bridge, info, mode);
                if (ret != MODE_OK)
                        return ret;
        }
index 26e997f1524fc3ade4e6350f50a990f22ed4b583..09e872e61315a87ee868bb3d7d10c7737c45b810 100644 (file)
@@ -114,7 +114,9 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
                }
 
                bridge = drm_bridge_chain_get_first_bridge(encoder);
-               ret = drm_bridge_chain_mode_valid(bridge, mode);
+               ret = drm_bridge_chain_mode_valid(bridge,
+                                                 &connector->display_info,
+                                                 mode);
                if (ret != MODE_OK) {
                        /* There is also no point in continuing for crtc check
                         * here. */
index 9517f522dcb9c20b4dadd6b76451b1e9b7d3829d..50fd119a52763402a608c1782de84c4342954787 100644 (file)
@@ -1379,6 +1379,7 @@ static void tda998x_bridge_detach(struct drm_bridge *bridge)
 }
 
 static enum drm_mode_status tda998x_bridge_mode_valid(struct drm_bridge *bridge,
+                                    const struct drm_display_info *info,
                                     const struct drm_display_mode *mode)
 {
        /* TDA19988 dotclock can go up to 165MHz */
index 5110acb0c6c174136648379db81c4d89f7cf1c49..1d2992daef4097e6e323389866c42809c81ba95e 100644 (file)
@@ -434,6 +434,7 @@ static int dpi_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 dpi_bridge_mode_valid(struct drm_bridge *bridge,
+                      const struct drm_display_info *info,
                       const struct drm_display_mode *mode)
 {
        struct dpi_data *dpi = drm_bridge_to_dpi(bridge);
index 417a8740ad0ac77f85f92c6c58e85ebec511914f..033fd30074b078021f60c64edeae4fbea65931d8 100644 (file)
@@ -140,6 +140,7 @@ static int sdi_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 sdi_bridge_mode_valid(struct drm_bridge *bridge,
+                     const struct drm_display_info *info,
                      const struct drm_display_mode *mode)
 {
        struct sdi_device *sdi = drm_bridge_to_sdi(bridge);
index 9701843ccf09d946c091156f0611811410c465d2..4406ce2a08b4057c9bba570bd83ba5d1449e52ab 100644 (file)
@@ -548,6 +548,7 @@ static int venc_bridge_attach(struct drm_bridge *bridge,
 
 static enum drm_mode_status
 venc_bridge_mode_valid(struct drm_bridge *bridge,
+                      const struct drm_display_info *info,
                       const struct drm_display_mode *mode)
 {
        switch (venc_get_videomode(mode)) {
index ea2aa5ebae3467d4d3d2a030aef206f8bd8b4e18..e3d7f36d8c3926b21c0fd26ef6ea2aa489d4264d 100644 (file)
@@ -35,6 +35,7 @@
 struct drm_bridge;
 struct drm_bridge_timings;
 struct drm_connector;
+struct drm_display_info;
 struct drm_panel;
 struct edid;
 struct i2c_adapter;
@@ -112,6 +113,7 @@ struct drm_bridge_funcs {
         * drm_mode_status Enum
         */
        enum drm_mode_status (*mode_valid)(struct drm_bridge *bridge,
+                                          const struct drm_display_info *info,
                                           const struct drm_display_mode *mode);
 
        /**
@@ -836,6 +838,7 @@ bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
                                 struct drm_display_mode *adjusted_mode);
 enum drm_mode_status
 drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
+                           const struct drm_display_info *info,
                            const struct drm_display_mode *mode);
 void drm_bridge_chain_disable(struct drm_bridge *bridge);
 void drm_bridge_chain_post_disable(struct drm_bridge *bridge);