Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'i2c-for-6.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
"A set of I2C driver fixes. Mostly fixing resource leaks or sanity
checks"

* tag 'i2c-for-6.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: xiic: Correct return value check for xiic_reinit()
i2c: mux: gpio: Add missing fwnode_handle_put()
i2c: mux: demux-pinctrl: check the return value of devm_kstrdup()
i2c: designware: fix __i2c_dw_disable() in case master is holding SCL low
i2c: i801: unregister tco_pdev in i801_probe() error path

+29 -2
+17
drivers/i2c/busses/i2c-designware-common.c
··· 441 441 442 442 void __i2c_dw_disable(struct dw_i2c_dev *dev) 443 443 { 444 + unsigned int raw_intr_stats; 445 + unsigned int enable; 444 446 int timeout = 100; 447 + bool abort_needed; 445 448 unsigned int status; 449 + int ret; 450 + 451 + regmap_read(dev->map, DW_IC_RAW_INTR_STAT, &raw_intr_stats); 452 + regmap_read(dev->map, DW_IC_ENABLE, &enable); 453 + 454 + abort_needed = raw_intr_stats & DW_IC_INTR_MST_ON_HOLD; 455 + if (abort_needed) { 456 + regmap_write(dev->map, DW_IC_ENABLE, enable | DW_IC_ENABLE_ABORT); 457 + ret = regmap_read_poll_timeout(dev->map, DW_IC_ENABLE, enable, 458 + !(enable & DW_IC_ENABLE_ABORT), 10, 459 + 100); 460 + if (ret) 461 + dev_err(dev->dev, "timeout while trying to abort current transfer\n"); 462 + } 446 463 447 464 do { 448 465 __i2c_dw_disable_nowait(dev);
+3
drivers/i2c/busses/i2c-designware-core.h
··· 98 98 #define DW_IC_INTR_START_DET BIT(10) 99 99 #define DW_IC_INTR_GEN_CALL BIT(11) 100 100 #define DW_IC_INTR_RESTART_DET BIT(12) 101 + #define DW_IC_INTR_MST_ON_HOLD BIT(13) 101 102 102 103 #define DW_IC_INTR_DEFAULT_MASK (DW_IC_INTR_RX_FULL | \ 103 104 DW_IC_INTR_TX_ABRT | \ ··· 108 107 #define DW_IC_INTR_SLAVE_MASK (DW_IC_INTR_DEFAULT_MASK | \ 109 108 DW_IC_INTR_RX_UNDER | \ 110 109 DW_IC_INTR_RD_REQ) 110 + 111 + #define DW_IC_ENABLE_ABORT BIT(1) 111 112 112 113 #define DW_IC_STATUS_ACTIVITY BIT(0) 113 114 #define DW_IC_STATUS_TFE BIT(2)
+1
drivers/i2c/busses/i2c-i801.c
··· 1754 1754 "SMBus I801 adapter at %04lx", priv->smba); 1755 1755 err = i2c_add_adapter(&priv->adapter); 1756 1756 if (err) { 1757 + platform_device_unregister(priv->tco_pdev); 1757 1758 i801_acpi_remove(priv); 1758 1759 return err; 1759 1760 }
+1 -1
drivers/i2c/busses/i2c-xiic.c
··· 710 710 * reset the IP instead of just flush fifos 711 711 */ 712 712 ret = xiic_reinit(i2c); 713 - if (!ret) 713 + if (ret < 0) 714 714 dev_dbg(i2c->adap.dev.parent, "reinit failed\n"); 715 715 716 716 if (i2c->rx_msg) {
+4
drivers/i2c/muxes/i2c-demux-pinctrl.c
··· 243 243 244 244 props[i].name = devm_kstrdup(&pdev->dev, "status", GFP_KERNEL); 245 245 props[i].value = devm_kstrdup(&pdev->dev, "ok", GFP_KERNEL); 246 + if (!props[i].name || !props[i].value) { 247 + err = -ENOMEM; 248 + goto err_rollback; 249 + } 246 250 props[i].length = 3; 247 251 248 252 of_changeset_init(&priv->chan[i].chgset);
+3 -1
drivers/i2c/muxes/i2c-mux-gpio.c
··· 105 105 106 106 } else if (is_acpi_node(child)) { 107 107 rc = acpi_get_local_address(ACPI_HANDLE_FWNODE(child), values + i); 108 - if (rc) 108 + if (rc) { 109 + fwnode_handle_put(child); 109 110 return dev_err_probe(dev, rc, "Cannot get address\n"); 111 + } 110 112 } 111 113 112 114 i++;