Changeset 3321

Show
Ignore:
Timestamp:
07/18/99 20:18:10 (14 years ago)
Author:
frodo
Message:

SMBus access integrated into i2c-core

I think I have done the same thing as Kyösti in his patch, but I included
the real SMBus code too. What was smbus_access is now called i2c_smbus_xfer;
all other functions are prepended with i2c_.

Next thing to do: modify i2c-dev.

Location:
i2c/trunk/kernel
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • i2c/trunk/kernel/i2c-algo-bit.c

    r3320 r3321  
    534534        I2C_ALGO_BIT, 
    535535        bit_xfer, 
     536        NULL, 
    536537        NULL,                           /* slave_xmit           */ 
    537538        NULL,                           /* slave_recv           */ 
  • i2c/trunk/kernel/i2c-algo-pcf.c

    r3320 r3321  
    516516        I2C_ALGO_PCF, 
    517517        pcf_xfer, 
     518        NULL, 
    518519        NULL,                           /* slave_xmit           */ 
    519520        NULL,                           /* slave_recv           */ 
  • i2c/trunk/kernel/i2c-core.c

    r3320 r3321  
    2121/* ------------------------------------------------------------------------- */ 
    2222 
    23 /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even 
    24    Frodo Looijaard <frodol@dds.nl> */ 
     23/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>. 
     24   All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> */ 
    2525 
    2626#include <linux/module.h> 
     
    345345        int ret; 
    346346 
    347         DEB(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); 
    348  
    349         I2C_LOCK(adap); 
    350         ret = adap->algo->master_xfer(adap,msgs,num); 
    351         I2C_UNLOCK(adap); 
    352  
    353         return ret; 
     347        if (adap->algo->master_xfer) { 
     348                DEB(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); 
     349 
     350                I2C_LOCK(adap); 
     351                ret = adap->algo->master_xfer(adap,msgs,num); 
     352                I2C_UNLOCK(adap); 
     353 
     354                return ret; 
     355        } else { 
     356                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     357                       adap->id); 
     358                return 0; 
     359        } 
    354360} 
    355361 
     
    359365        struct i2c_adapter *adap=client->adapter; 
    360366        struct i2c_msg msg; 
    361         msg.addr   = client->addr; 
    362         msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
    363         msg.len = count; 
    364         (const char *)msg.buf = buf; 
    365  
    366         DEB(printk("master_send: writing %d bytes on %s.\n", 
    367                 count,client->adapter->name)); 
    368  
    369         I2C_LOCK(adap); 
    370         ret = adap->algo->master_xfer(adap,&msg,1); 
    371         I2C_UNLOCK(adap); 
    372  
    373         /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
    374          * transmitted, else error code. 
    375          */ 
    376         return (ret == 1 )? count : ret; 
     367 
     368        if (client->adapter->algo->master_xfer) { 
     369                msg.addr   = client->addr; 
     370                msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
     371                msg.len = count; 
     372                (const char *)msg.buf = buf; 
     373         
     374                DEB(printk("master_send: writing %d bytes on %s.\n", 
     375                        count,client->adapter->name)); 
     376         
     377                I2C_LOCK(adap); 
     378                ret = adap->algo->master_xfer(adap,&msg,1); 
     379                I2C_UNLOCK(adap); 
     380 
     381                /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
     382                 * transmitted, else error code. 
     383                 */ 
     384                return (ret == 1 )? count : ret; 
     385        } else { 
     386                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     387                       client->adapter->id); 
     388                return 0; 
     389        } 
    377390} 
    378391 
     
    385398        struct i2c_msg msg; 
    386399 
    387         c = (char*)kmalloc(sizeof(char)*(count+1),GFP_KERNEL); 
    388         if (0 == c)  
    389                 return -ENOMEM; 
    390  
    391         msg.addr   = client->addr; 
    392         msg.flags  = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
    393         msg.len = count+1; 
    394         (const char *)msg.buf = c; 
     400        if (client->adapter->algo->master_xfer) { 
     401                c = (char*)kmalloc(sizeof(char)*(count+1),GFP_KERNEL); 
     402                if (0 == c)  
     403                        return -ENOMEM; 
     404         
     405                msg.addr   = client->addr; 
     406                msg.flags  = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
     407                msg.len = count+1; 
     408                (const char *)msg.buf = c; 
     409                         
     410                c[0] = subadress; 
     411                memcpy(&c[1], buf, sizeof(char)*count); 
    395412                 
    396         c[0] = subadress; 
    397         memcpy(&c[1], buf, sizeof(char)*count); 
    398          
    399         DEB(printk("master_send_subadress: writing %d bytes on %s. (sa:0x%02x)\n", 
    400                 count,client->adapter->name,subadress)); 
    401  
    402         I2C_LOCK(adap); 
    403         ret = adap->algo->master_xfer(adap,&msg,1); 
    404         I2C_UNLOCK(adap); 
    405  
    406         /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
    407          * transmitted, else error code. 
    408          */ 
     413                DEB(printk("master_send_subadress: writing %d bytes on %s. (sa:0x%02x)\n", 
     414                        count,client->adapter->name,subadress)); 
     415         
     416                I2C_LOCK(adap); 
     417                ret = adap->algo->master_xfer(adap,&msg,1); 
     418                I2C_UNLOCK(adap); 
     419 
     420                /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
     421                * transmitted, else error code. 
     422                */ 
    409423          
    410         kfree(c); 
    411           
    412         return (ret == 1 )? count : ret; 
     424                kfree(c); 
     425                 
     426                return (ret == 1 )? count : ret; 
     427        } else { 
     428                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     429                       client->adapter->id); 
     430                return 0; 
     431        } 
    413432} 
    414433 
     
    420439        struct  i2c_msg msg[2]; 
    421440         
    422         msg[0].addr     = client->addr; 
    423         msg[0].flags    = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
    424         msg[0].len      = 1; 
    425         (const char*)msg[0].buf = (const char*)&subadress; 
    426  
    427         msg[1].addr     = client->addr; 
    428         msg[1].flags    = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
    429         msg[1].flags    |= I2C_M_RD; 
    430         msg[1].len      = count; 
    431         (const char*)msg[1].buf = (const char*)buf; 
    432          
    433         DEB(printk("master_recv_subadress: reading %d bytes from subadress %d on %s.\n", 
    434                 count,subadress,client->adapter->name)); 
    435  
    436         I2C_LOCK(adap); 
    437         ret = adap->algo->master_xfer(adap,msg,2); 
    438         I2C_UNLOCK(adap); 
    439  
    440         /* if everything went ok (i.e. 1 msg transmitted), 
    441            return 0, else return error code. 
    442          */ 
    443         return (ret == 1 ) ? 0 : ret; 
     441        if (client->adapter->algo->master_xfer) { 
     442                msg[0].addr     = client->addr; 
     443                msg[0].flags    = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
     444                msg[0].len      = 1; 
     445                (const char*)msg[0].buf = (const char*)&subadress; 
     446         
     447                msg[1].addr     = client->addr; 
     448                msg[1].flags    = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
     449                msg[1].flags    |= I2C_M_RD; 
     450                msg[1].len      = count; 
     451                (const char*)msg[1].buf = (const char*)buf; 
     452                 
     453                DEB(printk("master_recv_subadress: reading %d bytes from subadress %d on %s.\n", 
     454                        count,subadress,client->adapter->name)); 
     455         
     456                I2C_LOCK(adap); 
     457                ret = adap->algo->master_xfer(adap,msg,2); 
     458                I2C_UNLOCK(adap); 
     459 
     460                /* if everything went ok (i.e. 1 msg transmitted), 
     461                return 0, else return error code. 
     462                */ 
     463                return (ret == 1 ) ? 0 : ret; 
     464        } else { 
     465                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     466                       client->adapter->id); 
     467                return 0; 
     468        } 
    444469} 
    445470 
     
    451476        struct i2c_msg msg; 
    452477        int ret; 
    453         msg.addr   = client->addr; 
    454         msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
    455         msg.flags |= I2C_M_RD; 
    456         msg.len = count; 
    457         msg.buf = buf; 
    458  
    459         DEB(printk("master_recv: reading %d bytes on %s.\n", 
    460                 count,client->adapter->name)); 
    461  
    462         I2C_LOCK(adap); 
    463         ret = adap->algo->master_xfer(adap,&msg,1); 
    464         I2C_UNLOCK(adap); 
    465  
    466         DEB(printk("master_recv: return:%d (count:%d, addr:0x%02x)\n", 
    467                 ret, count, client->addr)); 
    468  
    469         /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
    470          * transmitted, else error code. 
    471          */ 
    472         return (ret == 1 )? count : ret; 
     478        if (client->adapter->algo->master_xfer) { 
     479                msg.addr   = client->addr; 
     480                msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 
     481                msg.flags |= I2C_M_RD; 
     482                msg.len = count; 
     483                msg.buf = buf; 
     484 
     485                DEB(printk("master_recv: reading %d bytes on %s.\n", 
     486                        count,client->adapter->name)); 
     487         
     488                I2C_LOCK(adap); 
     489                ret = adap->algo->master_xfer(adap,&msg,1); 
     490                I2C_UNLOCK(adap); 
     491         
     492                DEB(printk("master_recv: return:%d (count:%d, addr:0x%02x)\n", 
     493                        ret, count, client->addr)); 
     494         
     495                /* if everything went ok (i.e. 1 msg transmitted), return #bytes 
     496                * transmitted, else error code. 
     497                */ 
     498                return (ret == 1 )? count : ret; 
     499        } else { 
     500                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     501                       client->adapter->id); 
     502                return 0; 
     503        } 
    473504} 
    474505 
     
    495526} 
    496527 
     528 
    497529int i2c_probe(struct i2c_client *client, int low_addr, int hi_addr) 
    498530{ 
    499531        int i; 
    500532        struct i2c_msg msg; 
    501         msg.flags=client->flags & (I2C_M_TENMASK | I2C_M_TEN ); 
    502         msg.buf = NULL; 
    503         msg.len = 0; 
    504         I2C_LOCK(client->adapter); 
    505         for (i = low_addr; i <= hi_addr; i++) { 
    506                 msg.addr=i; 
    507                 /* TODO: implement a control statement in the algo layer  
    508                  * that does address lookup only. 
    509                  */ 
    510                 if (1 == client->adapter-> 
    511                     algo->master_xfer(client->adapter,&msg,1)) 
    512                         break; 
    513         } 
    514         I2C_UNLOCK(client->adapter); 
    515         return (i <= hi_addr) ? (client->addr=i) : -1; 
     533        if (client->adapter->algo->master_xfer) { 
     534                msg.flags=client->flags & (I2C_M_TENMASK | I2C_M_TEN ); 
     535                msg.buf = NULL; 
     536                msg.len = 0; 
     537                I2C_LOCK(client->adapter); 
     538                for (i = low_addr; i <= hi_addr; i++) { 
     539                        msg.addr=i; 
     540                        /* TODO: implement a control statement in the algo layer  
     541                        * that does address lookup only. 
     542                        */ 
     543                        if (1 == client->adapter-> 
     544                        algo->master_xfer(client->adapter,&msg,1)) 
     545                                break; 
     546                } 
     547                I2C_UNLOCK(client->adapter); 
     548                return (i <= hi_addr) ? (client->addr=i) : -1; 
     549        } else { 
     550                printk("I2C adapter %04x: I2C level transfers not supported\n", 
     551                       client->adapter->id); 
     552                return 0; 
     553        } 
    516554} 
    517555 
     
    527565        return -1; 
    528566} 
     567 
     568/* The SMBus parts */ 
     569 
     570extern s32 i2c_smbus_write_quick(struct i2c_adapter * adapter, u8 addr,  
     571                                        u8 value) 
     572{ 
     573        return i2c_smbus_xfer(adapter,addr,value,0,I2C_SMBUS_QUICK,NULL); 
     574} 
     575 
     576extern s32 i2c_smbus_read_byte(struct i2c_adapter * adapter,u8 addr) 
     577{ 
     578        union i2c_smbus_data data; 
     579        if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, 
     580                           &data)) 
     581                return -1; 
     582        else 
     583                return 0x0FF & data.byte; 
     584} 
     585 
     586extern s32 i2c_smbus_write_byte(struct i2c_adapter * adapter, u8 addr,  
     587                                       u8 value) 
     588{ 
     589        return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,value,  
     590                              I2C_SMBUS_BYTE,NULL); 
     591} 
     592 
     593extern s32 i2c_smbus_read_byte_data(struct i2c_adapter * adapter, 
     594                                           u8 addr, u8 command) 
     595{ 
     596        union i2c_smbus_data data; 
     597        if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 
     598                           I2C_SMBUS_BYTE_DATA,&data)) 
     599                return -1; 
     600        else 
     601                return 0x0FF & data.byte; 
     602} 
     603 
     604extern s32 i2c_smbus_write_byte_data(struct i2c_adapter * adapter, 
     605                                        u8 addr, u8 command, u8 value) 
     606{ 
     607        union i2c_smbus_data data; 
     608        data.byte = value; 
     609        return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 
     610                              I2C_SMBUS_BYTE_DATA,&data); 
     611} 
     612 
     613extern s32 i2c_smbus_read_word_data(struct i2c_adapter * adapter, 
     614                                           u8 addr, u8 command) 
     615{ 
     616        union i2c_smbus_data data; 
     617        if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 
     618                           I2C_SMBUS_WORD_DATA, &data)) 
     619                return -1; 
     620        else 
     621                return 0x0FFFF & data.word; 
     622} 
     623 
     624extern s32 i2c_smbus_write_word_data(struct i2c_adapter * adapter, 
     625                                            u8 addr, u8 command, u16 value) 
     626{ 
     627        union i2c_smbus_data data; 
     628        data.word = value; 
     629        return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 
     630                              I2C_SMBUS_WORD_DATA,&data); 
     631} 
     632 
     633extern s32 i2c_smbus_process_call(struct i2c_adapter * adapter, 
     634                                     u8 addr, u8 command, u16 value) 
     635{ 
     636        union i2c_smbus_data data; 
     637        data.word = value; 
     638        if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 
     639                           I2C_SMBUS_PROC_CALL, &data)) 
     640                return -1; 
     641        else 
     642                return 0x0FFFF & data.word; 
     643} 
     644 
     645/* Returns the number of read bytes */ 
     646extern s32 i2c_smbus_read_block_data(struct i2c_adapter * adapter, 
     647                                            u8 addr, u8 command, u8 *values) 
     648{ 
     649        union i2c_smbus_data data; 
     650        int i; 
     651        if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 
     652                           I2C_SMBUS_BLOCK_DATA,&data)) 
     653                return -1; 
     654        else { 
     655                for (i = 1; i <= data.block[0]; i++) 
     656                        values[i-1] = data.block[i]; 
     657                return data.block[0]; 
     658        } 
     659} 
     660 
     661extern s32 i2c_smbus_write_block_data(struct i2c_adapter * adapter, 
     662                                             u8 addr, u8 command, u8 length, 
     663                                             u8 *values) 
     664{ 
     665        union i2c_smbus_data data; 
     666        int i; 
     667        if (length > 32) 
     668                length = 32; 
     669        for (i = 1; i <= length; i++) 
     670                data.block[i] = values[i-1]; 
     671        data.block[0] = length; 
     672        return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 
     673                              I2C_SMBUS_BLOCK_DATA,&data); 
     674} 
     675 
     676/* Simulate a SMBus command using the i2c protocol  
     677   No checking of parameters is done!  */ 
     678static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u8 addr,  
     679                                   char read_write, u8 command, int size,  
     680                                   union i2c_smbus_data * data) 
     681{ 
     682        /* So we need to generate a series of msgs. In the case of writing, we 
     683          need to use only one message; when reading, we need two. We initialize 
     684          most things with sane defaults, to keep the code below somewhat 
     685          simpler. */ 
     686        unsigned char msgbuf0[33]; 
     687        unsigned char msgbuf1[33]; 
     688        int num = read_write == I2C_SMBUS_READ?2:1; 
     689        struct i2c_msg msg[2] = { { addr, 0, 1, msgbuf0 },  
     690                                  { addr, I2C_M_RD, 0, msgbuf1 } 
     691                                }; 
     692        int i; 
     693 
     694        msgbuf0[0] = command; 
     695        switch(size) { 
     696        case I2C_SMBUS_QUICK: 
     697                msg[0].len = 0; 
     698                num = 1; /* Special case: The read/write field is used  
     699                            as data */ 
     700                break; 
     701        case I2C_SMBUS_BYTE: 
     702                if (read_write == I2C_SMBUS_READ) { 
     703                        /* Special case: only a read! */ 
     704                        msg[0].flags = I2C_M_RD; 
     705                        num = 1; 
     706                } 
     707                break; 
     708        case I2C_SMBUS_BYTE_DATA: 
     709                if (read_write == I2C_SMBUS_READ) 
     710                        msg[1].len = 1; 
     711                else { 
     712                        msg[0].len = 2; 
     713                        msgbuf0[1] = data->byte; 
     714                } 
     715                break; 
     716        case I2C_SMBUS_WORD_DATA: 
     717                if (read_write == I2C_SMBUS_READ) 
     718                        msg[1].len = 2; 
     719                else { 
     720                        msg[0].len=3; 
     721                        msgbuf0[1] = data->word & 0xff; 
     722                        msgbuf0[2] = (data->word >> 8) & 0xff; 
     723                } 
     724                break; 
     725        case I2C_SMBUS_PROC_CALL: 
     726                num = 2; /* Special case */ 
     727                msg[0].len = 3; 
     728                msg[1].len = 2; 
     729                msgbuf0[1] = data->word & 0xff; 
     730                msgbuf0[2] = (data->word >> 8) & 0xff; 
     731                break; 
     732        case I2C_SMBUS_BLOCK_DATA: 
     733                if (read_write == I2C_SMBUS_READ) { 
     734                        printk("smbus.o: Block read not supported under " 
     735                               "I2C emulation!\n"); 
     736                return -1; 
     737                } else { 
     738                        msg[1].len = data->block[0] + 1; 
     739                        if (msg[1].len > 32) { 
     740                                printk("smbus.o: smbus_access called with " 
     741                                       "invalid block write size (%d)\n", 
     742                                       msg[1].len); 
     743                                return -1; 
     744                        } 
     745                        for (i = 1; i <= msg[1].len; i++) 
     746                                msgbuf0[i] = data->block[i]; 
     747                } 
     748                break; 
     749        default: 
     750                printk("smbus.o: smbus_access called with invalid size (%d)\n", 
     751                       size); 
     752                return -1; 
     753        } 
     754     
     755        if (i2c_transfer(adapter, msg, num) < 0) 
     756                return -1; 
     757 
     758        if (read_write == I2C_SMBUS_READ) 
     759                switch(size) { 
     760                        case I2C_SMBUS_BYTE: 
     761                                data->byte = msgbuf0[0]; 
     762                                break; 
     763                        case I2C_SMBUS_BYTE_DATA: 
     764                                data->byte = msgbuf1[0]; 
     765                                break; 
     766                        case I2C_SMBUS_WORD_DATA:  
     767                        case I2C_SMBUS_PROC_CALL: 
     768                                data->word = msgbuf1[0] | (msgbuf1[1] << 8); 
     769                                break; 
     770                } 
     771        return 0; 
     772} 
     773 
     774 
     775s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u8 addr, char read_write, 
     776                   u8 command, int size, union i2c_smbus_data * data) 
     777{ 
     778        s32 res; 
     779        if (adapter->algo->smbus_xfer) { 
     780                down(&adapter->lock); 
     781                res = adapter->algo->smbus_xfer(adapter,addr,read_write, 
     782                                                command,size,data); 
     783                up(&adapter->lock); 
     784        } else 
     785                res = i2c_smbus_xfer_emulated(adapter,addr,read_write, 
     786                                                command,size,data); 
     787        return res; 
     788} 
     789 
    529790 
    530791int __init i2c_init(void) 
     
    633894EXPORT_SYMBOL(i2c_transfer); 
    634895 
     896EXPORT_SYMBOL(i2c_smbus_xfer); 
     897EXPORT_SYMBOL(i2c_smbus_write_quick); 
     898EXPORT_SYMBOL(i2c_smbus_read_byte); 
     899EXPORT_SYMBOL(i2c_smbus_write_byte); 
     900EXPORT_SYMBOL(i2c_smbus_read_byte_data); 
     901EXPORT_SYMBOL(i2c_smbus_write_byte_data); 
     902EXPORT_SYMBOL(i2c_smbus_read_word_data); 
     903EXPORT_SYMBOL(i2c_smbus_write_word_data); 
     904EXPORT_SYMBOL(i2c_smbus_process_call); 
     905EXPORT_SYMBOL(i2c_smbus_read_block_data); 
     906EXPORT_SYMBOL(i2c_smbus_write_block_data); 
     907 
    635908int init_module(void)  
    636909{ 
  • i2c/trunk/kernel/i2c.h

    r3320 r3321  
    4848struct i2c_client; 
    4949struct i2c_driver; 
     50union i2c_smbus_data; 
    5051 
    5152 
     
    9697        char *buf;              /* pointer to msg data                  */ 
    9798}; 
     99 
     100 
     101/* This is the very generalized SMBus access routine. You probably do not 
     102   want to use this, though; one of the functions below may be much easier, 
     103   and probably just as fast.  
     104   Note that we use i2c_adapter here, because you do not need a specific 
     105   smbus adapter to call this function. */ 
     106extern s32 i2c_smbus_xfer (struct i2c_adapter * adapter, u8 addr,  
     107                           char read_write, u8 command, int size, 
     108                           union i2c_smbus_data * data); 
     109 
     110/* Now follow the 'nice' access routines. These also document the calling 
     111   conventions of smbus_access. */ 
     112 
     113extern s32 i2c_smbus_write_quick(struct i2c_adapter * adapter, u8 addr,  
     114                                 u8 value); 
     115extern s32 i2c_smbus_read_byte(struct i2c_adapter * adapter,u8 addr); 
     116extern s32 i2c_smbus_write_byte(struct i2c_adapter * adapter, u8 addr,  
     117                                u8 value); 
     118extern s32 i2c_smbus_read_byte_data(struct i2c_adapter * adapter, 
     119                                    u8 addr, u8 command); 
     120extern s32 i2c_smbus_write_byte_data(struct i2c_adapter * adapter, 
     121                                 u8 addr, u8 command, u8 value); 
     122extern s32 i2c_smbus_read_word_data(struct i2c_adapter * adapter, 
     123                                    u8 addr, u8 command); 
     124extern s32 i2c_smbus_write_word_data(struct i2c_adapter * adapter, 
     125                                     u8 addr, u8 command, u16 value); 
     126extern s32 i2c_smbus_process_call(struct i2c_adapter * adapter, 
     127                              u8 addr, u8 command, u16 value); 
     128/* Returns the number of read bytes */ 
     129extern s32 i2c_smbus_read_block_data(struct i2c_adapter * adapter, 
     130                                     u8 addr, u8 command, u8 *values); 
     131extern s32 i2c_smbus_write_block_data(struct i2c_adapter * adapter, 
     132                                      u8 addr, u8 command, u8 length, 
     133                                      u8 *values); 
     134 
    98135 
    99136/* 
     
    171208        char name[32];                          /* textual description  */ 
    172209        unsigned int id;        
     210 
     211        /* If a adapter algorithm can't to I2C-level access, set master_xfer 
     212           to NULL. If an adapter algorithm can do SMBus access, set  
     213           smbus_xfer. If set to NULL, the SMBus protocol is simulated 
     214           using common I2C messages */ 
    173215        int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg msgs[],  
    174216                           int num); 
     217        int (*smbus_xfer) (struct i2c_adapter *adap, u8 addr, char read_write, 
     218                           u8 command, int size, union i2c_smbus_data * data); 
    175219 
    176220        /* --- these optional/future use for some adapter types.*/ 
     
    263307 
    264308#endif /* __KERNEL__ */ 
     309 
     310/*  
     311 * Data for SMBus Messages  
     312 */ 
     313union i2c_smbus_data {  
     314        __u8 byte; 
     315        __u16 word; 
     316        __u8 block[33]; /* block[0] is used for length */ 
     317}; 
     318 
     319/* smbus_access read or write markers */ 
     320#define I2C_SMBUS_READ      1 
     321#define I2C_SMBUS_WRITE     0 
     322 
     323/* SMBus transaction types (size parameter in the above functions)  
     324   Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ 
     325#define I2C_SMBUS_QUICK      0 
     326#define I2C_SMBUS_BYTE       1 
     327#define I2C_SMBUS_BYTE_DATA  2  
     328#define I2C_SMBUS_WORD_DATA  3 
     329#define I2C_SMBUS_PROC_CALL  4 
     330#define I2C_SMBUS_BLOCK_DATA 5 
    265331 
    266332