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;
}