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

drm/bridge: analogix_dp: Split the platform-specific poweron in two parts

Some of the platform-specific stuff in rockchip_dp_poweron() needs to
happen before the generic code. Some needs to happen after. Let's
split the callback in two.

Specifically we can't start doing PSR work until _after_ the whole
controller is up, so don't set the enable until the end.

Cc: Kristian H. Kristensen <hoegsberg@chromium.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
[seanpaul added exynos change]
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Thierry Escande <thierry.escande@collabora.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180423105003.9004-23-enric.balletbo@collabora.com

authored by

Douglas Anderson and committed by
Andrzej Hajda
7bb3bb4d 6bda8112

+18 -6
+5 -2
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
··· 1260 1260 goto out_dp_clk_pre; 1261 1261 } 1262 1262 1263 - if (dp->plat_data->power_on) 1264 - dp->plat_data->power_on(dp->plat_data); 1263 + if (dp->plat_data->power_on_start) 1264 + dp->plat_data->power_on_start(dp->plat_data); 1265 1265 1266 1266 phy_power_on(dp->phy); 1267 1267 ··· 1285 1285 DRM_ERROR("dp commit error, ret = %d\n", ret); 1286 1286 goto out_dp_init; 1287 1287 } 1288 + 1289 + if (dp->plat_data->power_on_end) 1290 + dp->plat_data->power_on_end(dp->plat_data); 1288 1291 1289 1292 enable_irq(dp->irq); 1290 1293 return 0;
+1 -1
drivers/gpu/drm/exynos/exynos_dp.c
··· 162 162 dp->drm_dev = drm_dev; 163 163 164 164 dp->plat_data.dev_type = EXYNOS_DP; 165 - dp->plat_data.power_on = exynos_dp_poweron; 165 + dp->plat_data.power_on_start = exynos_dp_poweron; 166 166 dp->plat_data.power_off = exynos_dp_poweroff; 167 167 dp->plat_data.attach = exynos_dp_bridge_attach; 168 168 dp->plat_data.get_modes = exynos_dp_get_modes;
+10 -2
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
··· 109 109 return 0; 110 110 } 111 111 112 - static int rockchip_dp_poweron(struct analogix_dp_plat_data *plat_data) 112 + static int rockchip_dp_poweron_start(struct analogix_dp_plat_data *plat_data) 113 113 { 114 114 struct rockchip_dp_device *dp = to_dp(plat_data); 115 115 int ret; ··· 126 126 clk_disable_unprepare(dp->pclk); 127 127 return ret; 128 128 } 129 + 130 + return ret; 131 + } 132 + 133 + static int rockchip_dp_poweron_end(struct analogix_dp_plat_data *plat_data) 134 + { 135 + struct rockchip_dp_device *dp = to_dp(plat_data); 129 136 130 137 return rockchip_drm_psr_activate(&dp->encoder); 131 138 } ··· 337 330 dp->plat_data.encoder = &dp->encoder; 338 331 339 332 dp->plat_data.dev_type = dp->data->chip_type; 340 - dp->plat_data.power_on = rockchip_dp_poweron; 333 + dp->plat_data.power_on_start = rockchip_dp_poweron_start; 334 + dp->plat_data.power_on_end = rockchip_dp_poweron_end; 341 335 dp->plat_data.power_off = rockchip_dp_powerdown; 342 336 dp->plat_data.get_modes = rockchip_dp_get_modes; 343 337
+2 -1
include/drm/bridge/analogix_dp.h
··· 33 33 struct drm_connector *connector; 34 34 bool skip_connector; 35 35 36 - int (*power_on)(struct analogix_dp_plat_data *); 36 + int (*power_on_start)(struct analogix_dp_plat_data *); 37 + int (*power_on_end)(struct analogix_dp_plat_data *); 37 38 int (*power_off)(struct analogix_dp_plat_data *); 38 39 int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *, 39 40 struct drm_connector *);