$NetBSD$

--- a/drivers/video/bridge/anx6345.c
+++ b/drivers/video/bridge/anx6345.c
@@ -3,6 +3,8 @@
  * Copyright (C) 2017 Vasily Khoruzhick <anarsoul@gmail.com>
  */
 
+#define DEBUG
+
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
@@ -248,13 +250,77 @@ static int anx6345_read_dpcd(struct udev
 	return 0;
 }
 
+static u8 pinebook14_edid[] = {
+	/* Header */
+	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+	/* ID Manufacturer Name */
+	0x09, 0xe5,
+	/* ID Product Code */
+	0x37, 0x00,
+	/* 32-bit serial No. */
+	0x00, 0x00, 0x00, 0x00,
+	/* Week of manufacture */
+	0x01,
+	/* Year of manufacture */
+	0x16,
+	/* EDID Structure Ver. */
+	0x01,
+	/* EDID revision # */
+	0x04,
+	/* Video input definition */
+	0x80,
+	/* Max H image size */
+	0x1f,
+	/* Max V image size */
+	0x11,
+	/* Display Gamma */
+	0x78,
+	/* Feature support */
+	0x0a,
+	/* Color bits */
+	0xb0, 0x90, 0x97, 0x58, 0x54, 0x92, 0x26, 0x1d, 0x50, 0x54,
+	/* Established timings */
+	0x00, 0x00, 0x00,
+	/* Standard timings */
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	0x01, 0x01,
+	/* Detailed timing/monitor descriptor #1 */
+	0x3e, 0x1c, 0x56, 0xa0, 0x50, 0x00, 0x16, 0x30,
+	0x30, 0x20, 0x36, 0x00, 0x35, 0xad, 0x10, 0x00,
+	0x00, 0x1a,
+	/* Detailed timing/monitor descriptor #2 */
+	0x3e, 0x1c, 0x56, 0xa0, 0x50, 0x00, 0x16, 0x30,
+	0x30, 0x20, 0x36, 0x00, 0x35, 0xad, 0x10, 0x00,
+	0x00, 0x1a,
+	/* Detailed timing/monitor descriptor #3 */
+	0x00, 0x00, 0x00, 0xfe, 0x00, 0x42, 0x4f, 0x45,
+	0x20, 0x48, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20,
+	/* Detailed timing/monitor descriptor #4 */
+	0x00, 0x00, 0x00, 0xfe, 0x00, 0x48, 0x42, 0x31,
+	0x34, 0x30, 0x57, 0x58, 0x31, 0x2d, 0x35, 0x30,
+	0x31, 0x0a,
+	/* Extension flag */
+	0x00,
+	/* Checksum */
+	0x81
+};
+
 static int anx6345_read_edid(struct udevice *dev, u8 *buf, int size)
 {
-	struct anx6345_priv *priv = dev_get_priv(dev);
-
 	if (size > EDID_SIZE)
 		size = EDID_SIZE;
-	memcpy(buf, priv->edid, size);
+
+	if (anx6345_read_aux_i2c(dev, 0x50, 0x0, size, buf) != 0) {
+		debug("%s: EDID read failed, using static EDID\n", __func__);
+		memcpy(buf, pinebook14_edid, size);
+	}
 
 	return size;
 }
@@ -268,7 +334,7 @@ static int anx6345_attach(struct udevice
 static int anx6345_enable(struct udevice *dev)
 {
 	u8 chipid, colordepth, lanes, data_rate, c;
-	int ret, i, bpp;
+	int ret, i;
 	struct display_timing timing;
 	struct anx6345_priv *priv = dev_get_priv(dev);
 
@@ -336,27 +402,19 @@ static int anx6345_enable(struct udevice
 	anx6345_write_r0(dev, ANX9804_HDCP_CONTROL_0_REG, 0x00);
 	anx6345_write_r0(dev, 0xa7, 0x00);
 
-	anx6345_read_aux_i2c(dev, 0x50, 0x0, EDID_SIZE, priv->edid);
-	if (edid_get_timing(priv->edid, EDID_SIZE, &timing, &bpp) != 0) {
-		debug("Failed to parse EDID\n");
-		return -EIO;
-	}
-	debug("%s: panel found: %dx%d, bpp %d\n", __func__,
-	      timing.hactive.typ, timing.vactive.typ, bpp);
-	if (bpp == 6)
-		colordepth = 0x00; /* 6 bit */
-	else
-		colordepth = 0x10; /* 8 bit */
+	/* XXXJDM hard-coded for HB140WX1-501 14" TFT-LCD */
+	colordepth = 0x00; /* 6 bit */
+
 	anx6345_write_r1(dev, ANX9804_VID_CTRL2_REG, colordepth);
 
 	if (anx6345_read_dpcd(dev, DP_MAX_LINK_RATE, &data_rate)) {
 		debug("%s: Failed to DP_MAX_LINK_RATE\n", __func__);
-		return -EIO;
+		data_rate = 10;
 	}
 	debug("%s: data_rate: %d\n", __func__, (int)data_rate);
 	if (anx6345_read_dpcd(dev, DP_MAX_LANE_COUNT, &lanes)) {
 		debug("%s: Failed to read DP_MAX_LANE_COUNT\n", __func__);
-		return -EIO;
+		lanes = 1;
 	}
 	lanes &= DP_MAX_LANE_COUNT_MASK;
 	debug("%s: lanes: %d\n", __func__, (int)lanes);
