aboutsummaryrefslogtreecommitdiff
path: root/src/soc/mediatek/mt8173/i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/mediatek/mt8173/i2c.c')
-rw-r--r--src/soc/mediatek/mt8173/i2c.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/soc/mediatek/mt8173/i2c.c b/src/soc/mediatek/mt8173/i2c.c
index f07ffc92ab..1d541e5d0f 100644
--- a/src/soc/mediatek/mt8173/i2c.c
+++ b/src/soc/mediatek/mt8173/i2c.c
@@ -136,7 +136,7 @@ static inline void mtk_i2c_dump_info(uint8_t bus)
I2CLOG("addr address %x\n", (uint32_t)regs);
}
-static uint32_t mtk_i2c_transfer(uint8_t bus, struct i2c_seg *seg,
+static uint32_t mtk_i2c_transfer(uint8_t bus, struct i2c_msg *seg,
enum i2c_modes read)
{
uint32_t ret_code = I2C_OK;
@@ -154,7 +154,7 @@ static uint32_t mtk_i2c_transfer(uint8_t bus, struct i2c_seg *seg,
regs = i2c[bus].i2c_regs;
dma_regs = i2c[bus].i2c_dma_regs;
- addr = seg[0].chip;
+ addr = seg[0].slave;
switch (read) {
case I2C_WRITE_MODE:
@@ -305,26 +305,31 @@ static uint32_t mtk_i2c_transfer(uint8_t bus, struct i2c_seg *seg,
return ret_code;
}
-static uint8_t mtk_i2c_should_combine(struct i2c_seg *seg, int left_count)
+static uint8_t mtk_i2c_should_combine(struct i2c_msg *seg, int left_count)
{
- if (left_count >= 2 && seg[0].read == 0 && seg[1].read == 1 &&
- seg[0].chip == seg[1].chip)
+ if (left_count >= 2 &&
+ !(seg[0].flags & I2C_M_RD) &&
+ (seg[1].flags & I2C_M_RD) &&
+ seg[0].slave == seg[1].slave)
return 1;
else
return 0;
}
-int platform_i2c_transfer(unsigned bus, struct i2c_seg *segments, int seg_count)
+int platform_i2c_transfer(unsigned bus, struct i2c_msg *segments,
+ int seg_count)
{
int ret = 0;
int i;
int read;
for (i = 0; i < seg_count; i++) {
- if (mtk_i2c_should_combine(&segments[i], seg_count - i))
+ if (mtk_i2c_should_combine(&segments[i], seg_count - i)) {
read = I2C_WRITE_READ_MODE;
- else
- read = segments[i].read;
+ } else {
+ read = (segments[i].flags & I2C_M_RD) ?
+ I2C_READ_MODE : I2C_WRITE_MODE;
+ }
ret = mtk_i2c_transfer(bus, &segments[i], read);