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

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

Pull i2c fixes from Wolfram Sang:

- fix broken I2C communication on Armada 3700 with recovery

- fix device_node reference leak in probe (fsi)

- fix NULL-deref when serial string is missing (cp2615)

* tag 'i2c-for-7.0-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: pxa: defer reset on Armada 3700 when recovery is used
i2c: fsi: Fix a potential leak in fsi_i2c_probe()
i2c: cp2615: fix serial string NULL-deref at probe

+20 -1
+3
drivers/i2c/busses/i2c-cp2615.c
··· 298 298 if (!adap) 299 299 return -ENOMEM; 300 300 301 + if (!usbdev->serial) 302 + return -EINVAL; 303 + 301 304 strscpy(adap->name, usbdev->serial, sizeof(adap->name)); 302 305 adap->owner = THIS_MODULE; 303 306 adap->dev.parent = &usbif->dev;
+1
drivers/i2c/busses/i2c-fsi.c
··· 729 729 rc = i2c_add_adapter(&port->adapter); 730 730 if (rc < 0) { 731 731 dev_err(dev, "Failed to register adapter: %d\n", rc); 732 + of_node_put(np); 732 733 kfree(port); 733 734 continue; 734 735 }
+16 -1
drivers/i2c/busses/i2c-pxa.c
··· 268 268 struct pinctrl *pinctrl; 269 269 struct pinctrl_state *pinctrl_default; 270 270 struct pinctrl_state *pinctrl_recovery; 271 + bool reset_before_xfer; 271 272 }; 272 273 273 274 #define _IBMR(i2c) ((i2c)->reg_ibmr) ··· 1145 1144 { 1146 1145 struct pxa_i2c *i2c = adap->algo_data; 1147 1146 1147 + if (i2c->reset_before_xfer) { 1148 + i2c_pxa_reset(i2c); 1149 + i2c->reset_before_xfer = false; 1150 + } 1151 + 1148 1152 return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_xfer); 1149 1153 } 1150 1154 ··· 1527 1521 } 1528 1522 } 1529 1523 1530 - i2c_pxa_reset(i2c); 1524 + /* 1525 + * Skip reset on Armada 3700 when recovery is used to avoid 1526 + * controller hang due to the pinctrl state changes done by 1527 + * the generic recovery initialization code. The reset will 1528 + * be performed later, prior to the first transfer. 1529 + */ 1530 + if (i2c_type == REGS_A3700 && i2c->adap.bus_recovery_info) 1531 + i2c->reset_before_xfer = true; 1532 + else 1533 + i2c_pxa_reset(i2c); 1531 1534 1532 1535 ret = i2c_add_numbered_adapter(&i2c->adap); 1533 1536 if (ret < 0)