summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/cr50/rdd.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/board/cr50/rdd.c b/board/cr50/rdd.c
index 0f6fcc6674..e7727c3ac8 100644
--- a/board/cr50/rdd.c
+++ b/board/cr50/rdd.c
@@ -62,7 +62,13 @@ enum ccd_block_flags {
* This will block EC-CR50-communication. CR50 should not enable EC
* UART.
*/
- CCD_BLOCK_EC_CR50_COMM = BIT(4)
+ CCD_BLOCK_EC_CR50_COMM = BIT(4),
+
+ /*
+ * This will block EC-CR50-communication. CR50 should not enable EC
+ * UART.
+ */
+ CCD_BLOCK_TRISTATE_EC = BIT(5)
};
/* Which UARTs are blocked by console command */
@@ -107,8 +113,13 @@ static void uartn_tx_disconnect(int uart)
} else {
GWRITE(PINMUX, DIOB5_SEL, 0);
- /* Set up the pulldown */
- GWRITE_FIELD(PINMUX, DIOB5_CTL, PD, 1);
+ /*
+ * Set up the pulldown on EC RX unless the EC UART is supposed
+ * to be tri-stated. If it's supposed to be tristated, disable
+ * TX and remove the pull-down from RX.
+ */
+ GWRITE_FIELD(PINMUX, DIOB5_CTL, PD,
+ !(ccd_block & CCD_BLOCK_TRISTATE_EC));
}
}
@@ -452,6 +463,8 @@ static void print_ccd_ports_blocked(void)
}
if (ccd_block & CCD_BLOCK_EC_CR50_COMM)
ccputs(" EC_CR50_COMM");
+ if (ccd_block & CCD_BLOCK_TRISTATE_EC)
+ ccputs(" TRISTATE_EC");
if (!ccd_block)
ccputs(" (none)");
ccputs("\n");
@@ -494,6 +507,10 @@ static int command_ccd_block(int argc, char **argv)
block_flag = CCD_BLOCK_IGNORE_SERVO;
else if (!strcasecmp(argv[1], "EC_CR50_COMM"))
block_flag = CCD_BLOCK_EC_CR50_COMM;
+ else if (!strcasecmp(argv[1], "TRISTATE_EC"))
+ block_flag = (CCD_BLOCK_TRISTATE_EC |
+ CCD_BLOCK_EC_UART |
+ CCD_BLOCK_EC_CR50_COMM);
else
return EC_ERROR_PARAM1;
@@ -507,9 +524,16 @@ static int command_ccd_block(int argc, char **argv)
if (block_flag == CCD_BLOCK_IGNORE_SERVO)
servo_ignore(new_state);
- else if (block_flag == CCD_BLOCK_EC_CR50_COMM)
+ else if (block_flag & CCD_BLOCK_EC_CR50_COMM)
ec_comm_block(new_state);
+ /*
+ * Call uartn_tx_disconnect to make sure the pulldown gets
+ * removed even if the EC uart is already disabled.
+ */
+ if (block_flag & CCD_BLOCK_TRISTATE_EC)
+ uartn_tx_disconnect(UART_EC);
+
/* Update blocked state in deferred function */
ccd_update_state();
}
@@ -519,6 +543,6 @@ static int command_ccd_block(int argc, char **argv)
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(ccdblock, command_ccd_block,
- "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM>"
- " [BOOLEAN]]",
+ "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM | "
+ "TRISTATE_EC> [BOOLEAN]]",
"Force CCD ports disabled");