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
7 Signed-off-by: eng33 <eng33@waveshare.com>
9 drivers/gpu/drm/panel/panel-waveshare-dsi.c | 155 +++++++++++++++++---
10 1 file changed, 138 insertions(+), 17 deletions(-)
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;
18 +struct ws_panel_data {
19 + const struct drm_display_mode *mode;
21 + unsigned long mode_flags;
25 * https://www.waveshare.com/product/raspberry-pi/displays/2.8inch-dsi-lcd.htm
27 @@ -47,6 +53,12 @@ static const struct drm_display_mode ws_
28 .vtotal = 640 + 150 + 50 + 150,
31 +static const struct ws_panel_data ws_panel_2_8_data = {
32 + .mode = &ws_panel_2_8_mode,
34 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
37 /* 3.4inch 800x800 Round
38 * https://www.waveshare.com/product/displays/lcd-oled/3.4inch-dsi-lcd-c.htm
40 @@ -62,6 +74,12 @@ static const struct drm_display_mode ws_
41 .vtotal = 800 + 8 + 4 + 16,
44 +static const struct ws_panel_data ws_panel_3_4_data = {
45 + .mode = &ws_panel_3_4_mode,
47 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
51 * https://www.waveshare.com/product/raspberry-pi/displays/4inch-dsi-lcd.htm
53 @@ -77,6 +95,12 @@ static const struct drm_display_mode ws_
54 .vtotal = 800 + 20 + 100 + 20,
57 +static const struct ws_panel_data ws_panel_4_0_data = {
58 + .mode = &ws_panel_4_0_mode,
60 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
64 * https://www.waveshare.com/product/raspberry-pi/displays/lcd-oled/7inch-dsi-lcd-c-with-case-a.htm
66 @@ -92,6 +116,12 @@ static const struct drm_display_mode ws_
67 .vtotal = 600 + 10 + 10 + 10,
70 +static const struct ws_panel_data ws_panel_7_0_c_data = {
71 + .mode = &ws_panel_7_0_c_mode,
73 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
77 * https://www.waveshare.com/product/raspberry-pi/displays/7.9inch-dsi-lcd.htm
79 @@ -107,6 +137,12 @@ static const struct drm_display_mode ws_
80 .vtotal = 1280 + 20 + 10 + 20,
83 +static const struct ws_panel_data ws_panel_7_9_data = {
84 + .mode = &ws_panel_7_9_mode,
86 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
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,
96 +static const struct ws_panel_data ws_panel_10_1_data = {
97 + .mode = &ws_panel_10_1_mode,
99 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
103 * https://www.waveshare.com/product/raspberry-pi/displays/11.9inch-dsi-lcd.htm
105 @@ -138,6 +180,12 @@ static const struct drm_display_mode ws_
106 .vtotal = 1480 + 60 + 60 + 60,
109 +static const struct ws_panel_data ws_panel_11_9_data = {
110 + .mode = &ws_panel_11_9_mode,
112 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
115 static const struct drm_display_mode ws_panel_4_mode = {
118 @@ -150,6 +198,12 @@ static const struct drm_display_mode ws_
119 .vtotal = 720 + 8 + 4 + 16,
122 +static const struct ws_panel_data ws_panel_4_data = {
123 + .mode = &ws_panel_4_mode,
125 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
129 * https://www.waveshare.com/5inch-dsi-lcd-d.htm
131 @@ -165,6 +219,12 @@ static const struct drm_display_mode ws_
132 .vtotal = 1280 + 20 + 20 + 20,
135 +static const struct ws_panel_data ws_panel_5_0_data = {
136 + .mode = &ws_panel_5_0_mode,
138 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
142 * https://www.waveshare.com/6.25inch-dsi-lcd.htm
144 @@ -180,6 +240,12 @@ static const struct drm_display_mode ws_
145 .vtotal = 1560 + 20 + 20 + 20,
148 +static const struct ws_panel_data ws_panel_6_25_data = {
149 + .mode = &ws_panel_6_25_mode,
151 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
155 * https://www.waveshare.com/8.8inch-dsi-lcd.htm
157 @@ -195,6 +261,48 @@ static const struct drm_display_mode ws_
158 .vtotal = 1920 + 20 + 20 + 20,
161 +static const struct ws_panel_data ws_panel_8_8_data = {
162 + .mode = &ws_panel_8_8_mode,
164 + .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
167 +static const struct drm_display_mode ws_panel_13_3_4lane_mode = {
170 + .hsync_start = 1920 + 88,
171 + .hsync_end = 1920 + 88 + 44,
172 + .htotal = 1920 + 88 + 44 + 148,
174 + .vsync_start = 1080 + 4,
175 + .vsync_end = 1080 + 4 + 5,
176 + .vtotal = 1080 + 4 + 5 + 36,
179 +static const struct ws_panel_data ws_panel_13_3_4lane_data = {
180 + .mode = &ws_panel_13_3_4lane_mode,
182 + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
185 +static const struct drm_display_mode ws_panel_13_3_2lane_mode = {
188 + .hsync_start = 1920 + 88,
189 + .hsync_end = 1920 + 88 + 44,
190 + .htotal = 1920 + 88 + 44 + 148,
192 + .vsync_start = 1080 + 4,
193 + .vsync_end = 1080 + 4 + 5,
194 + .vtotal = 1080 + 4 + 5 + 36,
197 +static const struct ws_panel_data ws_panel_13_3_2lane_data = {
198 + .mode = &ws_panel_13_3_2lane_mode,
200 + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
203 static struct ws_panel *panel_to_ts(struct drm_panel *panel)
205 return container_of(panel, struct ws_panel, base);
206 @@ -232,7 +340,10 @@ static int ws_panel_enable(struct drm_pa
208 struct ws_panel *ts = panel_to_ts(panel);
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);
214 + ws_panel_i2c_write(ts, 0xad, 0x01);
218 @@ -328,13 +439,18 @@ static int ws_panel_probe(struct i2c_cli
222 + const struct ws_panel_data *_ws_panel_data;
225 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
229 - ts->mode = of_device_get_match_data(dev);
230 + _ws_panel_data = of_device_get_match_data(dev);
231 + if (!_ws_panel_data)
234 + ts->mode = _ws_panel_data->mode;
238 @@ -396,10 +512,9 @@ static int ws_panel_probe(struct i2c_cli
240 drm_panel_add(&ts->base);
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;
249 ret = devm_mipi_dsi_attach(dev, ts->dsi);
251 @@ -432,40 +547,46 @@ static void ws_panel_shutdown(struct i2c
252 static const struct of_device_id ws_panel_of_ids[] = {
254 .compatible = "waveshare,2.8inch-panel",
255 - .data = &ws_panel_2_8_mode,
256 + .data = &ws_panel_2_8_data,
258 .compatible = "waveshare,3.4inch-panel",
259 - .data = &ws_panel_3_4_mode,
260 + .data = &ws_panel_3_4_data,
262 .compatible = "waveshare,4.0inch-panel",
263 - .data = &ws_panel_4_0_mode,
264 + .data = &ws_panel_4_0_data,
266 .compatible = "waveshare,7.0inch-c-panel",
267 - .data = &ws_panel_7_0_c_mode,
268 + .data = &ws_panel_7_0_c_data,
270 .compatible = "waveshare,7.9inch-panel",
271 - .data = &ws_panel_7_9_mode,
272 + .data = &ws_panel_7_9_data,
274 .compatible = "waveshare,8.0inch-panel",
275 - .data = &ws_panel_10_1_mode,
276 + .data = &ws_panel_10_1_data,
278 .compatible = "waveshare,10.1inch-panel",
279 - .data = &ws_panel_10_1_mode,
280 + .data = &ws_panel_10_1_data,
282 .compatible = "waveshare,11.9inch-panel",
283 - .data = &ws_panel_11_9_mode,
284 + .data = &ws_panel_11_9_data,
286 .compatible = "waveshare,4inch-panel",
287 - .data = &ws_panel_4_mode,
288 + .data = &ws_panel_4_data,
290 .compatible = "waveshare,5.0inch-panel",
291 - .data = &ws_panel_5_0_mode,
292 + .data = &ws_panel_5_0_data,
294 .compatible = "waveshare,6.25inch-panel",
295 - .data = &ws_panel_6_25_mode,
296 + .data = &ws_panel_6_25_data,
298 .compatible = "waveshare,8.8inch-panel",
299 - .data = &ws_panel_8_8_mode,
300 + .data = &ws_panel_8_8_data,
302 + .compatible = "waveshare,13.3inch-4lane-panel",
303 + .data = &ws_panel_13_3_4lane_data,
305 + .compatible = "waveshare,13.3inch-2lane-panel",
306 + .data = &ws_panel_13_3_2lane_data,