Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: Check for ACPI resource conflicts

Check for ACPI resource conflicts in i2c bus drivers. I've included
all recent SMBus master drivers for PC hardware.

I've voluntarily left out:
* Drivers that don't run on PCs: they can't conflict with ACPI.
* Bit-banged bus device drivers: it's very unlikely that ACPI would
deal with such buses.

Signed-off-by: Jean Delvare <jdelvare@suse.de>

authored by

Jean Delvare and committed by
Jean Delvare
54fb4a05 2373c180

+67
+6
drivers/i2c/busses/i2c-ali1535.c
··· 61 61 #include <linux/ioport.h> 62 62 #include <linux/i2c.h> 63 63 #include <linux/init.h> 64 + #include <linux/acpi.h> 64 65 #include <asm/io.h> 65 66 66 67 ··· 159 158 "ALI1535_smb region uninitialized - upgrade BIOS?\n"); 160 159 goto exit; 161 160 } 161 + 162 + retval = acpi_check_region(ali1535_smba, ALI1535_SMB_IOSIZE, 163 + ali1535_driver.name); 164 + if (retval) 165 + goto exit; 162 166 163 167 if (!request_region(ali1535_smba, ALI1535_SMB_IOSIZE, 164 168 ali1535_driver.name)) {
+5
drivers/i2c/busses/i2c-ali1563.c
··· 21 21 #include <linux/i2c.h> 22 22 #include <linux/pci.h> 23 23 #include <linux/init.h> 24 + #include <linux/acpi.h> 24 25 25 26 #define ALI1563_MAX_TIMEOUT 500 26 27 #define ALI1563_SMBBA 0x80 ··· 356 355 goto Err; 357 356 } 358 357 } 358 + 359 + if (acpi_check_region(ali1563_smba, ALI1563_SMB_IOSIZE, 360 + ali1563_pci_driver.name)) 361 + goto Err; 359 362 360 363 if (!request_region(ali1563_smba, ALI1563_SMB_IOSIZE, 361 364 ali1563_pci_driver.name)) {
+5
drivers/i2c/busses/i2c-ali15x3.c
··· 68 68 #include <linux/delay.h> 69 69 #include <linux/i2c.h> 70 70 #include <linux/init.h> 71 + #include <linux/acpi.h> 71 72 #include <asm/io.h> 72 73 73 74 /* ALI15X3 SMBus address offsets */ ··· 166 165 167 166 if(force_addr) 168 167 ali15x3_smba = force_addr & ~(ALI15X3_SMB_IOSIZE - 1); 168 + 169 + if (acpi_check_region(ali15x3_smba, ALI15X3_SMB_IOSIZE, 170 + ali15x3_driver.name)) 171 + return -EBUSY; 169 172 170 173 if (!request_region(ali15x3_smba, ALI15X3_SMB_IOSIZE, 171 174 ali15x3_driver.name)) {
+6
drivers/i2c/busses/i2c-amd756.c
··· 45 45 #include <linux/ioport.h> 46 46 #include <linux/i2c.h> 47 47 #include <linux/init.h> 48 + #include <linux/acpi.h> 48 49 #include <asm/io.h> 49 50 50 51 /* AMD756 SMBus address offsets */ ··· 368 367 amd756_ioport &= 0xff00; 369 368 amd756_ioport += SMB_ADDR_OFFSET; 370 369 } 370 + 371 + error = acpi_check_region(amd756_ioport, SMB_IOSIZE, 372 + amd756_driver.name); 373 + if (error) 374 + return error; 371 375 372 376 if (!request_region(amd756_ioport, SMB_IOSIZE, amd756_driver.name)) { 373 377 dev_err(&pdev->dev, "SMB region 0x%x already in use!\n",
+5
drivers/i2c/busses/i2c-amd8111.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/i2c.h> 18 18 #include <linux/delay.h> 19 + #include <linux/acpi.h> 19 20 #include <asm/io.h> 20 21 21 22 MODULE_LICENSE("GPL"); ··· 374 373 smbus->dev = dev; 375 374 smbus->base = pci_resource_start(dev, 0); 376 375 smbus->size = pci_resource_len(dev, 0); 376 + 377 + error = acpi_check_resource_conflict(&dev->resource[0]); 378 + if (error) 379 + goto out_kfree; 377 380 378 381 if (!request_region(smbus->base, smbus->size, amd8111_driver.name)) { 379 382 error = -EBUSY;
+5
drivers/i2c/busses/i2c-i801.c
··· 64 64 #include <linux/ioport.h> 65 65 #include <linux/init.h> 66 66 #include <linux/i2c.h> 67 + #include <linux/acpi.h> 67 68 #include <asm/io.h> 68 69 69 70 /* I801 SMBus address offsets */ ··· 624 623 err = -ENODEV; 625 624 goto exit; 626 625 } 626 + 627 + err = acpi_check_resource_conflict(&dev->resource[SMBBAR]); 628 + if (err) 629 + goto exit; 627 630 628 631 err = pci_request_region(dev, SMBBAR, i801_driver.name); 629 632 if (err) {
+3
drivers/i2c/busses/i2c-isch.c
··· 35 35 #include <linux/i2c.h> 36 36 #include <linux/init.h> 37 37 #include <linux/io.h> 38 + #include <linux/acpi.h> 38 39 39 40 /* SCH SMBus address offsets */ 40 41 #define SMBHSTCNT (0 + sch_smba) ··· 280 279 dev_err(&dev->dev, "SMBus base address uninitialized!\n"); 281 280 return -ENODEV; 282 281 } 282 + if (acpi_check_region(sch_smba, SMBIOSIZE, sch_driver.name)) 283 + return -EBUSY; 283 284 if (!request_region(sch_smba, SMBIOSIZE, sch_driver.name)) { 284 285 dev_err(&dev->dev, "SMBus region 0x%x already in use!\n", 285 286 sch_smba);
+6
drivers/i2c/busses/i2c-nforce2.c
··· 51 51 #include <linux/i2c.h> 52 52 #include <linux/delay.h> 53 53 #include <linux/dmi.h> 54 + #include <linux/acpi.h> 54 55 #include <asm/io.h> 55 56 56 57 MODULE_LICENSE("GPL"); ··· 343 342 smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK; 344 343 smbus->size = 64; 345 344 } 345 + 346 + error = acpi_check_region(smbus->base, smbus->size, 347 + nforce2_driver.name); 348 + if (error) 349 + return -1; 346 350 347 351 if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) { 348 352 dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
+4
drivers/i2c/busses/i2c-piix4.c
··· 39 39 #include <linux/i2c.h> 40 40 #include <linux/init.h> 41 41 #include <linux/dmi.h> 42 + #include <linux/acpi.h> 42 43 #include <asm/io.h> 43 44 44 45 ··· 168 167 return -ENODEV; 169 168 } 170 169 } 170 + 171 + if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) 172 + return -EBUSY; 171 173 172 174 if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) { 173 175 dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n",
+6
drivers/i2c/busses/i2c-sis5595.c
··· 62 62 #include <linux/ioport.h> 63 63 #include <linux/init.h> 64 64 #include <linux/i2c.h> 65 + #include <linux/acpi.h> 65 66 #include <asm/io.h> 66 67 67 68 static int blacklist[] = { ··· 175 174 176 175 /* NB: We grab just the two SMBus registers here, but this may still 177 176 * interfere with ACPI :-( */ 177 + retval = acpi_check_region(sis5595_base + SMB_INDEX, 2, 178 + sis5595_driver.name); 179 + if (retval) 180 + return retval; 181 + 178 182 if (!request_region(sis5595_base + SMB_INDEX, 2, 179 183 sis5595_driver.name)) { 180 184 dev_err(&SIS5595_dev->dev, "SMBus registers 0x%04x-0x%04x already in use!\n",
+6
drivers/i2c/busses/i2c-sis630.c
··· 55 55 #include <linux/ioport.h> 56 56 #include <linux/init.h> 57 57 #include <linux/i2c.h> 58 + #include <linux/acpi.h> 58 59 #include <asm/io.h> 59 60 60 61 /* SIS630 SMBus registers */ ··· 437 436 } 438 437 439 438 dev_dbg(&sis630_dev->dev, "ACPI base at 0x%04x\n", acpi_base); 439 + 440 + retval = acpi_check_region(acpi_base + SMB_STS, SIS630_SMB_IOREGION, 441 + sis630_driver.name); 442 + if (retval) 443 + goto exit; 440 444 441 445 /* Everything is happy, let's grab the memory and set things up. */ 442 446 if (!request_region(acpi_base + SMB_STS, SIS630_SMB_IOREGION,
+5
drivers/i2c/busses/i2c-sis96x.c
··· 40 40 #include <linux/ioport.h> 41 41 #include <linux/i2c.h> 42 42 #include <linux/init.h> 43 + #include <linux/acpi.h> 43 44 #include <asm/io.h> 44 45 45 46 /* base address register in PCI config space */ ··· 281 280 } 282 281 dev_info(&dev->dev, "SiS96x SMBus base address: 0x%04x\n", 283 282 sis96x_smbus_base); 283 + 284 + retval = acpi_check_resource_conflict(&dev->resource[SIS96x_BAR]); 285 + if (retval) 286 + return retval; 284 287 285 288 /* Everything is happy, let's grab the memory and set things up. */ 286 289 if (!request_region(sis96x_smbus_base, SMB_IOSIZE,
+5
drivers/i2c/busses/i2c-viapro.c
··· 50 50 #include <linux/ioport.h> 51 51 #include <linux/i2c.h> 52 52 #include <linux/init.h> 53 + #include <linux/acpi.h> 53 54 #include <asm/io.h> 54 55 55 56 static struct pci_dev *vt596_pdev; ··· 357 356 } 358 357 359 358 found: 359 + error = acpi_check_region(vt596_smba, 8, vt596_driver.name); 360 + if (error) 361 + return error; 362 + 360 363 if (!request_region(vt596_smba, 8, vt596_driver.name)) { 361 364 dev_err(&pdev->dev, "SMBus region 0x%x already in use!\n", 362 365 vt596_smba);