I2C Part 1 - Remove some redundancy from the i2c-core.c file
PATCH 1/1 I2C Part 1 - Remove some redundancy from the i2c-core.c file
This is a series of patches to add a non-blocking interface to the I2C driver. Hopefully it is broken into small enough functional changes. I'm not posting the whole series right now, just the first few.
Call i2c_transfer() from i2c_master_send() and i2c_master_recv() to avoid the redundant code that was in all three functions.
This is important for the non-blocking interfaces because they will have to handle a non-blocking interface in this area. Having it in one place greatly simplifies the changes.
drivers/i2c/i2c-core.c +28 -41
@@ -606,27 +606,20 @@struct i2c_adapter *adap=client->adapter;struct i2c_msg msg; -if (client->adapter->algo->master_xfer) { - msg.addr = client->addr; - msg.flags = client->flags &I2C_M_TEN ; - msg.len = count; - msg.buf = (char *)buf; + msg.addr = client->addr; + msg.flags = client->flags &I2C_M_TEN ; + msg.len = count; + msg.buf = (char *)buf; -dev_dbg (&client->adapter->dev,"master_send: writing %d bytes.\n" , - count); - -down (&adap->bus_lock); - ret = adap->algo->master_xfer (adap,&msg,1 ); -up (&adap->bus_lock); +dev_dbg (&client->adapter->dev,"master_send: writing %d bytes.\n" , + count); -/* if everything went ok (i.e. 1 msg transmitted), return #bytes -* transmitted, else error code. -*/ -return (ret ==1 )? count : ret; - }else { -dev_err (&client->adapter->dev,"I2C level transfers not supported\n" ); -return -ENOSYS ; - } + ret =i2c_transfer (adap, &msg,1 ); + +/* if everything went ok (i.e. 1 msg transmitted), return #bytes +* transmitted, else error code. +*/ +return (ret ==1 )? count : ret; }int i2c_master_recv (struct i2c_client *client,char *buf ,int count)
@@ -634,31 +627,25 @@struct i2c_adapter *adap=client->adapter;struct i2c_msg msg;int ret; -if (client->adapter->algo->master_xfer) { - msg.addr = client->addr; - msg.flags = client->flags &I2C_M_TEN ; - msg.flags |=I2C_M_RD ; - msg.len = count; - msg.buf = buf; -dev_dbg (&client->adapter->dev,"master_recv: reading %d bytes.\n" , - count); - -down (&adap->bus_lock); - ret = adap->algo->master_xfer (adap,&msg,1 ); -up (&adap->bus_lock); + msg.addr = client->addr; + msg.flags = client->flags &I2C_M_TEN ; + msg.flags |=I2C_M_RD ; + msg.len = count; + msg.buf = buf; + +dev_dbg (&client->adapter->dev,"master_recv: reading %d bytes.\n" , + count); -dev_dbg (&client->adapter->dev,"master_recv: return:%d (count:%d, addr:0x%02x)\n" , - ret, count, client->addr); + ret =i2c_transfer (adap, &msg,1 ); + +dev_dbg (&client->adapter->dev,"master_recv: return:%d (count:%d, addr:0x%02x)\n" , + ret, count, client->addr); -/* if everything went ok (i.e. 1 msg transmitted), return #bytes -* transmitted, else error code. -*/ -return (ret ==1 )? count : ret; - }else { -dev_err (&client->adapter->dev,"I2C level transfers not supported\n" ); -return -ENOSYS ; - } +/* if everything went ok (i.e. 1 msg transmitted), return #bytes +* transmitted, else error code. +*/ +return (ret ==1 )? count : ret; }
Hi Corey,
Quoted 2 lines
Call
i2c_transfer()fromi2c_master_send()andi2c_master_recv()to avoid the redundant code that was in all three functions.
I like this. You're right, there is code duplication here, which we can get rid of, so let's do so. I'd only have one comments about your patch:
You can get rid of the dev_dbg calls in i2c_master_send() and i2c_master_recv() altogether IMHO. I recently updated i2c_transfer() to make it more verbose in debug mode [1], so the debug messages in i2c_master_send() and i2c_master_recv() are mostly redundant now as far as I can see.
[1] http://archives.andrew.net.au/lm-sensors/msg29859.html
Thanks,
Signature · 1 line
Jean Delvare
Ok, I have taken some time from suffering (packaging perl modules) to get back to this.
Here's a new patch with the debug calls removed, as you requested.
Thanks,
-Corey
Quoted 18 lines · Jean Delvare
Hi Corey,
Quoted 4 lines
Call
i2c_transfer()fromi2c_master_send()andi2c_master_recv()to avoid the redundant code that was in all three functions.I like this. You're right, there is code duplication here, which we can get rid of, so let's do so. I'd only have one comments about your patch:
You can get rid of the
dev_dbgcalls ini2c_master_send()andi2c_master_recv()altogether IMHO. I recently updatedi2c_transfer()to make it more verbose in debug mode [1], so the debug messages ini2c_master_send()andi2c_master_recv()are mostly redundant now as far as I can see.
Quoted 5 lines
[1] http://archives.andrew.net.au/lm-sensors/msg29859.html
Thanks,
Call i2c_transfer() from i2c_master_send() and i2c_master_recv() to avoid the redundant code that was in all three functions. It also removes unnecessary debug statements as suggested by Jean Delvare.
This is important for the non-blocking interfaces because they will have to handle a non-blocking interface in this area. Having it in one place greatly simplifies the changes.
drivers/i2c/i2c-core.c +22 -44
@@ -612,27 +612,17 @@struct i2c_adapter *adap=client->adapter;struct i2c_msg msg; -if (client->adapter->algo->master_xfer) { - msg.addr = client->addr; - msg.flags = client->flags &I2C_M_TEN ; - msg.len = count; - msg.buf = (char *)buf; + msg.addr = client->addr; + msg.flags = client->flags &I2C_M_TEN ; + msg.len = count; + msg.buf = (char *)buf; -dev_dbg (&client->adapter->dev,"master_send: writing %d bytes.\n" , - count); - -down (&adap->bus_lock); - ret = adap->algo->master_xfer (adap,&msg,1 ); -up (&adap->bus_lock); - -/* if everything went ok (i.e. 1 msg transmitted), return #bytes -* transmitted, else error code. -*/ -return (ret ==1 )? count : ret; - }else { -dev_err (&client->adapter->dev,"I2C level transfers not supported\n" ); -return -ENOSYS ; - } + ret =i2c_transfer (adap, &msg,1 ); + +/* if everything went ok (i.e. 1 msg transmitted), return #bytes +* transmitted, else error code. +*/ +return (ret ==1 )? count : ret; }int i2c_master_recv (struct i2c_client *client,char *buf ,int count)
@@ -640,31 +630,19 @@struct i2c_adapter *adap=client->adapter;struct i2c_msg msg;int ret; -if (client->adapter->algo->master_xfer) { - msg.addr = client->addr; - msg.flags = client->flags &I2C_M_TEN ; - msg.flags |=I2C_M_RD ; - msg.len = count; - msg.buf = buf; -dev_dbg (&client->adapter->dev,"master_recv: reading %d bytes.\n" , - count); - -down (&adap->bus_lock); - ret = adap->algo->master_xfer (adap,&msg,1 ); -up (&adap->bus_lock); - -dev_dbg (&client->adapter->dev,"master_recv: return:%d (count:%d, addr:0x%02x)\n" , - ret, count, client->addr); - -/* if everything went ok (i.e. 1 msg transmitted), return #bytes -* transmitted, else error code. -*/ -return (ret ==1 )? count : ret; - }else { -dev_err (&client->adapter->dev,"I2C level transfers not supported\n" ); -return -ENOSYS ; - } + msg.addr = client->addr; + msg.flags = client->flags &I2C_M_TEN ; + msg.flags |=I2C_M_RD ; + msg.len = count; + msg.buf = buf; + + ret =i2c_transfer (adap, &msg,1 ); + +/* if everything went ok (i.e. 1 msg transmitted), return #bytes +* transmitted, else error code. +*/ +return (ret ==1 )? count : ret; }