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)