From a165956e0b0fb5a34815b4cc13747d92f90a33a0 Mon Sep 17 00:00:00 2001
From: Jerry Han <hanxu5@huaqin.corp-partner.google.com>
Date: Thu, 1 Aug 2019 16:16:08 +0800
Subject: [PATCH 07/10] [v7,2/2] drm/panel: Add Boe Himax8279d MIPI-DSI LCD
 panel

Support Boe Himax8279d 8.0" 1200x1920 TFT LCD panel, it is a MIPI DSI
panel.

V7:
- Add the information of the reviewer
- Remove unnecessary delays, The udelay_range code gracefully returns
    without hitting the scheduler on a delay of 0. (Derek)
- Merge the same data structures, like display_mode and off_cmds (Derek)
- Optimize the processing of results returned by
    devm_gpiod_get_optional (Derek)

V6:
- Add the information of the reviewer (Sam)
- Delete unnecessary header files #include <linux/fb.h> (Sam)
- The config DRM_PANEL_BOE_HIMAX8279D appears twice. Drop one of them (Sam)
- ADD static, set_gpios function is not used outside this module (Sam)

V5:
- Added changelog

V4:
- Frefix all function maes with boe_ (Sam)
- Fsed "enable_gpio" replace "reset_gpio", Make it look clearer (Sam)
- Sort include lines alphabetically (Sam)
- Fixed entries in the makefile must be sorted alphabetically (Sam)
- Add send_mipi_cmds function to avoid duplicating the code (Sam)
- Add the necessary delay(reset_delay_t5) between reset and sending
    the initialization command (Rock wang)

V3:
- Remove unnecessary delays in sending initialization commands (Jitao Shi)

V2:
- Use SPDX identifier (Sam)
- Use necessary header files replace drmP.h (Sam)
- Delete unnecessary header files #include <linux/err.h> (Sam)
- Specifies a GPIOs array to control the reset timing,
    instead of reading "dsi-reset-sequence" data from DTS (Sam)
- Delete backlight_disable() function when already disabled (Sam)
- Use devm_of_find_backlight() replace of_find_backlight_by_node() (Sam)
- Move the necessary data in the DTS to the current file,
    like porch, display_mode and Init code etc. (Sam)
- Add compatible device "boe,himax8279d10p" (Sam)

V1:
- Support Boe Himax8279d 8.0" 1200x1920 TFT LCD panel, it is a MIPI DSI
    panel.

Signed-off-by: Jerry Han <hanxu5@huaqin.corp-partner.google.com>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Reviewed-by: Derek Basehore <dbasehore@chromium.org>
Cc: Jitao Shi <jitao.shi@mediatek.com>
Cc: Rock wang <rock_wang@himax.com.cn>
---
 drivers/gpu/drm/panel/panel-boe-himax8279d.c | 109 ++++++++-----------
 1 file changed, 45 insertions(+), 64 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-boe-himax8279d.c b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
index c050a48487a2..ff5a89e38fd7 100644
--- a/drivers/gpu/drm/panel/panel-boe-himax8279d.c
+++ b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
@@ -130,9 +130,8 @@ static int boe_panel_unprepare(struct drm_panel *panel)
 	/* send off code */
 	err = send_mipi_cmds(panel, pinfo->desc->off_cmds);
 	if (err < 0) {
-		dev_err(panel->dev,
-			"failed to send DCS Off Code: %d\n",
-			err);
+		DRM_DEV_ERROR(panel->dev,
+				"failed to send DCS Off Code: %d\n", err);
 		goto poweroff;
 	}
 
@@ -164,24 +163,20 @@ static int boe_panel_prepare(struct drm_panel *panel)
 	/* reset sequence */
 	usleep_range(desc->reset_delay_t2, 1000 + desc->reset_delay_t2);
 
-	if (desc->reset_delay_t3) {
-		gpiod_set_value(pinfo->enable_gpio, 1);
-		usleep_range(desc->reset_delay_t3, 1000 + desc->reset_delay_t3);
-		gpiod_set_value(pinfo->enable_gpio, 0);
-	}
+	gpiod_set_value(pinfo->enable_gpio, 1);
+	usleep_range(desc->reset_delay_t3, 1000 + desc->reset_delay_t3);
+	gpiod_set_value(pinfo->enable_gpio, 0);
 
 	usleep_range(desc->reset_delay_t4, 1000 + desc->reset_delay_t4);
 	gpiod_set_value(pinfo->enable_gpio, 1);
 
