drm/rockchip: Add return value to .loader_protect()

Callback loader_protect() maybe failed.

Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
Change-Id: Icb9a25701929c79b94c9a63568a408913e49f87c
This commit is contained in:
Wyon Bi
2022-09-30 01:46:16 +00:00
committed by Tao Huang
parent bc2d913a39
commit 379474682f
11 changed files with 62 additions and 21 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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);

View File

@@ -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",

View File

@@ -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

View File

@@ -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

View File

@@ -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_ */