hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Ilitek ILI9322 TFT LCD drm_panel driver.
34 *
....@@ -16,19 +17,12 @@
1617 *
1718 * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org>
1819 * Derived from drivers/drm/gpu/panel/panel-samsung-ld9040.c
19
- *
20
- * This program is free software; you can redistribute it and/or modify
21
- * it under the terms of the GNU General Public License version 2 as
22
- * published by the Free Software Foundation.
2320 */
2421
25
-#include <drm/drmP.h>
26
-#include <drm/drm_panel.h>
27
-
28
-#include <linux/of_device.h>
2922 #include <linux/bitops.h>
3023 #include <linux/gpio/consumer.h>
3124 #include <linux/module.h>
25
+#include <linux/of_device.h>
3226 #include <linux/regmap.h>
3327 #include <linux/regulator/consumer.h>
3428 #include <linux/spi/spi.h>
....@@ -36,6 +30,9 @@
3630 #include <video/mipi_display.h>
3731 #include <video/of_videomode.h>
3832 #include <video/videomode.h>
33
+
34
+#include <drm/drm_modes.h>
35
+#include <drm/drm_panel.h>
3936
4037 #define ILI9322_CHIP_ID 0x00
4138 #define ILI9322_CHIP_ID_MAGIC 0x96
....@@ -351,7 +348,6 @@
351348
352349 static int ili9322_init(struct drm_panel *panel, struct ili9322 *ili)
353350 {
354
- struct drm_connector *connector = panel->connector;
355351 u8 reg;
356352 int ret;
357353 int i;
....@@ -382,7 +378,7 @@
382378 "can't set up VCOM amplitude (%d)\n", ret);
383379 return ret;
384380 }
385
- };
381
+ }
386382
387383 if (ili->vcom_high != U8_MAX) {
388384 ret = regmap_write(ili->regmap, ILI9322_VCOM_HIGH,
....@@ -391,7 +387,7 @@
391387 dev_err(ili->dev, "can't set up VCOM high (%d)\n", ret);
392388 return ret;
393389 }
394
- };
390
+ }
395391
396392 /* Set up gamma correction */
397393 for (i = 0; i < ARRAY_SIZE(ili->gamma); i++) {
....@@ -409,23 +405,11 @@
409405 * Polarity and inverted color order for RGB input.
410406 * None of this applies in the BT.656 mode.
411407 */
412
- if (ili->conf->dclk_active_high) {
408
+ reg = 0;
409
+ if (ili->conf->dclk_active_high)
413410 reg = ILI9322_POL_DCLK;
414
- connector->display_info.bus_flags |=
415
- DRM_BUS_FLAG_PIXDATA_POSEDGE;
416
- } else {
417
- reg = 0;
418
- connector->display_info.bus_flags |=
419
- DRM_BUS_FLAG_PIXDATA_NEGEDGE;
420
- }
421
- if (ili->conf->de_active_high) {
411
+ if (ili->conf->de_active_high)
422412 reg |= ILI9322_POL_DE;
423
- connector->display_info.bus_flags |=
424
- DRM_BUS_FLAG_DE_HIGH;
425
- } else {
426
- connector->display_info.bus_flags |=
427
- DRM_BUS_FLAG_DE_LOW;
428
- }
429413 if (ili->conf->hsync_active_high)
430414 reg |= ILI9322_POL_HSYNC;
431415 if (ili->conf->vsync_active_high)
....@@ -555,7 +539,7 @@
555539
556540 /* Serial RGB modes */
557541 static const struct drm_display_mode srgb_320x240_mode = {
558
- .clock = 2453500,
542
+ .clock = 24535,
559543 .hdisplay = 320,
560544 .hsync_start = 320 + 359,
561545 .hsync_end = 320 + 359 + 1,
....@@ -564,12 +548,11 @@
564548 .vsync_start = 240 + 4,
565549 .vsync_end = 240 + 4 + 1,
566550 .vtotal = 262,
567
- .vrefresh = 60,
568551 .flags = 0,
569552 };
570553
571554 static const struct drm_display_mode srgb_360x240_mode = {
572
- .clock = 2700000,
555
+ .clock = 27000,
573556 .hdisplay = 360,
574557 .hsync_start = 360 + 35,
575558 .hsync_end = 360 + 35 + 1,
....@@ -578,13 +561,12 @@
578561 .vsync_start = 240 + 21,
579562 .vsync_end = 240 + 21 + 1,
580563 .vtotal = 262,
581
- .vrefresh = 60,
582564 .flags = 0,
583565 };
584566
585567 /* This is the only mode listed for parallel RGB in the datasheet */
586568 static const struct drm_display_mode prgb_320x240_mode = {
587
- .clock = 6400000,
569
+ .clock = 64000,
588570 .hdisplay = 320,
589571 .hsync_start = 320 + 38,
590572 .hsync_end = 320 + 38 + 1,
....@@ -593,13 +575,12 @@
593575 .vsync_start = 240 + 4,
594576 .vsync_end = 240 + 4 + 1,
595577 .vtotal = 262,
596
- .vrefresh = 60,
597578 .flags = 0,
598579 };
599580
600581 /* YUV modes */
601582 static const struct drm_display_mode yuv_640x320_mode = {
602
- .clock = 2454000,
583
+ .clock = 24540,
603584 .hdisplay = 640,
604585 .hsync_start = 640 + 252,
605586 .hsync_end = 640 + 252 + 1,
....@@ -608,12 +589,11 @@
608589 .vsync_start = 320 + 4,
609590 .vsync_end = 320 + 4 + 1,
610591 .vtotal = 320 + 4 + 1 + 18,
611
- .vrefresh = 60,
612592 .flags = 0,
613593 };
614594
615595 static const struct drm_display_mode yuv_720x360_mode = {
616
- .clock = 2700000,
596
+ .clock = 27000,
617597 .hdisplay = 720,
618598 .hsync_start = 720 + 252,
619599 .hsync_end = 720 + 252 + 1,
....@@ -622,13 +602,12 @@
622602 .vsync_start = 360 + 4,
623603 .vsync_end = 360 + 4 + 1,
624604 .vtotal = 360 + 4 + 1 + 18,
625
- .vrefresh = 60,
626605 .flags = 0,
627606 };
628607
629608 /* BT.656 VGA mode, 640x480 */
630609 static const struct drm_display_mode itu_r_bt_656_640_mode = {
631
- .clock = 2454000,
610
+ .clock = 24540,
632611 .hdisplay = 640,
633612 .hsync_start = 640 + 3,
634613 .hsync_end = 640 + 3 + 1,
....@@ -637,13 +616,12 @@
637616 .vsync_start = 480 + 4,
638617 .vsync_end = 480 + 4 + 1,
639618 .vtotal = 500,
640
- .vrefresh = 60,
641619 .flags = 0,
642620 };
643621
644622 /* BT.656 D1 mode 720x480 */
645623 static const struct drm_display_mode itu_r_bt_656_720_mode = {
646
- .clock = 2700000,
624
+ .clock = 27000,
647625 .hdisplay = 720,
648626 .hsync_start = 720 + 3,
649627 .hsync_end = 720 + 3 + 1,
....@@ -652,50 +630,59 @@
652630 .vsync_start = 480 + 4,
653631 .vsync_end = 480 + 4 + 1,
654632 .vtotal = 500,
655
- .vrefresh = 60,
656633 .flags = 0,
657634 };
658635
659
-static int ili9322_get_modes(struct drm_panel *panel)
636
+static int ili9322_get_modes(struct drm_panel *panel,
637
+ struct drm_connector *connector)
660638 {
661
- struct drm_connector *connector = panel->connector;
662639 struct ili9322 *ili = panel_to_ili9322(panel);
640
+ struct drm_device *drm = connector->dev;
663641 struct drm_display_mode *mode;
642
+ struct drm_display_info *info;
664643
665
- strncpy(connector->display_info.name, "ILI9322 TFT LCD driver\0",
666
- DRM_DISPLAY_INFO_LEN);
667
- connector->display_info.width_mm = ili->conf->width_mm;
668
- connector->display_info.height_mm = ili->conf->height_mm;
644
+ info = &connector->display_info;
645
+ info->width_mm = ili->conf->width_mm;
646
+ info->height_mm = ili->conf->height_mm;
647
+ if (ili->conf->dclk_active_high)
648
+ info->bus_flags |= DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE;
649
+ else
650
+ info->bus_flags |= DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE;
651
+
652
+ if (ili->conf->de_active_high)
653
+ info->bus_flags |= DRM_BUS_FLAG_DE_HIGH;
654
+ else
655
+ info->bus_flags |= DRM_BUS_FLAG_DE_LOW;
669656
670657 switch (ili->input) {
671658 case ILI9322_INPUT_SRGB_DUMMY_320X240:
672
- mode = drm_mode_duplicate(panel->drm, &srgb_320x240_mode);
659
+ mode = drm_mode_duplicate(drm, &srgb_320x240_mode);
673660 break;
674661 case ILI9322_INPUT_SRGB_DUMMY_360X240:
675
- mode = drm_mode_duplicate(panel->drm, &srgb_360x240_mode);
662
+ mode = drm_mode_duplicate(drm, &srgb_360x240_mode);
676663 break;
677664 case ILI9322_INPUT_PRGB_THROUGH:
678665 case ILI9322_INPUT_PRGB_ALIGNED:
679
- mode = drm_mode_duplicate(panel->drm, &prgb_320x240_mode);
666
+ mode = drm_mode_duplicate(drm, &prgb_320x240_mode);
680667 break;
681668 case ILI9322_INPUT_YUV_640X320_YCBCR:
682
- mode = drm_mode_duplicate(panel->drm, &yuv_640x320_mode);
669
+ mode = drm_mode_duplicate(drm, &yuv_640x320_mode);
683670 break;
684671 case ILI9322_INPUT_YUV_720X360_YCBCR:
685
- mode = drm_mode_duplicate(panel->drm, &yuv_720x360_mode);
672
+ mode = drm_mode_duplicate(drm, &yuv_720x360_mode);
686673 break;
687674 case ILI9322_INPUT_ITU_R_BT656_720X360_YCBCR:
688
- mode = drm_mode_duplicate(panel->drm, &itu_r_bt_656_720_mode);
675
+ mode = drm_mode_duplicate(drm, &itu_r_bt_656_720_mode);
689676 break;
690677 case ILI9322_INPUT_ITU_R_BT656_640X320_YCBCR:
691
- mode = drm_mode_duplicate(panel->drm, &itu_r_bt_656_640_mode);
678
+ mode = drm_mode_duplicate(drm, &itu_r_bt_656_640_mode);
692679 break;
693680 default:
694681 mode = NULL;
695682 break;
696683 }
697684 if (!mode) {
698
- DRM_ERROR("bad mode or failed to add mode\n");
685
+ dev_err(panel->dev, "bad mode or failed to add mode\n");
699686 return -EINVAL;
700687 }
701688 drm_mode_set_name(mode);
....@@ -901,11 +888,12 @@
901888 ili->input = ili->conf->input;
902889 }
903890
904
- drm_panel_init(&ili->panel);
905
- ili->panel.dev = dev;
906
- ili->panel.funcs = &ili9322_drm_funcs;
891
+ drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
892
+ DRM_MODE_CONNECTOR_DPI);
907893
908
- return drm_panel_add(&ili->panel);
894
+ drm_panel_add(&ili->panel);
895
+
896
+ return 0;
909897 }
910898
911899 static int ili9322_remove(struct spi_device *spi)