Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
"Three driver bugfixes for I2C. Buisness as usual"

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: mediatek: Fix apdma and i2c hand-shake timeout
i2c: i801: Fix the i2c-mux gpiod_lookup_table not being properly terminated
i2c: sprd: use a specific timeout to avoid system hang up issue

+30 -7
+1 -1
drivers/i2c/busses/i2c-i801.c
··· 1449 1449 1450 1450 /* Register GPIO descriptor lookup table */ 1451 1451 lookup = devm_kzalloc(dev, 1452 - struct_size(lookup, table, mux_config->n_gpios), 1452 + struct_size(lookup, table, mux_config->n_gpios + 1), 1453 1453 GFP_KERNEL); 1454 1454 if (!lookup) 1455 1455 return -ENOMEM;
+22 -5
drivers/i2c/busses/i2c-mt65xx.c
··· 38 38 #define I2C_IO_CONFIG_OPEN_DRAIN 0x0003 39 39 #define I2C_IO_CONFIG_PUSH_PULL 0x0000 40 40 #define I2C_SOFT_RST 0x0001 41 + #define I2C_HANDSHAKE_RST 0x0020 41 42 #define I2C_FIFO_ADDR_CLR 0x0001 42 43 #define I2C_DELAY_LEN 0x0002 43 44 #define I2C_TIME_CLR_VALUE 0x0000 ··· 46 45 #define I2C_WRRD_TRANAC_VALUE 0x0002 47 46 #define I2C_RD_TRANAC_VALUE 0x0001 48 47 #define I2C_SCL_MIS_COMP_VALUE 0x0000 48 + #define I2C_CHN_CLR_FLAG 0x0000 49 49 50 50 #define I2C_DMA_CON_TX 0x0000 51 51 #define I2C_DMA_CON_RX 0x0001 ··· 56 54 #define I2C_DMA_START_EN 0x0001 57 55 #define I2C_DMA_INT_FLAG_NONE 0x0000 58 56 #define I2C_DMA_CLR_FLAG 0x0000 57 + #define I2C_DMA_WARM_RST 0x0001 59 58 #define I2C_DMA_HARD_RST 0x0002 59 + #define I2C_DMA_HANDSHAKE_RST 0x0004 60 60 61 61 #define MAX_SAMPLE_CNT_DIV 8 62 62 #define MAX_STEP_CNT_DIV 64 ··· 479 475 { 480 476 u16 control_reg; 481 477 482 - writel(I2C_DMA_HARD_RST, i2c->pdmabase + OFFSET_RST); 483 - udelay(50); 484 - writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST); 485 - 486 - mtk_i2c_writew(i2c, I2C_SOFT_RST, OFFSET_SOFTRESET); 478 + if (i2c->dev_comp->dma_sync) { 479 + writel(I2C_DMA_WARM_RST, i2c->pdmabase + OFFSET_RST); 480 + udelay(10); 481 + writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST); 482 + udelay(10); 483 + writel(I2C_DMA_HANDSHAKE_RST | I2C_DMA_HARD_RST, 484 + i2c->pdmabase + OFFSET_RST); 485 + mtk_i2c_writew(i2c, I2C_HANDSHAKE_RST | I2C_SOFT_RST, 486 + OFFSET_SOFTRESET); 487 + udelay(10); 488 + writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST); 489 + mtk_i2c_writew(i2c, I2C_CHN_CLR_FLAG, OFFSET_SOFTRESET); 490 + } else { 491 + writel(I2C_DMA_HARD_RST, i2c->pdmabase + OFFSET_RST); 492 + udelay(50); 493 + writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST); 494 + mtk_i2c_writew(i2c, I2C_SOFT_RST, OFFSET_SOFTRESET); 495 + } 487 496 488 497 /* Set ioconfig */ 489 498 if (i2c->use_push_pull)
+7 -1
drivers/i2c/busses/i2c-sprd.c
··· 72 72 73 73 /* timeout (ms) for pm runtime autosuspend */ 74 74 #define SPRD_I2C_PM_TIMEOUT 1000 75 + /* timeout (ms) for transfer message */ 76 + #define I2C_XFER_TIMEOUT 1000 75 77 76 78 /* SPRD i2c data structure */ 77 79 struct sprd_i2c { ··· 246 244 struct i2c_msg *msg, bool is_last_msg) 247 245 { 248 246 struct sprd_i2c *i2c_dev = i2c_adap->algo_data; 247 + unsigned long time_left; 249 248 250 249 i2c_dev->msg = msg; 251 250 i2c_dev->buf = msg->buf; ··· 276 273 277 274 sprd_i2c_opt_start(i2c_dev); 278 275 279 - wait_for_completion(&i2c_dev->complete); 276 + time_left = wait_for_completion_timeout(&i2c_dev->complete, 277 + msecs_to_jiffies(I2C_XFER_TIMEOUT)); 278 + if (!time_left) 279 + return -ETIMEDOUT; 280 280 281 281 return i2c_dev->err; 282 282 }