blob: cdb7900ee63530c6800775e1af95fa1576090bdd [file] [log] [blame]
Felix Held556d1cc2022-02-02 22:11:52 +01001/* 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
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}