<p>Uwe Poeche has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/30204">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">siemens/mc_apl4: Enable LVDS Display on mc_apl4<br><br>Enable PTN3460 chip initialization to get LVDS attached LCD working on<br>mc_apl4.<br><br>Change-Id: I3ccf5398f16831db321eba846d6b041daadf31dd<br>Signed-off-by: Uwe Poeche <uwe.poeche@siemens.com><br>---<br>M src/mainboard/siemens/mc_apl1/variants/mc_apl4/Makefile.inc<br>A src/mainboard/siemens/mc_apl1/variants/mc_apl4/include/variant/ptn3460.h<br>A src/mainboard/siemens/mc_apl1/variants/mc_apl4/mainboard.c<br>A src/mainboard/siemens/mc_apl1/variants/mc_apl4/ptn3460.c<br>4 files changed, 299 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/04/30204/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl4/Makefile.inc b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/Makefile.inc</span><br><span>index 0a124ce..482abf8 100644</span><br><span>--- a/src/mainboard/siemens/mc_apl1/variants/mc_apl4/Makefile.inc</span><br><span>+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/Makefile.inc</span><br><span>@@ -2,3 +2,5 @@</span><br><span> romstage-y += gpio.c</span><br><span> </span><br><span> ramstage-y += gpio.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += mainboard.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += ptn3460.c</span><br><span>diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl4/include/variant/ptn3460.h b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/include/variant/ptn3460.h</span><br><span>new file mode 100644</span><br><span>index 0000000..3f78b22</span><br><span>--- /dev/null</span><br><span>+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/include/variant/ptn3460.h</span><br><span>@@ -0,0 +1,91 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2014-2017 Siemens AG</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef PTN3460_H_</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN3460_H_</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_SLAVE_ADR                0x60</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_I2C_CONTROLLER        7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_EDID_OFF               0x00</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_EDID_LEN              0x80</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_CONFIG_OFF            0x80</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_FLASH_CFG_OFF 0xE8</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_FLASH_CFG_LEN 0x04</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_MAX_EDID_NUM  6</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Define some error codes that can be used. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_NO_ERROR              0x00000000</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_BUS_ERROR               0x10000000</span><br><span style="color: hsl(120, 100%, 40%);">+#define PTN_INVALID_EDID    0x20000000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ptn_3460_config {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* DiplayPort interface control. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t dp_interface_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* LVDS interface control register 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t lvds_interface_ctrl1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* LVDS interface control register 2. */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t lvds_interface_ctrl2;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* LVDS interface control register 3. */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t lvds_interface_ctrl3;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Select which EDID-block is emulated. */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t edid_rom_emulation;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Select which EDID block to map to 0..0x7F. */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t edid_rom_access_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Smallest PWM frequency for back light. */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t pwm_min[3];</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Biggest PWM frequency for back light. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t pwm_max[3];</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Fast link training control register. */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t fast_link_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Pin configuration control register 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t pin_cfg_ctrl1;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Pin configuration control register 2. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t pin_cfg_ctrl2;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Default PWM bit count in DPCD register. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t pwm_default;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Current PWM bit count in DPCD register. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t pwm_value;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Default PWM frequency in DPCD register. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t pwm_default_freq;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Panel T3 timing value. */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t t3_timing;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Panel T12 timing value. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t t12_timing;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Back light control register. */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t backlight_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Panel T2 delay. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t t2_delay;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Panel T4 timing value. */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t t4_timing;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Panel T5 delay. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t t5_delay;</span><br><span style="color: hsl(120, 100%, 40%);">+} __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ptn_3460_flash {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Flash command (erase or erase and flash). */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Magic number needed by the flash algorithm. */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t magic;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Trigger for starting flash operation. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t trigger;</span><br><span style="color: hsl(120, 100%, 40%);">+} __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn3460_init(const char *hwi_block);</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn3460_write_edid(uint8_t edid_num, const uint8_t data[PTN_EDID_LEN]);</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn_select_edid(uint8_t edid_num);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* PTN3460_H_ */</span><br><span>diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl4/mainboard.c b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/mainboard.c</span><br><span>new file mode 100644</span><br><span>index 0000000..65e78bb</span><br><span>--- /dev/null</span><br><span>+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/mainboard.c</span><br><span>@@ -0,0 +1,35 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2018 Siemens AG</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <bootstate.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <hwilib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <baseboard/variants.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <variant/ptn3460.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void variant_mainboard_final(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int status;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Set up the DP2LVDS converter.</span><br><span style="color: hsl(120, 100%, 40%);">+       * ptn3460_init() may only be executed after i2c bus init.</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+   status = ptn3460_init("hwinfo.hex");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+           printk(BIOS_ERR, "LCD: Set up PTN with status 0x%x\n", status);</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          printk(BIOS_INFO, "LCD: Set up PTN was successful.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/mainboard/siemens/mc_apl1/variants/mc_apl4/ptn3460.c b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/ptn3460.c</span><br><span>new file mode 100644</span><br><span>index 0000000..aa4ba8c</span><br><span>--- /dev/null</span><br><span>+++ b/src/mainboard/siemens/mc_apl1/variants/mc_apl4/ptn3460.c</span><br><span>@@ -0,0 +1,171 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2014-2017 Siemens AG</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <hwilib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/i2c_simple.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <variant/ptn3460.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function sets up the DP2LVDS-converter to be used with the appropriate</span><br><span style="color: hsl(120, 100%, 40%);">+ * lcd panel.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param *hwi_block Filename in CBFS of the block to use as HW-Info.</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return 0 on success or HWI-Data/PTN error code.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn3460_init(const char *hwi_block)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ptn_3460_config cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+   int status;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t disp_con = 0, color_depth = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t edid_data[PTN_EDID_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!hwi_block || hwilib_find_blocks(hwi_block) != CB_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+              printk(BIOS_ERR, "LCD: Info block \"%s\" not found!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           hwi_block);</span><br><span style="color: hsl(120, 100%, 40%);">+           return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Get all needed information from hwinfo block. */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (hwilib_get_field(Edid, edid_data, sizeof(edid_data)) !=</span><br><span style="color: hsl(120, 100%, 40%);">+                   sizeof(edid_data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printk(BIOS_ERR, "LCD: No EDID data available in %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             hwi_block);</span><br><span style="color: hsl(120, 100%, 40%);">+           return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((hwilib_get_field(PF_DisplCon, &disp_con, sizeof(disp_con)) !=</span><br><span style="color: hsl(120, 100%, 40%);">+                        sizeof(disp_con))) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printk(BIOS_ERR, "LCD: Missing panel features from %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           hwi_block);</span><br><span style="color: hsl(120, 100%, 40%);">+           return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (hwilib_get_field(PF_Color_Depth, &color_depth, sizeof(color_depth))</span><br><span style="color: hsl(120, 100%, 40%);">+                   != sizeof(color_depth)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printk(BIOS_ERR, "LCD: Missing panel features from %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           hwi_block);</span><br><span style="color: hsl(120, 100%, 40%);">+           return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Here, all the desired information for setting up DP2LVDS converter</span><br><span style="color: hsl(120, 100%, 40%);">+  * is present. Inside the converter, table 6 will be used for the</span><br><span style="color: hsl(120, 100%, 40%);">+      * timings.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   status = ptn3460_write_edid(6, edid_data);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+           return status;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Select this table to be emulated. */</span><br><span style="color: hsl(120, 100%, 40%);">+       ptn_select_edid(6);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Read PTN configuration data. */</span><br><span style="color: hsl(120, 100%, 40%);">+    status = i2c_read_bytes(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    PTN_CONFIG_OFF, (uint8_t *)&cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+                  sizeof(cfg));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+           return (PTN_BUS_ERROR | status);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Set up configuration data according to the hwinfo block we get. */</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg.dp_interface_ctrl = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Use odd-bus for clock distribution only. */</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg.lvds_interface_ctrl1 = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (disp_con == PF_DISPLCON_LVDS_DUAL)</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Turn on dual LVDS lane and clock. */</span><br><span style="color: hsl(120, 100%, 40%);">+               cfg.lvds_interface_ctrl1 |= 0x0b;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (color_depth == PF_COLOR_DEPTH_6BIT)</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Use 18 bits per pixel. */</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg.lvds_interface_ctrl1 |= 0x20;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* No clock spreading, 300 mV LVDS swing. */</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg.lvds_interface_ctrl2 = 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Swap LVDS signal (N vs. P). */</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg.lvds_interface_ctrl3 = 0x04;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Delay T2 (VDD to LVDS active) by 16 ms. */</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg.t2_delay = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 250 ms from LVDS to backlight active. */</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg.t3_timing = 10;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 1 second re-power delay. */</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg.t12_timing = 20;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 150 ms backlight off to LVDS inactive. */</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg.t4_timing = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Delay T5 (LVDS to VDD inactive) by 16 ms. */</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg.t5_delay = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Enable backlight control. */</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg.backlight_ctrl = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Write back configuration data to PTN3460. */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < sizeof(struct ptn_3460_config); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                PTN_CONFIG_OFF+i,</span><br><span style="color: hsl(120, 100%, 40%);">+                             *(((uint8_t *)&cfg)+i));</span><br><span style="color: hsl(120, 100%, 40%);">+          if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+                   return (PTN_BUS_ERROR | status);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return PTN_NO_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function writes one Extended Display Identification Data (EDID)</span><br><span style="color: hsl(120, 100%, 40%);">+ * structure to PTN3460.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param edid_num Number of EDID that must be written (0..6).</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param *data Pointer to a buffer where data to write is stored in.</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return 0 on success or error code.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn3460_write_edid(uint8_t edid_num, const uint8_t data[PTN_EDID_LEN])</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int status;</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (edid_num > PTN_MAX_EDID_NUM)</span><br><span style="color: hsl(120, 100%, 40%);">+           return PTN_INVALID_EDID;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* First enable access to the desired EDID table. */</span><br><span style="color: hsl(120, 100%, 40%);">+  status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR,</span><br><span style="color: hsl(120, 100%, 40%);">+                        PTN_CONFIG_OFF + 5, edid_num);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+           return (PTN_BUS_ERROR | status);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Now we can simply write EDID-data to ptn3460. */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < PTN_EDID_LEN; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                PTN_EDID_OFF + i, data[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+                   return (PTN_BUS_ERROR | status);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return PTN_NO_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function selects one of 7 EDID-tables inside PTN3460 which should be</span><br><span style="color: hsl(120, 100%, 40%);">+ * emulated on DisplayPort and turn emulation ON.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param edid_num Number of EDID to emulate (0..6).</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return 0 on success or error code.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ptn_select_edid(uint8_t edid_num)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int status;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (edid_num > PTN_MAX_EDID_NUM)</span><br><span style="color: hsl(120, 100%, 40%);">+           return PTN_INVALID_EDID;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Enable emulation of the desired EDID table. */</span><br><span style="color: hsl(120, 100%, 40%);">+     val = (edid_num << 1) | 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR,</span><br><span style="color: hsl(120, 100%, 40%);">+                        PTN_CONFIG_OFF + 4, val);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (status)</span><br><span style="color: hsl(120, 100%, 40%);">+           return (PTN_BUS_ERROR | status);</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          return PTN_NO_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/30204">change 30204</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/c/coreboot/+/30204"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I3ccf5398f16831db321eba846d6b041daadf31dd </div>
<div style="display:none"> Gerrit-Change-Number: 30204 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Uwe Poeche <uwe.poeche@siemens.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>