Changeset 4318

Show
Ignore:
Timestamp:
02/15/07 10:34:08 (8 years ago)
Author:
khali
Message:

i2c-amd8111: Cleanups and fixes backported from Linux 2.6.
* Add an explicit mask when writing the low byte of a word.
* Use I2C_SMBUS_BLOCK_MAX instead of hardcoding 32.
* Use boolean not instead of bitwise not for bit tests, it's clearer.
* Return proper error values rather than -1.
* Fix a race on device registration, initialization should be done

before the bus is registered.

Location:
lm-sensors/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/CHANGES

    r4316 r4318  
    44SVN HEAD 
    55  Man page i2cdetect.8: Scanning range can be restricted 
     6  Module i2c-amd8111: Cleanups (2.6 backport) 
     7                      Fix initialization race (2.6 backport) 
    68  Programs i2cdetect, i2cdump, isadump: Flush output in real time 
    79  Program sensors-detect: Only probe relevant I2C addresses 
  • lm-sensors/trunk/kernel/busses/i2c-amd8111.c

    r3177 r4318  
    216216                        amd_ec_write(smbus, AMD_SMB_CMD, command); 
    217217                        if (read_write == I2C_SMBUS_WRITE) { 
    218                                 amd_ec_write(smbus, AMD_SMB_DATA, data->word); 
     218                                amd_ec_write(smbus, AMD_SMB_DATA, data->word & 0xff); 
    219219                                amd_ec_write(smbus, AMD_SMB_DATA + 1, data->word >> 8); 
    220220                        } 
     
    225225                        amd_ec_write(smbus, AMD_SMB_CMD, command); 
    226226                        if (read_write == I2C_SMBUS_WRITE) { 
    227                                 len = min_t(u8, data->block[0], 32); 
     227                                len = min_t(u8, data->block[0], I2C_SMBUS_BLOCK_MAX); 
    228228                                amd_ec_write(smbus, AMD_SMB_BCNT, len); 
    229229                                for (i = 0; i < len; i++) 
     
    234234 
    235235                case I2C_SMBUS_I2C_BLOCK_DATA: 
    236                         len = min_t(u8, data->block[0], 32); 
     236                        len = min_t(u8, data->block[0], I2C_SMBUS_BLOCK_MAX); 
    237237                        amd_ec_write(smbus, AMD_SMB_CMD, command); 
    238238                        amd_ec_write(smbus, AMD_SMB_BCNT, len); 
     
    245245                case I2C_SMBUS_PROC_CALL: 
    246246                        amd_ec_write(smbus, AMD_SMB_CMD, command); 
    247                         amd_ec_write(smbus, AMD_SMB_DATA, data->word); 
     247                        amd_ec_write(smbus, AMD_SMB_DATA, data->word & 0xff); 
    248248                        amd_ec_write(smbus, AMD_SMB_DATA + 1, data->word >> 8); 
    249249                        protocol = AMD_SMB_PRTCL_PROC_CALL | pec; 
     
    252252 
    253253                case I2C_SMBUS_BLOCK_PROC_CALL: 
    254                         len = min_t(u8, data->block[0], 31); 
     254                        len = min_t(u8, data->block[0], I2C_SMBUS_BLOCK_MAX - 1); 
    255255                        amd_ec_write(smbus, AMD_SMB_CMD, command); 
    256256                        amd_ec_write(smbus, AMD_SMB_BCNT, len); 
     
    304304                case I2C_SMBUS_BLOCK_PROC_CALL: 
    305305                        amd_ec_read(smbus, AMD_SMB_BCNT, &len); 
    306                         len = min_t(u8, len, 32); 
     306                        len = min_t(u8, len, I2C_SMBUS_BLOCK_MAX); 
    307307                case I2C_SMBUS_I2C_BLOCK_DATA: 
    308308                        for (i = 0; i < len; i++) 
     
    355355        int error; 
    356356 
    357         if (~pci_resource_flags(dev, 0) & IORESOURCE_IO) 
    358                 return -1; 
     357        if (!(pci_resource_flags(dev, 0) & IORESOURCE_IO)) 
     358                return -ENODEV; 
    359359 
    360360        if (!(smbus = kmalloc(sizeof(struct amd_smbus), GFP_KERNEL))) 
    361                 return -1; 
     361                return -ENOMEM; 
    362362        memset(smbus, 0, sizeof(struct amd_smbus)); 
    363363 
     
    369369        if (!request_region(smbus->base, smbus->size, amd8111_driver.name)) { 
    370370                kfree(smbus); 
    371                 return -1; 
     371                return -EBUSY; 
    372372        } 
    373373 
     
    379379        smbus->adapter.dec_use = amd8111_dec; 
    380380 
     381        pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0); 
     382 
    381383        error = i2c_add_adapter(&smbus->adapter); 
    382384        if (error) { 
     
    384386                release_region(smbus->base, smbus->size); 
    385387                kfree(smbus); 
    386                 return -1; 
    387         } 
    388  
    389         pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0); 
     388                return error; 
     389        } 
    390390 
    391391        printk(KERN_INFO "i2c-amd8111.c: AMD8111 SMBus 2.0 adapter at %#x\n", smbus->base);