11a8d717cSWyon Bi // SPDX-License-Identifier: GPL-2.0+
21a8d717cSWyon Bi /*
31a8d717cSWyon Bi * (C) Copyright 2008-2018 Fuzhou Rockchip Electronics Co., Ltd
41a8d717cSWyon Bi */
51a8d717cSWyon Bi
61a8d717cSWyon Bi #include "rockchip_bridge.h"
7*0e6acdbcSDamon Ding #include "rockchip_display.h"
81a8d717cSWyon Bi
rockchip_bridge_init(struct rockchip_bridge * bridge,struct rockchip_connector * conn,struct display_state * state)93893d79dSWyon Bi void rockchip_bridge_init(struct rockchip_bridge *bridge,
100594ce39SZhang Yubing struct rockchip_connector *conn,
113893d79dSWyon Bi struct display_state *state)
123893d79dSWyon Bi {
133893d79dSWyon Bi if (!bridge)
143893d79dSWyon Bi return;
153893d79dSWyon Bi
160594ce39SZhang Yubing bridge->conn = conn;
173893d79dSWyon Bi bridge->state = state;
183893d79dSWyon Bi
19*0e6acdbcSDamon Ding if (bridge->bus_format)
20*0e6acdbcSDamon Ding state->conn_state.bus_format = bridge->bus_format;
21*0e6acdbcSDamon Ding
223893d79dSWyon Bi if (bridge->next_bridge)
230594ce39SZhang Yubing rockchip_bridge_init(bridge->next_bridge, conn, state);
243893d79dSWyon Bi }
253893d79dSWyon Bi
rockchip_bridge_pre_enable(struct rockchip_bridge * bridge)261a8d717cSWyon Bi void rockchip_bridge_pre_enable(struct rockchip_bridge *bridge)
271a8d717cSWyon Bi {
281a8d717cSWyon Bi if (!bridge)
291a8d717cSWyon Bi return;
301a8d717cSWyon Bi
311a8d717cSWyon Bi if (bridge->funcs && bridge->funcs->pre_enable)
321a8d717cSWyon Bi bridge->funcs->pre_enable(bridge);
333893d79dSWyon Bi
343893d79dSWyon Bi if (bridge->next_bridge)
353893d79dSWyon Bi rockchip_bridge_pre_enable(bridge->next_bridge);
361a8d717cSWyon Bi }
371a8d717cSWyon Bi
rockchip_bridge_post_disable(struct rockchip_bridge * bridge)381a8d717cSWyon Bi void rockchip_bridge_post_disable(struct rockchip_bridge *bridge)
391a8d717cSWyon Bi {
401a8d717cSWyon Bi if (!bridge)
411a8d717cSWyon Bi return;
421a8d717cSWyon Bi
433893d79dSWyon Bi if (bridge->next_bridge)
443893d79dSWyon Bi rockchip_bridge_post_disable(bridge->next_bridge);
453893d79dSWyon Bi
461a8d717cSWyon Bi if (bridge->funcs && bridge->funcs->post_disable)
471a8d717cSWyon Bi bridge->funcs->post_disable(bridge);
481a8d717cSWyon Bi }
491a8d717cSWyon Bi
rockchip_bridge_enable(struct rockchip_bridge * bridge)501a8d717cSWyon Bi void rockchip_bridge_enable(struct rockchip_bridge *bridge)
511a8d717cSWyon Bi {
521a8d717cSWyon Bi if (!bridge)
531a8d717cSWyon Bi return;
541a8d717cSWyon Bi
551a8d717cSWyon Bi if (bridge->funcs && bridge->funcs->enable)
561a8d717cSWyon Bi bridge->funcs->enable(bridge);
573893d79dSWyon Bi
583893d79dSWyon Bi if (bridge->next_bridge)
593893d79dSWyon Bi rockchip_bridge_enable(bridge->next_bridge);
601a8d717cSWyon Bi }
611a8d717cSWyon Bi
rockchip_bridge_disable(struct rockchip_bridge * bridge)621a8d717cSWyon Bi void rockchip_bridge_disable(struct rockchip_bridge *bridge)
631a8d717cSWyon Bi {
641a8d717cSWyon Bi if (!bridge)
651a8d717cSWyon Bi return;
661a8d717cSWyon Bi
673893d79dSWyon Bi if (bridge->next_bridge)
683893d79dSWyon Bi rockchip_bridge_disable(bridge->next_bridge);
693893d79dSWyon Bi
701a8d717cSWyon Bi if (bridge->funcs && bridge->funcs->disable)
711a8d717cSWyon Bi bridge->funcs->disable(bridge);
721a8d717cSWyon Bi }
73ee937701SWyon Bi
rockchip_bridge_mode_set(struct rockchip_bridge * bridge,const struct drm_display_mode * mode)74ee937701SWyon Bi void rockchip_bridge_mode_set(struct rockchip_bridge *bridge,
75ee937701SWyon Bi const struct drm_display_mode *mode)
76ee937701SWyon Bi {
77ee937701SWyon Bi if (!bridge || !mode)
78ee937701SWyon Bi return;
79ee937701SWyon Bi
80ee937701SWyon Bi if (bridge->funcs && bridge->funcs->mode_set)
81ee937701SWyon Bi bridge->funcs->mode_set(bridge, mode);
823893d79dSWyon Bi
833893d79dSWyon Bi if (bridge->next_bridge)
843893d79dSWyon Bi rockchip_bridge_mode_set(bridge->next_bridge, mode);
85ee937701SWyon Bi }
86daf8b0a0SWyon Bi
rockchip_bridge_detect(struct rockchip_bridge * bridge)87daf8b0a0SWyon Bi bool rockchip_bridge_detect(struct rockchip_bridge *bridge)
88daf8b0a0SWyon Bi {
89daf8b0a0SWyon Bi if (bridge->funcs && bridge->funcs->detect)
90daf8b0a0SWyon Bi if (!bridge->funcs->detect(bridge))
91daf8b0a0SWyon Bi return false;
92daf8b0a0SWyon Bi
93daf8b0a0SWyon Bi if (bridge->next_bridge)
94daf8b0a0SWyon Bi return rockchip_bridge_detect(bridge->next_bridge);
95daf8b0a0SWyon Bi
96daf8b0a0SWyon Bi return true;
97daf8b0a0SWyon Bi }
98