summaryrefslogtreecommitdiff
path: root/drivers/hwmon/w83795.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2010-10-28 20:31:47 +0200
committerJean Delvare <khali@endymion.delvare>2010-10-28 20:31:47 +0200
commitc1a792a6eea42d88a99e6ace215b22fbdb76c7b6 (patch)
tree92c6f630e7044fdd65100326ed0489a6cc1f5b0a /drivers/hwmon/w83795.c
parent02728ffef9c2cf067e654e832b8c282a8a4d0b16 (diff)
downloadlinux-3.10-c1a792a6eea42d88a99e6ace215b22fbdb76c7b6.tar.gz
linux-3.10-c1a792a6eea42d88a99e6ace215b22fbdb76c7b6.tar.bz2
linux-3.10-c1a792a6eea42d88a99e6ace215b22fbdb76c7b6.zip
hwmon: (w83795) Avoid reading the same register twice
Shorten driver load time by avoiding duplicate register access during initialization. This saves 112 ms on modprobe on my test system. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon/w83795.c')
-rw-r--r--drivers/hwmon/w83795.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c
index fd70a7b4629..aea3275f5da 100644
--- a/drivers/hwmon/w83795.c
+++ b/drivers/hwmon/w83795.c
@@ -1986,6 +1986,9 @@ static int w83795_probe(struct i2c_client *client,
data->in[i][IN_READ] = tmp;
}
for (i = 0; i < IN_LSB_REG_NUM; i++) {
+ if ((i == 2 && data->chip_type == w83795adg) ||
+ (i >= 4 && !(data->has_in & (1 << (i + 11)))))
+ continue;
data->in_lsb[i][IN_MAX] =
w83795_read(client, IN_LSB_REG(i, IN_MAX));
data->in_lsb[i][IN_LOW] =
@@ -1995,13 +1998,17 @@ static int w83795_probe(struct i2c_client *client,
/* First update fan and limits */
for (i = 0; i < ARRAY_SIZE(data->fan); i++) {
+ /* Each register contains LSB for 2 fans, but we want to
+ * read it only once to save time */
+ if ((i & 1) == 0 && (data->has_fan & (3 << i)))
+ tmp = w83795_read(client, W83795_REG_FAN_MIN_LSB(i));
+
if (!(data->has_fan & (1 << i)))
continue;
data->fan_min[i] =
w83795_read(client, W83795_REG_FAN_MIN_HL(i)) << 4;
data->fan_min[i] |=
- (w83795_read(client, W83795_REG_FAN_MIN_LSB(i)) >>
- W83795_REG_FAN_MIN_LSB_SHIFT(i)) & 0x0F;
+ (tmp >> W83795_REG_FAN_MIN_LSB_SHIFT(i)) & 0x0F;
data->fan[i] = w83795_read(client, W83795_REG_FAN(i)) << 4;
data->fan[i] |=
(w83795_read(client, W83795_REG_VRLSB) >> 4) & 0x0F;