]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
drm/bridge/synopsys: dw-hdmi: Use bridge->mode_valid() callback
authorJose Abreu <Jose.Abreu@synopsys.com>
Thu, 25 May 2017 14:19:19 +0000 (15:19 +0100)
committerArchit Taneja <architt@codeaurora.org>
Mon, 5 Jun 2017 06:39:50 +0000 (12:09 +0530)
Now that we have a callback to check if bridge supports a given mode
we can use it in Synopsys Designware HDMI bridge so that we restrict
the number of probbed modes to the ones we can actually display.

Also, there is no need to use mode_fixup() callback as mode_valid()
will handle the mode validation.

NOTE: I also had to change the pdata declaration of mode_valid
custom callback so that the passed modes are const. I also changed
in the platforms I found. Not even compiled it though.

Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Carlos Palminha <palminha@synopsys.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Archit Taneja <architt@codeaurora.org>
Cc: Andrzej Hajda <a.hajda@samsung.com>
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Carlo Caione <carlo@caione.org>
Cc: Kevin Hilman <khilman@baylibre.com>
Cc: Mark Yao <mark.yao@rock-chips.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Link: http://patchwork.freedesktop.org/patch/msgid/3d8d449e4d13d2535fa292c75f5fa931de4a4fa8.1495720737.git.joabreu@synopsys.com
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/imx/dw_hdmi-imx.c
drivers/gpu/drm/meson/meson_dw_hdmi.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
include/drm/bridge/dw_hdmi.h

index 8737de8c1c52163165d7da32da96e00a66c6fce1..ead11242c4b91e2fd0f2c2da7a68ff0e72025b3c 100644 (file)
@@ -1907,24 +1907,6 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
        return ret;
 }
 
-static enum drm_mode_status
-dw_hdmi_connector_mode_valid(struct drm_connector *connector,
-                            struct drm_display_mode *mode)
-{
-       struct dw_hdmi *hdmi = container_of(connector,
-                                          struct dw_hdmi, connector);
-       enum drm_mode_status mode_status = MODE_OK;
-
-       /* We don't support double-clocked modes */
-       if (mode->flags & DRM_MODE_FLAG_DBLCLK)
-               return MODE_BAD;
-
-       if (hdmi->plat_data->mode_valid)
-               mode_status = hdmi->plat_data->mode_valid(connector, mode);
-
-       return mode_status;
-}
-
 static void dw_hdmi_connector_force(struct drm_connector *connector)
 {
        struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
@@ -1950,7 +1932,6 @@ static const struct drm_connector_funcs dw_hdmi_connector_funcs = {
 
 static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs = {
        .get_modes = dw_hdmi_connector_get_modes,
-       .mode_valid = dw_hdmi_connector_mode_valid,
        .best_encoder = drm_atomic_helper_best_encoder,
 };
 
@@ -1973,18 +1954,22 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
        return 0;
 }
 
-static bool dw_hdmi_bridge_mode_fixup(struct drm_bridge *bridge,
-                                     const struct drm_display_mode *orig_mode,
-                                     struct drm_display_mode *mode)
+static enum drm_mode_status
+dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
+                         const struct drm_display_mode *mode)
 {
        struct dw_hdmi *hdmi = bridge->driver_private;
        struct drm_connector *connector = &hdmi->connector;
-       enum drm_mode_status status;
+       enum drm_mode_status mode_status = MODE_OK;
 
-       status = dw_hdmi_connector_mode_valid(connector, mode);
-       if (status != MODE_OK)
-               return false;
-       return true;
+       /* We don't support double-clocked modes */
+       if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+               return MODE_BAD;
+
+       if (hdmi->plat_data->mode_valid)
+               mode_status = hdmi->plat_data->mode_valid(connector, mode);
+
+       return mode_status;
 }
 
 static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
@@ -2028,7 +2013,7 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
        .enable = dw_hdmi_bridge_enable,
        .disable = dw_hdmi_bridge_disable,
        .mode_set = dw_hdmi_bridge_mode_set,
-       .mode_fixup = dw_hdmi_bridge_mode_fixup,
+       .mode_valid = dw_hdmi_bridge_mode_valid,
 };
 
 static irqreturn_t dw_hdmi_i2c_irq(struct dw_hdmi *hdmi)
index f039641070ac03c7cebe743cdd467af09b1edfc6..b62763aa87069fb3eccb9787dfe73f6ae33a45e2 100644 (file)
@@ -147,8 +147,9 @@ static const struct drm_encoder_funcs dw_hdmi_imx_encoder_funcs = {
        .destroy = drm_encoder_cleanup,
 };
 
-static enum drm_mode_status imx6q_hdmi_mode_valid(struct drm_connector *con,
-                                                 struct drm_display_mode *mode)
+static enum drm_mode_status
+imx6q_hdmi_mode_valid(struct drm_connector *con,
+                     const struct drm_display_mode *mode)
 {
        if (mode->clock < 13500)
                return MODE_CLOCK_LOW;
@@ -159,8 +160,9 @@ static enum drm_mode_status imx6q_hdmi_mode_valid(struct drm_connector *con,
        return MODE_OK;
 }
 
-static enum drm_mode_status imx6dl_hdmi_mode_valid(struct drm_connector *con,
-                                                  struct drm_display_mode *mode)
+static enum drm_mode_status
+imx6dl_hdmi_mode_valid(struct drm_connector *con,
+                      const struct drm_display_mode *mode)
 {
        if (mode->clock < 13500)
                return MODE_CLOCK_LOW;
index 7b86eb7776b3e4b0bb62b5f1363aaded17371ce1..cef414466f9fed4256cd22cdca30e5fa8cc3f737 100644 (file)
@@ -536,8 +536,9 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
 }
 
 /* TOFIX Enable support for non-vic modes */
-static enum drm_mode_status dw_hdmi_mode_valid(struct drm_connector *connector,
-                                              struct drm_display_mode *mode)
+static enum drm_mode_status
+dw_hdmi_mode_valid(struct drm_connector *connector,
+                  const struct drm_display_mode *mode)
 {
        unsigned int vclk_freq;
        unsigned int venc_freq;
index 63dab6f1b1911bb9293099fbb40f85082060d8ab..f8208489724e02d7953660b27a2247a06a817996 100644 (file)
@@ -155,7 +155,7 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
 
 static enum drm_mode_status
 dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
-                           struct drm_display_mode *mode)
+                           const struct drm_display_mode *mode)
 {
        const struct dw_hdmi_mpll_config *mpll_cfg = rockchip_mpll_cfg;
        int pclk = mode->clock * 1000;
index ed599bea3f6ccb9b63439d073f4adf9d06f941f4..4c8d4c81a0e8f3e818014e97d917e0fed5eb75a3 100644 (file)
@@ -125,7 +125,7 @@ struct dw_hdmi_phy_ops {
 struct dw_hdmi_plat_data {
        struct regmap *regm;
        enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
-                                          struct drm_display_mode *mode);
+                                          const struct drm_display_mode *mode);
        unsigned long input_bus_format;
        unsigned long input_bus_encoding;