]> rtime.felk.cvut.cz Git - vajnamar/linux-xlnx.git/commitdiff
drm: xilinx: sdi: Adding 3G-B support in drm SDI driver
authorSaurabh Sengar <saurabh.singh@xilinx.com>
Fri, 13 Oct 2017 10:12:53 +0000 (15:42 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 17 Oct 2017 10:57:47 +0000 (12:57 +0200)
Adding sdi mode 3G-B support in driver.
3G-B works in PSF modes hence setting the st352 payload
calculation accordingly.

Signed-off-by: Saurabh Sengar <saurabhs@xilinx.com>
Reviewed-by: Hyun Kwon <hyun.kwon@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/gpu/drm/xilinx/xilinx_drm_sdi.c

index f0f80e7bd2676ed1964ef2e8da529ca02238be83..c41d357043e9692616e0fd88def2eaf9d8eb7895 100644 (file)
 #define XST352_PROG_SHIFT                      6
 #define XST352_TRANS_SHIFT                     7
 #define XST352_2048_SHIFT                      BIT(6)
+#define XST352_PSF_MODE                                BIT(6)
 #define ST352_BYTE3                            0x00
 #define ST352_BYTE4                            0x01
 #define INVALID_VALUE                          -1
@@ -345,6 +346,48 @@ static const struct xlnx_sdi_display_config xlnx_sdi_modes[] = {
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
                   .vrefresh = 48, }, {0x8, 0x4},
                   {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 1920x1080i@96Hz */
+       {{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2291,
+                  2383, 2754, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 96, }, {0x8, 0x4},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 1920x1080i@100Hz */
+       {{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
+                  2492, 2640, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 100, }, {0x9, 0x9},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 1920x1080i@120Hz */
+       {{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
+                  2052, 2200, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 120, }, {0xB, 0xA},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 2048x1080i@96Hz */
+       {{ DRM_MODE("2048x1080i", DRM_MODE_TYPE_DRIVER, 148500, 2048, 2377,
+                  2421, 2750, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 96, }, {0x8, 0x4},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 2048x1080i@100Hz */
+       {{ DRM_MODE("2048x1080i", DRM_MODE_TYPE_DRIVER, 148500, 2048, 2322,
+                  2366, 2640, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 100, }, {0x9, 0x9},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
+       /* 3G-B: 2048x1080i@120Hz */
+       {{ DRM_MODE("2048x1080i", DRM_MODE_TYPE_DRIVER, 148500, 2048, 2114,
+                  2134, 2200, 0, 1080, 1084, 1094, 1124, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+                  DRM_MODE_FLAG_INTERLACE),
+                  .vrefresh = 120, }, {0xB, 0xA},
+                  {0x85, 0x85, 0x89, 0x8A, 0xC1, 0xC1} },
        /* 6G: 3840x2160@30Hz */
        {{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
@@ -945,9 +988,13 @@ static u32 xilinx_sdi_calc_st352_payld(struct xilinx_sdi *sdi,
        /* byte 2 calculation */
        is_p = !(mode->flags & DRM_MODE_FLAG_INTERLACE);
        smpl_r = xlnx_sdi_modes[id].st352_byt2[is_frac];
-       byt2 = (is_p << XST352_PROG_SHIFT) | smpl_r;
-       if (mode->vtotal >= 1125)
-               byt2 |= (is_p << XST352_TRANS_SHIFT);
+       if (sdi_mode == XSDI_MODE_3GB) {
+               byt2 = XST352_PSF_MODE | smpl_r;
+       } else {
+               byt2 = (is_p << XST352_PROG_SHIFT) | smpl_r;
+               if (mode->vtotal >= 1125)
+                       byt2 |= (is_p << XST352_TRANS_SHIFT);
+       }
        /* byte 1 calculation */
        byt1 = xlnx_sdi_modes[id].st352_byt1[sdi_mode];