forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/gpu/drm/panel/panel-innolux-p079zca.c
....@@ -1,25 +1,22 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation; either version 2 of the License, or
7
- * (at your option) any later version.
84 */
95
10
-#include <linux/backlight.h>
6
+#include <linux/delay.h>
117 #include <linux/gpio/consumer.h>
128 #include <linux/module.h>
139 #include <linux/of.h>
1410 #include <linux/of_device.h>
1511 #include <linux/regulator/consumer.h>
1612
17
-#include <drm/drmP.h>
18
-#include <drm/drm_crtc.h>
19
-#include <drm/drm_mipi_dsi.h>
20
-#include <drm/drm_panel.h>
21
-
2213 #include <video/mipi_display.h>
14
+
15
+#include <drm/drm_crtc.h>
16
+#include <drm/drm_device.h>
17
+#include <drm/drm_mipi_dsi.h>
18
+#include <drm/drm_modes.h>
19
+#include <drm/drm_panel.h>
2320
2421 struct panel_init_cmd {
2522 size_t len;
....@@ -53,9 +50,7 @@
5350 struct mipi_dsi_device *link;
5451 const struct panel_desc *desc;
5552
56
- struct backlight_device *backlight;
5753 struct regulator_bulk_data *supplies;
58
- unsigned int num_supplies;
5954 struct gpio_desc *enable_gpio;
6055
6156 bool prepared;
....@@ -74,8 +69,6 @@
7469 if (!innolux->enabled)
7570 return 0;
7671
77
- backlight_disable(innolux->backlight);
78
-
7972 innolux->enabled = false;
8073
8174 return 0;
....@@ -91,13 +84,11 @@
9184
9285 err = mipi_dsi_dcs_set_display_off(innolux->link);
9386 if (err < 0)
94
- DRM_DEV_ERROR(panel->dev, "failed to set display off: %d\n",
95
- err);
87
+ dev_err(panel->dev, "failed to set display off: %d\n", err);
9688
9789 err = mipi_dsi_dcs_enter_sleep_mode(innolux->link);
9890 if (err < 0) {
99
- DRM_DEV_ERROR(panel->dev, "failed to enter sleep mode: %d\n",
100
- err);
91
+ dev_err(panel->dev, "failed to enter sleep mode: %d\n", err);
10192 return err;
10293 }
10394
....@@ -153,8 +144,7 @@
153144 err = mipi_dsi_generic_write(innolux->link, cmd->data,
154145 cmd->len);
155146 if (err < 0) {
156
- dev_err(panel->dev,
157
- "failed to write command %u\n", i);
147
+ dev_err(panel->dev, "failed to write command %u\n", i);
158148 goto poweroff;
159149 }
160150
....@@ -165,8 +155,7 @@
165155 */
166156 err = mipi_dsi_dcs_nop(innolux->link);
167157 if (err < 0) {
168
- dev_err(panel->dev,
169
- "failed to send DCS nop: %d\n", err);
158
+ dev_err(panel->dev, "failed to send DCS nop: %d\n", err);
170159 goto poweroff;
171160 }
172161 }
....@@ -174,8 +163,7 @@
174163
175164 err = mipi_dsi_dcs_exit_sleep_mode(innolux->link);
176165 if (err < 0) {
177
- DRM_DEV_ERROR(panel->dev, "failed to exit sleep mode: %d\n",
178
- err);
166
+ dev_err(panel->dev, "failed to exit sleep mode: %d\n", err);
179167 goto poweroff;
180168 }
181169
....@@ -184,8 +172,7 @@
184172
185173 err = mipi_dsi_dcs_set_display_on(innolux->link);
186174 if (err < 0) {
187
- DRM_DEV_ERROR(panel->dev, "failed to set display on: %d\n",
188
- err);
175
+ dev_err(panel->dev, "failed to set display on: %d\n", err);
189176 goto poweroff;
190177 }
191178
....@@ -206,17 +193,9 @@
206193 static int innolux_panel_enable(struct drm_panel *panel)
207194 {
208195 struct innolux_panel *innolux = to_innolux_panel(panel);
209
- int ret;
210196
211197 if (innolux->enabled)
212198 return 0;
213
-
214
- ret = backlight_enable(innolux->backlight);
215
- if (ret) {
216
- DRM_DEV_ERROR(panel->drm->dev,
217
- "Failed to enable backlight %d\n", ret);
218
- return ret;
219
- }
220199
221200 innolux->enabled = true;
222201
....@@ -237,7 +216,6 @@
237216 .vsync_start = 1024 + 20,
238217 .vsync_end = 1024 + 20 + 4,
239218 .vtotal = 1024 + 20 + 4 + 20,
240
- .vrefresh = 60,
241219 };
242220
243221 static const struct panel_desc innolux_p079zca_panel_desc = {
....@@ -271,7 +249,6 @@
271249 .vsync_start = 2048 + 100,
272250 .vsync_end = 2048 + 100 + 2,
273251 .vtotal = 2048 + 100 + 2 + 18,
274
- .vrefresh = 60,
275252 };
276253
277254 /*
....@@ -405,28 +382,27 @@
405382 .sleep_mode_delay = 100, /* T15 */
406383 };
407384
408
-static int innolux_panel_get_modes(struct drm_panel *panel)
385
+static int innolux_panel_get_modes(struct drm_panel *panel,
386
+ struct drm_connector *connector)
409387 {
410388 struct innolux_panel *innolux = to_innolux_panel(panel);
411389 const struct drm_display_mode *m = innolux->desc->mode;
412390 struct drm_display_mode *mode;
413391
414
- mode = drm_mode_duplicate(panel->drm, m);
392
+ mode = drm_mode_duplicate(connector->dev, m);
415393 if (!mode) {
416
- DRM_DEV_ERROR(panel->drm->dev, "failed to add mode %ux%ux@%u\n",
417
- m->hdisplay, m->vdisplay, m->vrefresh);
394
+ dev_err(panel->dev, "failed to add mode %ux%u@%u\n",
395
+ m->hdisplay, m->vdisplay, drm_mode_vrefresh(m));
418396 return -ENOMEM;
419397 }
420398
421399 drm_mode_set_name(mode);
422400
423
- drm_mode_probed_add(panel->connector, mode);
401
+ drm_mode_probed_add(connector, mode);
424402
425
- panel->connector->display_info.width_mm =
426
- innolux->desc->size.width;
427
- panel->connector->display_info.height_mm =
428
- innolux->desc->size.height;
429
- panel->connector->display_info.bpc = innolux->desc->bpc;
403
+ connector->display_info.width_mm = innolux->desc->size.width;
404
+ connector->display_info.height_mm = innolux->desc->size.height;
405
+ connector->display_info.bpc = innolux->desc->bpc;
430406
431407 return 1;
432408 }
....@@ -485,17 +461,14 @@
485461 innolux->enable_gpio = NULL;
486462 }
487463
488
- innolux->backlight = devm_of_find_backlight(dev);
489
- if (IS_ERR(innolux->backlight))
490
- return PTR_ERR(innolux->backlight);
464
+ drm_panel_init(&innolux->base, dev, &innolux_panel_funcs,
465
+ DRM_MODE_CONNECTOR_DSI);
491466
492
- drm_panel_init(&innolux->base);
493
- innolux->base.funcs = &innolux_panel_funcs;
494
- innolux->base.dev = dev;
495
-
496
- err = drm_panel_add(&innolux->base);
497
- if (err < 0)
467
+ err = drm_panel_of_backlight(&innolux->base);
468
+ if (err)
498469 return err;
470
+
471
+ drm_panel_add(&innolux->base);
499472
500473 mipi_dsi_set_drvdata(dsi, innolux);
501474 innolux->link = dsi;
....@@ -505,8 +478,7 @@
505478
506479 static void innolux_panel_del(struct innolux_panel *innolux)
507480 {
508
- if (innolux->base.dev)
509
- drm_panel_remove(&innolux->base);
481
+ drm_panel_remove(&innolux->base);
510482 }
511483
512484 static int innolux_panel_probe(struct mipi_dsi_device *dsi)
....@@ -539,19 +511,17 @@
539511 struct innolux_panel *innolux = mipi_dsi_get_drvdata(dsi);
540512 int err;
541513
542
- err = innolux_panel_unprepare(&innolux->base);
514
+ err = drm_panel_unprepare(&innolux->base);
543515 if (err < 0)
544
- DRM_DEV_ERROR(&dsi->dev, "failed to unprepare panel: %d\n",
545
- err);
516
+ dev_err(&dsi->dev, "failed to unprepare panel: %d\n", err);
546517
547
- err = innolux_panel_disable(&innolux->base);
518
+ err = drm_panel_disable(&innolux->base);
548519 if (err < 0)
549
- DRM_DEV_ERROR(&dsi->dev, "failed to disable panel: %d\n", err);
520
+ dev_err(&dsi->dev, "failed to disable panel: %d\n", err);
550521
551522 err = mipi_dsi_detach(dsi);
552523 if (err < 0)
553
- DRM_DEV_ERROR(&dsi->dev, "failed to detach from DSI host: %d\n",
554
- err);
524
+ dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err);
555525
556526 innolux_panel_del(innolux);
557527
....@@ -562,8 +532,8 @@
562532 {
563533 struct innolux_panel *innolux = mipi_dsi_get_drvdata(dsi);
564534
565
- innolux_panel_unprepare(&innolux->base);
566
- innolux_panel_disable(&innolux->base);
535
+ drm_panel_unprepare(&innolux->base);
536
+ drm_panel_disable(&innolux->base);
567537 }
568538
569539 static struct mipi_dsi_driver innolux_panel_driver = {