xref: /aosp_15_r20/external/coreboot/src/soc/amd/common/block/i2c/i2c_pad_ctrl.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/acpimmio.h>
4 #include <amdblocks/i2c.h>
5 #include <console/console.h>
6 #include <types.h>
7 #include "i2c_pad_def.h"
8 
fch_i2c_pad_init(unsigned int bus,enum i2c_speed speed,const struct i2c_pad_control * ctrl)9 void fch_i2c_pad_init(unsigned int bus,
10 		      enum i2c_speed speed,
11 		      const struct i2c_pad_control *ctrl)
12 {
13 	uint32_t pad_ctrl;
14 
15 	pad_ctrl = misc_read32(MISC_I2C_PAD_CTRL(bus));
16 
17 	pad_ctrl &= ~I2C_PAD_CTRL_NG_MASK;
18 	pad_ctrl |= I2C_PAD_CTRL_NG_NORMAL;
19 
20 	switch (ctrl->rx_level) {
21 	case I2C_PAD_RX_NO_CHANGE:
22 		break;
23 	case I2C_PAD_RX_OFF:
24 		pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK;
25 		pad_ctrl |= I2C_PAD_CTRL_RX_SEL_OFF;
26 		break;
27 	case I2C_PAD_RX_3_3V:
28 		pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK;
29 		pad_ctrl |= I2C_PAD_CTRL_RX_SEL_3_3V;
30 		break;
31 	case I2C_PAD_RX_1_8V:
32 		pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK;
33 		pad_ctrl |= I2C_PAD_CTRL_RX_SEL_1_8V;
34 		break;
35 	default:
36 		printk(BIOS_WARNING, "Invalid I2C pad RX level for bus %u\n", bus);
37 		break;
38 	}
39 
40 	pad_ctrl &= ~I2C_PAD_CTRL_FALLSLEW_MASK;
41 	pad_ctrl |= speed == I2C_SPEED_STANDARD ?
42 		I2C_PAD_CTRL_FALLSLEW_STD : I2C_PAD_CTRL_FALLSLEW_LOW;
43 	pad_ctrl |= I2C_PAD_CTRL_FALLSLEW_EN;
44 	misc_write32(MISC_I2C_PAD_CTRL(bus), pad_ctrl);
45 }
46