/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include "i2c_pad_def.h" void fch_i2c_pad_init(unsigned int bus, enum i2c_speed speed, const struct i2c_pad_control *ctrl) { uint32_t pad_ctrl; pad_ctrl = misc_read32(MISC_I2C_PAD_CTRL(bus)); pad_ctrl &= ~I2C_PAD_CTRL_NG_MASK; pad_ctrl |= I2C_PAD_CTRL_NG_NORMAL; switch (ctrl->rx_level) { case I2C_PAD_RX_NO_CHANGE: break; case I2C_PAD_RX_OFF: pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I2C_PAD_CTRL_RX_SEL_OFF; break; case I2C_PAD_RX_3_3V: pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I2C_PAD_CTRL_RX_SEL_3_3V; break; case I2C_PAD_RX_1_8V: pad_ctrl &= ~I2C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I2C_PAD_CTRL_RX_SEL_1_8V; break; default: printk(BIOS_WARNING, "Invalid I2C pad RX level for bus %u\n", bus); break; } pad_ctrl &= ~I2C_PAD_CTRL_FALLSLEW_MASK; pad_ctrl |= speed == I2C_SPEED_STANDARD ? I2C_PAD_CTRL_FALLSLEW_STD : I2C_PAD_CTRL_FALLSLEW_LOW; pad_ctrl |= I2C_PAD_CTRL_FALLSLEW_EN; misc_write32(MISC_I2C_PAD_CTRL(bus), pad_ctrl); }