diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-07-03 09:56:33 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2014-08-04 10:01:37 -0400 |
commit | 278ee1c840fcf32f156fd876efcc3780bc580f6c (patch) | |
tree | d4f0790e08dc9cfb28bd6efa5d61843cee82e083 /drivers/hwmon | |
parent | b591d3c1964e7cba6582eb22c7033d37c31a4e99 (diff) |
hwmon: (adm1031) Avoid forward declaration
Reorder functions to avoid forward declaration.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/adm1031.c | 286 |
1 files changed, 138 insertions, 148 deletions
diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c index 51c1a5a165ab..9f3cb80a17c7 100644 --- a/drivers/hwmon/adm1031.c +++ b/drivers/hwmon/adm1031.c | |||
@@ -105,34 +105,6 @@ struct adm1031_data { | |||
105 | s8 temp_crit[3]; | 105 | s8 temp_crit[3]; |
106 | }; | 106 | }; |
107 | 107 | ||
108 | static int adm1031_probe(struct i2c_client *client, | ||
109 | const struct i2c_device_id *id); | ||
110 | static int adm1031_detect(struct i2c_client *client, | ||
111 | struct i2c_board_info *info); | ||
112 | static void adm1031_init_client(struct i2c_client *client); | ||
113 | static int adm1031_remove(struct i2c_client *client); | ||
114 | static struct adm1031_data *adm1031_update_device(struct device *dev); | ||
115 | |||
116 | static const struct i2c_device_id adm1031_id[] = { | ||
117 | { "adm1030", adm1030 }, | ||
118 | { "adm1031", adm1031 }, | ||
119 | { } | ||
120 | }; | ||
121 | MODULE_DEVICE_TABLE(i2c, adm1031_id); | ||
122 | |||
123 | /* This is the driver that will be inserted */ | ||
124 | static struct i2c_driver adm1031_driver = { | ||
125 | .class = I2C_CLASS_HWMON, | ||
126 | .driver = { | ||
127 | .name = "adm1031", | ||
128 | }, | ||
129 | .probe = adm1031_probe, | ||
130 | .remove = adm1031_remove, | ||
131 | .id_table = adm1031_id, | ||
132 | .detect = adm1031_detect, | ||
133 | .address_list = normal_i2c, | ||
134 | }; | ||
135 | |||
136 | static inline u8 adm1031_read_value(struct i2c_client *client, u8 reg) | 108 | static inline u8 adm1031_read_value(struct i2c_client *client, u8 reg) |
137 | { | 109 | { |
138 | return i2c_smbus_read_byte_data(client, reg); | 110 | return i2c_smbus_read_byte_data(client, reg); |
@@ -144,6 +116,96 @@ adm1031_write_value(struct i2c_client *client, u8 reg, unsigned int value) | |||
144 | return i2c_smbus_write_byte_data(client, reg, value); | 116 | return i2c_smbus_write_byte_data(client, reg, value); |
145 | } | 117 | } |
146 | 118 | ||
119 | static struct adm1031_data *adm1031_update_device(struct device *dev) | ||
120 | { | ||
121 | struct i2c_client *client = to_i2c_client(dev); | ||
122 | struct adm1031_data *data = i2c_get_clientdata(client); | ||
123 | unsigned long next_update; | ||
124 | int chan; | ||
125 | |||
126 | mutex_lock(&data->update_lock); | ||
127 | |||
128 | next_update = data->last_updated | ||
129 | + msecs_to_jiffies(data->update_interval); | ||
130 | if (time_after(jiffies, next_update) || !data->valid) { | ||
131 | |||
132 | dev_dbg(&client->dev, "Starting adm1031 update\n"); | ||
133 | for (chan = 0; | ||
134 | chan < ((data->chip_type == adm1031) ? 3 : 2); chan++) { | ||
135 | u8 oldh, newh; | ||
136 | |||
137 | oldh = | ||
138 | adm1031_read_value(client, ADM1031_REG_TEMP(chan)); | ||
139 | data->ext_temp[chan] = | ||
140 | adm1031_read_value(client, ADM1031_REG_EXT_TEMP); | ||
141 | newh = | ||
142 | adm1031_read_value(client, ADM1031_REG_TEMP(chan)); | ||
143 | if (newh != oldh) { | ||
144 | data->ext_temp[chan] = | ||
145 | adm1031_read_value(client, | ||
146 | ADM1031_REG_EXT_TEMP); | ||
147 | #ifdef DEBUG | ||
148 | oldh = | ||
149 | adm1031_read_value(client, | ||
150 | ADM1031_REG_TEMP(chan)); | ||
151 | |||
152 | /* oldh is actually newer */ | ||
153 | if (newh != oldh) | ||
154 | dev_warn(&client->dev, | ||
155 | "Remote temperature may be wrong.\n"); | ||
156 | #endif | ||
157 | } | ||
158 | data->temp[chan] = newh; | ||
159 | |||
160 | data->temp_offset[chan] = | ||
161 | adm1031_read_value(client, | ||
162 | ADM1031_REG_TEMP_OFFSET(chan)); | ||
163 | data->temp_min[chan] = | ||
164 | adm1031_read_value(client, | ||
165 | ADM1031_REG_TEMP_MIN(chan)); | ||
166 | data->temp_max[chan] = | ||
167 | adm1031_read_value(client, | ||
168 | ADM1031_REG_TEMP_MAX(chan)); | ||
169 | data->temp_crit[chan] = | ||
170 | adm1031_read_value(client, | ||
171 | ADM1031_REG_TEMP_CRIT(chan)); | ||
172 | data->auto_temp[chan] = | ||
173 | adm1031_read_value(client, | ||
174 | ADM1031_REG_AUTO_TEMP(chan)); | ||
175 | |||
176 | } | ||
177 | |||
178 | data->conf1 = adm1031_read_value(client, ADM1031_REG_CONF1); | ||
179 | data->conf2 = adm1031_read_value(client, ADM1031_REG_CONF2); | ||
180 | |||
181 | data->alarm = adm1031_read_value(client, ADM1031_REG_STATUS(0)) | ||
182 | | (adm1031_read_value(client, ADM1031_REG_STATUS(1)) << 8); | ||
183 | if (data->chip_type == adm1030) | ||
184 | data->alarm &= 0xc0ff; | ||
185 | |||
186 | for (chan = 0; chan < (data->chip_type == adm1030 ? 1 : 2); | ||
187 | chan++) { | ||
188 | data->fan_div[chan] = | ||
189 | adm1031_read_value(client, | ||
190 | ADM1031_REG_FAN_DIV(chan)); | ||
191 | data->fan_min[chan] = | ||
192 | adm1031_read_value(client, | ||
193 | ADM1031_REG_FAN_MIN(chan)); | ||
194 | data->fan[chan] = | ||
195 | adm1031_read_value(client, | ||
196 | ADM1031_REG_FAN_SPEED(chan)); | ||
197 | data->pwm[chan] = | ||
198 | (adm1031_read_value(client, | ||
199 | ADM1031_REG_PWM) >> (4 * chan)) & 0x0f; | ||
200 | } | ||
201 | data->last_updated = jiffies; | ||
202 | data->valid = 1; | ||
203 | } | ||
204 | |||
205 | mutex_unlock(&data->update_lock); | ||
206 | |||
207 | return data; | ||
208 | } | ||
147 | 209 | ||
148 | #define TEMP_TO_REG(val) (((val) < 0 ? ((val - 500) / 1000) : \ | 210 | #define TEMP_TO_REG(val) (((val) < 0 ? ((val - 500) / 1000) : \ |
149 | ((val + 500) / 1000))) | 211 | ((val + 500) / 1000))) |
@@ -950,6 +1012,37 @@ static int adm1031_detect(struct i2c_client *client, | |||
950 | return 0; | 1012 | return 0; |
951 | } | 1013 | } |
952 | 1014 | ||
1015 | static void adm1031_init_client(struct i2c_client *client) | ||
1016 | { | ||
1017 | unsigned int read_val; | ||
1018 | unsigned int mask; | ||
1019 | int i; | ||
1020 | struct adm1031_data *data = i2c_get_clientdata(client); | ||
1021 | |||
1022 | mask = (ADM1031_CONF2_PWM1_ENABLE | ADM1031_CONF2_TACH1_ENABLE); | ||
1023 | if (data->chip_type == adm1031) { | ||
1024 | mask |= (ADM1031_CONF2_PWM2_ENABLE | | ||
1025 | ADM1031_CONF2_TACH2_ENABLE); | ||
1026 | } | ||
1027 | /* Initialize the ADM1031 chip (enables fan speed reading ) */ | ||
1028 | read_val = adm1031_read_value(client, ADM1031_REG_CONF2); | ||
1029 | if ((read_val | mask) != read_val) | ||
1030 | adm1031_write_value(client, ADM1031_REG_CONF2, read_val | mask); | ||
1031 | |||
1032 | read_val = adm1031_read_value(client, ADM1031_REG_CONF1); | ||
1033 | if ((read_val | ADM1031_CONF1_MONITOR_ENABLE) != read_val) { | ||
1034 | adm1031_write_value(client, ADM1031_REG_CONF1, | ||
1035 | read_val | ADM1031_CONF1_MONITOR_ENABLE); | ||
1036 | } | ||
1037 | |||
1038 | /* Read the chip's update rate */ | ||
1039 | mask = ADM1031_UPDATE_RATE_MASK; | ||
1040 | read_val = adm1031_read_value(client, ADM1031_REG_FAN_FILTER); | ||
1041 | i = (read_val & mask) >> ADM1031_UPDATE_RATE_SHIFT; | ||
1042 | /* Save it as update interval */ | ||
1043 | data->update_interval = update_intervals[i]; | ||
1044 | } | ||
1045 | |||
953 | static int adm1031_probe(struct i2c_client *client, | 1046 | static int adm1031_probe(struct i2c_client *client, |
954 | const struct i2c_device_id *id) | 1047 | const struct i2c_device_id *id) |
955 | { | 1048 | { |
@@ -1008,127 +1101,24 @@ static int adm1031_remove(struct i2c_client *client) | |||
1008 | return 0; | 1101 | return 0; |
1009 | } | 1102 | } |
1010 | 1103 | ||
1011 | static void adm1031_init_client(struct i2c_client *client) | 1104 | static const struct i2c_device_id adm1031_id[] = { |
1012 | { | 1105 | { "adm1030", adm1030 }, |
1013 | unsigned int read_val; | 1106 | { "adm1031", adm1031 }, |
1014 | unsigned int mask; | 1107 | { } |
1015 | int i; | 1108 | }; |
1016 | struct adm1031_data *data = i2c_get_clientdata(client); | 1109 | MODULE_DEVICE_TABLE(i2c, adm1031_id); |
1017 | |||
1018 | mask = (ADM1031_CONF2_PWM1_ENABLE | ADM1031_CONF2_TACH1_ENABLE); | ||
1019 | if (data->chip_type == adm1031) { | ||
1020 | mask |= (ADM1031_CONF2_PWM2_ENABLE | | ||
1021 | ADM1031_CONF2_TACH2_ENABLE); | ||
1022 | } | ||
1023 | /* Initialize the ADM1031 chip (enables fan speed reading ) */ | ||
1024 | read_val = adm1031_read_value(client, ADM1031_REG_CONF2); | ||
1025 | if ((read_val | mask) != read_val) | ||
1026 | adm1031_write_value(client, ADM1031_REG_CONF2, read_val | mask); | ||
1027 | |||
1028 | read_val = adm1031_read_value(client, ADM1031_REG_CONF1); | ||
1029 | if ((read_val | ADM1031_CONF1_MONITOR_ENABLE) != read_val) { | ||
1030 | adm1031_write_value(client, ADM1031_REG_CONF1, | ||
1031 | read_val | ADM1031_CONF1_MONITOR_ENABLE); | ||
1032 | } | ||
1033 | |||
1034 | /* Read the chip's update rate */ | ||
1035 | mask = ADM1031_UPDATE_RATE_MASK; | ||
1036 | read_val = adm1031_read_value(client, ADM1031_REG_FAN_FILTER); | ||
1037 | i = (read_val & mask) >> ADM1031_UPDATE_RATE_SHIFT; | ||
1038 | /* Save it as update interval */ | ||
1039 | data->update_interval = update_intervals[i]; | ||
1040 | } | ||
1041 | |||
1042 | static struct adm1031_data *adm1031_update_device(struct device *dev) | ||
1043 | { | ||
1044 | struct i2c_client *client = to_i2c_client(dev); | ||
1045 | struct adm1031_data *data = i2c_get_clientdata(client); | ||
1046 | unsigned long next_update; | ||
1047 | int chan; | ||
1048 | |||
1049 | mutex_lock(&data->update_lock); | ||
1050 | |||
1051 | next_update = data->last_updated | ||
1052 | + msecs_to_jiffies(data->update_interval); | ||
1053 | if (time_after(jiffies, next_update) || !data->valid) { | ||
1054 | |||
1055 | dev_dbg(&client->dev, "Starting adm1031 update\n"); | ||
1056 | for (chan = 0; | ||
1057 | chan < ((data->chip_type == adm1031) ? 3 : 2); chan++) { | ||
1058 | u8 oldh, newh; | ||
1059 | |||
1060 | oldh = | ||
1061 | adm1031_read_value(client, ADM1031_REG_TEMP(chan)); | ||
1062 | data->ext_temp[chan] = | ||
1063 | adm1031_read_value(client, ADM1031_REG_EXT_TEMP); | ||
1064 | newh = | ||
1065 | adm1031_read_value(client, ADM1031_REG_TEMP(chan)); | ||
1066 | if (newh != oldh) { | ||
1067 | data->ext_temp[chan] = | ||
1068 | adm1031_read_value(client, | ||
1069 | ADM1031_REG_EXT_TEMP); | ||
1070 | #ifdef DEBUG | ||
1071 | oldh = | ||
1072 | adm1031_read_value(client, | ||
1073 | ADM1031_REG_TEMP(chan)); | ||
1074 | |||
1075 | /* oldh is actually newer */ | ||
1076 | if (newh != oldh) | ||
1077 | dev_warn(&client->dev, | ||
1078 | "Remote temperature may be wrong.\n"); | ||
1079 | #endif | ||
1080 | } | ||
1081 | data->temp[chan] = newh; | ||
1082 | |||
1083 | data->temp_offset[chan] = | ||
1084 | adm1031_read_value(client, | ||
1085 | ADM1031_REG_TEMP_OFFSET(chan)); | ||
1086 | data->temp_min[chan] = | ||
1087 | adm1031_read_value(client, | ||
1088 | ADM1031_REG_TEMP_MIN(chan)); | ||
1089 | data->temp_max[chan] = | ||
1090 | adm1031_read_value(client, | ||
1091 | ADM1031_REG_TEMP_MAX(chan)); | ||
1092 | data->temp_crit[chan] = | ||
1093 | adm1031_read_value(client, | ||
1094 | ADM1031_REG_TEMP_CRIT(chan)); | ||
1095 | data->auto_temp[chan] = | ||
1096 | adm1031_read_value(client, | ||
1097 | ADM1031_REG_AUTO_TEMP(chan)); | ||
1098 | |||
1099 | } | ||
1100 | |||
1101 | data->conf1 = adm1031_read_value(client, ADM1031_REG_CONF1); | ||
1102 | data->conf2 = adm1031_read_value(client, ADM1031_REG_CONF2); | ||
1103 | |||
1104 | data->alarm = adm1031_read_value(client, ADM1031_REG_STATUS(0)) | ||
1105 | | (adm1031_read_value(client, ADM1031_REG_STATUS(1)) << 8); | ||
1106 | if (data->chip_type == adm1030) | ||
1107 | data->alarm &= 0xc0ff; | ||
1108 | |||
1109 | for (chan = 0; chan < (data->chip_type == adm1030 ? 1 : 2); | ||
1110 | chan++) { | ||
1111 | data->fan_div[chan] = | ||
1112 | adm1031_read_value(client, | ||
1113 | ADM1031_REG_FAN_DIV(chan)); | ||
1114 | data->fan_min[chan] = | ||
1115 | adm1031_read_value(client, | ||
1116 | ADM1031_REG_FAN_MIN(chan)); | ||
1117 | data->fan[chan] = | ||
1118 | adm1031_read_value(client, | ||
1119 | ADM1031_REG_FAN_SPEED(chan)); | ||
1120 | data->pwm[chan] = | ||
1121 | (adm1031_read_value(client, | ||
1122 | ADM1031_REG_PWM) >> (4 * chan)) & 0x0f; | ||
1123 | } | ||
1124 | data->last_updated = jiffies; | ||
1125 | data->valid = 1; | ||
1126 | } | ||
1127 | |||
1128 | mutex_unlock(&data->update_lock); | ||
1129 | 1110 | ||
1130 | return data; | 1111 | static struct i2c_driver adm1031_driver = { |
1131 | } | 1112 | .class = I2C_CLASS_HWMON, |
1113 | .driver = { | ||
1114 | .name = "adm1031", | ||
1115 | }, | ||
1116 | .probe = adm1031_probe, | ||
1117 | .remove = adm1031_remove, | ||
1118 | .id_table = adm1031_id, | ||
1119 | .detect = adm1031_detect, | ||
1120 | .address_list = normal_i2c, | ||
1121 | }; | ||
1132 | 1122 | ||
1133 | module_i2c_driver(adm1031_driver); | 1123 | module_i2c_driver(adm1031_driver); |
1134 | 1124 | ||