Changeset 3646
- Timestamp:
- 06/18/02 02:46:02 (11 years ago)
- Files:
-
- 1 modified
-
i2c/trunk/kernel/i2c-core.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
i2c/trunk/kernel/i2c-core.c
r3642 r3646 19 19 20 20 /* 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> */ 22 23 23 24 /* $Id$ */ … … 1031 1032 } 1032 1033 1034 /* Special for block process call which has two blocks */ 1035 u8 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 1033 1050 extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value) 1034 1051 { … … 1050 1067 { 1051 1068 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))) { 1053 1071 union i2c_smbus_data data; 1054 1072 u8 d[2] = {(client->addr << 1), value}; … … 1124 1142 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, 1125 1143 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), 1128 1147 &data)) 1129 1148 return -1; … … 1155 1174 data.block[i] = values[i-1]; 1156 1175 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))) { 1158 1178 u8 d[2] = {(client->addr << 1), command}; 1159 1179 data.block[length + 1] = i2c_smbus_pec(2, d, data.block); … … 1161 1181 return i2c_smbus_xfer(client->adapter,client->addr,client->flags, 1162 1182 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), 1165 1186 &data); 1187 } 1188 1189 /* Returns the number of read bytes */ 1190 extern 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]; 1166 1220 } 1167 1221 … … 1251 1305 case I2C_SMBUS_PROC_CALL: 1252 1306 num = 2; /* Special case */ 1307 read_write = I2C_SMBUS_READ; 1253 1308 msg[0].len = 3; 1254 1309 msg[1].len = 2; … … 1258 1313 case I2C_SMBUS_BLOCK_DATA: 1259 1314 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; 1263 1318 } else { 1264 1319 msg[0].len = data->block[0] + 2; … … 1273 1328 } 1274 1329 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; 1275 1334 case I2C_SMBUS_I2C_BLOCK_DATA: 1276 1335 if (read_write == I2C_SMBUS_READ) {
