Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: CX88 i2c issue w/ DVB tuners
> The thin layer already exists, almost all i2c drivers implement the
> master_transfer function like this:
>
> int i2c_transfer (struct i2c_adapter *adap,
> struct i2c_msg msg[],
> int num)
> {
> for (i=0; i<num; i++) {
> if (msg[i].flags & I2C_M_RD)
> i2c_read(adap, msg[i].buf, msg[i].len);
> else
> i2c_write(adap, msg[i].buf, msg[i].len);
> }
> }
>
>
> Nothing new needs to get introduced despite two convinience functions
> which reverse the useless API abstraction and access the read/write
> functions directly again:
>
>
> int card_i2c_write (struct card *card, const u8 *buf, int len)
> {
> struct i2c_msg m = { .flags = 0, .buf = buf, .len = len };
> return i2c_transfer(&card->i2c_adap, &m, 1) == 1 ? len : -EIO;
> }
>
>
> int card_i2c_read (struct card *card, const u8 *buf, int len)
> {
> struct i2c_msg m = { .flags = I2C_M_RD, .buf = buf, .len = len };
> return i2c_transfer(&card->i2c_adap, &m, 1) == 1 ? len : -EIO;
> }
"Almost all". The cx88 does not for example. It only implements the setscl,
setsda, getscl, getsda functions. The standard kernel i2c bitbanging code
does the rest.
Home |
Main Index |
Thread Index