137 lines
3.6 KiB
Diff
137 lines
3.6 KiB
Diff
$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);
|