xref: /rk3399_rockchip-uboot/drivers/video/drm/rockchip_panel.c (revision 9ac6f4797ca1f9a9c5c1f4bdb8414fefa85f8bd3)
1 /*
2  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <config.h>
8 #include <common.h>
9 #include <errno.h>
10 #include <malloc.h>
11 #include <fdtdec.h>
12 #include <fdt_support.h>
13 #include <asm/unaligned.h>
14 #include <linux/list.h>
15 #include <dm/device.h>
16 
17 #include "rockchip_display.h"
18 #include "rockchip_crtc.h"
19 #include "rockchip_connector.h"
20 #include "rockchip_panel.h"
21 
22 static const struct drm_display_mode auo_b125han03_mode = {
23 	.clock = 146900,
24 	.hdisplay = 1920,
25 	.hsync_start = 1920 + 48,
26 	.hsync_end = 1920 + 48 + 32,
27 	.htotal = 1920 + 48 + 32 + 140,
28 	.vdisplay = 1080,
29 	.vsync_start = 1080 + 2,
30 	.vsync_end = 1080 + 2 + 5,
31 	.vtotal = 1080 + 2 + 5 + 57,
32 	.vrefresh = 60,
33 	.flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
34 };
35 
36 static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
37 	.clock = 200000,
38 	.hdisplay = 1536,
39 	.hsync_start = 1536 + 12,
40 	.hsync_end = 1536 + 12 + 16,
41 	.htotal = 1536 + 12 + 16 + 48,
42 	.vdisplay = 2048,
43 	.vsync_start = 2048 + 8,
44 	.vsync_end = 2048 + 8 + 4,
45 	.vtotal = 2048 + 8 + 4 + 8,
46 	.vrefresh = 60,
47 	.flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
48 };
49 #if 0
50 static const struct rockchip_panel simple_panel_data = {
51 	.funcs = &panel_simple_funcs,
52 };
53 #endif
54 
55 static const struct rockchip_panel simple_panel_dsi_data = {
56 	.funcs = &rockchip_dsi_panel_funcs,
57 };
58 #if 0
59 static const struct rockchip_panel lg_lp079qx1_sp0v_data = {
60 	.funcs = &panel_simple_funcs,
61 	.data = &lg_lp079qx1_sp0v_mode,
62 };
63 
64 static const struct rockchip_panel auo_b125han03_data = {
65 	.funcs = &panel_simple_funcs,
66 	.data = &auo_b125han03_mode,
67 };
68 #endif
69 
70 static const struct udevice_id rockchip_panel_ids[] = {
71 #if 0
72 	}, {
73 		.compatible = "simple-panel",
74 		.funcs = &simple_panel_data,
75 	},
76 #endif
77  {
78 		.compatible = "simple-panel-dsi",
79 		.data = (ulong)&simple_panel_dsi_data,
80 	},
81 #if 0
82 {
83 		.compatible = "lg,lp079qx1-sp0v",
84 		.funcs = &lg_lp079qx1_sp0v_data,
85 	}, {
86 		.compatible = "auo,b125han03",
87 		.funcs = &auo_b125han03_data,
88 	},
89 #endif
90  {}
91 };
92 
93 static int rockchip_panel_probe(struct udevice *dev)
94 {
95 	printf("--->yzq %s %d\n", __func__, __LINE__);
96 	return 0;
97 }
98 
99 static int rockchip_panel_bind(struct udevice *dev)
100 {
101 	printf("--->yzq %s %d\n", __func__, __LINE__);
102 	return 0;
103 }
104 
105 
106 U_BOOT_DRIVER(rockchip_panel) = {
107 	.name = "rockchip_panel",
108 	.id = UCLASS_PANEL,
109 	.of_match = rockchip_panel_ids,
110 	.bind	= rockchip_panel_bind,
111 	.probe	= rockchip_panel_probe,
112 };
113 
114 const struct drm_display_mode *
115 rockchip_get_display_mode_from_panel(struct display_state *state)
116 {
117 	struct panel_state *panel_state = &state->panel_state;
118 	const struct rockchip_panel *panel = panel_state->panel;
119 
120 	if (!panel || !panel->data)
121 		return NULL;
122 
123 	return (const struct drm_display_mode *)panel->data;
124 }
125 
126 #if 0
127 const struct rockchip_panel *rockchip_get_panel(const void *blob, int node)
128 {
129 	const char *name;
130 	int i;
131 
132 	name = fdt_stringlist_get(blob, node, "compatible", 0, NULL);
133 
134 	for (i = 0; i < ARRAY_SIZE(g_panel); i++)
135 		if (!strcmp(name, g_panel[i].compatible))
136 			break;
137 
138 	if (i >= ARRAY_SIZE(g_panel))
139 		return NULL;
140 
141 	return &g_panel[i];
142 }
143 #endif
144 
145 int rockchip_panel_init(struct display_state *state)
146 {
147 	struct panel_state *panel_state = &state->panel_state;
148 	const struct rockchip_panel *panel = panel_state->panel;
149 
150 	if (!panel || !panel->funcs || !panel->funcs->init) {
151 		printf("%s: failed to find panel init funcs\n", __func__);
152 		return -ENODEV;
153 	}
154 
155 	return panel->funcs->init(state);
156 }
157 
158 void rockchip_panel_deinit(struct display_state *state)
159 {
160 	struct panel_state *panel_state = &state->panel_state;
161 	const struct rockchip_panel *panel = panel_state->panel;
162 
163 	if (!panel || !panel->funcs || !panel->funcs->deinit) {
164 		printf("%s: failed to find panel deinit funcs\n", __func__);
165 		return;
166 	}
167 
168 	panel->funcs->deinit(state);
169 }
170 
171 int rockchip_panel_prepare(struct display_state *state)
172 {
173 	struct panel_state *panel_state = &state->panel_state;
174 	const struct rockchip_panel *panel = panel_state->panel;
175 
176 printf("--->yzq %s %d\n", __func__, __LINE__);
177 	if (!panel || !panel->funcs || !panel->funcs->prepare) {
178 printf("--->yzq %s %d panel=%p\n", __func__, __LINE__, panel);
179 printf("--->yzq %s %d panel->funcs=%p\n", __func__, __LINE__, panel->funcs);
180 printf("--->yzq %s %d panel->funcs->prepare=%p\n", __func__, __LINE__, panel->funcs->prepare);
181 		printf("%s: failed to find panel prepare funcs\n", __func__);
182 		return -ENODEV;
183 	}
184 printf("--->yzq %s %d\n", __func__, __LINE__);
185 
186 	return panel->funcs->prepare(state);
187 }
188 
189 int rockchip_panel_unprepare(struct display_state *state)
190 {
191 	struct panel_state *panel_state = &state->panel_state;
192 	const struct rockchip_panel *panel = panel_state->panel;
193 
194 	if (!panel || !panel->funcs || !panel->funcs->unprepare) {
195 		printf("%s: failed to find panel unprepare funcs\n", __func__);
196 		return -ENODEV;
197 	}
198 
199 	return panel->funcs->unprepare(state);
200 }
201 
202 int rockchip_panel_enable(struct display_state *state)
203 {
204 	struct panel_state *panel_state = &state->panel_state;
205 	const struct rockchip_panel *panel = panel_state->panel;
206 
207 	if (!panel || !panel->funcs || !panel->funcs->enable) {
208 		printf("%s: failed to find panel prepare funcs\n", __func__);
209 		return -ENODEV;
210 	}
211 
212 	return panel->funcs->enable(state);
213 }
214 
215 int rockchip_panel_disable(struct display_state *state)
216 {
217 	struct panel_state *panel_state = &state->panel_state;
218 	const struct rockchip_panel *panel = panel_state->panel;
219 
220 	if (!panel || !panel->funcs || !panel->funcs->disable) {
221 		printf("%s: failed to find panel disable funcs\n", __func__);
222 		return -ENODEV;
223 	}
224 
225 	return panel->funcs->disable(state);
226 }
227