Changeset 3646

Show
Ignore:
Timestamp:
06/18/02 02:46:02 (11 years ago)
Author:
mds
Message:

add i2c_smbus_block_process_call(). Untested.

Fix i2c emulated process call (wouldn't return the two bytes
to the caller).
Column 80 fixes.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • i2c/trunk/kernel/i2c-core.c

    r3642 r3646  
    1919 
    2020/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>. 
    21    All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> */ 
     21   All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> 
     22   SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com>                */ 
    2223 
    2324/* $Id$ */ 
     
    10311032} 
    10321033 
     1034/* Special for block process call which has two blocks */ 
     1035u8 i2c_smbus_blkproc_pec(u8 first, u8 second, u8 *blk1, u8 third, u8 *blk2) 
     1036{ 
     1037        int i; 
     1038        u8 crc = 0; 
     1039 
     1040        crc = crc8((crc ^ first) << 8); 
     1041        crc = crc8((crc ^ second) << 8); 
     1042        for(i = 0; i <= blk1[0]; i++) 
     1043                crc = crc8((crc ^ blk1[i]) << 8); 
     1044        crc = crc8((crc ^ third) << 8); 
     1045        for(i = 0; i <= blk2[0]; i++) 
     1046                crc = crc8((crc ^ blk2[i]) << 8); 
     1047        return crc; 
     1048} 
     1049 
    10331050extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value) 
    10341051{ 
     
    10501067{ 
    10511068        if((client->flags & I2C_CLIENT_PEC) && 
    1052            !(i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_HWPEC_CALC))) { 
     1069           !(i2c_check_functionality(client->adapter, 
     1070                                     I2C_FUNC_SMBUS_HWPEC_CALC))) { 
    10531071                union i2c_smbus_data data; 
    10541072                u8 d[2] = {(client->addr << 1), value}; 
     
    11241142        if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, 
    11251143                           I2C_SMBUS_READ,command, 
    1126                            ((client->flags & I2C_CLIENT_PEC) ? I2C_SMBUS_BLOCK_DATA_PEC : 
    1127                                                                I2C_SMBUS_BLOCK_DATA), 
     1144                           ((client->flags & I2C_CLIENT_PEC) ? 
     1145                                                 I2C_SMBUS_BLOCK_DATA_PEC : 
     1146                                                 I2C_SMBUS_BLOCK_DATA), 
    11281147                           &data)) 
    11291148                return -1; 
     
    11551174                data.block[i] = values[i-1]; 
    11561175        if((client->flags & I2C_CLIENT_PEC) && 
    1157            !(i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_HWPEC_CALC))) { 
     1176           !(i2c_check_functionality(client->adapter, 
     1177                                     I2C_FUNC_SMBUS_HWPEC_CALC))) { 
    11581178                u8 d[2] = {(client->addr << 1), command}; 
    11591179                data.block[length + 1] = i2c_smbus_pec(2, d, data.block); 
     
    11611181        return i2c_smbus_xfer(client->adapter,client->addr,client->flags, 
    11621182                              I2C_SMBUS_WRITE, command, 
    1163                               ((client->flags & I2C_CLIENT_PEC) ? I2C_SMBUS_BLOCK_DATA_PEC : 
    1164                                                                   I2C_SMBUS_BLOCK_DATA), 
     1183                              ((client->flags & I2C_CLIENT_PEC) ? 
     1184                                                    I2C_SMBUS_BLOCK_DATA_PEC : 
     1185                                                    I2C_SMBUS_BLOCK_DATA), 
    11651186                              &data); 
     1187} 
     1188 
     1189/* Returns the number of read bytes */ 
     1190extern s32 i2c_smbus_block_process_call(struct i2c_client * client, 
     1191                                        u8 command, u8 length, u8 *values) 
     1192{ 
     1193        union i2c_smbus_data data; 
     1194        int i; 
     1195        if (length > I2C_SMBUS_BLOCK_MAX - 1) 
     1196                return -1; 
     1197        data.block[0] = length; 
     1198        for (i = 1; i <= length; i++) 
     1199                data.block[i] = values[i-1]; 
     1200        if(i2c_smbus_xfer(client->adapter,client->addr,client->flags, 
     1201                          I2C_SMBUS_WRITE, command, 
     1202                          I2C_SMBUS_BLOCK_PROC_CALL, &data)) 
     1203                return -1; 
     1204        if((client->flags & I2C_CLIENT_PEC) && 
     1205           !(i2c_check_functionality(client->adapter, 
     1206                                     I2C_FUNC_SMBUS_HWPEC_CALC))) { 
     1207                i = i2c_smbus_blkproc_pec(client->addr << 1, command, 
     1208                                          data.block, 
     1209                                          (client->addr << 1) | 0x01, 
     1210                                          data.block + length + 1); 
     1211                if(i != data.block[data.block[length + 1] + length + 1]) { 
     1212                        DEB(printk(KERN_DEBUG "i2c-core.o: Bad block proc PEC 0x%02x vs. 0x%02x\n", 
     1213                                   i, data.block[data.block[0] + 1])); 
     1214                        return(-1); 
     1215                } 
     1216        } 
     1217        for (i = 1; i <= data.block[length + 1]; i++) 
     1218                values[i-1] = data.block[length + i]; 
     1219        return data.block[length + 1]; 
    11661220} 
    11671221 
     
    12511305        case I2C_SMBUS_PROC_CALL: 
    12521306                num = 2; /* Special case */ 
     1307                read_write = I2C_SMBUS_READ; 
    12531308                msg[0].len = 3; 
    12541309                msg[1].len = 2; 
     
    12581313        case I2C_SMBUS_BLOCK_DATA: 
    12591314                if (read_write == I2C_SMBUS_READ) { 
    1260                         printk(KERN_ERR "i2c-core.o: Block read not supported under " 
    1261                                "I2C emulation!\n"); 
    1262                 return -1; 
     1315                        printk(KERN_ERR "i2c-core.o: Block read not supported " 
     1316                               "under I2C emulation!\n"); 
     1317                        return -1; 
    12631318                } else { 
    12641319                        msg[0].len = data->block[0] + 2; 
     
    12731328                } 
    12741329                break; 
     1330        case I2C_SMBUS_BLOCK_PROC_CALL: 
     1331                printk(KERN_ERR "i2c-core.o: Block process call not supported " 
     1332                       "under I2C emulation!\n"); 
     1333                return -1; 
    12751334        case I2C_SMBUS_I2C_BLOCK_DATA: 
    12761335                if (read_write == I2C_SMBUS_READ) {