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

drm/bridge/synopsys: dw-hdmi: Use bridge->mode_valid() callback

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

authored by

Jose Abreu and committed by
Archit Taneja
b0febde7 f3ca01d3

+24 -36
+13 -28
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
··· 1907 1907 return ret; 1908 1908 } 1909 1909 1910 - static enum drm_mode_status 1911 - dw_hdmi_connector_mode_valid(struct drm_connector *connector, 1912 - struct drm_display_mode *mode) 1913 - { 1914 - struct dw_hdmi *hdmi = container_of(connector, 1915 - struct dw_hdmi, connector); 1916 - enum drm_mode_status mode_status = MODE_OK; 1917 - 1918 - /* We don't support double-clocked modes */ 1919 - if (mode->flags & DRM_MODE_FLAG_DBLCLK) 1920 - return MODE_BAD; 1921 - 1922 - if (hdmi->plat_data->mode_valid) 1923 - mode_status = hdmi->plat_data->mode_valid(connector, mode); 1924 - 1925 - return mode_status; 1926 - } 1927 - 1928 1910 static void dw_hdmi_connector_force(struct drm_connector *connector) 1929 1911 { 1930 1912 struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, ··· 1932 1950 1933 1951 static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs = { 1934 1952 .get_modes = dw_hdmi_connector_get_modes, 1935 - .mode_valid = dw_hdmi_connector_mode_valid, 1936 1953 .best_encoder = drm_atomic_helper_best_encoder, 1937 1954 }; 1938 1955 ··· 1954 1973 return 0; 1955 1974 } 1956 1975 1957 - static bool dw_hdmi_bridge_mode_fixup(struct drm_bridge *bridge, 1958 - const struct drm_display_mode *orig_mode, 1959 - struct drm_display_mode *mode) 1976 + static enum drm_mode_status 1977 + dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge, 1978 + const struct drm_display_mode *mode) 1960 1979 { 1961 1980 struct dw_hdmi *hdmi = bridge->driver_private; 1962 1981 struct drm_connector *connector = &hdmi->connector; 1963 - enum drm_mode_status status; 1982 + enum drm_mode_status mode_status = MODE_OK; 1964 1983 1965 - status = dw_hdmi_connector_mode_valid(connector, mode); 1966 - if (status != MODE_OK) 1967 - return false; 1968 - return true; 1984 + /* We don't support double-clocked modes */ 1985 + if (mode->flags & DRM_MODE_FLAG_DBLCLK) 1986 + return MODE_BAD; 1987 + 1988 + if (hdmi->plat_data->mode_valid) 1989 + mode_status = hdmi->plat_data->mode_valid(connector, mode); 1990 + 1991 + return mode_status; 1969 1992 } 1970 1993 1971 1994 static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge, ··· 2013 2028 .enable = dw_hdmi_bridge_enable, 2014 2029 .disable = dw_hdmi_bridge_disable, 2015 2030 .mode_set = dw_hdmi_bridge_mode_set, 2016 - .mode_fixup = dw_hdmi_bridge_mode_fixup, 2031 + .mode_valid = dw_hdmi_bridge_mode_valid, 2017 2032 }; 2018 2033 2019 2034 static irqreturn_t dw_hdmi_i2c_irq(struct dw_hdmi *hdmi)
+6 -4
drivers/gpu/drm/imx/dw_hdmi-imx.c
··· 147 147 .destroy = drm_encoder_cleanup, 148 148 }; 149 149 150 - static enum drm_mode_status imx6q_hdmi_mode_valid(struct drm_connector *con, 151 - struct drm_display_mode *mode) 150 + static enum drm_mode_status 151 + imx6q_hdmi_mode_valid(struct drm_connector *con, 152 + const struct drm_display_mode *mode) 152 153 { 153 154 if (mode->clock < 13500) 154 155 return MODE_CLOCK_LOW; ··· 160 159 return MODE_OK; 161 160 } 162 161 163 - static enum drm_mode_status imx6dl_hdmi_mode_valid(struct drm_connector *con, 164 - struct drm_display_mode *mode) 162 + static enum drm_mode_status 163 + imx6dl_hdmi_mode_valid(struct drm_connector *con, 164 + const struct drm_display_mode *mode) 165 165 { 166 166 if (mode->clock < 13500) 167 167 return MODE_CLOCK_LOW;
+3 -2
drivers/gpu/drm/meson/meson_dw_hdmi.c
··· 536 536 } 537 537 538 538 /* TOFIX Enable support for non-vic modes */ 539 - static enum drm_mode_status dw_hdmi_mode_valid(struct drm_connector *connector, 540 - struct drm_display_mode *mode) 539 + static enum drm_mode_status 540 + dw_hdmi_mode_valid(struct drm_connector *connector, 541 + const struct drm_display_mode *mode) 541 542 { 542 543 unsigned int vclk_freq; 543 544 unsigned int venc_freq;
+1 -1
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
··· 155 155 156 156 static enum drm_mode_status 157 157 dw_hdmi_rockchip_mode_valid(struct drm_connector *connector, 158 - struct drm_display_mode *mode) 158 + const struct drm_display_mode *mode) 159 159 { 160 160 const struct dw_hdmi_mpll_config *mpll_cfg = rockchip_mpll_cfg; 161 161 int pclk = mode->clock * 1000;
+1 -1
include/drm/bridge/dw_hdmi.h
··· 125 125 struct dw_hdmi_plat_data { 126 126 struct regmap *regm; 127 127 enum drm_mode_status (*mode_valid)(struct drm_connector *connector, 128 - struct drm_display_mode *mode); 128 + const struct drm_display_mode *mode); 129 129 unsigned long input_bus_format; 130 130 unsigned long input_bus_encoding; 131 131