mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 01:54:09 +08:00
A set of I2C driver fixes. Mostly fixing resource leaks or sanity
checks. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEOZGx6rniZ1Gk92RdFA3kzBSgKbYFAmUPEk8ACgkQFA3kzBSg KbbHAQ/8DhJRoJlATgy3UinyDcGWF1ifxr/5AzWcN5x5ju/eSHlghKUVl+KaZHWB NCCYH3JMBjHeDpHD9xSLnUYhcCBugmcEw+nHNC4WY+5LBvXHL/9ZzN1yhFmYjlob NeRZzaefjPdKLucjr52FHzOBZIDS3T5dwIsMj4LmoaO+qYouOgjxBZ0N+G5EQvxT FWzAwb/rdeMrTo3lrX2EQGV29Io0lpGl/QpR/71+uKcJndENaPHVm05ne0V2un/6 D6KI7UBmpAnmTzNYmujpqG8UD/dhAiKs/qJdIRKLMx25E5fzJWN5zliaKk5iOeRG Xcdv/K4GabEcMuY3RM59YO3WE+p/pL5sNeJlioTCnAASKEFLr9Q67wN5rKYBAHxM xwlnwHcWNMg8DMrIawHlHaLIUC2z+BBDRSiP2xPUy5aj10lQ/Unf96bsRo7F8UP9 h48I25RsXxmExOzBz3Caz1rJgOFnmkH5uoIr7az8BTcBMzekECwLZvPAnsUHtXB0 M+XD1ZW6hhavLjDaKHMOWbF/HmidDvtZtrbMVDHzHzpkLBwnIJQ0EEZTkDcPUjP7 WqBx+cBcRVfMOnTie/vhpsFbsM+8VuHD55HQjDwEMML/GNrrLqC8G1izB1Y4Nc8h PCmN1ai4jSdS06yVxMnGnDDLLl0U0Bpv/0Jsaneolfxfg4SWfdw= =oqo+ -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
5a4de7dc9e
@ -441,8 +441,25 @@ err_release_lock:
|
||||
|
||||
void __i2c_dw_disable(struct dw_i2c_dev *dev)
|
||||
{
|
||||
unsigned int raw_intr_stats;
|
||||
unsigned int enable;
|
||||
int timeout = 100;
|
||||
bool abort_needed;
|
||||
unsigned int status;
|
||||
int ret;
|
||||
|
||||
regmap_read(dev->map, DW_IC_RAW_INTR_STAT, &raw_intr_stats);
|
||||
regmap_read(dev->map, DW_IC_ENABLE, &enable);
|
||||
|
||||
abort_needed = raw_intr_stats & DW_IC_INTR_MST_ON_HOLD;
|
||||
if (abort_needed) {
|
||||
regmap_write(dev->map, DW_IC_ENABLE, enable | DW_IC_ENABLE_ABORT);
|
||||
ret = regmap_read_poll_timeout(dev->map, DW_IC_ENABLE, enable,
|
||||
!(enable & DW_IC_ENABLE_ABORT), 10,
|
||||
100);
|
||||
if (ret)
|
||||
dev_err(dev->dev, "timeout while trying to abort current transfer\n");
|
||||
}
|
||||
|
||||
do {
|
||||
__i2c_dw_disable_nowait(dev);
|
||||
|
@ -98,6 +98,7 @@
|
||||
#define DW_IC_INTR_START_DET BIT(10)
|
||||
#define DW_IC_INTR_GEN_CALL BIT(11)
|
||||
#define DW_IC_INTR_RESTART_DET BIT(12)
|
||||
#define DW_IC_INTR_MST_ON_HOLD BIT(13)
|
||||
|
||||
#define DW_IC_INTR_DEFAULT_MASK (DW_IC_INTR_RX_FULL | \
|
||||
DW_IC_INTR_TX_ABRT | \
|
||||
@ -108,6 +109,8 @@
|
||||
DW_IC_INTR_RX_UNDER | \
|
||||
DW_IC_INTR_RD_REQ)
|
||||
|
||||
#define DW_IC_ENABLE_ABORT BIT(1)
|
||||
|
||||
#define DW_IC_STATUS_ACTIVITY BIT(0)
|
||||
#define DW_IC_STATUS_TFE BIT(2)
|
||||
#define DW_IC_STATUS_RFNE BIT(3)
|
||||
|
@ -1754,6 +1754,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
"SMBus I801 adapter at %04lx", priv->smba);
|
||||
err = i2c_add_adapter(&priv->adapter);
|
||||
if (err) {
|
||||
platform_device_unregister(priv->tco_pdev);
|
||||
i801_acpi_remove(priv);
|
||||
return err;
|
||||
}
|
||||
|
@ -710,7 +710,7 @@ static irqreturn_t xiic_process(int irq, void *dev_id)
|
||||
* reset the IP instead of just flush fifos
|
||||
*/
|
||||
ret = xiic_reinit(i2c);
|
||||
if (!ret)
|
||||
if (ret < 0)
|
||||
dev_dbg(i2c->adap.dev.parent, "reinit failed\n");
|
||||
|
||||
if (i2c->rx_msg) {
|
||||
|
@ -243,6 +243,10 @@ static int i2c_demux_pinctrl_probe(struct platform_device *pdev)
|
||||
|
||||
props[i].name = devm_kstrdup(&pdev->dev, "status", GFP_KERNEL);
|
||||
props[i].value = devm_kstrdup(&pdev->dev, "ok", GFP_KERNEL);
|
||||
if (!props[i].name || !props[i].value) {
|
||||
err = -ENOMEM;
|
||||
goto err_rollback;
|
||||
}
|
||||
props[i].length = 3;
|
||||
|
||||
of_changeset_init(&priv->chan[i].chgset);
|
||||
|
@ -105,8 +105,10 @@ static int i2c_mux_gpio_probe_fw(struct gpiomux *mux,
|
||||
|
||||
} else if (is_acpi_node(child)) {
|
||||
rc = acpi_get_local_address(ACPI_HANDLE_FWNODE(child), values + i);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
fwnode_handle_put(child);
|
||||
return dev_err_probe(dev, rc, "Cannot get address\n");
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
|
Loading…
Reference in New Issue
Block a user