Skip to content

Commit 11ac4ce

Browse files
committed
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
2 parents 8d8bd2a + 2f42e85 commit 11ac4ce

3 files changed

Lines changed: 20 additions & 1 deletion

File tree

drivers/i2c/busses/i2c-cp2615.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ cp2615_i2c_probe(struct usb_interface *usbif, const struct usb_device_id *id)
298298
if (!adap)
299299
return -ENOMEM;
300300

301+
if (!usbdev->serial)
302+
return -EINVAL;
303+
301304
strscpy(adap->name, usbdev->serial, sizeof(adap->name));
302305
adap->owner = THIS_MODULE;
303306
adap->dev.parent = &usbif->dev;

drivers/i2c/busses/i2c-fsi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,7 @@ static int fsi_i2c_probe(struct fsi_device *fsi_dev)
729729
rc = i2c_add_adapter(&port->adapter);
730730
if (rc < 0) {
731731
dev_err(dev, "Failed to register adapter: %d\n", rc);
732+
of_node_put(np);
732733
kfree(port);
733734
continue;
734735
}

drivers/i2c/busses/i2c-pxa.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ struct pxa_i2c {
268268
struct pinctrl *pinctrl;
269269
struct pinctrl_state *pinctrl_default;
270270
struct pinctrl_state *pinctrl_recovery;
271+
bool reset_before_xfer;
271272
};
272273

273274
#define _IBMR(i2c) ((i2c)->reg_ibmr)
@@ -1144,6 +1145,11 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap,
11441145
{
11451146
struct pxa_i2c *i2c = adap->algo_data;
11461147

1148+
if (i2c->reset_before_xfer) {
1149+
i2c_pxa_reset(i2c);
1150+
i2c->reset_before_xfer = false;
1151+
}
1152+
11471153
return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_xfer);
11481154
}
11491155

@@ -1521,7 +1527,16 @@ static int i2c_pxa_probe(struct platform_device *dev)
15211527
}
15221528
}
15231529

1524-
i2c_pxa_reset(i2c);
1530+
/*
1531+
* Skip reset on Armada 3700 when recovery is used to avoid
1532+
* controller hang due to the pinctrl state changes done by
1533+
* the generic recovery initialization code. The reset will
1534+
* be performed later, prior to the first transfer.
1535+
*/
1536+
if (i2c_type == REGS_A3700 && i2c->adap.bus_recovery_info)
1537+
i2c->reset_before_xfer = true;
1538+
else
1539+
i2c_pxa_reset(i2c);
15251540

15261541
ret = i2c_add_numbered_adapter(&i2c->adap);
15271542
if (ret < 0)

0 commit comments

Comments
 (0)