-	if (desc->reset_delay_t5)
-		usleep_range(desc->reset_delay_t5, 1000 + desc->reset_delay_t5);
+	usleep_range(desc->reset_delay_t5, 1000 + desc->reset_delay_t5);
 
 	/* send init code */
 	err = send_mipi_cmds(panel, pinfo->desc->on_cmds);
 	if (err < 0) {
-		dev_err(panel->dev,
-			"failed to send DCS Init Code: %d\n",
-			err);
+		DRM_DEV_ERROR(panel->dev,
+				"failed to send DCS Init Code: %d\n", err);
 		goto poweroff;
 	}
 
@@ -246,8 +241,7 @@ static const struct drm_panel_funcs panel_funcs = {
 	.get_modes = boe_panel_get_modes,
 };
 
-/* 8 inch */
-static const struct drm_display_mode boe_himax8279d8p_display_mode = {
+static const struct drm_display_mode default_display_mode = {
 	.clock = 159420,
 	.hdisplay = 1200,
 	.hsync_start = 1200 + 80,
@@ -260,6 +254,14 @@ static const struct drm_display_mode boe_himax8279d8p_display_mode = {
 	.vrefresh = 60,
 };
 
+static const struct panel_cmd default_off_cmds[] = {
+	_INIT_CMD(0x00, 0x28),
+	_INIT_CMD(0x01, 0x10),
+
+	{},
+};
+
+/* 8 inch */
 static const struct panel_cmd boe_himax8279d8p_on_cmds[] = {
 	_INIT_CMD(0x22, 0x10),
 	_INIT_CMD(0x00, 0xB0, 0x05),
@@ -567,15 +569,8 @@ static const struct panel_cmd boe_himax8279d8p_on_cmds[] = {
 	{},
 };
 
-static const struct panel_cmd boe_himax8279d8p_off_cmds[] = {
-	_INIT_CMD(0x00, 0x28),
-	_INIT_CMD(0x01, 0x10),
-
-	{},
-};
-
 static const struct panel_desc boe_himax8279d8p_panel_desc = {
-	.display_mode = &boe_himax8279d8p_display_mode,
+	.display_mode = &default_display_mode,
 	.bpc = 8,
 	.width_mm = 107,
 	.height_mm = 172,
@@ -589,23 +584,10 @@ static const struct panel_desc boe_himax8279d8p_panel_desc = {
 	.format = MIPI_DSI_FMT_RGB888,
 	.lanes = 4,
 	.on_cmds = boe_himax8279d8p_on_cmds,
-	.off_cmds = boe_himax8279d8p_off_cmds,
+	.off_cmds = default_off_cmds,
 };
 
 /* 10 inch */
-static const struct drm_display_mode boe_himax8279d10p_display_mode = {
-	.clock = 159420,
-	.hdisplay = 1200,
-	.hsync_start = 1200 + 80,
-	.hsync_end = 1200 + 80 + 60,
-	.htotal = 1200 + 80 + 60 + 24,
-	.vdisplay = 1920,
-	.vsync_start = 1920 + 10,
-	.vsync_end = 1920 + 10 + 14,
-	.vtotal = 1920 + 10 + 14 + 4,
-	.vrefresh = 60,
-};
-
 static const struct panel_cmd boe_himax8279d10p_on_cmds[] = {
 	_INIT_CMD(0x00, 0xB0, 0x05),
 	_INIT_CMD(0x00, 0xB1, 0xE5),
@@ -910,15 +892,8 @@ static const struct panel_cmd boe_himax8279d10p_on_cmds[] = {
 	{},
 };
 
-static const struct panel_cmd boe_himax8279d10p_off_cmds[] = {
-	_INIT_CMD(0x00, 0x28),
-	_INIT_CMD(0x01, 0x10),
-
-	{},
-};
-
 static const struct panel_desc boe_himax8279d10p_panel_desc = {
-	.display_mode = &boe_himax8279d10p_display_mode,
+	.display_mode = &default_display_mode,
 	.bpc = 8,
 	.width_mm = 135,
 	.height_mm = 216,
@@ -932,7 +907,7 @@ static const struct panel_desc boe_himax8279d10p_panel_desc = {
 	.format = MIPI_DSI_FMT_RGB888,
 	.lanes = 4,
 	.on_cmds = boe_himax8279d10p_on_cmds,
-	.off_cmds = boe_himax8279d10p_off_cmds,
+	.off_cmds = default_off_cmds,
 };
 
 static const struct of_device_id panel_of_match[] = {
@@ -949,28 +924,34 @@ MODULE_DEVICE_TABLE(of, panel_of_match);
 static int panel_add(struct panel_info *pinfo)
 {
 	struct device *dev = &pinfo->link->dev;
-	int err;
+	int ret;
 
-	pinfo->pp18_gpio = devm_gpiod_get_optional(dev, "pp18", GPIOD_OUT_LOW);
+	pinfo->pp18_gpio = devm_gpiod_get_optional(dev, "pp18", GPIOD_OUT_HIGH);
 	if (IS_ERR(pinfo->pp18_gpio)) {
-		err = PTR_ERR(pinfo->pp18_gpio);
-		dev_err(dev, "failed to get pp18 gpio: %d\n", err);
-		pinfo->pp18_gpio = NULL;
+		ret = PTR_ERR(pinfo->pp18_gpio);
+		if (ret != -EPROBE_DEFER)
+			DRM_DEV_ERROR(dev, "failed to get pp18 gpio: %d\n",
+					ret);
+		return ret;
 	}
 
-	pinfo->pp33_gpio = devm_gpiod_get_optional(dev, "pp33", GPIOD_OUT_LOW);
+	pinfo->pp33_gpio = devm_gpiod_get_optional(dev, "pp33", GPIOD_OUT_HIGH);
 	if (IS_ERR(pinfo->pp33_gpio)) {
-		err = PTR_ERR(pinfo->pp33_gpio);
-		dev_err(dev, "failed to get pp33 gpio: %d\n", err);
-		pinfo->pp33_gpio = NULL;
+		ret = PTR_ERR(pinfo->pp33_gpio);
+		if (ret != -EPROBE_DEFER)
+			DRM_DEV_ERROR(dev, "failed to get pp33 gpio: %d\n",
+					ret);
+		return ret;
 	}
 
 	pinfo->enable_gpio = devm_gpiod_get_optional(dev, "enable",
-						    GPIOD_OUT_LOW);
+							GPIOD_OUT_HIGH);
 	if (IS_ERR(pinfo->enable_gpio)) {
-		err = PTR_ERR(pinfo->enable_gpio);
-		dev_err(dev, "failed to get enable gpio: %d\n", err);
-		pinfo->enable_gpio = NULL;
+		ret = PTR_ERR(pinfo->enable_gpio);
+		if (ret != -EPROBE_DEFER)
+			DRM_DEV_ERROR(dev, "failed to get enable gpio: %d\n",
+					ret);
+		return ret;
 	}
 
 	pinfo->backlight = devm_of_find_backlight(dev);
@@ -981,9 +962,9 @@ static int panel_add(struct panel_info *pinfo)
 	pinfo->base.funcs = &panel_funcs;
 	pinfo->base.dev = &pinfo->link->dev;
 
-	err = drm_panel_add(&pinfo->base);
-	if (err < 0)
-		return err;
+	ret = drm_panel_add(&pinfo->base);
+	if (ret < 0)
+		return ret;
 
 	return 0;
 }
@@ -1028,7 +1009,7 @@ static int panel_remove(struct mipi_dsi_device *dsi)
 	err = boe_panel_unprepare(&pinfo->base);
 	if (err < 0)
 		DRM_DEV_ERROR(&dsi->dev, "failed to unprepare panel: %d\n",
-						err);
+				err);
 
 	err = boe_panel_disable(&pinfo->base);
 	if (err < 0)
@@ -1037,7 +1018,7 @@ static int panel_remove(struct mipi_dsi_device *dsi)
 	err = mipi_dsi_detach(dsi);
 	if (err < 0)
 		DRM_DEV_ERROR(&dsi->dev, "failed to detach from DSI host: %d\n",
-					  err);
+				err);
 
 	drm_panel_detach(&pinfo->base);
 	panel_del(pinfo);
-- 
2.17.1

