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)9void 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