Re: [PATCH] i2c driver fixes for 2.6.4

From: Greg KH (greg_at_kroah.com)
Date: 03/15/04

  • Next message: Greg KH: "Re: [PATCH] i2c driver fixes for 2.6.4"
    Date:	Mon, 15 Mar 2004 14:56:34 -0800
    To: linux-kernel@vger.kernel.org, sensors@stimpy.netroedge.com
    
    

    ChangeSet 1.1608.74.9, 2004/03/11 16:53:51-08:00, mhoffman@lightlink.com

    [PATCH] I2C: sensor chip driver refactoring

    This patch is a refactoring of some common code among all sensors chip
    drivers (except asb100, which was written this way to begin with.)
    It saves a handful of lines and ~100-300 bytes per module. It compiles
    ok. I've only tested it against one of the drivers, but the changes are
    similar across the board and quite mechanical. Please apply.

     drivers/i2c/chips/adm1021.c | 31 ++++++----------
     drivers/i2c/chips/fscher.c | 11 +++--
     drivers/i2c/chips/gl518sm.c | 15 +++----
     drivers/i2c/chips/it87.c | 51 ++++++++-------------------
     drivers/i2c/chips/lm75.c | 11 +++--
     drivers/i2c/chips/lm78.c | 51 ++++++++-------------------
     drivers/i2c/chips/lm80.c | 31 +++++-----------
     drivers/i2c/chips/lm83.c | 15 +++----
     drivers/i2c/chips/lm85.c | 71 +++++++++----------------------------
     drivers/i2c/chips/lm90.c | 19 ++++------
     drivers/i2c/chips/via686a.c | 47 +++++++-----------------
     drivers/i2c/chips/w83627hf.c | 67 +++++++----------------------------
     drivers/i2c/chips/w83781d.c | 79 +++++++++---------------------------------
     drivers/i2c/chips/w83l785ts.c | 15 +++----
     14 files changed, 162 insertions(+), 352 deletions(-)

    diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c
    --- a/drivers/i2c/chips/adm1021.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/adm1021.c Mon Mar 15 14:34:33 2004
    @@ -139,7 +139,7 @@
     static int adm1021_read_value(struct i2c_client *client, u8 reg);
     static int adm1021_write_value(struct i2c_client *client, u8 reg,
                                    u16 value);
    -static void adm1021_update_client(struct i2c_client *client);
    +static struct adm1021_data *adm1021_update_device(struct device *dev);
     
     /* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */
     static int read_only = 0;
    @@ -161,15 +161,10 @@
     static int adm1021_id = 0;
     
     #define show(value) \
    -static ssize_t show_##value(struct device *dev, char *buf) \
    -{ \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct adm1021_data *data = i2c_get_clientdata(client); \
    - int temp; \
    - \
    - adm1021_update_client(client); \
    - temp = TEMP_FROM_REG(data->value); \
    - return sprintf(buf, "%d\n", temp); \
    +static ssize_t show_##value(struct device *dev, char *buf) \
    +{ \
    + struct adm1021_data *data = adm1021_update_device(dev); \
    + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
     }
     show(temp_max);
     show(temp_hyst);
    @@ -179,13 +174,10 @@
     show(remote_temp_input);
     
     #define show2(value) \
    -static ssize_t show_##value(struct device *dev, char *buf) \
    -{ \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct adm1021_data *data = i2c_get_clientdata(client); \
    - \
    - adm1021_update_client(client); \
    - return sprintf(buf, "%d\n", data->value); \
    +static ssize_t show_##value(struct device *dev, char *buf) \
    +{ \
    + struct adm1021_data *data = adm1021_update_device(dev); \
    + return sprintf(buf, "%d\n", data->value); \
     }
     show2(alarms);
     show2(die_code);
    @@ -393,8 +385,9 @@
             return 0;
     }
     
    -static void adm1021_update_client(struct i2c_client *client)
    +static struct adm1021_data *adm1021_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct adm1021_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -424,6 +417,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_adm1021_init(void)
    diff -Nru a/drivers/i2c/chips/fscher.c b/drivers/i2c/chips/fscher.c
    --- a/drivers/i2c/chips/fscher.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/fscher.c Mon Mar 15 14:34:33 2004
    @@ -113,7 +113,7 @@
     static int fscher_attach_adapter(struct i2c_adapter *adapter);
     static int fscher_detect(struct i2c_adapter *adapter, int address, int kind);
     static int fscher_detach_client(struct i2c_client *client);
    -static void fscher_update_client(struct i2c_client *client);
    +static struct fscher_data *fscher_update_device(struct device *dev);
     static void fscher_init_client(struct i2c_client *client);
     
     static int fscher_read_value(struct i2c_client *client, u8 reg);
    @@ -170,9 +170,7 @@
     static ssize_t show_##kind##offset##sub (struct device *, char *); \
     static ssize_t show_##kind##offset##sub (struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct fscher_data *data = i2c_get_clientdata(client); \
    - fscher_update_client(client); \
    + struct fscher_data *data = fscher_update_device(dev); \
             return show_##kind##sub(data, buf, (offset)); \
     }
     
    @@ -420,8 +418,9 @@
             data->revision = fscher_read_value(client, FSCHER_REG_REVISION);
     }
     
    -static void fscher_update_client(struct i2c_client *client)
    +static struct fscher_data *fscher_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct fscher_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -466,6 +465,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     
    diff -Nru a/drivers/i2c/chips/gl518sm.c b/drivers/i2c/chips/gl518sm.c
    --- a/drivers/i2c/chips/gl518sm.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/gl518sm.c Mon Mar 15 14:34:33 2004
    @@ -151,7 +151,7 @@
     static int gl518_detach_client(struct i2c_client *client);
     static int gl518_read_value(struct i2c_client *client, u8 reg);
     static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value);
    -static void gl518_update_client(struct i2c_client *client);
    +static struct gl518_data *gl518_update_device(struct device *dev);
     
     /* This is the driver that will be inserted */
     static struct i2c_driver gl518_driver = {
    @@ -176,18 +176,14 @@
     #define show(type, suffix, value) \
     static ssize_t show_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct gl518_data *data = i2c_get_clientdata(client); \
    - gl518_update_client(client); \
    + struct gl518_data *data = gl518_update_device(dev); \
             return sprintf(buf, "%d\n", type##_FROM_REG(data->value)); \
     }
     
     #define show_fan(suffix, value, index) \
     static ssize_t show_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct gl518_data *data = i2c_get_clientdata(client); \
    - gl518_update_client(client); \
    + struct gl518_data *data = gl518_update_device(dev); \
             return sprintf(buf, "%d\n", FAN_FROM_REG(data->value[index], \
                     DIV_FROM_REG(data->fan_div[index]))); \
     }
    @@ -523,8 +519,9 @@
                     return i2c_smbus_write_byte_data(client, reg, value);
     }
     
    -static void gl518_update_client(struct i2c_client *client)
    +static struct gl518_data *gl518_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct gl518_data *data = i2c_get_clientdata(client);
             int val;
     
    @@ -590,6 +587,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_gl518sm_init(void)
    diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
    --- a/drivers/i2c/chips/it87.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/it87.c Mon Mar 15 14:34:33 2004
    @@ -167,7 +167,7 @@
     static int it87_read_value(struct i2c_client *client, u8 register);
     static int it87_write_value(struct i2c_client *client, u8 register,
                             u8 value);
    -static void it87_update_client(struct i2c_client *client);
    +static struct it87_data *it87_update_device(struct device *dev);
     static void it87_init_client(struct i2c_client *client, struct it87_data *data);
     
     
    @@ -184,25 +184,19 @@
     
     static ssize_t show_in(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr])*10 );
     }
     
     static ssize_t show_in_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr])*10 );
     }
     
     static ssize_t show_in_max(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr])*10 );
     }
     
    @@ -284,23 +278,17 @@
     /* 3 temperatures */
     static ssize_t show_temp(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])*100 );
     }
     static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr])*100);
     }
     static ssize_t show_temp_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_low[nr])*100);
     }
     static ssize_t set_temp_max(struct device *dev, const char *buf,
    @@ -360,9 +348,7 @@
     
     static ssize_t show_sensor(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             if (data->sensor & (1 << nr))
                     return sprintf(buf, "3\n"); /* thermal diode */
             if (data->sensor & (8 << nr))
    @@ -408,25 +394,19 @@
     /* 3 Fans */
     static ssize_t show_fan(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr],
                                     DIV_FROM_REG(data->fan_div[nr])) );
     }
     static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf,"%d\n",
                     FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr])) );
     }
     static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf,"%d\n", DIV_FROM_REG(data->fan_div[nr]) );
     }
     static ssize_t set_fan_min(struct device *dev, const char *buf,
    @@ -512,9 +492,7 @@
     /* Alarms */
     static ssize_t show_alarms(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct it87_data *data = i2c_get_clientdata(client);
    - it87_update_client(client);
    + struct it87_data *data = it87_update_device(dev);
             return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
     }
     static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
    @@ -811,8 +789,9 @@
                              | (update_vbat ? 0x41 : 0x01));
     }
     
    -static void it87_update_client(struct i2c_client *client)
    +static struct it87_data *it87_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct it87_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -883,6 +862,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sm_it87_init(void)
    diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c
    --- a/drivers/i2c/chips/lm75.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm75.c Mon Mar 15 14:34:33 2004
    @@ -64,7 +64,7 @@
     static int lm75_detach_client(struct i2c_client *client);
     static int lm75_read_value(struct i2c_client *client, u8 reg);
     static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
    -static void lm75_update_client(struct i2c_client *client);
    +static struct lm75_data *lm75_update_device(struct device *dev);
     
     
     /* This is the driver that will be inserted */
    @@ -82,9 +82,7 @@
     #define show(value) \
     static ssize_t show_##value(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm75_data *data = i2c_get_clientdata(client); \
    - lm75_update_client(client); \
    + struct lm75_data *data = lm75_update_device(dev); \
             return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value)); \
     }
     show(temp_max);
    @@ -250,8 +248,9 @@
             lm75_write_value(client, LM75_REG_CONF, 0);
     }
     
    -static void lm75_update_client(struct i2c_client *client)
    +static struct lm75_data *lm75_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm75_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -268,6 +267,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_lm75_init(void)
    diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c
    --- a/drivers/i2c/chips/lm78.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm78.c Mon Mar 15 14:34:33 2004
    @@ -223,7 +223,7 @@
     
     static int lm78_read_value(struct i2c_client *client, u8 register);
     static int lm78_write_value(struct i2c_client *client, u8 register, u8 value);
    -static void lm78_update_client(struct i2c_client *client);
    +static struct lm78_data *lm78_update_device(struct device *dev);
     static void lm78_init_client(struct i2c_client *client);
     
     
    @@ -239,25 +239,19 @@
     /* 7 Voltages */
     static ssize_t show_in(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
     }
     
     static ssize_t show_in_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
     }
     
     static ssize_t show_in_max(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
     }
     
    @@ -327,17 +321,13 @@
     /* Temperature */
     static ssize_t show_temp(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
     }
     
     static ssize_t show_temp_over(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
     }
     
    @@ -353,9 +343,7 @@
     
     static ssize_t show_temp_hyst(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
     }
     
    @@ -378,18 +366,14 @@
     /* 3 Fans */
     static ssize_t show_fan(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
                     DIV_FROM_REG(data->fan_div[nr])) );
     }
     
     static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
                     DIV_FROM_REG(data->fan_div[nr])) );
     }
    @@ -407,9 +391,7 @@
     
     static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]) );
     }
     
    @@ -490,9 +472,7 @@
     /* VID */
     static ssize_t show_vid(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", VID_FROM_REG(data->vid));
     }
     static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL);
    @@ -500,9 +480,7 @@
     /* Alarms */
     static ssize_t show_alarms(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm78_data *data = i2c_get_clientdata(client);
    - lm78_update_client(client);
    + struct lm78_data *data = lm78_update_device(dev);
             return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->alarms));
     }
     static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
    @@ -829,8 +807,9 @@
     
     }
     
    -static void lm78_update_client(struct i2c_client *client)
    +static struct lm78_data *lm78_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm78_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -879,6 +858,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sm_lm78_init(void)
    diff -Nru a/drivers/i2c/chips/lm80.c b/drivers/i2c/chips/lm80.c
    --- a/drivers/i2c/chips/lm80.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm80.c Mon Mar 15 14:34:33 2004
    @@ -141,7 +141,7 @@
     static int lm80_detect(struct i2c_adapter *adapter, int address, int kind);
     static void lm80_init_client(struct i2c_client *client);
     static int lm80_detach_client(struct i2c_client *client);
    -static void lm80_update_client(struct i2c_client *client);
    +static struct lm80_data *lm80_update_device(struct device *dev);
     static int lm80_read_value(struct i2c_client *client, u8 reg);
     static int lm80_write_value(struct i2c_client *client, u8 reg, u8 value);
     
    @@ -171,9 +171,7 @@
     #define show_in(suffix, value) \
     static ssize_t show_in_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm80_data *data = i2c_get_clientdata(client); \
    - lm80_update_client(client); \
    + struct lm80_data *data = lm80_update_device(dev); \
             return sprintf(buf, "%d\n", IN_FROM_REG(data->value)); \
     }
     show_in(min0, in_min[0]);
    @@ -227,9 +225,7 @@
     #define show_fan(suffix, value, div) \
     static ssize_t show_fan_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm80_data *data = i2c_get_clientdata(client); \
    - lm80_update_client(client); \
    + struct lm80_data *data = lm80_update_device(dev); \
             return sprintf(buf, "%d\n", FAN_FROM_REG(data->value, \
                            DIV_FROM_REG(data->div))); \
     }
    @@ -241,9 +237,7 @@
     #define show_fan_div(suffix, value) \
     static ssize_t show_fan_div##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm80_data *data = i2c_get_clientdata(client); \
    - lm80_update_client(client); \
    + struct lm80_data *data = lm80_update_device(dev); \
             return sprintf(buf, "%d\n", DIV_FROM_REG(data->value)); \
     }
     show_fan_div(1, fan_div[0]);
    @@ -265,18 +259,14 @@
     
     static ssize_t show_temp_input1(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm80_data *data = i2c_get_clientdata(client);
    - lm80_update_client(client);
    + struct lm80_data *data = lm80_update_device(dev);
             return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp));
     }
     
     #define show_temp(suffix, value) \
     static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm80_data *data = i2c_get_clientdata(client); \
    - lm80_update_client(client); \
    + struct lm80_data *data = lm80_update_device(dev); \
             return sprintf(buf, "%d\n", TEMP_LIMIT_FROM_REG(data->value)); \
     }
     show_temp(hot_max, temp_hot_max);
    @@ -302,9 +292,7 @@
     
     static ssize_t show_alarms(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm80_data *data = i2c_get_clientdata(client);
    - lm80_update_client(client);
    + struct lm80_data *data = lm80_update_device(dev);
             return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->alarms));
     }
     
    @@ -498,8 +486,9 @@
             lm80_write_value(client, LM80_REG_CONFIG, 0x01);
     }
     
    -static void lm80_update_client(struct i2c_client *client)
    +static struct lm80_data *lm80_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm80_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -546,6 +535,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_lm80_init(void)
    diff -Nru a/drivers/i2c/chips/lm83.c b/drivers/i2c/chips/lm83.c
    --- a/drivers/i2c/chips/lm83.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm83.c Mon Mar 15 14:34:33 2004
    @@ -118,7 +118,7 @@
     static int lm83_attach_adapter(struct i2c_adapter *adapter);
     static int lm83_detect(struct i2c_adapter *adapter, int address, int kind);
     static int lm83_detach_client(struct i2c_client *client);
    -static void lm83_update_client(struct i2c_client *client);
    +static struct lm83_data *lm83_update_device(struct device *dev);
     
     /*
      * Driver data (common to all clients)
    @@ -162,9 +162,7 @@
     #define show_temp(suffix, value) \
     static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm83_data *data = i2c_get_clientdata(client); \
    - lm83_update_client(client); \
    + struct lm83_data *data = lm83_update_device(dev); \
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
     }
     show_temp(input1, temp_input[0]);
    @@ -195,9 +193,7 @@
     
     static ssize_t show_alarms(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm83_data *data = i2c_get_clientdata(client);
    - lm83_update_client(client);
    + struct lm83_data *data = lm83_update_device(dev);
             return sprintf(buf, "%d\n", data->alarms);
     }
     
    @@ -353,8 +349,9 @@
             return 0;
     }
     
    -static void lm83_update_client(struct i2c_client *client)
    +static struct lm83_data *lm83_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm83_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -385,6 +382,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_lm83_init(void)
    diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c
    --- a/drivers/i2c/chips/lm85.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm85.c Mon Mar 15 14:34:33 2004
    @@ -397,7 +397,7 @@
     
     static int lm85_read_value(struct i2c_client *client, u8 register);
     static int lm85_write_value(struct i2c_client *client, u8 register, int value);
    -static void lm85_update_client(struct i2c_client *client);
    +static struct lm85_data *lm85_update_device(struct device *dev);
     static void lm85_init_client(struct i2c_client *client);
     
     
    @@ -417,18 +417,12 @@
     /* 4 Fans */
     static ssize_t show_fan(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr]) );
     }
     static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr]) );
     }
     static ssize_t set_fan_min(struct device *dev, const char *buf,
    @@ -473,10 +467,7 @@
     
     static ssize_t show_vid_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
     }
     
    @@ -484,10 +475,7 @@
     
     static ssize_t show_vrm_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->vrm);
     }
     
    @@ -506,10 +494,7 @@
     
     static ssize_t show_alarms_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
     }
     
    @@ -519,10 +504,7 @@
     
     static ssize_t show_pwm(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", PWM_FROM_REG(data->pwm[nr]) );
     }
     static ssize_t set_pwm(struct device *dev, const char *buf,
    @@ -541,11 +523,9 @@
     }
     static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    + struct lm85_data *data = lm85_update_device(dev);
             int pwm_zone;
     
    - lm85_update_client(client);
             pwm_zone = ZONE_FROM_REG(data->autofan[nr].config);
             return sprintf(buf,"%d\n", (pwm_zone != 0 && pwm_zone != -1) );
     }
    @@ -576,18 +556,12 @@
     
     static ssize_t show_in(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in[nr]) );
     }
     static ssize_t show_in_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_min[nr]) );
     }
     static ssize_t set_in_min(struct device *dev, const char *buf,
    @@ -606,10 +580,7 @@
     }
     static ssize_t show_in_max(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_max[nr]) );
     }
     static ssize_t set_in_max(struct device *dev, const char *buf,
    @@ -665,18 +636,12 @@
     
     static ssize_t show_temp(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp[nr]) );
     }
     static ssize_t show_temp_min(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_min[nr]) );
     }
     static ssize_t set_temp_min(struct device *dev, const char *buf,
    @@ -695,10 +660,7 @@
     }
     static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm85_data *data = i2c_get_clientdata(client);
    -
    - lm85_update_client(client);
    + struct lm85_data *data = lm85_update_device(dev);
             return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_max[nr]) );
     }
     static ssize_t set_temp_max(struct device *dev, const char *buf,
    @@ -1047,8 +1009,9 @@
             lm85_write_value(client, LM85_REG_CONFIG, value);
     }
     
    -void lm85_update_client(struct i2c_client *client)
    +static struct lm85_data *lm85_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm85_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -1189,6 +1152,8 @@
             data->valid = 1;
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     
    diff -Nru a/drivers/i2c/chips/lm90.c b/drivers/i2c/chips/lm90.c
    --- a/drivers/i2c/chips/lm90.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/lm90.c Mon Mar 15 14:34:33 2004
    @@ -126,7 +126,7 @@
             int kind);
     static void lm90_init_client(struct i2c_client *client);
     static int lm90_detach_client(struct i2c_client *client);
    -static void lm90_update_client(struct i2c_client *client);
    +static struct lm90_data *lm90_update_device(struct device *dev);
     
     /*
      * Driver data (common to all clients)
    @@ -171,9 +171,7 @@
     #define show_temp(value, converter) \
     static ssize_t show_##value(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm90_data *data = i2c_get_clientdata(client); \
    - lm90_update_client(client); \
    + struct lm90_data *data = lm90_update_device(dev); \
             return sprintf(buf, "%d\n", converter(data->value)); \
     }
     show_temp(temp_input1, TEMP1_FROM_REG);
    @@ -216,9 +214,7 @@
     #define show_temp_hyst(value, basereg) \
     static ssize_t show_##value(struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct lm90_data *data = i2c_get_clientdata(client); \
    - lm90_update_client(client); \
    + struct lm90_data *data = lm90_update_device(dev); \
             return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->basereg) \
                            - HYST_FROM_REG(data->temp_hyst)); \
     }
    @@ -239,9 +235,7 @@
     
     static ssize_t show_alarms(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct lm90_data *data = i2c_get_clientdata(client);
    - lm90_update_client(client);
    + struct lm90_data *data = lm90_update_device(dev);
             return sprintf(buf, "%d\n", data->alarms);
     }
     
    @@ -430,8 +424,9 @@
             return 0;
     }
     
    -static void lm90_update_client(struct i2c_client *client)
    +static struct lm90_data *lm90_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct lm90_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -505,6 +500,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_lm90_init(void)
    diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
    --- a/drivers/i2c/chips/via686a.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/via686a.c Mon Mar 15 14:34:33 2004
    @@ -409,30 +409,24 @@
             outb_p(value, client->addr + reg);
     }
     
    -static void via686a_update_client(struct i2c_client *client);
    +static struct via686a_data *via686a_update_device(struct device *dev);
     static void via686a_init_client(struct i2c_client *client);
     
     /* following are the sysfs callback functions */
     
     /* 7 voltage sensors */
     static ssize_t show_in(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", IN_FROM_REG(data->in[nr], nr)*10 );
     }
     
     static ssize_t show_in_min(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_min[nr], nr)*10 );
     }
     
     static ssize_t show_in_max(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_max[nr], nr)*10 );
     }
     
    @@ -496,21 +490,15 @@
     
     /* 3 temperatures */
     static ssize_t show_temp(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr])*100 );
     }
     static ssize_t show_temp_over(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr])*100);
     }
     static ssize_t show_temp_hyst(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr])*100);
     }
     static ssize_t set_temp_over(struct device *dev, const char *buf,
    @@ -568,23 +556,17 @@
     
     /* 2 Fans */
     static ssize_t show_fan(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr],
                                     DIV_FROM_REG(data->fan_div[nr])) );
     }
     static ssize_t show_fan_min(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf,"%d\n",
                     FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr])) );
     }
     static ssize_t show_fan_div(struct device *dev, char *buf, int nr) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf,"%d\n", DIV_FROM_REG(data->fan_div[nr]) );
     }
     static ssize_t set_fan_min(struct device *dev, const char *buf,
    @@ -642,9 +624,7 @@
     
     /* Alarms */
     static ssize_t show_alarms(struct device *dev, char *buf) {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct via686a_data *data = i2c_get_clientdata(client);
    - via686a_update_client(client);
    + struct via686a_data *data = via686a_update_device(dev);
             return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
     }
     static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
    @@ -854,8 +834,9 @@
                                 !(VIA686A_TEMP_MODE_MASK | VIA686A_TEMP_MODE_CONTINUOUS));
     }
     
    -static void via686a_update_client(struct i2c_client *client)
    +static struct via686a_data *via686a_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct via686a_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -916,6 +897,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static struct pci_device_id via686a_pci_ids[] = {
    diff -Nru a/drivers/i2c/chips/w83627hf.c b/drivers/i2c/chips/w83627hf.c
    --- a/drivers/i2c/chips/w83627hf.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/w83627hf.c Mon Mar 15 14:34:33 2004
    @@ -322,7 +322,7 @@
     static int w83627hf_read_value(struct i2c_client *client, u16 register);
     static int w83627hf_write_value(struct i2c_client *client, u16 register,
                                    u16 value);
    -static void w83627hf_update_client(struct i2c_client *client);
    +static struct w83627hf_data *w83627hf_update_device(struct device *dev);
     static void w83627hf_init_client(struct i2c_client *client);
     
     static struct i2c_driver w83627hf_driver = {
    @@ -338,11 +338,7 @@
     #define show_in_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83627hf_data *data = i2c_get_clientdata(client); \
    - \
    - w83627hf_update_client(client); \
    - \
    + struct w83627hf_data *data = w83627hf_update_device(dev); \
             return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr])); \
     }
     show_in_reg(in)
    @@ -414,11 +410,7 @@
     #define show_fan_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83627hf_data *data = i2c_get_clientdata(client); \
    - \
    - w83627hf_update_client(client); \
    - \
    + struct w83627hf_data *data = w83627hf_update_device(dev); \
             return sprintf(buf,"%ld\n", \
                     FAN_FROM_REG(data->reg[nr-1], \
                                 (long)DIV_FROM_REG(data->fan_div[nr-1]))); \
    @@ -478,11 +470,7 @@
     #define show_temp_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83627hf_data *data = i2c_get_clientdata(client); \
    - \
    - w83627hf_update_client(client); \
    - \
    + struct w83627hf_data *data = w83627hf_update_device(dev); \
             if (nr >= 2) { /* TEMP2 and TEMP3 */ \
                     return sprintf(buf,"%ld\n", \
                             (long)LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \
    @@ -560,11 +548,7 @@
     static ssize_t
     show_vid_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
     }
     static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL)
    @@ -574,11 +558,7 @@
     static ssize_t
     show_vrm_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->vrm);
     }
     static ssize_t
    @@ -600,11 +580,7 @@
     static ssize_t
     show_alarms_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->alarms);
     }
     static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL)
    @@ -614,11 +590,7 @@
     #define show_beep_reg(REG, reg) \
     static ssize_t show_beep_##reg (struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83627hf_data *data = i2c_get_clientdata(client); \
    - \
    - w83627hf_update_client(client); \
    - \
    + struct w83627hf_data *data = w83627hf_update_device(dev); \
             return sprintf(buf,"%ld\n", \
                           (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \
     }
    @@ -682,11 +654,7 @@
     static ssize_t
     show_fan_div_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n",
                            (long) DIV_FROM_REG(data->fan_div[nr - 1]));
     }
    @@ -749,11 +717,7 @@
     static ssize_t
     show_pwm_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->pwm[nr - 1]);
     }
     
    @@ -809,11 +773,7 @@
     static ssize_t
     show_sensor_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83627hf_data *data = i2c_get_clientdata(client);
    -
    - w83627hf_update_client(client);
    -
    + struct w83627hf_data *data = w83627hf_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]);
     }
     
    @@ -1273,8 +1233,9 @@
                                 | 0x01);
     }
     
    -static void w83627hf_update_client(struct i2c_client *client)
    +static struct w83627hf_data *w83627hf_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct w83627hf_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -1362,6 +1323,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_w83627hf_init(void)
    diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
    --- a/drivers/i2c/chips/w83781d.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/w83781d.c Mon Mar 15 14:34:33 2004
    @@ -276,7 +276,7 @@
     static int w83781d_read_value(struct i2c_client *client, u16 register);
     static int w83781d_write_value(struct i2c_client *client, u16 register,
                                    u16 value);
    -static void w83781d_update_client(struct i2c_client *client);
    +static struct w83781d_data *w83781d_update_device(struct device *dev);
     static void w83781d_init_client(struct i2c_client *client);
     
     static inline u16 swap_bytes(u16 val)
    @@ -297,11 +297,7 @@
     #define show_in_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83781d_data *data = i2c_get_clientdata(client); \
    - \
    - w83781d_update_client(client); \
    - \
    + struct w83781d_data *data = w83781d_update_device(dev); \
             return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr] * 10)); \
     }
     show_in_reg(in);
    @@ -368,11 +364,7 @@
     #define show_fan_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83781d_data *data = i2c_get_clientdata(client); \
    - \
    - w83781d_update_client(client); \
    - \
    + struct w83781d_data *data = w83781d_update_device(dev); \
             return sprintf(buf,"%ld\n", \
                     FAN_FROM_REG(data->reg[nr-1], (long)DIV_FROM_REG(data->fan_div[nr-1]))); \
     }
    @@ -429,11 +421,7 @@
     #define show_temp_reg(reg) \
     static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83781d_data *data = i2c_get_clientdata(client); \
    - \
    - w83781d_update_client(client); \
    - \
    + struct w83781d_data *data = w83781d_update_device(dev); \
             if (nr >= 2) { /* TEMP2 and TEMP3 */ \
                     if (data->type == as99127f) { \
                             return sprintf(buf,"%ld\n", \
    @@ -516,11 +504,7 @@
     static ssize_t
     show_vid_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
     }
     
    @@ -531,11 +515,7 @@
     static ssize_t
     show_vrm_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->vrm);
     }
     
    @@ -559,11 +539,7 @@
     static ssize_t
     show_alarms_reg(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
     }
     
    @@ -574,11 +550,7 @@
     #define show_beep_reg(REG, reg) \
     static ssize_t show_beep_##reg (struct device *dev, char *buf) \
     { \
    - struct i2c_client *client = to_i2c_client(dev); \
    - struct w83781d_data *data = i2c_get_clientdata(client); \
    - \
    - w83781d_update_client(client); \
    - \
    + struct w83781d_data *data = w83781d_update_device(dev); \
             return sprintf(buf,"%ld\n", (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \
     }
     show_beep_reg(ENABLE, enable);
    @@ -642,11 +614,7 @@
     static ssize_t
     show_fan_div_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n",
                            (long) DIV_FROM_REG(data->fan_div[nr - 1]));
     }
    @@ -743,11 +711,7 @@
     static ssize_t
     show_pwm_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr - 1]));
     }
     
    @@ -755,11 +719,7 @@
     static ssize_t
     show_pwmenable_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->pwmenable[nr - 1]);
     }
     
    @@ -861,11 +821,7 @@
     static ssize_t
     show_sensor_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    -
    - w83781d_update_client(client);
    -
    + struct w83781d_data *data = w83781d_update_device(dev);
             return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]);
     }
     
    @@ -937,12 +893,9 @@
     static ssize_t
     show_rt_reg(struct device *dev, char *buf, int nr)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83781d_data *data = i2c_get_clientdata(client);
    + struct w83781d_data *data = w83781d_update_device(dev);
             int i, j = 0;
     
    - w83781d_update_client(client);
    -
             for (i = 0; i < 32; i++) {
                     if (i > 0)
                             j += sprintf(buf, " %ld", (long) data->rt[nr - 1][i]);
    @@ -1667,9 +1620,9 @@
                                 | 0x01);
     }
     
    -static void
    -w83781d_update_client(struct i2c_client *client)
    +static struct w83781d_data *w83781d_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct w83781d_data *data = i2c_get_clientdata(client);
             int i;
     
    @@ -1782,6 +1735,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init
    diff -Nru a/drivers/i2c/chips/w83l785ts.c b/drivers/i2c/chips/w83l785ts.c
    --- a/drivers/i2c/chips/w83l785ts.c Mon Mar 15 14:34:33 2004
    +++ b/drivers/i2c/chips/w83l785ts.c Mon Mar 15 14:34:33 2004
    @@ -89,7 +89,7 @@
             int kind);
     static int w83l785ts_detach_client(struct i2c_client *client);
     static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval);
    -static void w83l785ts_update_client(struct i2c_client *client);
    +static struct w83l785ts_data *w83l785ts_update_device(struct device *dev);
     
     /*
      * Driver data (common to all clients)
    @@ -130,17 +130,13 @@
     
     static ssize_t show_temp(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83l785ts_data *data = i2c_get_clientdata(client);
    - w83l785ts_update_client(client);
    + struct w83l785ts_data *data = w83l785ts_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
     }
     
     static ssize_t show_temp_over(struct device *dev, char *buf)
     {
    - struct i2c_client *client = to_i2c_client(dev);
    - struct w83l785ts_data *data = i2c_get_clientdata(client);
    - w83l785ts_update_client(client);
    + struct w83l785ts_data *data = w83l785ts_update_device(dev);
             return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
     }
     
    @@ -304,8 +300,9 @@
             return defval;
     }
     
    -static void w83l785ts_update_client(struct i2c_client *client)
    +static struct w83l785ts_data *w83l785ts_update_device(struct device *dev)
     {
    + struct i2c_client *client = to_i2c_client(dev);
             struct w83l785ts_data *data = i2c_get_clientdata(client);
     
             down(&data->update_lock);
    @@ -324,6 +321,8 @@
             }
     
             up(&data->update_lock);
    +
    + return data;
     }
     
     static int __init sensors_w83l785ts_init(void)

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Greg KH: "Re: [PATCH] i2c driver fixes for 2.6.4"

    Relevant Pages