Skip to content

Commit 0990528

Browse files
committed
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
2 parents ad87a8d + 3ef18b2 commit 0990528

File tree

4 files changed

+40
-22
lines changed

4 files changed

+40
-22
lines changed

drivers/i2c/busses/i2c-ali1535.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ MODULE_DEVICE_TABLE(pci, ali1535_ids);
485485

486486
static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id)
487487
{
488+
int ret;
489+
488490
if (ali1535_setup(dev)) {
489491
dev_warn(&dev->dev,
490492
"ALI1535 not detected, module not inserted.\n");
@@ -496,7 +498,15 @@ static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id)
496498

497499
snprintf(ali1535_adapter.name, sizeof(ali1535_adapter.name),
498500
"SMBus ALI1535 adapter at %04x", ali1535_offset);
499-
return i2c_add_adapter(&ali1535_adapter);
501+
ret = i2c_add_adapter(&ali1535_adapter);
502+
if (ret)
503+
goto release_region;
504+
505+
return 0;
506+
507+
release_region:
508+
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
509+
return ret;
500510
}
501511

502512
static void ali1535_remove(struct pci_dev *dev)

drivers/i2c/busses/i2c-ali15x3.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,8 @@ MODULE_DEVICE_TABLE (pci, ali15x3_ids);
472472

473473
static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id)
474474
{
475+
int ret;
476+
475477
if (ali15x3_setup(dev)) {
476478
dev_err(&dev->dev,
477479
"ALI15X3 not detected, module not inserted.\n");
@@ -483,7 +485,15 @@ static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id)
483485

484486
snprintf(ali15x3_adapter.name, sizeof(ali15x3_adapter.name),
485487
"SMBus ALI15X3 adapter at %04x", ali15x3_smba);
486-
return i2c_add_adapter(&ali15x3_adapter);
488+
ret = i2c_add_adapter(&ali15x3_adapter);
489+
if (ret)
490+
goto release_region;
491+
492+
return 0;
493+
494+
release_region:
495+
release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE);
496+
return ret;
487497
}
488498

489499
static void ali15x3_remove(struct pci_dev *dev)

drivers/i2c/busses/i2c-omap.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,23 +1048,6 @@ static int omap_i2c_transmit_data(struct omap_i2c_dev *omap, u8 num_bytes,
10481048
return 0;
10491049
}
10501050

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-
10681051
static int omap_i2c_xfer_data(struct omap_i2c_dev *omap)
10691052
{
10701053
u16 bits;
@@ -1095,8 +1078,13 @@ static int omap_i2c_xfer_data(struct omap_i2c_dev *omap)
10951078
}
10961079

10971080
if (stat & OMAP_I2C_STAT_NACK) {
1098-
err |= OMAP_I2C_STAT_NACK;
1081+
omap->cmd_err |= OMAP_I2C_STAT_NACK;
10991082
omap_i2c_ack_stat(omap, OMAP_I2C_STAT_NACK);
1083+
1084+
if (!(stat & ~OMAP_I2C_STAT_NACK)) {
1085+
err = -EAGAIN;
1086+
break;
1087+
}
11001088
}
11011089

11021090
if (stat & OMAP_I2C_STAT_AL) {
@@ -1472,7 +1460,7 @@ omap_i2c_probe(struct platform_device *pdev)
14721460
IRQF_NO_SUSPEND, pdev->name, omap);
14731461
else
14741462
r = devm_request_threaded_irq(&pdev->dev, omap->irq,
1475-
omap_i2c_isr, omap_i2c_isr_thread,
1463+
NULL, omap_i2c_isr_thread,
14761464
IRQF_NO_SUSPEND | IRQF_ONESHOT,
14771465
pdev->name, omap);
14781466

drivers/i2c/busses/i2c-sis630.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,8 @@ MODULE_DEVICE_TABLE(pci, sis630_ids);
509509

510510
static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id)
511511
{
512+
int ret;
513+
512514
if (sis630_setup(dev)) {
513515
dev_err(&dev->dev,
514516
"SIS630 compatible bus not detected, "
@@ -522,7 +524,15 @@ static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id)
522524
snprintf(sis630_adapter.name, sizeof(sis630_adapter.name),
523525
"SMBus SIS630 adapter at %04x", smbus_base + SMB_STS);
524526

525-
return i2c_add_adapter(&sis630_adapter);
527+
ret = i2c_add_adapter(&sis630_adapter);
528+
if (ret)
529+
goto release_region;
530+
531+
return 0;
532+
533+
release_region:
534+
release_region(smbus_base + SMB_STS, SIS630_SMB_IOREGION);
535+
return ret;
526536
}
527537

528538
static void sis630_remove(struct pci_dev *dev)

0 commit comments

Comments
 (0)