Changeset 3600

Show
Ignore:
Timestamp:
11/19/01 20:01:46 (12 years ago)
Author:
mds
Message:

add emulation layer for i2c block reads

i2c_smbus_read_i2c_block_data() for single-byte addresses.
Add #defines for 2-byte address block accesses:

#define I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 0x10000000 /* I2C-like block xfer */
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 0x20000000 /* w/ 2-byte reg. addr. */

Location:
i2c/trunk/kernel
Files:
3 modified

Legend:

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

    r3599 r3600  
    11101110} 
    11111111 
     1112/* Returns the number of read bytes */ 
     1113extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, 
     1114                                         u8 command, u8 *values) 
     1115{ 
     1116        union i2c_smbus_data data; 
     1117        int i; 
     1118        if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, 
     1119                              I2C_SMBUS_READ,command, 
     1120                              I2C_SMBUS_I2C_BLOCK_DATA,&data)) 
     1121                return -1; 
     1122        else { 
     1123                for (i = 1; i <= data.block[0]; i++) 
     1124                        values[i-1] = data.block[i]; 
     1125                return data.block[0]; 
     1126        } 
     1127} 
     1128 
    11121129extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client, 
    11131130                                          u8 command, u8 length, u8 *values) 
     
    11931210                                printk(KERN_ERR "i2c-core.o: smbus_access called with " 
    11941211                                       "invalid block write size (%d)\n", 
    1195                                        msg[0].len); 
     1212                                       data->block[0]); 
    11961213                                return -1; 
    11971214                        } 
    11981215                        for (i = 1; i <= msg[0].len; i++) 
    11991216                                msgbuf0[i] = data->block[i-1]; 
     1217                } 
     1218                break; 
     1219        case I2C_SMBUS_I2C_BLOCK_DATA: 
     1220                if (read_write == I2C_SMBUS_READ) { 
     1221                        msg[1].len = 32; 
     1222                } else { 
     1223                        msg[0].len = data->block[0] + 2; 
     1224                        if (msg[0].len > 34) { 
     1225                                printk("i2c-core.o: i2c_smbus_xfer_emulated called with " 
     1226                                       "invalid block write size (%d)\n", 
     1227                                       data->block[0]); 
     1228                                return -1; 
     1229                        } 
     1230                        for (i = 0; i < data->block[0]; i++) 
     1231                                msgbuf0[i] = data->block[i+1]; 
    12001232                } 
    12011233                break; 
     
    12211253                                data->word = msgbuf1[0] | (msgbuf1[1] << 8); 
    12221254                                break; 
     1255                        case I2C_SMBUS_I2C_BLOCK_DATA: 
     1256                                /* fixed at 32 for now */ 
     1257                                data->block[0] = 32; 
     1258                                for (i = 0; i < 32; i++) 
     1259                                        data->block[i+1] = msgbuf1[i]; 
     1260                                break; 
    12231261                } 
    12241262        return 0; 
     
    14011439EXPORT_SYMBOL(i2c_smbus_read_block_data); 
    14021440EXPORT_SYMBOL(i2c_smbus_write_block_data); 
     1441EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data); 
     1442EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data); 
    14031443 
    14041444EXPORT_SYMBOL(i2c_get_functionality); 
  • i2c/trunk/kernel/i2c-dev.h

    r3568 r3600  
    163163} 
    164164 
     165/* Returns the number of read bytes */ 
     166static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, 
     167                                                  __u8 *values) 
     168{ 
     169        union i2c_smbus_data data; 
     170        int i; 
     171        if (i2c_smbus_access(file,I2C_SMBUS_READ,command, 
     172                              I2C_SMBUS_I2C_BLOCK_DATA,&data)) 
     173                return -1; 
     174        else { 
     175                for (i = 1; i <= data.block[0]; i++) 
     176                        values[i-1] = data.block[i]; 
     177                return data.block[0]; 
     178        } 
     179} 
     180 
    165181static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, 
    166182                                               __u8 length, __u8 *values) 
  • i2c/trunk/kernel/i2c.h

    r3597 r3600  
    124124                                      u8 command, u8 length, 
    125125                                      u8 *values); 
     126extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, 
     127                                         u8 command, u8 *values); 
    126128extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client, 
    127129                                          u8 command, u8 length, 
     
    407409#define I2C_FUNC_SMBUS_READ_BLOCK_DATA  0x01000000  
    408410#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000  
    409 #define I2C_FUNC_SMBUS_READ_I2C_BLOCK   0x04000000 /* New I2C-like block */ 
    410 #define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK  0x08000000 /* transfer */ 
     411#define I2C_FUNC_SMBUS_READ_I2C_BLOCK   0x04000000 /* I2C-like block xfer  */ 
     412#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK  0x08000000 /* w/ 1-byte reg. addr. */ 
     413#define I2C_FUNC_SMBUS_READ_I2C_BLOCK_2  0x10000000 /* I2C-like block xfer  */ 
     414#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 0x20000000 /* w/ 2-byte reg. addr. */ 
    411415 
    412416#define I2C_FUNC_SMBUS_BYTE I2C_FUNC_SMBUS_READ_BYTE | \ 
     
    420424#define I2C_FUNC_SMBUS_I2C_BLOCK I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ 
    421425                                  I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 
     426#define I2C_FUNC_SMBUS_I2C_BLOCK_2 I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 | \ 
     427                                   I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 
    422428 
    423429#define I2C_FUNC_SMBUS_EMUL I2C_FUNC_SMBUS_QUICK | \ 
     
    426432                            I2C_FUNC_SMBUS_WORD_DATA | \ 
    427433                            I2C_FUNC_SMBUS_PROC_CALL | \ 
    428                             I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 
     434                            I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | \ 
     435                            I2C_FUNC_SMBUS_I2C_BLOCK | \ 
     436                            I2C_FUNC_SMBUS_I2C_BLOCK_2 
    429437 
    430438/*