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

Reply via email to