From b086c3e1c07123735c46c4ebae2b7020ccb74f77 Mon Sep 17 00:00:00 2001
From: Sandy Huang <hjc@rock-chips.com>
Date: Thu, 20 Dec 2018 11:11:52 +0800
Subject: [PATCH] drm/panel: panel-simple: add support multi panel timing

Change-Id: I3c0da51de1d9ea1fb20f88a0453057bac818686e
Signed-off-by: Sandy Huang <hjc@rock-chips.com>
---
 drivers/gpu/drm/panel/panel-simple.c | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 1c4a2ca..62dc751 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -474,8 +474,8 @@ static int panel_simple_of_get_native_mode(struct panel_simple *panel)
 	struct drm_connector *connector = panel->base.connector;
 	struct drm_device *drm = panel->base.drm;
 	struct drm_display_mode *mode;
-	struct device_node *timings_np;
-	int ret;
+	struct device_node *timings_np, *child_np;
+	int ret, num_modes = 0;
 
 	timings_np = of_get_child_by_name(panel->dev->of_node,
 					  "display-timings");
@@ -484,24 +484,28 @@ static int panel_simple_of_get_native_mode(struct panel_simple *panel)
 		return 0;
 	}
 
-	of_node_put(timings_np);
-	mode = drm_mode_create(drm);
-	if (!mode)
-		return 0;
+	for_each_available_child_of_node(timings_np, child_np) {
+		mode = drm_mode_create(drm);
+		if (!mode)
+			return 0;
+
+		ret = of_get_drm_display_mode(panel->dev->of_node, mode, num_modes);
+		if (ret) {
+			dev_dbg(panel->dev, "failed to find dts display timings\n");
+			drm_mode_destroy(drm, mode);
+			return 0;
+		}
 
-	ret = of_get_drm_display_mode(panel->dev->of_node, mode,
-				      OF_USE_NATIVE_MODE);
-	if (ret) {
-		dev_dbg(panel->dev, "failed to find dts display timings\n");
-		drm_mode_destroy(drm, mode);
-		return 0;
+		drm_mode_set_name(mode);
+		mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+		drm_mode_probed_add(connector, mode);
+
+		num_modes++;
 	}
 
-	drm_mode_set_name(mode);
-	mode->type |= DRM_MODE_TYPE_PREFERRED;
-	drm_mode_probed_add(connector, mode);
+	of_node_put(timings_np);
 
-	return 1;
+	return num_modes;
 }
 
 static int panel_simple_regulator_enable(struct drm_panel *panel)
-- 
2.7.4

