summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/cr50/board.c13
-rw-r--r--board/cr50/board.h3
-rw-r--r--board/cr50/gpio.inc12
-rw-r--r--board/cr50/rdd.c53
-rw-r--r--chip/g/rdd.h6
5 files changed, 82 insertions, 5 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c
index 9a1be332b4..ed34fa3000 100644
--- a/board/cr50/board.c
+++ b/board/cr50/board.c
@@ -12,9 +12,11 @@
#include "flash_config.h"
#include "gpio.h"
#include "hooks.h"
+#include "i2c.h"
#include "i2cs.h"
#include "init_chip.h"
#include "nvmem.h"
+#include "rdd.h"
#include "registers.h"
#include "signed_header.h"
#include "spi.h"
@@ -73,11 +75,19 @@ uint32_t nvmem_user_sizes[NVMEM_NUM_USERS] = {
static uint32_t board_properties;
static uint8_t reboot_request_posted;
+/* I2C Port definition */
+const struct i2c_port_t i2c_ports[] = {
+ {"master", I2C_PORT_MASTER, 100,
+ GPIO_I2C_SCL_INA, GPIO_I2C_SDA_INA},
+};
+const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports);
+
void post_reboot_request(void)
{
/* Reboot the device next time TPM reset is requested. */
reboot_request_posted = 1;
}
+
/*
* There's no way to trigger on both rising and falling edges, so force a
* compiler error if we try. The workaround is to use the pinmux to connect
@@ -595,6 +605,9 @@ static void servo_attached(void)
/* Disconnect AP and EC UART when servo is attached */
uartn_tx_disconnect(UART_AP);
uartn_tx_disconnect(UART_EC);
+
+ /* Disconnect i2cm interface to ina */
+ ina_disconnect();
}
void device_state_on(enum gpio_signal signal)
diff --git a/board/cr50/board.h b/board/cr50/board.h
index fd59137090..10f99b7a75 100644
--- a/board/cr50/board.h
+++ b/board/cr50/board.h
@@ -213,7 +213,10 @@ enum nvmem_users {
#define CONFIG_USB_FW_UPDATE
#define CONFIG_I2C
+#define CONFIG_I2C_MASTER
#define CONFIG_I2C_SLAVE
#define CONFIG_TPM_I2CS
+#define I2C_PORT_MASTER 0
+
#endif /* __CROS_EC_BOARD_H */
diff --git a/board/cr50/gpio.inc b/board/cr50/gpio.inc
index 34b64abd06..d129763c09 100644
--- a/board/cr50/gpio.inc
+++ b/board/cr50/gpio.inc
@@ -41,12 +41,15 @@ GPIO(SPI_MOSI, PIN(0, 7), GPIO_INPUT)
GPIO(SPI_CLK, PIN(0, 8), GPIO_INPUT)
GPIO(SPI_CS_L, PIN(0, 9), GPIO_INPUT)
-/* Control the load switch powering the INA 3.3V rail */
-GPIO(EN_PP3300_INA_L, PIN(1, 9), GPIO_ODR_HIGH)
-
/* GPIOs used for Cr50 strapping options */
GPIO(STRAP0, PIN(0, 10), GPIO_INPUT)
+/* Control the load switch powering the INA 3.3V rail */
+GPIO(EN_PP3300_INA_L, PIN(0, 11), GPIO_ODR_HIGH)
+/* GPIOs used for I2CM pins for INAs */
+GPIO(I2C_SCL_INA, PIN(0, 12), GPIO_INPUT)
+GPIO(I2C_SDA_INA, PIN(0, 13), GPIO_INPUT)
+
/* Unimplemented signals which we need to emulate for now */
/* TODO(wfrichar): Half the boards don't use this signal. Take it out. */
UNIMPLEMENTED(ENTERING_RW)
@@ -71,7 +74,8 @@ PINMUX(GPIO(SYS_RST_L_OUT), M0, DIO_INPUT)
PINMUX(GPIO(CCD_MODE_L), M1, DIO_INPUT)
PINMUX(GPIO(BATT_PRES_L), M2, 0)
PINMUX(GPIO(STRAP0), A1, DIO_INPUT)
-
+PINMUX(GPIO(I2C_SCL_INA), B0, DIO_INPUT)
+PINMUX(GPIO(I2C_SDA_INA), B1, DIO_INPUT)
/* UARTs */
PINMUX(FUNC(UART0_TX), A0, DIO_OUTPUT) /* Cr50 console */
PINMUX(FUNC(UART0_RX), A13, DIO_INPUT | DIO_WAKE_FALLING)
diff --git a/board/cr50/rdd.c b/board/cr50/rdd.c
index 623209fa03..4c67b5f1d2 100644
--- a/board/cr50/rdd.c
+++ b/board/cr50/rdd.c
@@ -8,6 +8,7 @@
#include "device_state.h"
#include "gpio.h"
#include "hooks.h"
+#include "i2c.h"
#include "rbox.h"
#include "rdd.h"
#include "registers.h"
@@ -94,6 +95,45 @@ void uartn_tx_disconnect(int uart)
uart_select_tx(uart, 0);
}
+void ina_connect(void)
+{
+ /* Apply power to INA chips */
+ gpio_set_level(GPIO_EN_PP3300_INA_L, 0);
+ /* Allow enough time for power rail to come up */
+ usleep(25);
+
+ /*
+ * Connect B0/B1 pads to I2C0 input SDA/SCL. Note, that the inputs
+ * for these pads are already enabled for the gpio signals I2C_SCL_INA
+ * and I2C_SDA_INA in gpio.inc.
+ */
+ GWRITE(PINMUX, I2C0_SDA_SEL, GC_PINMUX_DIOB1_SEL);
+ GWRITE(PINMUX, I2C0_SCL_SEL, GC_PINMUX_DIOB0_SEL);
+
+ /* Connect I2CS SDA/SCL output to B1/B0 pads */
+ GWRITE(PINMUX, DIOB1_SEL, GC_PINMUX_I2C0_SDA_SEL);
+ GWRITE(PINMUX, DIOB0_SEL, GC_PINMUX_I2C0_SCL_SEL);
+
+ /*
+ * Initialize the i2cm module after the INAs are powered and the signal
+ * lines are connected.
+ */
+ i2cm_init();
+}
+
+void ina_disconnect(void)
+{
+ /* Disonnect I2C0 SDA/SCL output to B1/B0 pads */
+ GWRITE(PINMUX, DIOB1_SEL, 0);
+ GWRITE(PINMUX, DIOB0_SEL, 0);
+ /* Disconnect B1/B0 pads to I2C0 input SDA/SCL */
+ GWRITE(PINMUX, I2C0_SDA_SEL, 0);
+ GWRITE(PINMUX, I2C0_SCL_SEL, 0);
+
+ /* Disable power to INA chips */
+ gpio_set_level(GPIO_EN_PP3300_INA_L, 1);
+}
+
void rdd_attached(void)
{
/* Indicate case-closed debug mode (active low) */
@@ -198,6 +238,17 @@ static int command_ccd(int argc, char **argv)
ec_uart_enabled = 0;
uartn_tx_disconnect(UART_EC);
}
+ } else if (!strcasecmp("ina", argv[1]) && argc > 2) {
+ if (!parse_bool(argv[2], &val))
+ return EC_ERROR_PARAM2;
+
+ if (val) {
+ ina_connect();
+ ccprintf("CCD: INAs enabled\n");
+ } else {
+ ina_disconnect();
+ ccprintf("CCD: INAs disabled\n");
+ }
} else if (argc == 2) {
if (!parse_bool(argv[1], &val))
return EC_ERROR_PARAM1;
@@ -217,7 +268,7 @@ static int command_ccd(int argc, char **argv)
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(ccd, command_ccd,
- "[uart] [<BOOLEAN>]",
+ "[uart|ina] [<BOOLEAN>]",
"Get/set the case closed debug state");
static int command_sys_rst(int argc, char **argv)
diff --git a/chip/g/rdd.h b/chip/g/rdd.h
index 1f19ee9b3e..45dbb049de 100644
--- a/chip/g/rdd.h
+++ b/chip/g/rdd.h
@@ -18,4 +18,10 @@ void rdd_attached(void);
* cable is detached.
*/
int is_utmi_wakeup_allowed(void);
+
+/* Power up INAs and initialize I2C0 interface */
+void ina_connect(void);
+
+/* Disconnect I2C0 interface and powerdown INAs */
+void ina_disconnect(void);
#endif /* __CROS_RDD_H */