When the current wm8775 module probe, it checks the adapter for
SMBUS_BYTE_DATA functionality. However, when it writes, it does an i2c
level transfer (with i2c_master_send). This patch converts that to to a
standard SMBus byte data write, which makes the wm8775 module no longer
depend on raw i2c. Another one of my useless patches, but if someone
one day needs a pure SMBus implementation of our wolfson module, this
would do the trick. Call it "better interoperability" :)
Same thing with the saa7115 module. There was a function called
readreg() that sent 2 raw i2c commands on the adapter, which were just a
smbus read byte data. I replaced it with an saa7115_read().
msp3400, tda9887, tuner, and tveeprom all depend on raw i2c so I can't
do anything with those.
Index: driver/wm8775.c
===================================================================
--- driver/wm8775.c (revision 313)
+++ driver/wm8775.c (working copy)
@@ -211,19 +211,18 @@
}
for (i = 0; i < ELEMENTS(config->reg); i++) {
+ u8 regaddr = config->reg[i] >> 8;
+ u8 regval = config->reg[i] & 0xff;
DEB(1,
"%s register %d (%s), config: %02x%02x active: %02x%02x.",
s->reg[i] != config->reg[i] ? "Updating" : "Skipping", i,
reg_name(i), s->reg[i] >> 8, s->reg[i] & 0xFF,
- config->reg[i] >> 8, config->reg[i] & 0xFF);
+ regaddr, regval);
if (s->reg[i] != config->reg[i]) {
- __u8 buffer[2];
- buffer[0] = config->reg[i] >> 8;
- buffer[1] = config->reg[i] & 0xff;
- if (2 != i2c_master_send(client, buffer, 2)) {
+ if (0 != i2c_smbus_write_byte_data(client, regaddr,
regval)) {
LOG_ERR
("Failed to update register %d (%s) with
%02x%02x.",
- i, reg_name(i), buffer[0], buffer[1]);
+ i, reg_name(i), regaddr, regval);
}
s->reg[i] = config->reg[i];
}
Index: driver/saa7115.c
===================================================================
--- driver/saa7115.c (revision 313)
+++ driver/saa7115.c (working copy)
@@ -105,26 +105,6 @@
/* ----------------------------------------------------------------------- */
-static u8 readreg(struct i2c_client *client, unsigned char reg)
-{
- struct i2c_adapter *adap = client->adapter;
- unsigned char mm1[] = { 0x1e };
- unsigned char mm2[] = { 0x00 };
- struct i2c_msg msgs[2];
-
- msgs[0].flags = 0;
- msgs[1].flags = I2C_M_RD;
- msgs[0].addr = msgs[1].addr = client->addr;
- mm1[0] = reg;
- msgs[0].len = 1;
- msgs[1].len = 1;
- msgs[0].buf = mm1;
- msgs[1].buf = mm2;
- i2c_transfer(adap, msgs, 2);
-
- return mm2[0];
-}
-
static inline int saa7115_write(struct i2c_client *client, u8 reg, u8 value)
{
return i2c_smbus_write_byte_data(client, reg, value);
@@ -1190,7 +1170,7 @@
i2c_attach_client(client);
dprintk(1, "status: (1E) 0x%02x, (1F) 0x%02x\n",
- readreg(client, 0x1e), readreg(client, 0x1f));
+ saa7115_read(client, 0x1e), saa7115_read(client, 0x1f));
return 0;
}