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