soc/amd/common/i23c_pad_ctrl: add I3C pad config options

Before, the I2C/I3C pads could only be configured to I2C mode. To be
able to use the I3C controller, add the corresponding options and
implementation for the I3C pad mode with all possible voltages.

Change-Id: I1cc2e830019101cfef96b9474477717a8a75111c
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/87435
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Maximilian Brune <maximilian.brune@9elements.com>
This commit is contained in:
Felix Held 2025-04-23 17:42:42 +02:00 committed by Matt DeVillier
commit 5b1a8b53b6
2 changed files with 31 additions and 3 deletions

View file

@ -14,26 +14,51 @@ void fch_i23c_pad_init(unsigned int bus,
pad_ctrl = misc_read32(MISC_I23C_PAD_CTRL(bus));
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I2C;
switch (ctrl->rx_level) {
case I2C_PAD_RX_NO_CHANGE:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I2C;
/* Default is enabled and thresholds for 1.8V operation */
break;
case I2C_PAD_RX_OFF:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I2C;
pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK;
pad_ctrl |= I23C_PAD_CTRL_RX_SEL_OFF;
pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V;
break;
case I2C_PAD_RX_1_8V:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I2C;
pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK;
pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON;
pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V;
break;
case I2C_PAD_RX_1_1V:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I2C;
pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK;
pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON;
pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_1_1V;
break;
case I3C_PAD_RX_NO_CHANGE:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I3C;
break;
case I3C_PAD_RX_1_8V:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I3C;
pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK;
pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON;
pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V;
break;
case I3C_PAD_RX_1_1V:
pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK;
pad_ctrl |= I23C_PAD_CTRL_MODE_I3C;
pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK;
pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON;
pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK;

View file

@ -62,6 +62,9 @@ enum i2c_pad_rx_level {
I2C_PAD_RX_3_3V,
I2C_PAD_RX_1_8V,
I2C_PAD_RX_1_1V,
I3C_PAD_RX_NO_CHANGE,
I3C_PAD_RX_1_8V,
I3C_PAD_RX_1_1V,
};
struct i2c_pad_control {