From 379474682f9fdd191e6ef59bb9f8fdedccb0470b Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Fri, 30 Sep 2022 01:46:16 +0000 Subject: [PATCH] drm/rockchip: Add return value to .loader_protect() Callback loader_protect() maybe failed. Signed-off-by: Wyon Bi Change-Id: Icb9a25701929c79b94c9a63568a408913e49f87c --- .../drm/bridge/analogix/analogix_dp_core.c | 14 ++++++++++-- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 22 ++++++++++++++----- drivers/gpu/drm/rockchip/dw-dp.c | 4 +++- .../gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 4 +++- .../gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c | 4 +++- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 6 +++-- drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_logo.c | 12 ++++++++-- drivers/gpu/drm/rockchip/rockchip_lvds.c | 6 +++-- drivers/gpu/drm/rockchip/rockchip_rgb.c | 8 ++++--- include/drm/bridge/analogix_dp.h | 1 + 11 files changed, 62 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 33e3787bcf2a..592efc5318dd 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1714,6 +1714,12 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge) dp->dpms_mode = DRM_MODE_DPMS_OFF; } +void analogix_dp_disable(struct analogix_dp_device *dp) +{ + analogix_dp_bridge_disable(&dp->bridge); +} +EXPORT_SYMBOL_GPL(analogix_dp_disable); + static void analogix_dp_bridge_atomic_disable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) @@ -2105,15 +2111,19 @@ int analogix_dp_loader_protect(struct analogix_dp_device *dp) ret = analogix_dp_fast_link_train_detection(dp); if (ret) - return ret; + goto err_disable; if (analogix_dp_detect_sink_psr(dp)) { ret = analogix_dp_enable_sink_psr(dp); if (ret) - return ret; + goto err_disable; } return 0; + +err_disable: + analogix_dp_disable(dp); + return ret; } EXPORT_SYMBOL_GPL(analogix_dp_loader_protect); diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 325ddd1fb21a..3d489d9609f2 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -232,25 +232,35 @@ static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data, return 0; } -static void rockchip_dp_loader_protect(struct drm_encoder *encoder, bool on) +static int rockchip_dp_loader_protect(struct drm_encoder *encoder, bool on) { struct rockchip_dp_device *dp = to_dp(encoder); struct analogix_dp_plat_data *plat_data = &dp->plat_data; + struct rockchip_dp_device *secondary = NULL; + int ret; if (plat_data->right) { - struct rockchip_dp_device *secondary = - rockchip_dp_find_by_id(dp->dev->driver, !dp->id); + secondary = rockchip_dp_find_by_id(dp->dev->driver, !dp->id); - rockchip_dp_loader_protect(&secondary->encoder, on); + ret = rockchip_dp_loader_protect(&secondary->encoder, on); + if (ret) + return ret; } if (!on) - return; + return 0; if (plat_data->panel) panel_simple_loader_protect(plat_data->panel); - analogix_dp_loader_protect(dp->adp); + ret = analogix_dp_loader_protect(dp->adp); + if (ret) { + if (secondary) + analogix_dp_disable(secondary->adp); + return ret; + } + + return 0; } static bool rockchip_dp_skip_connector(struct drm_bridge *bridge) diff --git a/drivers/gpu/drm/rockchip/dw-dp.c b/drivers/gpu/drm/rockchip/dw-dp.c index 37fb38b908cb..b0f2c05f4c83 100644 --- a/drivers/gpu/drm/rockchip/dw-dp.c +++ b/drivers/gpu/drm/rockchip/dw-dp.c @@ -2106,13 +2106,15 @@ static void _dw_dp_loader_protect(struct dw_dp *dp, bool on) } } -static void dw_dp_loader_protect(struct drm_encoder *encoder, bool on) +static int dw_dp_loader_protect(struct drm_encoder *encoder, bool on) { struct dw_dp *dp = encoder_to_dp(encoder); _dw_dp_loader_protect(dp, on); if (dp->right) _dw_dp_loader_protect(dp->right, on); + + return 0; } static int dw_dp_connector_init(struct dw_dp *dp) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c index a052e6228f84..6922f56d1fad 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c @@ -830,7 +830,7 @@ static void dw_mipi_dsi_rockchip_loader_protect(struct dw_mipi_dsi_rockchip *dsi dw_mipi_dsi_rockchip_loader_protect(dsi->slave, on); } -static void dw_mipi_dsi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, +static int dw_mipi_dsi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, bool on) { struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder); @@ -839,6 +839,8 @@ static void dw_mipi_dsi_rockchip_encoder_loader_protect(struct drm_encoder *enco panel_simple_loader_protect(dsi->panel); dw_mipi_dsi_rockchip_loader_protect(dsi, on); + + return 0; } static const struct drm_encoder_helper_funcs diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c index ff36a8aeb907..f55a3a5c5c7c 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c @@ -962,7 +962,7 @@ static void dw_mipi_dsi2_loader_protect(struct dw_mipi_dsi2 *dsi2, bool on) dw_mipi_dsi2_loader_protect(dsi2->slave, on); } -static void dw_mipi_dsi2_encoder_loader_protect(struct drm_encoder *encoder, +static int dw_mipi_dsi2_encoder_loader_protect(struct drm_encoder *encoder, bool on) { struct dw_mipi_dsi2 *dsi2 = encoder_to_dsi2(encoder); @@ -971,6 +971,8 @@ static void dw_mipi_dsi2_encoder_loader_protect(struct drm_encoder *encoder, panel_simple_loader_protect(dsi2->panel); dw_mipi_dsi2_loader_protect(dsi2, on); + + return 0; } static const struct drm_encoder_helper_funcs diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 31eebd779955..d1af980127b1 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -1573,7 +1573,7 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) ret ? "LIT" : "BIG"); } -static void dw_hdmi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, +static int dw_hdmi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, bool on) { struct rockchip_hdmi *hdmi = to_rockchip_hdmi(encoder); @@ -1584,7 +1584,7 @@ static void dw_hdmi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, ret = clk_prepare_enable(hdmi->link_clk); if (ret < 0) { DRM_DEV_ERROR(hdmi->dev, "failed to enable link_clk %d\n", ret); - return; + return ret; } } @@ -1593,6 +1593,8 @@ static void dw_hdmi_rockchip_encoder_loader_protect(struct drm_encoder *encoder, clk_disable_unprepare(hdmi->link_clk); hdmi->phy->power_count--; } + + return 0; } static void rk3588_set_link_mode(struct rockchip_hdmi *hdmi) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 424273d61ae4..434d3c93271b 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -90,7 +90,7 @@ struct rockchip_drm_sub_dev { struct list_head list; struct drm_connector *connector; struct device_node *of_node; - void (*loader_protect)(struct drm_encoder *encoder, bool on); + int (*loader_protect)(struct drm_encoder *encoder, bool on); void (*oob_hotplug_event)(struct drm_connector *connector); void (*update_vfp_for_vrr)(struct drm_connector *connector, struct drm_display_mode *mode, int vfp); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c index eae4605aa2c7..d0fcbb5c47a4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c @@ -657,8 +657,16 @@ static int setup_initial_state(struct drm_device *drm_dev, else conn_state->best_encoder = rockchip_drm_connector_get_single_encoder(connector); - if (set->sub_dev->loader_protect) - set->sub_dev->loader_protect(conn_state->best_encoder, true); + if (set->sub_dev->loader_protect) { + ret = set->sub_dev->loader_protect(conn_state->best_encoder, true); + if (ret) { + dev_err(drm_dev->dev, + "connector[%s] loader protect failed\n", + connector->name); + return ret; + } + } + num_modes = rockchip_drm_fill_connector_modes(connector, 7680, 7680, set->force_output); if (!num_modes) { dev_err(drm_dev->dev, "connector[%s] can't found any modes\n", diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index ca2838db89eb..ce4b3a251146 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -318,13 +318,15 @@ static void rockchip_lvds_encoder_disable(struct drm_encoder *encoder) drm_panel_unprepare(lvds->panel); } -static void rockchip_lvds_encoder_loader_protect(struct drm_encoder *encoder, - bool on) +static int rockchip_lvds_encoder_loader_protect(struct drm_encoder *encoder, + bool on) { struct rockchip_lvds *lvds = encoder_to_lvds(encoder); if (lvds->panel) panel_simple_loader_protect(lvds->panel); + + return 0; } static const diff --git a/drivers/gpu/drm/rockchip/rockchip_rgb.c b/drivers/gpu/drm/rockchip/rockchip_rgb.c index 972cbc8a6708..c6ca9596ca1f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_rgb.c +++ b/drivers/gpu/drm/rockchip/rockchip_rgb.c @@ -308,8 +308,8 @@ rockchip_rgb_encoder_atomic_check(struct drm_encoder *encoder, return 0; } -static void rockchip_rgb_encoder_loader_protect(struct drm_encoder *encoder, - bool on) +static int rockchip_rgb_encoder_loader_protect(struct drm_encoder *encoder, + bool on) { struct rockchip_rgb *rgb = encoder_to_rgb(encoder); @@ -319,11 +319,13 @@ static void rockchip_rgb_encoder_loader_protect(struct drm_encoder *encoder, mcu_panel->prepared = true; mcu_panel->enabled = true; - return; + return 0; } if (rgb->panel) panel_simple_loader_protect(rgb->panel); + + return 0; } static enum drm_mode_status diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h index bc5e8edf8d7d..e912503a9149 100644 --- a/include/drm/bridge/analogix_dp.h +++ b/include/drm/bridge/analogix_dp.h @@ -80,5 +80,6 @@ int analogix_dp_audio_startup(struct analogix_dp_device *dp); int analogix_dp_audio_get_eld(struct analogix_dp_device *dp, u8 *buf, size_t len); int analogix_dp_loader_protect(struct analogix_dp_device *dp); +void analogix_dp_disable(struct analogix_dp_device *dp); #endif /* _ANALOGIX_DP_H_ */