]> git.ipfire.org Git - thirdparty/openwrt.git/blob
c6861c6a54c4cacfd9ddbf8c7ef5e4a1536332ac
[thirdparty/openwrt.git] /
1 From 4a89fda8f73df89e009a6188ef07ab97b1d03c7f Mon Sep 17 00:00:00 2001
2 From: eng33 <eng33@waveshare.com>
3 Date: Thu, 5 Dec 2024 17:20:22 +0800
4 Subject: [PATCH] drivers:gpu:drm:panel: Added waveshare 13.3inch panel(support
5 2/4lane)
6
7 Signed-off-by: eng33 <eng33@waveshare.com>
8 ---
9 drivers/gpu/drm/panel/panel-waveshare-dsi.c | 155 +++++++++++++++++---
10 1 file changed, 138 insertions(+), 17 deletions(-)
11
12 --- a/drivers/gpu/drm/panel/panel-waveshare-dsi.c
13 +++ b/drivers/gpu/drm/panel/panel-waveshare-dsi.c
14 @@ -32,6 +32,12 @@ struct ws_panel {
15 enum drm_panel_orientation orientation;
16 };
17
18 +struct ws_panel_data {
19 + const struct drm_display_mode *mode;
20 + int lanes;
21 + unsigned long mode_flags;
22 +};
23 +
24 /* 2.8inch 480x640
25 * https://www.waveshare.com/product/raspberry-pi/displays/2.8inch-dsi-lcd.htm
26 */
27 @@ -47,6 +53,12 @@ static const struct drm_display_mode ws_
28 .vtotal = 640 + 150 + 50 + 150,
29 };
30
31 +static const struct ws_panel_data ws_panel_2_8_data = {
32 + .mode = &ws_panel_2_8_mode,
33 + .lanes = 2,
34 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
35 +};
36 +
37 /* 3.4inch 800x800 Round
38 * https://www.waveshare.com/product/displays/lcd-oled/3.4inch-dsi-lcd-c.htm
39 */
40 @@ -62,6 +74,12 @@ static const struct drm_display_mode ws_
41 .vtotal = 800 + 8 + 4 + 16,
42 };
43
44 +static const struct ws_panel_data ws_panel_3_4_data = {
45 + .mode = &ws_panel_3_4_mode,
46 + .lanes = 2,
47 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
48 +};
49 +
50 /* 4.0inch 480x800
51 * https://www.waveshare.com/product/raspberry-pi/displays/4inch-dsi-lcd.htm
52 */
53 @@ -77,6 +95,12 @@ static const struct drm_display_mode ws_
54 .vtotal = 800 + 20 + 100 + 20,
55 };
56
57 +static const struct ws_panel_data ws_panel_4_0_data = {
58 + .mode = &ws_panel_4_0_mode,
59 + .lanes = 2,
60 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
61 +};
62 +
63 /* 7.0inch C 1024x600
64 * https://www.waveshare.com/product/raspberry-pi/displays/lcd-oled/7inch-dsi-lcd-c-with-case-a.htm
65 */
66 @@ -92,6 +116,12 @@ static const struct drm_display_mode ws_
67 .vtotal = 600 + 10 + 10 + 10,
68 };
69
70 +static const struct ws_panel_data ws_panel_7_0_c_data = {
71 + .mode = &ws_panel_7_0_c_mode,
72 + .lanes = 2,
73 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
74 +};
75 +
76 /* 7.9inch 400x1280
77 * https://www.waveshare.com/product/raspberry-pi/displays/7.9inch-dsi-lcd.htm
78 */
79 @@ -107,6 +137,12 @@ static const struct drm_display_mode ws_
80 .vtotal = 1280 + 20 + 10 + 20,
81 };
82
83 +static const struct ws_panel_data ws_panel_7_9_data = {
84 + .mode = &ws_panel_7_9_mode,
85 + .lanes = 2,
86 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
87 +};
88 +
89 /* 8.0inch or 10.1inch 1280x800
90 * https://www.waveshare.com/product/raspberry-pi/displays/8inch-dsi-lcd-c.htm
91 * https://www.waveshare.com/product/raspberry-pi/displays/10.1inch-dsi-lcd-c.htm
92 @@ -123,6 +159,12 @@ static const struct drm_display_mode ws_
93 .vtotal = 800 + 40 + 48 + 40,
94 };
95
96 +static const struct ws_panel_data ws_panel_10_1_data = {
97 + .mode = &ws_panel_10_1_mode,
98 + .lanes = 2,
99 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
100 +};
101 +
102 /* 11.9inch 320x1480
103 * https://www.waveshare.com/product/raspberry-pi/displays/11.9inch-dsi-lcd.htm
104 */
105 @@ -138,6 +180,12 @@ static const struct drm_display_mode ws_
106 .vtotal = 1480 + 60 + 60 + 60,
107 };
108
109 +static const struct ws_panel_data ws_panel_11_9_data = {
110 + .mode = &ws_panel_11_9_mode,
111 + .lanes = 2,
112 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
113 +};
114 +
115 static const struct drm_display_mode ws_panel_4_mode = {
116 .clock = 50000,
117 .hdisplay = 720,
118 @@ -150,6 +198,12 @@ static const struct drm_display_mode ws_
119 .vtotal = 720 + 8 + 4 + 16,
120 };
121
122 +static const struct ws_panel_data ws_panel_4_data = {
123 + .mode = &ws_panel_4_mode,
124 + .lanes = 2,
125 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
126 +};
127 +
128 /* 5.0inch 720x1280
129 * https://www.waveshare.com/5inch-dsi-lcd-d.htm
130 */
131 @@ -165,6 +219,12 @@ static const struct drm_display_mode ws_
132 .vtotal = 1280 + 20 + 20 + 20,
133 };
134
135 +static const struct ws_panel_data ws_panel_5_0_data = {
136 + .mode = &ws_panel_5_0_mode,
137 + .lanes = 2,
138 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
139 +};
140 +
141 /* 6.25inch 720x1560
142 * https://www.waveshare.com/6.25inch-dsi-lcd.htm
143 */
144 @@ -180,6 +240,12 @@ static const struct drm_display_mode ws_
145 .vtotal = 1560 + 20 + 20 + 20,
146 };
147
148 +static const struct ws_panel_data ws_panel_6_25_data = {
149 + .mode = &ws_panel_6_25_mode,
150 + .lanes = 2,
151 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
152 +};
153 +
154 /* 8.8inch 480x1920
155 * https://www.waveshare.com/8.8inch-dsi-lcd.htm
156 */
157 @@ -195,6 +261,48 @@ static const struct drm_display_mode ws_
158 .vtotal = 1920 + 20 + 20 + 20,
159 };
160
161 +static const struct ws_panel_data ws_panel_8_8_data = {
162 + .mode = &ws_panel_8_8_mode,
163 + .lanes = 2,
164 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
165 +};
166 +
167 +static const struct drm_display_mode ws_panel_13_3_4lane_mode = {
168 + .clock = 148500,
169 + .hdisplay = 1920,
170 + .hsync_start = 1920 + 88,
171 + .hsync_end = 1920 + 88 + 44,
172 + .htotal = 1920 + 88 + 44 + 148,
173 + .vdisplay = 1080,
174 + .vsync_start = 1080 + 4,
175 + .vsync_end = 1080 + 4 + 5,
176 + .vtotal = 1080 + 4 + 5 + 36,
177 +};
178 +
179 +static const struct ws_panel_data ws_panel_13_3_4lane_data = {
180 + .mode = &ws_panel_13_3_4lane_mode,
181 + .lanes = 4,
182 + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
183 +};
184 +
185 +static const struct drm_display_mode ws_panel_13_3_2lane_mode = {
186 + .clock = 83333,
187 + .hdisplay = 1920,
188 + .hsync_start = 1920 + 88,
189 + .hsync_end = 1920 + 88 + 44,
190 + .htotal = 1920 + 88 + 44 + 148,
191 + .vdisplay = 1080,
192 + .vsync_start = 1080 + 4,
193 + .vsync_end = 1080 + 4 + 5,
194 + .vtotal = 1080 + 4 + 5 + 36,
195 +};
196 +
197 +static const struct ws_panel_data ws_panel_13_3_2lane_data = {
198 + .mode = &ws_panel_13_3_2lane_mode,
199 + .lanes = 2,
200 + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
201 +};
202 +
203 static struct ws_panel *panel_to_ts(struct drm_panel *panel)
204 {
205 return container_of(panel, struct ws_panel, base);
206 @@ -232,7 +340,10 @@ static int ws_panel_enable(struct drm_pa
207 {
208 struct ws_panel *ts = panel_to_ts(panel);
209
210 - ws_panel_i2c_write(ts, 0xad, 0x01);
211 + if (ts->mode == &ws_panel_13_3_2lane_mode)
212 + ws_panel_i2c_write(ts, 0xad, 0x02);
213 + else
214 + ws_panel_i2c_write(ts, 0xad, 0x01);
215
216 return 0;
217 }
218 @@ -328,13 +439,18 @@ static int ws_panel_probe(struct i2c_cli
219 .channel = 0,
220 .node = NULL,
221 };
222 + const struct ws_panel_data *_ws_panel_data;
223 int ret;
224
225 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
226 if (!ts)
227 return -ENOMEM;
228
229 - ts->mode = of_device_get_match_data(dev);
230 + _ws_panel_data = of_device_get_match_data(dev);
231 + if (!_ws_panel_data)
232 + return -EINVAL;
233 +
234 + ts->mode = _ws_panel_data->mode;
235 if (!ts->mode)
236 return -EINVAL;
237
238 @@ -396,10 +512,9 @@ static int ws_panel_probe(struct i2c_cli
239 */
240 drm_panel_add(&ts->base);
241
242 - ts->dsi->mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO |
243 - MIPI_DSI_CLOCK_NON_CONTINUOUS;
244 + ts->dsi->mode_flags = _ws_panel_data->mode_flags;
245 ts->dsi->format = MIPI_DSI_FMT_RGB888;
246 - ts->dsi->lanes = 2;
247 + ts->dsi->lanes = _ws_panel_data->lanes;
248
249 ret = devm_mipi_dsi_attach(dev, ts->dsi);
250
251 @@ -432,40 +547,46 @@ static void ws_panel_shutdown(struct i2c
252 static const struct of_device_id ws_panel_of_ids[] = {
253 {
254 .compatible = "waveshare,2.8inch-panel",
255 - .data = &ws_panel_2_8_mode,
256 + .data = &ws_panel_2_8_data,
257 }, {
258 .compatible = "waveshare,3.4inch-panel",
259 - .data = &ws_panel_3_4_mode,
260 + .data = &ws_panel_3_4_data,
261 }, {
262 .compatible = "waveshare,4.0inch-panel",
263 - .data = &ws_panel_4_0_mode,
264 + .data = &ws_panel_4_0_data,
265 }, {
266 .compatible = "waveshare,7.0inch-c-panel",
267 - .data = &ws_panel_7_0_c_mode,
268 + .data = &ws_panel_7_0_c_data,
269 }, {
270 .compatible = "waveshare,7.9inch-panel",
271 - .data = &ws_panel_7_9_mode,
272 + .data = &ws_panel_7_9_data,
273 }, {
274 .compatible = "waveshare,8.0inch-panel",
275 - .data = &ws_panel_10_1_mode,
276 + .data = &ws_panel_10_1_data,
277 }, {
278 .compatible = "waveshare,10.1inch-panel",
279 - .data = &ws_panel_10_1_mode,
280 + .data = &ws_panel_10_1_data,
281 }, {
282 .compatible = "waveshare,11.9inch-panel",
283 - .data = &ws_panel_11_9_mode,
284 + .data = &ws_panel_11_9_data,
285 }, {
286 .compatible = "waveshare,4inch-panel",
287 - .data = &ws_panel_4_mode,
288 + .data = &ws_panel_4_data,
289 }, {
290 .compatible = "waveshare,5.0inch-panel",
291 - .data = &ws_panel_5_0_mode,
292 + .data = &ws_panel_5_0_data,
293 }, {
294 .compatible = "waveshare,6.25inch-panel",
295 - .data = &ws_panel_6_25_mode,
296 + .data = &ws_panel_6_25_data,
297 }, {
298 .compatible = "waveshare,8.8inch-panel",
299 - .data = &ws_panel_8_8_mode,
300 + .data = &ws_panel_8_8_data,
301 + }, {
302 + .compatible = "waveshare,13.3inch-4lane-panel",
303 + .data = &ws_panel_13_3_4lane_data,
304 + }, {
305 + .compatible = "waveshare,13.3inch-2lane-panel",
306 + .data = &ws_panel_13_3_2lane_data,
307 }, {
308 /* sentinel */
309 }