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
rockchip_bridge_init(struct rockchip_bridge * bridge,struct rockchip_connector * conn,struct display_state * state)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
rockchip_bridge_pre_enable(struct rockchip_bridge * bridge)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
rockchip_bridge_post_disable(struct rockchip_bridge * bridge)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
rockchip_bridge_enable(struct rockchip_bridge * bridge)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
rockchip_bridge_disable(struct rockchip_bridge * bridge)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
rockchip_bridge_mode_set(struct rockchip_bridge * bridge,const struct drm_display_mode * mode)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
rockchip_bridge_detect(struct rockchip_bridge * bridge)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