xref: /OK3568_Linux_fs/u-boot/drivers/video/drm/rockchip_bridge.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * (C) Copyright 2008-2018 Fuzhou Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include "rockchip_bridge.h"
7*4882a593Smuzhiyun 
rockchip_bridge_init(struct rockchip_bridge * bridge,struct rockchip_connector * conn,struct display_state * state)8*4882a593Smuzhiyun void rockchip_bridge_init(struct rockchip_bridge *bridge,
9*4882a593Smuzhiyun 			  struct rockchip_connector *conn,
10*4882a593Smuzhiyun 			  struct display_state *state)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	if (!bridge)
13*4882a593Smuzhiyun 		return;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	bridge->conn = conn;
16*4882a593Smuzhiyun 	bridge->state = state;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	if (bridge->next_bridge)
19*4882a593Smuzhiyun 		rockchip_bridge_init(bridge->next_bridge, conn, state);
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun 
rockchip_bridge_pre_enable(struct rockchip_bridge * bridge)22*4882a593Smuzhiyun void rockchip_bridge_pre_enable(struct rockchip_bridge *bridge)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun 	if (!bridge)
25*4882a593Smuzhiyun 		return;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->pre_enable)
28*4882a593Smuzhiyun 		bridge->funcs->pre_enable(bridge);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	if (bridge->next_bridge)
31*4882a593Smuzhiyun 		rockchip_bridge_pre_enable(bridge->next_bridge);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
rockchip_bridge_post_disable(struct rockchip_bridge * bridge)34*4882a593Smuzhiyun void rockchip_bridge_post_disable(struct rockchip_bridge *bridge)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun 	if (!bridge)
37*4882a593Smuzhiyun 		return;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	if (bridge->next_bridge)
40*4882a593Smuzhiyun 		rockchip_bridge_post_disable(bridge->next_bridge);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->post_disable)
43*4882a593Smuzhiyun 		bridge->funcs->post_disable(bridge);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
rockchip_bridge_enable(struct rockchip_bridge * bridge)46*4882a593Smuzhiyun void rockchip_bridge_enable(struct rockchip_bridge *bridge)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	if (!bridge)
49*4882a593Smuzhiyun 		return;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->enable)
52*4882a593Smuzhiyun 		bridge->funcs->enable(bridge);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	if (bridge->next_bridge)
55*4882a593Smuzhiyun 		rockchip_bridge_enable(bridge->next_bridge);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
rockchip_bridge_disable(struct rockchip_bridge * bridge)58*4882a593Smuzhiyun void rockchip_bridge_disable(struct rockchip_bridge *bridge)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	if (!bridge)
61*4882a593Smuzhiyun 		return;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	if (bridge->next_bridge)
64*4882a593Smuzhiyun 		rockchip_bridge_disable(bridge->next_bridge);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->disable)
67*4882a593Smuzhiyun 		bridge->funcs->disable(bridge);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
rockchip_bridge_mode_set(struct rockchip_bridge * bridge,const struct drm_display_mode * mode)70*4882a593Smuzhiyun void rockchip_bridge_mode_set(struct rockchip_bridge *bridge,
71*4882a593Smuzhiyun 			      const struct drm_display_mode *mode)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	if (!bridge || !mode)
74*4882a593Smuzhiyun 		return;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->mode_set)
77*4882a593Smuzhiyun 		bridge->funcs->mode_set(bridge, mode);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	if (bridge->next_bridge)
80*4882a593Smuzhiyun 		rockchip_bridge_mode_set(bridge->next_bridge, mode);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
rockchip_bridge_detect(struct rockchip_bridge * bridge)83*4882a593Smuzhiyun bool rockchip_bridge_detect(struct rockchip_bridge *bridge)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	if (bridge->funcs && bridge->funcs->detect)
86*4882a593Smuzhiyun 		if (!bridge->funcs->detect(bridge))
87*4882a593Smuzhiyun 			return false;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	if (bridge->next_bridge)
90*4882a593Smuzhiyun 		return rockchip_bridge_detect(bridge->next_bridge);
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	return true;
93*4882a593Smuzhiyun }
94