summaryrefslogtreecommitdiff
path: root/src/mainboard/siemens
diff options
context:
space:
mode:
authorUwe Poeche <uwe.poeche@siemens.com>2019-09-24 09:44:58 +0200
committerPatrick Georgi <pgeorgi@google.com>2019-10-24 07:50:02 +0000
commited309e58b0d44f7757f7144a995ca95a94e8a52a (patch)
treeb49fc915988eb5bc310bbd956cd5d7d1ece5c024 /src/mainboard/siemens
parent285975dbba8c7f3bbb9f9950e79a30bb983d5123 (diff)
downloadcoreboot-ed309e58b0d44f7757f7144a995ca95a94e8a52a.tar.xz
soc/intel/fsp_baytrail: use designware I2C driver
Refactor I2C driver for fsp_baytrail to match the coreboot supported I2C bus device structure. The internal I2C controllers are now handled by the generic PCI driver approach and generic I2C access is enabled. As orientation for the I2C code the actual solution from soc/intel/apollolake I2C was taken. All the I2C specific parts were removed from lpss.c and have been implemented in the I2C driver. Future merge to soc/intel/common/block/i2c/i2c.c would be possible. With this patch I2C chip devices can now be used in devicetree. TEST=Booted siemens/tcu3 and verified that access to PTN3460 worked. Change-Id: I3b87bd7c27e4c1afcce7cd4225cca02599f43c60 Signed-off-by: Uwe Poeche <uwe.poeche@siemens.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/36062 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Werner Zeh <werner.zeh@siemens.com>
Diffstat (limited to 'src/mainboard/siemens')
-rw-r--r--src/mainboard/siemens/mc_tcu3/mainboard.c6
-rw-r--r--src/mainboard/siemens/mc_tcu3/ptn3460.c79
2 files changed, 47 insertions, 38 deletions
diff --git a/src/mainboard/siemens/mc_tcu3/mainboard.c b/src/mainboard/siemens/mc_tcu3/mainboard.c
index 9e12aa588f..e77c0b1e29 100644
--- a/src/mainboard/siemens/mc_tcu3/mainboard.c
+++ b/src/mainboard/siemens/mc_tcu3/mainboard.c
@@ -70,9 +70,15 @@ enum cb_err mainboard_get_mac_address(struct device *dev, uint8_t mac[6])
*/
static void mainboard_enable(struct device *dev)
{
+
+}
+
+static void mainboard_final(void *chip_info)
+{
setup_lcd_panel();
}
struct chip_operations mainboard_ops = {
.enable_dev = mainboard_enable,
+ .final = mainboard_final,
};
diff --git a/src/mainboard/siemens/mc_tcu3/ptn3460.c b/src/mainboard/siemens/mc_tcu3/ptn3460.c
index 414baeb089..56f51f9647 100644
--- a/src/mainboard/siemens/mc_tcu3/ptn3460.c
+++ b/src/mainboard/siemens/mc_tcu3/ptn3460.c
@@ -1,7 +1,7 @@
/*
* This file is part of the coreboot project.
*
- * Copyright (C) 2014 Siemens AG
+ * Copyright (C) 2014-2019 Siemens AG
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
#include <string.h>
#include <delay.h>
#include <types.h>
-
+#include <device/i2c_simple.h>
#include "soc/i2c.h"
#include "ptn3460.h"
@@ -34,6 +34,7 @@ int ptn3460_init(char *hwi_block)
uint8_t disp_con = 0, color_depth = 0;
uint8_t edid_data[0x80];
uint8_t hwid[4], tcu31_hwid[4] = {7, 9, 2, 0};
+ uint8_t i;
if (!hwi_block || hwilib_find_blocks(hwi_block) != CB_SUCCESS) {
printk(BIOS_ERR, "LCD: Info block \"%s\" not found!\n",
@@ -41,10 +42,6 @@ int ptn3460_init(char *hwi_block)
return 1;
}
- status = i2c_init(PTN_I2C_CONTROLLER);
- if (status)
- return (PTN_BUS_ERROR | status);
-
/* Get all needed information from hwinfo block */
if (hwilib_get_field(Edid, edid_data, 0x80) != sizeof(edid_data)) {
printk(BIOS_ERR, "LCD: No EDID data available in %s\n",
@@ -69,8 +66,8 @@ int ptn3460_init(char *hwi_block)
/* Select this table to be emulated */
ptn_select_edid(6);
/* Read PTN configuration data */
- status = i2c_read(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF,
- (u8*)&cfg, PTN_CONFIG_LEN);
+ status = i2c_read_bytes(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF, (u8 *) &cfg,
+ sizeof(struct ptn_3460_config));
if (status)
return (PTN_BUS_ERROR | status);
@@ -81,7 +78,6 @@ int ptn3460_init(char *hwi_block)
cfg.lvds_interface_ctrl1 |= 0x0b; /* Turn on dual LVDS lane and clock */
if (color_depth == PF_COLOR_DEPTH_6BIT)
cfg.lvds_interface_ctrl1 |= 0x20; /* Use 18 bits per pixel */
-
cfg.lvds_interface_ctrl2 = 0x03; /* no clock spreading, 300 mV LVDS swing */
/* Swap LVDS even and odd lanes for HW-ID 7.9.2.0 only. */
if (hwilib_get_field(HWID, hwid, sizeof(hwid)) == sizeof(hwid) &&
@@ -89,20 +85,22 @@ int ptn3460_init(char *hwi_block)
cfg.lvds_interface_ctrl3 = 0x01; /* swap LVDS even and odd */
} else
cfg.lvds_interface_ctrl3 = 0x00; /* no LVDS signal swap */
- cfg.t2_delay = 1; /* Delay T2 (VDD to LVDS active) by 16 ms */
- cfg.t3_timing = 10; /* 500 ms from LVDS to backlight active */
- cfg.t12_timing = 20; /* 1 second re-power delay */
- cfg.t4_timing = 3; /* 150 ms backlight off to LVDS inactive */
- cfg.t5_delay = 1; /* Delay T5 (LVDS to VDD inactive) by 16 ms */
- cfg.backlight_ctrl = 0; /* Enable backlight control */
+ cfg.t2_delay = 1; /* Delay T2 (VDD to LVDS active) by 16 ms */
+ cfg.t3_timing = 10; /* 500 ms from LVDS to backlight active */
+ cfg.t12_timing = 20; /* 1 second re-power delay */
+ cfg.t4_timing = 3; /* 150 ms backlight off to LVDS inactive */
+ cfg.t5_delay = 1; /* Delay T5 (LVDS to VDD inactive) by 16 ms */
+ cfg.backlight_ctrl = 0; /* Enable backlight control */
/* Write back configuration data to PTN3460 */
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF,
- (u8*)&cfg, PTN_CONFIG_LEN);
- if (status)
- return (PTN_BUS_ERROR | status);
- else
- return PTN_NO_ERROR;
+ for (i = 0; i < sizeof(struct ptn_3460_config); i++) {
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + i,
+ *(((uint8_t *) &cfg) + i));
+ if (status)
+ return (PTN_BUS_ERROR | status);
+ }
+
+ return PTN_NO_ERROR;
}
/** \brief This functions reads one desired EDID data structure from PTN3460
@@ -117,14 +115,13 @@ int ptn3460_read_edid(u8 edid_num, u8 *data)
if (edid_num > PTN_MAX_EDID_NUM)
return PTN_INVALID_EDID;
/* First enable access to the desired EDID table */
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 5,
- &edid_num, 1);
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 5, edid_num);
if (status)
return (PTN_BUS_ERROR | status);
/* Now we can simply read back EDID-data */
- status = i2c_read(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_EDID_OFF,
- data, PTN_EDID_LEN);
+ status = i2c_read_bytes(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_EDID_OFF, data,
+ PTN_EDID_LEN);
if (status)
return (PTN_BUS_ERROR | status);
else
@@ -139,22 +136,24 @@ int ptn3460_read_edid(u8 edid_num, u8 *data)
int ptn3460_write_edid(u8 edid_num, u8 *data)
{
int status;
+ int i;
if (edid_num > PTN_MAX_EDID_NUM)
return PTN_INVALID_EDID;
+
/* First enable access to the desired EDID table */
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 5,
- &edid_num, 1);
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 5, edid_num);
if (status)
return (PTN_BUS_ERROR | status);
/* Now we can simply write EDID-data to ptn3460 */
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_EDID_OFF,
- data, PTN_EDID_LEN);
- if (status)
- return (PTN_BUS_ERROR | status);
- else
- return PTN_NO_ERROR;
+ for (i = 0; i < PTN_EDID_LEN; i++) {
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_EDID_OFF + i,
+ data[i]);
+ if (status)
+ return (PTN_BUS_ERROR | status);
+ }
+ return PTN_NO_ERROR;
}
/** \brief This functions selects one of 7 EDID-tables inside PTN3460
@@ -171,8 +170,7 @@ int ptn_select_edid (u8 edid_num)
return PTN_INVALID_EDID;
/* Enable emulation of the desired EDID table */
val = (edid_num << 1) | 1;
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 4,
- &val, 1);
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_CONFIG_OFF + 4, val);
if (status)
return (PTN_BUS_ERROR | status);
else
@@ -188,14 +186,19 @@ int ptn_select_edid (u8 edid_num)
*/
int ptn3460_flash_config(void)
{
- int status;
+ int status, i;
struct ptn_3460_flash flash;
flash.cmd = 0x01; /* perform erase and flash cycle */
flash.magic = 0x7845; /* Magic number to protect flash operation */
flash.trigger = 0x56; /* This value starts flash operation */
- status = i2c_write(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_FLASH_CFG_OFF,
- (u8*)&flash, PTN_FLASH_CFG_LEN);
+
+ for (i = 0; i < sizeof(struct ptn_3460_flash); i++) {
+ status = i2c_writeb(PTN_I2C_CONTROLLER, PTN_SLAVE_ADR, PTN_FLASH_CFG_OFF+i,
+ *(((uint8_t *) &flash) + i));
+ if (status)
+ return (PTN_BUS_ERROR | status);
+ }
if (status) {
return (PTN_BUS_ERROR | status);
} else {