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

Pull i2c fixes from Wolfram Sang:

- omap: fix irq ACKS to avoid irq storming and system hang

- ali1535, ali15x3, sis630: fix error path at probe exit

* tag 'i2c-for-6.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: sis630: Fix an error handling path in sis630_probe()
i2c: ali15x3: Fix an error handling path in ali15x3_probe()
i2c: ali1535: Fix an error handling path in ali1535_probe()
i2c: omap: fix IRQ storms

Changed files
+40 -22
drivers
+11 -1
drivers/i2c/busses/i2c-ali1535.c
··· 485 485 486 486 static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id) 487 487 { 488 + int ret; 489 + 488 490 if (ali1535_setup(dev)) { 489 491 dev_warn(&dev->dev, 490 492 "ALI1535 not detected, module not inserted.\n"); ··· 498 496 499 497 snprintf(ali1535_adapter.name, sizeof(ali1535_adapter.name), 500 498 "SMBus ALI1535 adapter at %04x", ali1535_offset); 501 - return i2c_add_adapter(&ali1535_adapter); 499 + ret = i2c_add_adapter(&ali1535_adapter); 500 + if (ret) 501 + goto release_region; 502 + 503 + return 0; 504 + 505 + release_region: 506 + release_region(ali1535_smba, ALI1535_SMB_IOSIZE); 507 + return ret; 502 508 } 503 509 504 510 static void ali1535_remove(struct pci_dev *dev)
+11 -1
drivers/i2c/busses/i2c-ali15x3.c
··· 472 472 473 473 static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id) 474 474 { 475 + int ret; 476 + 475 477 if (ali15x3_setup(dev)) { 476 478 dev_err(&dev->dev, 477 479 "ALI15X3 not detected, module not inserted.\n"); ··· 485 483 486 484 snprintf(ali15x3_adapter.name, sizeof(ali15x3_adapter.name), 487 485 "SMBus ALI15X3 adapter at %04x", ali15x3_smba); 488 - return i2c_add_adapter(&ali15x3_adapter); 486 + ret = i2c_add_adapter(&ali15x3_adapter); 487 + if (ret) 488 + goto release_region; 489 + 490 + return 0; 491 + 492 + release_region: 493 + release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE); 494 + return ret; 489 495 } 490 496 491 497 static void ali15x3_remove(struct pci_dev *dev)
+7 -19
drivers/i2c/busses/i2c-omap.c
··· 1048 1048 return 0; 1049 1049 } 1050 1050 1051 - static irqreturn_t 1052 - omap_i2c_isr(int irq, void *dev_id) 1053 - { 1054 - struct omap_i2c_dev *omap = dev_id; 1055 - irqreturn_t ret = IRQ_HANDLED; 1056 - u16 mask; 1057 - u16 stat; 1058 - 1059 - stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG); 1060 - mask = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG) & ~OMAP_I2C_STAT_NACK; 1061 - 1062 - if (stat & mask) 1063 - ret = IRQ_WAKE_THREAD; 1064 - 1065 - return ret; 1066 - } 1067 - 1068 1051 static int omap_i2c_xfer_data(struct omap_i2c_dev *omap) 1069 1052 { 1070 1053 u16 bits; ··· 1078 1095 } 1079 1096 1080 1097 if (stat & OMAP_I2C_STAT_NACK) { 1081 - err |= OMAP_I2C_STAT_NACK; 1098 + omap->cmd_err |= OMAP_I2C_STAT_NACK; 1082 1099 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_NACK); 1100 + 1101 + if (!(stat & ~OMAP_I2C_STAT_NACK)) { 1102 + err = -EAGAIN; 1103 + break; 1104 + } 1083 1105 } 1084 1106 1085 1107 if (stat & OMAP_I2C_STAT_AL) { ··· 1460 1472 IRQF_NO_SUSPEND, pdev->name, omap); 1461 1473 else 1462 1474 r = devm_request_threaded_irq(&pdev->dev, omap->irq, 1463 - omap_i2c_isr, omap_i2c_isr_thread, 1475 + NULL, omap_i2c_isr_thread, 1464 1476 IRQF_NO_SUSPEND | IRQF_ONESHOT, 1465 1477 pdev->name, omap); 1466 1478
+11 -1
drivers/i2c/busses/i2c-sis630.c
··· 509 509 510 510 static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id) 511 511 { 512 + int ret; 513 + 512 514 if (sis630_setup(dev)) { 513 515 dev_err(&dev->dev, 514 516 "SIS630 compatible bus not detected, " ··· 524 522 snprintf(sis630_adapter.name, sizeof(sis630_adapter.name), 525 523 "SMBus SIS630 adapter at %04x", smbus_base + SMB_STS); 526 524 527 - return i2c_add_adapter(&sis630_adapter); 525 + ret = i2c_add_adapter(&sis630_adapter); 526 + if (ret) 527 + goto release_region; 528 + 529 + return 0; 530 + 531 + release_region: 532 + release_region(smbus_base + SMB_STS, SIS630_SMB_IOREGION); 533 + return ret; 528 534 } 529 535 530 536 static void sis630_remove(struct pci_dev *dev)