Re: [PATCH v7 4/6] drm/tidss: Add support to configure OLDI mode for am625-dss

2023-02-06 Thread Aradhya Bhatia



On 06-Feb-23 19:12, Tomi Valkeinen wrote:
> On 05/02/2023 15:42, Aradhya Bhatia wrote:
>> Hi Tomi,
>>
>> On 03-Feb-23 20:42, Tomi Valkeinen wrote:
>>> On 25/01/2023 13:35, Aradhya Bhatia wrote:
 The newer version of DSS (AM625-DSS) has 2 OLDI TXes at its disposal.
 These can be configured to support the following modes:

 1. OLDI_SINGLE_LINK_SINGLE_MODE
 Single Output over OLDI 0.
 +--+    +-+  +---+
 |  |    | |  |   |
 | CRTC +--->+ ENCODER +->| PANEL |
 |  |    | |  |   |
 +--+    +-+  +---+

 2. OLDI_SINGLE_LINK_CLONE_MODE
 Duplicate Output over OLDI 0 and 1.
 +--+    +-+  +---+
 |  |    | |  |   |
 | CRTC +---+--->| ENCODER +->| PANEL |
 |  |   |    | |  |   |
 +--+   |    +-+  +---+
  |
  |    +-+  +---+
  |    | |  |   |
  +--->| ENCODER +->| PANEL |
   | |  |   |
   +-+  +---+

 3. OLDI_DUAL_LINK_MODE
 Combined Output over OLDI 0 and 1.
 +--+    +-+  +---+
 |  |    | +->|   |
 | CRTC +--->+ ENCODER |  | PANEL |
 |  |    | +->|   |
 +--+    +-+  +---+

 Following the above pathways for different modes, 2 encoder/panel-bridge
 pipes get created for clone mode, and 1 pipe in cases of single link and
 dual link mode.

 Add support for confguring the OLDI modes using OF and LVDS DRM helper
 functions.

 Signed-off-by: Aradhya Bhatia 
 ---
    drivers/gpu/drm/tidss/tidss_dispc.c   |  24 ++-
    drivers/gpu/drm/tidss/tidss_dispc.h   |  12 ++
    drivers/gpu/drm/tidss/tidss_drv.h |   3 +
    drivers/gpu/drm/tidss/tidss_encoder.c |   4 +-
    drivers/gpu/drm/tidss/tidss_encoder.h |   3 +-
    drivers/gpu/drm/tidss/tidss_kms.c | 221 --
    6 files changed, 245 insertions(+), 22 deletions(-)

 diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c 
 b/drivers/gpu/drm/tidss/tidss_dispc.c
 index b55ccbcaa67f..37a73e309330 100644
 --- a/drivers/gpu/drm/tidss/tidss_dispc.c
 +++ b/drivers/gpu/drm/tidss/tidss_dispc.c
 @@ -88,6 +88,8 @@ const struct dispc_features dispc_k2g_feats = {
      .subrev = DISPC_K2G,
    +    .has_oldi = false,
 +
    .common = "common",
      .common_regs = tidss_k2g_common_regs,
 @@ -166,6 +168,8 @@ const struct dispc_features dispc_am625_feats = {
      .subrev = DISPC_AM625,
    +    .has_oldi = true,
 +
    .common = "common",
    .common_regs = tidss_am65x_common_regs,
    @@ -218,6 +222,8 @@ const struct dispc_features dispc_am65x_feats = {
      .subrev = DISPC_AM65X,
    +    .has_oldi = true,
 +
    .common = "common",
    .common_regs = tidss_am65x_common_regs,
    @@ -309,6 +315,8 @@ const struct dispc_features dispc_j721e_feats = {
      .subrev = DISPC_J721E,
    +    .has_oldi = false,
 +
    .common = "common_m",
    .common_regs = tidss_j721e_common_regs,
    @@ -361,6 +369,8 @@ struct dispc_device {
      struct dss_vp_data vp_data[TIDSS_MAX_VPS];
    +    enum dispc_oldi_modes oldi_mode;
 +
    u32 *fourccs;
    u32 num_fourccs;
    @@ -1963,6 +1973,12 @@ const u32 *dispc_plane_formats(struct 
 dispc_device *dispc, unsigned int *len)
    return dispc->fourccs;
    }
    +void dispc_set_oldi_mode(struct dispc_device *dispc,
 + enum dispc_oldi_modes oldi_mode)
 +{
 +    dispc->oldi_mode = oldi_mode;
 +}
 +
    static s32 pixinc(int pixels, u8 ps)
    {
    if (pixels == 1)
 @@ -2647,7 +2663,7 @@ int dispc_runtime_resume(struct dispc_device *dispc)
    REG_GET(dispc, DSS_SYSSTATUS, 2, 2),
    REG_GET(dispc, DSS_SYSSTATUS, 3, 3));
    -    if (dispc->feat->subrev == DISPC_AM65X)
 +    if (dispc->feat->has_oldi)
    dev_dbg(dispc->dev, "OLDI RESETDONE %d,%d,%d\n",
    REG_GET(dispc, DSS_SYSSTATUS, 5, 5),
    REG_GET(dispc, DSS_SYSSTATUS, 6, 6),
 @@ -2688,7 +2704,7 @@ static int dispc_iomap_resource(struct 
 platform_device *pdev, const char *name,
    return 0;
    }
    -static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,
 +static int dispc_init_am6xx_oldi_io_ctrl(struct device *dev,
     struct dispc_device *dispc)
    {
    dispc->oldi_io_ctrl =
 @@ -2827,8 +2843,8 @@ int dispc_init(struc

Re: [PATCH v7 4/6] drm/tidss: Add support to configure OLDI mode for am625-dss

2023-02-06 Thread Tomi Valkeinen

On 05/02/2023 15:42, Aradhya Bhatia wrote:

Hi Tomi,

On 03-Feb-23 20:42, Tomi Valkeinen wrote:

On 25/01/2023 13:35, Aradhya Bhatia wrote:

The newer version of DSS (AM625-DSS) has 2 OLDI TXes at its disposal.
These can be configured to support the following modes:

1. OLDI_SINGLE_LINK_SINGLE_MODE
Single Output over OLDI 0.
+--+    +-+  +---+
|  |    | |  |   |
| CRTC +--->+ ENCODER +->| PANEL |
|  |    | |  |   |
+--+    +-+  +---+

2. OLDI_SINGLE_LINK_CLONE_MODE
Duplicate Output over OLDI 0 and 1.
+--+    +-+  +---+
|  |    | |  |   |
| CRTC +---+--->| ENCODER +->| PANEL |
|  |   |    | |  |   |
+--+   |    +-+  +---+
     |
     |    +-+  +---+
     |    | |  |   |
     +--->| ENCODER +->| PANEL |
  | |  |   |
  +-+  +---+

3. OLDI_DUAL_LINK_MODE
Combined Output over OLDI 0 and 1.
+--+    +-+  +---+
|  |    | +->|   |
| CRTC +--->+ ENCODER |  | PANEL |
|  |    | +->|   |
+--+    +-+  +---+

Following the above pathways for different modes, 2 encoder/panel-bridge
pipes get created for clone mode, and 1 pipe in cases of single link and
dual link mode.

Add support for confguring the OLDI modes using OF and LVDS DRM helper
functions.

Signed-off-by: Aradhya Bhatia 
---
   drivers/gpu/drm/tidss/tidss_dispc.c   |  24 ++-
   drivers/gpu/drm/tidss/tidss_dispc.h   |  12 ++
   drivers/gpu/drm/tidss/tidss_drv.h |   3 +
   drivers/gpu/drm/tidss/tidss_encoder.c |   4 +-
   drivers/gpu/drm/tidss/tidss_encoder.h |   3 +-
   drivers/gpu/drm/tidss/tidss_kms.c | 221 --
   6 files changed, 245 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c 
b/drivers/gpu/drm/tidss/tidss_dispc.c
index b55ccbcaa67f..37a73e309330 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.c
+++ b/drivers/gpu/drm/tidss/tidss_dispc.c
@@ -88,6 +88,8 @@ const struct dispc_features dispc_k2g_feats = {
     .subrev = DISPC_K2G,
   +    .has_oldi = false,
+
   .common = "common",
     .common_regs = tidss_k2g_common_regs,
@@ -166,6 +168,8 @@ const struct dispc_features dispc_am625_feats = {
     .subrev = DISPC_AM625,
   +    .has_oldi = true,
+
   .common = "common",
   .common_regs = tidss_am65x_common_regs,
   @@ -218,6 +222,8 @@ const struct dispc_features dispc_am65x_feats = {
     .subrev = DISPC_AM65X,
   +    .has_oldi = true,
+
   .common = "common",
   .common_regs = tidss_am65x_common_regs,
   @@ -309,6 +315,8 @@ const struct dispc_features dispc_j721e_feats = {
     .subrev = DISPC_J721E,
   +    .has_oldi = false,
+
   .common = "common_m",
   .common_regs = tidss_j721e_common_regs,
   @@ -361,6 +369,8 @@ struct dispc_device {
     struct dss_vp_data vp_data[TIDSS_MAX_VPS];
   +    enum dispc_oldi_modes oldi_mode;
+
   u32 *fourccs;
   u32 num_fourccs;
   @@ -1963,6 +1973,12 @@ const u32 *dispc_plane_formats(struct dispc_device 
*dispc, unsigned int *len)
   return dispc->fourccs;
   }
   +void dispc_set_oldi_mode(struct dispc_device *dispc,
+ enum dispc_oldi_modes oldi_mode)
+{
+    dispc->oldi_mode = oldi_mode;
+}
+
   static s32 pixinc(int pixels, u8 ps)
   {
   if (pixels == 1)
@@ -2647,7 +2663,7 @@ int dispc_runtime_resume(struct dispc_device *dispc)
   REG_GET(dispc, DSS_SYSSTATUS, 2, 2),
   REG_GET(dispc, DSS_SYSSTATUS, 3, 3));
   -    if (dispc->feat->subrev == DISPC_AM65X)
+    if (dispc->feat->has_oldi)
   dev_dbg(dispc->dev, "OLDI RESETDONE %d,%d,%d\n",
   REG_GET(dispc, DSS_SYSSTATUS, 5, 5),
   REG_GET(dispc, DSS_SYSSTATUS, 6, 6),
@@ -2688,7 +2704,7 @@ static int dispc_iomap_resource(struct platform_device 
*pdev, const char *name,
   return 0;
   }
   -static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,
+static int dispc_init_am6xx_oldi_io_ctrl(struct device *dev,
    struct dispc_device *dispc)
   {
   dispc->oldi_io_ctrl =
@@ -2827,8 +2843,8 @@ int dispc_init(struct tidss_device *tidss)
   dispc->vp_data[i].gamma_table = gamma_table;
   }
   -    if (feat->subrev == DISPC_AM65X) {
-    r = dispc_init_am65x_oldi_io_ctrl(dev, dispc);
+    if (feat->has_oldi) {
+    r = dispc_init_am6xx_oldi_io_ctrl(dev, dispc);
   if (r)
   return r;
   }
diff --git a/drivers/gpu/drm/tidss/tidss_dispc.h 
b/drivers/gpu/drm/tidss/tidss_dispc.h
index 971f2856f015..880bc7de68b3 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.h
+++ b/drivers/gpu/drm/tidss/tidss_dispc.h
@@ -64,6 +64,15 @@ enum dispc_dss_subrevision {
   DISPC_J721E,
   };
   +enum dispc_oldi_

Re: [PATCH v7 4/6] drm/tidss: Add support to configure OLDI mode for am625-dss

2023-02-05 Thread Aradhya Bhatia
Hi Tomi,

On 03-Feb-23 20:42, Tomi Valkeinen wrote:
> On 25/01/2023 13:35, Aradhya Bhatia wrote:
>> The newer version of DSS (AM625-DSS) has 2 OLDI TXes at its disposal.
>> These can be configured to support the following modes:
>>
>> 1. OLDI_SINGLE_LINK_SINGLE_MODE
>> Single Output over OLDI 0.
>> +--+    +-+  +---+
>> |  |    | |  |   |
>> | CRTC +--->+ ENCODER +->| PANEL |
>> |  |    | |  |   |
>> +--+    +-+  +---+
>>
>> 2. OLDI_SINGLE_LINK_CLONE_MODE
>> Duplicate Output over OLDI 0 and 1.
>> +--+    +-+  +---+
>> |  |    | |  |   |
>> | CRTC +---+--->| ENCODER +->| PANEL |
>> |  |   |    | |  |   |
>> +--+   |    +-+  +---+
>>     |
>>     |    +-+  +---+
>>     |    | |  |   |
>>     +--->| ENCODER +->| PANEL |
>>  | |  |   |
>>  +-+  +---+
>>
>> 3. OLDI_DUAL_LINK_MODE
>> Combined Output over OLDI 0 and 1.
>> +--+    +-+  +---+
>> |  |    | +->|   |
>> | CRTC +--->+ ENCODER |  | PANEL |
>> |  |    | +->|   |
>> +--+    +-+  +---+
>>
>> Following the above pathways for different modes, 2 encoder/panel-bridge
>> pipes get created for clone mode, and 1 pipe in cases of single link and
>> dual link mode.
>>
>> Add support for confguring the OLDI modes using OF and LVDS DRM helper
>> functions.
>>
>> Signed-off-by: Aradhya Bhatia 
>> ---
>>   drivers/gpu/drm/tidss/tidss_dispc.c   |  24 ++-
>>   drivers/gpu/drm/tidss/tidss_dispc.h   |  12 ++
>>   drivers/gpu/drm/tidss/tidss_drv.h |   3 +
>>   drivers/gpu/drm/tidss/tidss_encoder.c |   4 +-
>>   drivers/gpu/drm/tidss/tidss_encoder.h |   3 +-
>>   drivers/gpu/drm/tidss/tidss_kms.c | 221 --
>>   6 files changed, 245 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c 
>> b/drivers/gpu/drm/tidss/tidss_dispc.c
>> index b55ccbcaa67f..37a73e309330 100644
>> --- a/drivers/gpu/drm/tidss/tidss_dispc.c
>> +++ b/drivers/gpu/drm/tidss/tidss_dispc.c
>> @@ -88,6 +88,8 @@ const struct dispc_features dispc_k2g_feats = {
>>     .subrev = DISPC_K2G,
>>   +    .has_oldi = false,
>> +
>>   .common = "common",
>>     .common_regs = tidss_k2g_common_regs,
>> @@ -166,6 +168,8 @@ const struct dispc_features dispc_am625_feats = {
>>     .subrev = DISPC_AM625,
>>   +    .has_oldi = true,
>> +
>>   .common = "common",
>>   .common_regs = tidss_am65x_common_regs,
>>   @@ -218,6 +222,8 @@ const struct dispc_features dispc_am65x_feats = {
>>     .subrev = DISPC_AM65X,
>>   +    .has_oldi = true,
>> +
>>   .common = "common",
>>   .common_regs = tidss_am65x_common_regs,
>>   @@ -309,6 +315,8 @@ const struct dispc_features dispc_j721e_feats = {
>>     .subrev = DISPC_J721E,
>>   +    .has_oldi = false,
>> +
>>   .common = "common_m",
>>   .common_regs = tidss_j721e_common_regs,
>>   @@ -361,6 +369,8 @@ struct dispc_device {
>>     struct dss_vp_data vp_data[TIDSS_MAX_VPS];
>>   +    enum dispc_oldi_modes oldi_mode;
>> +
>>   u32 *fourccs;
>>   u32 num_fourccs;
>>   @@ -1963,6 +1973,12 @@ const u32 *dispc_plane_formats(struct dispc_device 
>> *dispc, unsigned int *len)
>>   return dispc->fourccs;
>>   }
>>   +void dispc_set_oldi_mode(struct dispc_device *dispc,
>> + enum dispc_oldi_modes oldi_mode)
>> +{
>> +    dispc->oldi_mode = oldi_mode;
>> +}
>> +
>>   static s32 pixinc(int pixels, u8 ps)
>>   {
>>   if (pixels == 1)
>> @@ -2647,7 +2663,7 @@ int dispc_runtime_resume(struct dispc_device *dispc)
>>   REG_GET(dispc, DSS_SYSSTATUS, 2, 2),
>>   REG_GET(dispc, DSS_SYSSTATUS, 3, 3));
>>   -    if (dispc->feat->subrev == DISPC_AM65X)
>> +    if (dispc->feat->has_oldi)
>>   dev_dbg(dispc->dev, "OLDI RESETDONE %d,%d,%d\n",
>>   REG_GET(dispc, DSS_SYSSTATUS, 5, 5),
>>   REG_GET(dispc, DSS_SYSSTATUS, 6, 6),
>> @@ -2688,7 +2704,7 @@ static int dispc_iomap_resource(struct platform_device 
>> *pdev, const char *name,
>>   return 0;
>>   }
>>   -static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,
>> +static int dispc_init_am6xx_oldi_io_ctrl(struct device *dev,
>>    struct dispc_device *dispc)
>>   {
>>   dispc->oldi_io_ctrl =
>> @@ -2827,8 +2843,8 @@ int dispc_init(struct tidss_device *tidss)
>>   dispc->vp_data[i].gamma_table = gamma_table;
>>   }
>>   -    if (feat->subrev == DISPC_AM65X) {
>> -    r = dispc_init_am65x_oldi_io_ctrl(dev, dispc);
>> +    if (feat->has_oldi) {
>> +    r = dispc_init_am6xx_oldi_io_ctrl(dev, dispc);
>>   if (r)
>>   return r;
>>   }
>> diff --git a/drivers/gpu/drm/tidss/tidss_

Re: [PATCH v7 4/6] drm/tidss: Add support to configure OLDI mode for am625-dss

2023-02-03 Thread Tomi Valkeinen

On 25/01/2023 13:35, Aradhya Bhatia wrote:

The newer version of DSS (AM625-DSS) has 2 OLDI TXes at its disposal.
These can be configured to support the following modes:

1. OLDI_SINGLE_LINK_SINGLE_MODE
Single Output over OLDI 0.
+--++-+  +---+
|  || |  |   |
| CRTC +--->+ ENCODER +->| PANEL |
|  || |  |   |
+--++-+  +---+

2. OLDI_SINGLE_LINK_CLONE_MODE
Duplicate Output over OLDI 0 and 1.
+--++-+  +---+
|  || |  |   |
| CRTC +---+--->| ENCODER +->| PANEL |
|  |   || |  |   |
+--+   |+-+  +---+
|
|+-+  +---+
|| |  |   |
+--->| ENCODER +->| PANEL |
 | |  |   |
 +-+  +---+

3. OLDI_DUAL_LINK_MODE
Combined Output over OLDI 0 and 1.
+--++-+  +---+
|  || +->|   |
| CRTC +--->+ ENCODER |  | PANEL |
|  || +->|   |
+--++-+  +---+

Following the above pathways for different modes, 2 encoder/panel-bridge
pipes get created for clone mode, and 1 pipe in cases of single link and
dual link mode.

Add support for confguring the OLDI modes using OF and LVDS DRM helper
functions.

Signed-off-by: Aradhya Bhatia 
---
  drivers/gpu/drm/tidss/tidss_dispc.c   |  24 ++-
  drivers/gpu/drm/tidss/tidss_dispc.h   |  12 ++
  drivers/gpu/drm/tidss/tidss_drv.h |   3 +
  drivers/gpu/drm/tidss/tidss_encoder.c |   4 +-
  drivers/gpu/drm/tidss/tidss_encoder.h |   3 +-
  drivers/gpu/drm/tidss/tidss_kms.c | 221 --
  6 files changed, 245 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c 
b/drivers/gpu/drm/tidss/tidss_dispc.c
index b55ccbcaa67f..37a73e309330 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.c
+++ b/drivers/gpu/drm/tidss/tidss_dispc.c
@@ -88,6 +88,8 @@ const struct dispc_features dispc_k2g_feats = {
  
  	.subrev = DISPC_K2G,
  
+	.has_oldi = false,

+
.common = "common",
  
  	.common_regs = tidss_k2g_common_regs,

@@ -166,6 +168,8 @@ const struct dispc_features dispc_am625_feats = {
  
  	.subrev = DISPC_AM625,
  
+	.has_oldi = true,

+
.common = "common",
.common_regs = tidss_am65x_common_regs,
  
@@ -218,6 +222,8 @@ const struct dispc_features dispc_am65x_feats = {
  
  	.subrev = DISPC_AM65X,
  
+	.has_oldi = true,

+
.common = "common",
.common_regs = tidss_am65x_common_regs,
  
@@ -309,6 +315,8 @@ const struct dispc_features dispc_j721e_feats = {
  
  	.subrev = DISPC_J721E,
  
+	.has_oldi = false,

+
.common = "common_m",
.common_regs = tidss_j721e_common_regs,
  
@@ -361,6 +369,8 @@ struct dispc_device {
  
  	struct dss_vp_data vp_data[TIDSS_MAX_VPS];
  
+	enum dispc_oldi_modes oldi_mode;

+
u32 *fourccs;
u32 num_fourccs;
  
@@ -1963,6 +1973,12 @@ const u32 *dispc_plane_formats(struct dispc_device *dispc, unsigned int *len)

return dispc->fourccs;
  }
  
+void dispc_set_oldi_mode(struct dispc_device *dispc,

+enum dispc_oldi_modes oldi_mode)
+{
+   dispc->oldi_mode = oldi_mode;
+}
+
  static s32 pixinc(int pixels, u8 ps)
  {
if (pixels == 1)
@@ -2647,7 +2663,7 @@ int dispc_runtime_resume(struct dispc_device *dispc)
REG_GET(dispc, DSS_SYSSTATUS, 2, 2),
REG_GET(dispc, DSS_SYSSTATUS, 3, 3));
  
-	if (dispc->feat->subrev == DISPC_AM65X)

+   if (dispc->feat->has_oldi)
dev_dbg(dispc->dev, "OLDI RESETDONE %d,%d,%d\n",
REG_GET(dispc, DSS_SYSSTATUS, 5, 5),
REG_GET(dispc, DSS_SYSSTATUS, 6, 6),
@@ -2688,7 +2704,7 @@ static int dispc_iomap_resource(struct platform_device 
*pdev, const char *name,
return 0;
  }
  
-static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,

+static int dispc_init_am6xx_oldi_io_ctrl(struct device *dev,
 struct dispc_device *dispc)
  {
dispc->oldi_io_ctrl =
@@ -2827,8 +2843,8 @@ int dispc_init(struct tidss_device *tidss)
dispc->vp_data[i].gamma_table = gamma_table;
}
  
-	if (feat->subrev == DISPC_AM65X) {

-   r = dispc_init_am65x_oldi_io_ctrl(dev, dispc);
+   if (feat->has_oldi) {
+   r = dispc_init_am6xx_oldi_io_ctrl(dev, dispc);
if (r)
return r;
}
diff --git a/drivers/gpu/drm/tidss/tidss_dispc.h 
b/drivers/gpu/drm/tidss/tidss_dispc.h
index 971f2856f015..880bc7de68b3 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.h
+++ b/drivers/gpu/drm/tidss/tidss_dispc.h
@@ -64,6 +64,15 @@ enum dispc_dss_subrevision {
DISPC_J721E,
  };
  
+enum dispc_oldi_modes {

+   OLDI_MODE

[PATCH v7 4/6] drm/tidss: Add support to configure OLDI mode for am625-dss

2023-01-25 Thread Aradhya Bhatia
The newer version of DSS (AM625-DSS) has 2 OLDI TXes at its disposal.
These can be configured to support the following modes:

1. OLDI_SINGLE_LINK_SINGLE_MODE
Single Output over OLDI 0.
+--++-+  +---+
|  || |  |   |
| CRTC +--->+ ENCODER +->| PANEL |
|  || |  |   |
+--++-+  +---+

2. OLDI_SINGLE_LINK_CLONE_MODE
Duplicate Output over OLDI 0 and 1.
+--++-+  +---+
|  || |  |   |
| CRTC +---+--->| ENCODER +->| PANEL |
|  |   || |  |   |
+--+   |+-+  +---+
   |
   |+-+  +---+
   || |  |   |
   +--->| ENCODER +->| PANEL |
| |  |   |
+-+  +---+

3. OLDI_DUAL_LINK_MODE
Combined Output over OLDI 0 and 1.
+--++-+  +---+
|  || +->|   |
| CRTC +--->+ ENCODER |  | PANEL |
|  || +->|   |
+--++-+  +---+

Following the above pathways for different modes, 2 encoder/panel-bridge
pipes get created for clone mode, and 1 pipe in cases of single link and
dual link mode.

Add support for confguring the OLDI modes using OF and LVDS DRM helper
functions.

Signed-off-by: Aradhya Bhatia 
---
 drivers/gpu/drm/tidss/tidss_dispc.c   |  24 ++-
 drivers/gpu/drm/tidss/tidss_dispc.h   |  12 ++
 drivers/gpu/drm/tidss/tidss_drv.h |   3 +
 drivers/gpu/drm/tidss/tidss_encoder.c |   4 +-
 drivers/gpu/drm/tidss/tidss_encoder.h |   3 +-
 drivers/gpu/drm/tidss/tidss_kms.c | 221 --
 6 files changed, 245 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c 
b/drivers/gpu/drm/tidss/tidss_dispc.c
index b55ccbcaa67f..37a73e309330 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.c
+++ b/drivers/gpu/drm/tidss/tidss_dispc.c
@@ -88,6 +88,8 @@ const struct dispc_features dispc_k2g_feats = {
 
.subrev = DISPC_K2G,
 
+   .has_oldi = false,
+
.common = "common",
 
.common_regs = tidss_k2g_common_regs,
@@ -166,6 +168,8 @@ const struct dispc_features dispc_am625_feats = {
 
.subrev = DISPC_AM625,
 
+   .has_oldi = true,
+
.common = "common",
.common_regs = tidss_am65x_common_regs,
 
@@ -218,6 +222,8 @@ const struct dispc_features dispc_am65x_feats = {
 
.subrev = DISPC_AM65X,
 
+   .has_oldi = true,
+
.common = "common",
.common_regs = tidss_am65x_common_regs,
 
@@ -309,6 +315,8 @@ const struct dispc_features dispc_j721e_feats = {
 
.subrev = DISPC_J721E,
 
+   .has_oldi = false,
+
.common = "common_m",
.common_regs = tidss_j721e_common_regs,
 
@@ -361,6 +369,8 @@ struct dispc_device {
 
struct dss_vp_data vp_data[TIDSS_MAX_VPS];
 
+   enum dispc_oldi_modes oldi_mode;
+
u32 *fourccs;
u32 num_fourccs;
 
@@ -1963,6 +1973,12 @@ const u32 *dispc_plane_formats(struct dispc_device 
*dispc, unsigned int *len)
return dispc->fourccs;
 }
 
+void dispc_set_oldi_mode(struct dispc_device *dispc,
+enum dispc_oldi_modes oldi_mode)
+{
+   dispc->oldi_mode = oldi_mode;
+}
+
 static s32 pixinc(int pixels, u8 ps)
 {
if (pixels == 1)
@@ -2647,7 +2663,7 @@ int dispc_runtime_resume(struct dispc_device *dispc)
REG_GET(dispc, DSS_SYSSTATUS, 2, 2),
REG_GET(dispc, DSS_SYSSTATUS, 3, 3));
 
-   if (dispc->feat->subrev == DISPC_AM65X)
+   if (dispc->feat->has_oldi)
dev_dbg(dispc->dev, "OLDI RESETDONE %d,%d,%d\n",
REG_GET(dispc, DSS_SYSSTATUS, 5, 5),
REG_GET(dispc, DSS_SYSSTATUS, 6, 6),
@@ -2688,7 +2704,7 @@ static int dispc_iomap_resource(struct platform_device 
*pdev, const char *name,
return 0;
 }
 
-static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,
+static int dispc_init_am6xx_oldi_io_ctrl(struct device *dev,
 struct dispc_device *dispc)
 {
dispc->oldi_io_ctrl =
@@ -2827,8 +2843,8 @@ int dispc_init(struct tidss_device *tidss)
dispc->vp_data[i].gamma_table = gamma_table;
}
 
-   if (feat->subrev == DISPC_AM65X) {
-   r = dispc_init_am65x_oldi_io_ctrl(dev, dispc);
+   if (feat->has_oldi) {
+   r = dispc_init_am6xx_oldi_io_ctrl(dev, dispc);
if (r)
return r;
}
diff --git a/drivers/gpu/drm/tidss/tidss_dispc.h 
b/drivers/gpu/drm/tidss/tidss_dispc.h
index 971f2856f015..880bc7de68b3 100644
--- a/drivers/gpu/drm/tidss/tidss_dispc.h
+++ b/drivers/gpu/drm/tidss/tidss_dispc.h
@@ -64,6 +64,15 @@ enum dispc_dss_subrevision {
DISPC_J721E,
 };
 
+enum dispc_oldi_modes {
+   OLDI_MODE_SINGLE_LINK,