aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/w83795.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2010-10-28 14:31:48 -0400
committerJean Delvare <khali@endymion.delvare>2010-10-28 14:31:48 -0400
commit1bb3450ce5050bc677c1995a60a0ddfe9e33e7b6 (patch)
treebb4a0fcaaf4647cb791d1bcc00cde8fc9a52ba3d /drivers/hwmon/w83795.c
parent2ae61de90545fe3dadae8119181c430d89a8627b (diff)
hwmon: (w83795) Delay reading pwm config registers
Wait until we need the pwm config register values, instead of pre-reading them. This saves over 1 second on modprobe on my test system. Obviously this time is added when first accessing pwm config attributes, however not everybody will use them, so it seems unfair to slow down driver loading (and thus boot) for an optional feature. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon/w83795.c')
-rw-r--r--drivers/hwmon/w83795.c51
1 files changed, 29 insertions, 22 deletions
diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c
index 6464a52b134b..78a876f35fa3 100644
--- a/drivers/hwmon/w83795.c
+++ b/drivers/hwmon/w83795.c
@@ -372,6 +372,7 @@ struct w83795_data {
372 372
373 char valid; 373 char valid;
374 char valid_limits; 374 char valid_limits;
375 char valid_pwm_config;
375}; 376};
376 377
377/* 378/*
@@ -503,11 +504,17 @@ static void w83795_update_limits(struct i2c_client *client)
503 data->valid_limits = 1; 504 data->valid_limits = 1;
504} 505}
505 506
506static void w83795_update_pwm_config(struct i2c_client *client) 507static struct w83795_data *w83795_update_pwm_config(struct device *dev)
507{ 508{
509 struct i2c_client *client = to_i2c_client(dev);
508 struct w83795_data *data = i2c_get_clientdata(client); 510 struct w83795_data *data = i2c_get_clientdata(client);
509 int i, tmp; 511 int i, tmp;
510 512
513 mutex_lock(&data->update_lock);
514
515 if (data->valid_pwm_config)
516 goto END;
517
511 /* Read temperature source selection */ 518 /* Read temperature source selection */
512 for (i = 0; i < ARRAY_SIZE(data->temp_src); i++) 519 for (i = 0; i < ARRAY_SIZE(data->temp_src); i++)
513 data->temp_src[i] = w83795_read(client, W83795_REG_TSS(i)); 520 data->temp_src[i] = w83795_read(client, W83795_REG_TSS(i));
@@ -556,6 +563,12 @@ static void w83795_update_pwm_config(struct i2c_client *client)
556 for (i = 0; i < ARRAY_SIZE(data->setup_pwm); i++) 563 for (i = 0; i < ARRAY_SIZE(data->setup_pwm); i++)
557 data->setup_pwm[i] = 564 data->setup_pwm[i] =
558 w83795_read(client, W83795_REG_SETUP_PWM(i)); 565 w83795_read(client, W83795_REG_SETUP_PWM(i));
566
567 data->valid_pwm_config = 1;
568
569END:
570 mutex_unlock(&data->update_lock);
571 return data;
559} 572}
560 573
561static struct w83795_data *w83795_update_device(struct device *dev) 574static struct w83795_data *w83795_update_device(struct device *dev)
@@ -775,13 +788,16 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
775static ssize_t 788static ssize_t
776show_pwm(struct device *dev, struct device_attribute *attr, char *buf) 789show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
777{ 790{
778 struct w83795_data *data = w83795_update_device(dev); 791 struct w83795_data *data;
779 struct sensor_device_attribute_2 *sensor_attr = 792 struct sensor_device_attribute_2 *sensor_attr =
780 to_sensor_dev_attr_2(attr); 793 to_sensor_dev_attr_2(attr);
781 int nr = sensor_attr->nr; 794 int nr = sensor_attr->nr;
782 int index = sensor_attr->index; 795 int index = sensor_attr->index;
783 unsigned int val; 796 unsigned int val;
784 797
798 data = nr == PWM_OUTPUT ? w83795_update_device(dev)
799 : w83795_update_pwm_config(dev);
800
785 switch (nr) { 801 switch (nr) {
786 case PWM_STOP_TIME: 802 case PWM_STOP_TIME:
787 val = time_from_reg(data->pwm[index][nr]); 803 val = time_from_reg(data->pwm[index][nr]);
@@ -835,8 +851,7 @@ show_pwm_enable(struct device *dev, struct device_attribute *attr, char *buf)
835{ 851{
836 struct sensor_device_attribute_2 *sensor_attr = 852 struct sensor_device_attribute_2 *sensor_attr =
837 to_sensor_dev_attr_2(attr); 853 to_sensor_dev_attr_2(attr);
838 struct i2c_client *client = to_i2c_client(dev); 854 struct w83795_data *data = w83795_update_pwm_config(dev);
839 struct w83795_data *data = i2c_get_clientdata(client);
840 int index = sensor_attr->index; 855 int index = sensor_attr->index;
841 u8 tmp; 856 u8 tmp;
842 857
@@ -864,7 +879,7 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr,
864 const char *buf, size_t count) 879 const char *buf, size_t count)
865{ 880{
866 struct i2c_client *client = to_i2c_client(dev); 881 struct i2c_client *client = to_i2c_client(dev);
867 struct w83795_data *data = i2c_get_clientdata(client); 882 struct w83795_data *data = w83795_update_pwm_config(dev);
868 struct sensor_device_attribute_2 *sensor_attr = 883 struct sensor_device_attribute_2 *sensor_attr =
869 to_sensor_dev_attr_2(attr); 884 to_sensor_dev_attr_2(attr);
870 int index = sensor_attr->index; 885 int index = sensor_attr->index;
@@ -905,8 +920,7 @@ show_temp_src(struct device *dev, struct device_attribute *attr, char *buf)
905{ 920{
906 struct sensor_device_attribute_2 *sensor_attr = 921 struct sensor_device_attribute_2 *sensor_attr =
907 to_sensor_dev_attr_2(attr); 922 to_sensor_dev_attr_2(attr);
908 struct i2c_client *client = to_i2c_client(dev); 923 struct w83795_data *data = w83795_update_pwm_config(dev);
909 struct w83795_data *data = i2c_get_clientdata(client);
910 int index = sensor_attr->index; 924 int index = sensor_attr->index;
911 u8 val = index / 2; 925 u8 val = index / 2;
912 u8 tmp = data->temp_src[val]; 926 u8 tmp = data->temp_src[val];
@@ -926,7 +940,7 @@ store_temp_src(struct device *dev, struct device_attribute *attr,
926 const char *buf, size_t count) 940 const char *buf, size_t count)
927{ 941{
928 struct i2c_client *client = to_i2c_client(dev); 942 struct i2c_client *client = to_i2c_client(dev);
929 struct w83795_data *data = i2c_get_clientdata(client); 943 struct w83795_data *data = w83795_update_pwm_config(dev);
930 struct sensor_device_attribute_2 *sensor_attr = 944 struct sensor_device_attribute_2 *sensor_attr =
931 to_sensor_dev_attr_2(attr); 945 to_sensor_dev_attr_2(attr);
932 int index = sensor_attr->index; 946 int index = sensor_attr->index;
@@ -957,8 +971,7 @@ static ssize_t
957show_temp_pwm_enable(struct device *dev, struct device_attribute *attr, 971show_temp_pwm_enable(struct device *dev, struct device_attribute *attr,
958 char *buf) 972 char *buf)
959{ 973{
960 struct i2c_client *client = to_i2c_client(dev); 974 struct w83795_data *data = w83795_update_pwm_config(dev);
961 struct w83795_data *data = i2c_get_clientdata(client);
962 struct sensor_device_attribute_2 *sensor_attr = 975 struct sensor_device_attribute_2 *sensor_attr =
963 to_sensor_dev_attr_2(attr); 976 to_sensor_dev_attr_2(attr);
964 int nr = sensor_attr->nr; 977 int nr = sensor_attr->nr;
@@ -986,7 +999,7 @@ store_temp_pwm_enable(struct device *dev, struct device_attribute *attr,
986 const char *buf, size_t count) 999 const char *buf, size_t count)
987{ 1000{
988 struct i2c_client *client = to_i2c_client(dev); 1001 struct i2c_client *client = to_i2c_client(dev);
989 struct w83795_data *data = i2c_get_clientdata(client); 1002 struct w83795_data *data = w83795_update_pwm_config(dev);
990 struct sensor_device_attribute_2 *sensor_attr = 1003 struct sensor_device_attribute_2 *sensor_attr =
991 to_sensor_dev_attr_2(attr); 1004 to_sensor_dev_attr_2(attr);
992 int nr = sensor_attr->nr; 1005 int nr = sensor_attr->nr;
@@ -1023,8 +1036,7 @@ store_temp_pwm_enable(struct device *dev, struct device_attribute *attr,
1023static ssize_t 1036static ssize_t
1024show_fanin(struct device *dev, struct device_attribute *attr, char *buf) 1037show_fanin(struct device *dev, struct device_attribute *attr, char *buf)
1025{ 1038{
1026 struct i2c_client *client = to_i2c_client(dev); 1039 struct w83795_data *data = w83795_update_pwm_config(dev);
1027 struct w83795_data *data = i2c_get_clientdata(client);
1028 struct sensor_device_attribute_2 *sensor_attr = 1040 struct sensor_device_attribute_2 *sensor_attr =
1029 to_sensor_dev_attr_2(attr); 1041 to_sensor_dev_attr_2(attr);
1030 int nr = sensor_attr->nr; 1042 int nr = sensor_attr->nr;
@@ -1081,8 +1093,7 @@ store_fanin(struct device *dev, struct device_attribute *attr,
1081static ssize_t 1093static ssize_t
1082show_temp_pwm(struct device *dev, struct device_attribute *attr, char *buf) 1094show_temp_pwm(struct device *dev, struct device_attribute *attr, char *buf)
1083{ 1095{
1084 struct i2c_client *client = to_i2c_client(dev); 1096 struct w83795_data *data = w83795_update_pwm_config(dev);
1085 struct w83795_data *data = i2c_get_clientdata(client);
1086 struct sensor_device_attribute_2 *sensor_attr = 1097 struct sensor_device_attribute_2 *sensor_attr =
1087 to_sensor_dev_attr_2(attr); 1098 to_sensor_dev_attr_2(attr);
1088 int nr = sensor_attr->nr; 1099 int nr = sensor_attr->nr;
@@ -1143,8 +1154,7 @@ store_temp_pwm(struct device *dev, struct device_attribute *attr,
1143static ssize_t 1154static ssize_t
1144show_sf4_pwm(struct device *dev, struct device_attribute *attr, char *buf) 1155show_sf4_pwm(struct device *dev, struct device_attribute *attr, char *buf)
1145{ 1156{
1146 struct i2c_client *client = to_i2c_client(dev); 1157 struct w83795_data *data = w83795_update_pwm_config(dev);
1147 struct w83795_data *data = i2c_get_clientdata(client);
1148 struct sensor_device_attribute_2 *sensor_attr = 1158 struct sensor_device_attribute_2 *sensor_attr =
1149 to_sensor_dev_attr_2(attr); 1159 to_sensor_dev_attr_2(attr);
1150 int nr = sensor_attr->nr; 1160 int nr = sensor_attr->nr;
@@ -1179,8 +1189,7 @@ store_sf4_pwm(struct device *dev, struct device_attribute *attr,
1179static ssize_t 1189static ssize_t
1180show_sf4_temp(struct device *dev, struct device_attribute *attr, char *buf) 1190show_sf4_temp(struct device *dev, struct device_attribute *attr, char *buf)
1181{ 1191{
1182 struct i2c_client *client = to_i2c_client(dev); 1192 struct w83795_data *data = w83795_update_pwm_config(dev);
1183 struct w83795_data *data = i2c_get_clientdata(client);
1184 struct sensor_device_attribute_2 *sensor_attr = 1193 struct sensor_device_attribute_2 *sensor_attr =
1185 to_sensor_dev_attr_2(attr); 1194 to_sensor_dev_attr_2(attr);
1186 int nr = sensor_attr->nr; 1195 int nr = sensor_attr->nr;
@@ -1456,8 +1465,7 @@ show_sf_setup(struct device *dev, struct device_attribute *attr, char *buf)
1456 struct sensor_device_attribute_2 *sensor_attr = 1465 struct sensor_device_attribute_2 *sensor_attr =
1457 to_sensor_dev_attr_2(attr); 1466 to_sensor_dev_attr_2(attr);
1458 int nr = sensor_attr->nr; 1467 int nr = sensor_attr->nr;
1459 struct i2c_client *client = to_i2c_client(dev); 1468 struct w83795_data *data = w83795_update_pwm_config(dev);
1460 struct w83795_data *data = i2c_get_clientdata(client);
1461 u16 val = data->setup_pwm[nr]; 1469 u16 val = data->setup_pwm[nr];
1462 1470
1463 switch (nr) { 1471 switch (nr) {
@@ -2029,7 +2037,6 @@ static int w83795_probe(struct i2c_client *client,
2029 data->has_pwm = 8; 2037 data->has_pwm = 8;
2030 else 2038 else
2031 data->has_pwm = 2; 2039 data->has_pwm = 2;
2032 w83795_update_pwm_config(client);
2033 2040
2034 err = w83795_handle_files(dev, device_create_file); 2041 err = w83795_handle_files(dev, device_create_file);
2035 if (err) 2042 if (err)