1 /* SPDX-License-Identifier: GPL-2.0-only OR MIT */
4 #include <console/console.h>
5 #include <device/mmio.h>
6 #include <device/i2c_simple.h>
10 struct mtk_i2c mtk_i2c_bus_controller
[] = {
12 .i2c_regs
= (void *)(I2C_BASE
),
13 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
),
14 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
17 .i2c_regs
= (void *)(I2C_BASE
+ 0x1000),
18 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x180),
19 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
22 .i2c_regs
= (void *)(I2C_BASE
+ 0x2000),
23 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x300),
24 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
27 .i2c_regs
= (void *)(I2C_BASE
+ 0x3000),
28 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x400),
29 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
32 .i2c_regs
= (void *)(I2C_BASE
+ 0x4000),
33 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x480),
34 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
37 .i2c_regs
= (void *)(I2C_BASE
- 0x100000),
38 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x500),
39 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
42 .i2c_regs
= (void *)(I2C_BASE
- 0xFF000),
43 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x580),
44 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
47 .i2c_regs
= (void *)(I2C_BASE
- 0xFE000),
48 .i2c_dma_regs
= (void *)(I2C_DMA_BASE
+ 0x600),
49 .mt_i2c_flag
= I2C_APDMA_ASYNC
,
53 _Static_assert(ARRAY_SIZE(mtk_i2c_bus_controller
) == I2C_BUS_NUMBER
,
54 "Wrong size of mtk_i2c_bus_controller");
61 #define PAD_FUNC(name, func) {GPIO(name), PAD_##name##_FUNC_##func}
63 static const struct pad_func i2c_funcs
[I2C_BUS_NUMBER
][2] = {
85 PAD_FUNC(HDMIRX_SCL
, SCL5
),
86 PAD_FUNC(HDMIRX_SDA
, SDA5
),
89 PAD_FUNC(HDMITX_SCL
, SCL6
),
90 PAD_FUNC(HDMITX_SDA
, SDA6
),
93 PAD_FUNC(HDMIRX_HTPLG
, SCL7
),
94 PAD_FUNC(HDMIRX_PWR5V
, SDA7
),
99 static void mtk_i2c_set_gpio_pinmux(uint8_t bus
)
101 assert(bus
< I2C_BUS_NUMBER
);
103 const struct pad_func
*ptr
= i2c_funcs
[bus
];
104 for (size_t i
= 0; i
< 2; i
++) {
105 gpio_set_mode(ptr
[i
].gpio
, ptr
[i
].func
);
107 gpio_set_pull(ptr
[i
].gpio
, GPIO_PULL_ENABLE
, GPIO_PULL_UP
);
111 void mtk_i2c_bus_init(uint8_t bus
, uint32_t speed
)
113 mtk_i2c_speed_init(bus
, speed
);
114 mtk_i2c_set_gpio_pinmux(bus
);
117 void mtk_i2c_dump_more_info(struct mt_i2c_regs
*regs
)
119 printk(BIOS_DEBUG
, "LTIMING %x\nCLK_DIV %x\n",
120 read32(®s
->ltiming
),
121 read32(®s
->clock_div
));
124 void mtk_i2c_config_timing(struct mt_i2c_regs
*regs
, struct mtk_i2c
*bus_ctrl
)
126 write32(®s
->clock_div
, bus_ctrl
->ac_timing
.inter_clk_div
);
127 write32(®s
->timing
, bus_ctrl
->ac_timing
.htiming
);
128 write32(®s
->ltiming
, bus_ctrl
->ac_timing
.ltiming
);
129 write32(®s
->hs
, bus_ctrl
->ac_timing
.hs
);
130 write32(®s
->ext_conf
, bus_ctrl
->ac_timing
.ext
);