xref: /rk3399_rockchip-uboot/drivers/video/drm/rockchip_bridge.c (revision 0e6acdbc527a4aeb5fd5966bf874dbe404baf433)
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