| From 7c1f59c9d5caf3a84f35549b5d58f3c055a68da5 Mon Sep 17 00:00:00 2001 |
| From: Jean Delvare <khali@linux-fr.org> |
| Date: Thu, 12 Jan 2012 20:32:03 +0100 |
| Subject: i2c: Fix error value returned by several bus drivers |
| |
| From: Jean Delvare <khali@linux-fr.org> |
| |
| commit 7c1f59c9d5caf3a84f35549b5d58f3c055a68da5 upstream. |
| |
| When adding checks for ACPI resource conflicts to many bus drivers, |
| not enough attention was paid to the error paths, and for several |
| drivers this causes 0 to be returned on error in some cases. Fix this |
| by properly returning a non-zero value on every error. |
| |
| Signed-off-by: Jean Delvare <khali@linux-fr.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/i2c/busses/i2c-ali1535.c | 11 +++++++---- |
| drivers/i2c/busses/i2c-nforce2.c | 2 +- |
| drivers/i2c/busses/i2c-sis5595.c | 4 ++-- |
| drivers/i2c/busses/i2c-sis630.c | 6 +++++- |
| drivers/i2c/busses/i2c-viapro.c | 7 +++++-- |
| 5 files changed, 20 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-ali1535.c |
| +++ b/drivers/i2c/busses/i2c-ali1535.c |
| @@ -140,7 +140,7 @@ static unsigned short ali1535_smba; |
| defined to make the transition easier. */ |
| static int ali1535_setup(struct pci_dev *dev) |
| { |
| - int retval = -ENODEV; |
| + int retval; |
| unsigned char temp; |
| |
| /* Check the following things: |
| @@ -155,6 +155,7 @@ static int ali1535_setup(struct pci_dev |
| if (ali1535_smba == 0) { |
| dev_warn(&dev->dev, |
| "ALI1535_smb region uninitialized - upgrade BIOS?\n"); |
| + retval = -ENODEV; |
| goto exit; |
| } |
| |
| @@ -167,6 +168,7 @@ static int ali1535_setup(struct pci_dev |
| ali1535_driver.name)) { |
| dev_err(&dev->dev, "ALI1535_smb region 0x%x already in use!\n", |
| ali1535_smba); |
| + retval = -EBUSY; |
| goto exit; |
| } |
| |
| @@ -174,6 +176,7 @@ static int ali1535_setup(struct pci_dev |
| pci_read_config_byte(dev, SMBCFG, &temp); |
| if ((temp & ALI1535_SMBIO_EN) == 0) { |
| dev_err(&dev->dev, "SMB device not enabled - upgrade BIOS?\n"); |
| + retval = -ENODEV; |
| goto exit_free; |
| } |
| |
| @@ -181,6 +184,7 @@ static int ali1535_setup(struct pci_dev |
| pci_read_config_byte(dev, SMBHSTCFG, &temp); |
| if ((temp & 1) == 0) { |
| dev_err(&dev->dev, "SMBus controller not enabled - upgrade BIOS?\n"); |
| + retval = -ENODEV; |
| goto exit_free; |
| } |
| |
| @@ -198,12 +202,11 @@ static int ali1535_setup(struct pci_dev |
| dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp); |
| dev_dbg(&dev->dev, "ALI1535_smba = 0x%X\n", ali1535_smba); |
| |
| - retval = 0; |
| -exit: |
| - return retval; |
| + return 0; |
| |
| exit_free: |
| release_region(ali1535_smba, ALI1535_SMB_IOSIZE); |
| +exit: |
| return retval; |
| } |
| |
| --- a/drivers/i2c/busses/i2c-nforce2.c |
| +++ b/drivers/i2c/busses/i2c-nforce2.c |
| @@ -355,7 +355,7 @@ static int __devinit nforce2_probe_smb ( |
| error = acpi_check_region(smbus->base, smbus->size, |
| nforce2_driver.name); |
| if (error) |
| - return -1; |
| + return error; |
| |
| if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) { |
| dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n", |
| --- a/drivers/i2c/busses/i2c-sis5595.c |
| +++ b/drivers/i2c/busses/i2c-sis5595.c |
| @@ -147,7 +147,7 @@ static int sis5595_setup(struct pci_dev |
| u16 a; |
| u8 val; |
| int *i; |
| - int retval = -ENODEV; |
| + int retval; |
| |
| /* Look for imposters */ |
| for (i = blacklist; *i != 0; i++) { |
| @@ -223,7 +223,7 @@ static int sis5595_setup(struct pci_dev |
| |
| error: |
| release_region(sis5595_base + SMB_INDEX, 2); |
| - return retval; |
| + return -ENODEV; |
| } |
| |
| static int sis5595_transaction(struct i2c_adapter *adap) |
| --- a/drivers/i2c/busses/i2c-sis630.c |
| +++ b/drivers/i2c/busses/i2c-sis630.c |
| @@ -393,7 +393,7 @@ static int sis630_setup(struct pci_dev * |
| { |
| unsigned char b; |
| struct pci_dev *dummy = NULL; |
| - int retval = -ENODEV, i; |
| + int retval, i; |
| |
| /* check for supported SiS devices */ |
| for (i=0; supported[i] > 0 ; i++) { |
| @@ -418,18 +418,21 @@ static int sis630_setup(struct pci_dev * |
| */ |
| if (pci_read_config_byte(sis630_dev, SIS630_BIOS_CTL_REG,&b)) { |
| dev_err(&sis630_dev->dev, "Error: Can't read bios ctl reg\n"); |
| + retval = -ENODEV; |
| goto exit; |
| } |
| /* if ACPI already enabled , do nothing */ |
| if (!(b & 0x80) && |
| pci_write_config_byte(sis630_dev, SIS630_BIOS_CTL_REG, b | 0x80)) { |
| dev_err(&sis630_dev->dev, "Error: Can't enable ACPI\n"); |
| + retval = -ENODEV; |
| goto exit; |
| } |
| |
| /* Determine the ACPI base address */ |
| if (pci_read_config_word(sis630_dev,SIS630_ACPI_BASE_REG,&acpi_base)) { |
| dev_err(&sis630_dev->dev, "Error: Can't determine ACPI base address\n"); |
| + retval = -ENODEV; |
| goto exit; |
| } |
| |
| @@ -445,6 +448,7 @@ static int sis630_setup(struct pci_dev * |
| sis630_driver.name)) { |
| dev_err(&sis630_dev->dev, "SMBus registers 0x%04x-0x%04x already " |
| "in use!\n", acpi_base + SMB_STS, acpi_base + SMB_SAA); |
| + retval = -EBUSY; |
| goto exit; |
| } |
| |
| --- a/drivers/i2c/busses/i2c-viapro.c |
| +++ b/drivers/i2c/busses/i2c-viapro.c |
| @@ -330,7 +330,7 @@ static int __devinit vt596_probe(struct |
| const struct pci_device_id *id) |
| { |
| unsigned char temp; |
| - int error = -ENODEV; |
| + int error; |
| |
| /* Determine the address of the SMBus areas */ |
| if (force_addr) { |
| @@ -396,6 +396,7 @@ found: |
| dev_err(&pdev->dev, "SMBUS: Error: Host SMBus " |
| "controller not enabled! - upgrade BIOS or " |
| "use force=1\n"); |
| + error = -ENODEV; |
| goto release_region; |
| } |
| } |
| @@ -428,9 +429,11 @@ found: |
| "SMBus Via Pro adapter at %04x", vt596_smba); |
| |
| vt596_pdev = pci_dev_get(pdev); |
| - if (i2c_add_adapter(&vt596_adapter)) { |
| + error = i2c_add_adapter(&vt596_adapter); |
| + if (error) { |
| pci_dev_put(vt596_pdev); |
| vt596_pdev = NULL; |
| + goto release_region; |
| } |
| |
| /* Always return failure here. This is to allow other drivers to bind |