Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: add support for adt7470

New driver to expose temperature and fan controls attached to Analog
Devices ADT7470 hwmon chips.

Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

authored by

Darrick J. Wong and committed by
Mark M. Hoffman
6f9703d0 8afb1049

+1061
+10
drivers/hwmon/Kconfig
··· 133 133 This driver can also be built as a module. If so, the module 134 134 will be called adm9240. 135 135 136 + config SENSORS_ADT7470 137 + tristate "Analog Devices ADT7470" 138 + depends on I2C && EXPERIMENTAL 139 + help 140 + If you say yes here you get support for the Analog Devices 141 + ADT7470 temperature monitoring chips. 142 + 143 + This driver can also be built as a module. If so, the module 144 + will be called adt7470. 145 + 136 146 config SENSORS_K8TEMP 137 147 tristate "AMD Athlon64/FX or Opteron temperature sensor" 138 148 depends on X86 && PCI && EXPERIMENTAL
+1
drivers/hwmon/Makefile
··· 22 22 obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o 23 23 obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o 24 24 obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o 25 + obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o 25 26 obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o 26 27 obj-$(CONFIG_SENSORS_AMS) += ams/ 27 28 obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
+1050
drivers/hwmon/adt7470.c
··· 1 + /* 2 + * A hwmon driver for the Analog Devices ADT7470 3 + * Copyright (C) 2007 IBM 4 + * 5 + * Author: Darrick J. Wong <djwong@us.ibm.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + 22 + #include <linux/module.h> 23 + #include <linux/jiffies.h> 24 + #include <linux/i2c.h> 25 + #include <linux/hwmon.h> 26 + #include <linux/hwmon-sysfs.h> 27 + #include <linux/err.h> 28 + #include <linux/mutex.h> 29 + #include <linux/delay.h> 30 + #include <linux/log2.h> 31 + 32 + /* Addresses to scan */ 33 + static unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END }; 34 + 35 + /* Insmod parameters */ 36 + I2C_CLIENT_INSMOD_1(adt7470); 37 + 38 + /* ADT7470 registers */ 39 + #define ADT7470_REG_BASE_ADDR 0x20 40 + #define ADT7470_REG_TEMP_BASE_ADDR 0x20 41 + #define ADT7470_REG_TEMP_MAX_ADDR 0x29 42 + #define ADT7470_REG_FAN_BASE_ADDR 0x2A 43 + #define ADT7470_REG_FAN_MAX_ADDR 0x31 44 + #define ADT7470_REG_PWM_BASE_ADDR 0x32 45 + #define ADT7470_REG_PWM_MAX_ADDR 0x35 46 + #define ADT7470_REG_PWM_MAX_BASE_ADDR 0x38 47 + #define ADT7470_REG_PWM_MAX_MAX_ADDR 0x3B 48 + #define ADT7470_REG_CFG 0x40 49 + #define ADT7470_FSPD_MASK 0x04 50 + #define ADT7470_REG_ALARM1 0x41 51 + #define ADT7470_REG_ALARM2 0x42 52 + #define ADT7470_REG_TEMP_LIMITS_BASE_ADDR 0x44 53 + #define ADT7470_REG_TEMP_LIMITS_MAX_ADDR 0x57 54 + #define ADT7470_REG_FAN_MIN_BASE_ADDR 0x58 55 + #define ADT7470_REG_FAN_MIN_MAX_ADDR 0x5F 56 + #define ADT7470_REG_FAN_MAX_BASE_ADDR 0x60 57 + #define ADT7470_REG_FAN_MAX_MAX_ADDR 0x67 58 + #define ADT7470_REG_PWM_CFG_BASE_ADDR 0x68 59 + #define ADT7470_REG_PWM12_CFG 0x68 60 + #define ADT7470_PWM2_AUTO_MASK 0x40 61 + #define ADT7470_PWM1_AUTO_MASK 0x80 62 + #define ADT7470_REG_PWM34_CFG 0x69 63 + #define ADT7470_PWM3_AUTO_MASK 0x40 64 + #define ADT7470_PWM4_AUTO_MASK 0x80 65 + #define ADT7470_REG_PWM_MIN_BASE_ADDR 0x6A 66 + #define ADT7470_REG_PWM_MIN_MAX_ADDR 0x6D 67 + #define ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR 0x6E 68 + #define ADT7470_REG_PWM_TEMP_MIN_MAX_ADDR 0x71 69 + #define ADT7470_REG_ACOUSTICS12 0x75 70 + #define ADT7470_REG_ACOUSTICS34 0x76 71 + #define ADT7470_REG_DEVICE 0x3D 72 + #define ADT7470_REG_VENDOR 0x3E 73 + #define ADT7470_REG_REVISION 0x3F 74 + #define ADT7470_REG_ALARM1_MASK 0x72 75 + #define ADT7470_REG_ALARM2_MASK 0x73 76 + #define ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR 0x7C 77 + #define ADT7470_REG_PWM_AUTO_TEMP_MAX_ADDR 0x7D 78 + #define ADT7470_REG_MAX_ADDR 0x81 79 + 80 + #define ADT7470_TEMP_COUNT 10 81 + #define ADT7470_TEMP_REG(x) (ADT7470_REG_TEMP_BASE_ADDR + (x)) 82 + #define ADT7470_TEMP_MIN_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + ((x) * 2)) 83 + #define ADT7470_TEMP_MAX_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + \ 84 + ((x) * 2) + 1) 85 + 86 + #define ADT7470_FAN_COUNT 4 87 + #define ADT7470_REG_FAN(x) (ADT7470_REG_FAN_BASE_ADDR + ((x) * 2)) 88 + #define ADT7470_REG_FAN_MIN(x) (ADT7470_REG_FAN_MIN_BASE_ADDR + ((x) * 2)) 89 + #define ADT7470_REG_FAN_MAX(x) (ADT7470_REG_FAN_MAX_BASE_ADDR + ((x) * 2)) 90 + 91 + #define ADT7470_PWM_COUNT 4 92 + #define ADT7470_REG_PWM(x) (ADT7470_REG_PWM_BASE_ADDR + (x)) 93 + #define ADT7470_REG_PWM_MAX(x) (ADT7470_REG_PWM_MAX_BASE_ADDR + (x)) 94 + #define ADT7470_REG_PWM_MIN(x) (ADT7470_REG_PWM_MIN_BASE_ADDR + (x)) 95 + #define ADT7470_REG_PWM_TMIN(x) (ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR + (x)) 96 + #define ADT7470_REG_PWM_CFG(x) (ADT7470_REG_PWM_CFG_BASE_ADDR + ((x) / 2)) 97 + #define ADT7470_REG_PWM_AUTO_TEMP(x) (ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR + \ 98 + ((x) / 2)) 99 + 100 + #define ADT7470_VENDOR 0x41 101 + #define ADT7470_DEVICE 0x70 102 + /* datasheet only mentions a revision 2 */ 103 + #define ADT7470_REVISION 0x02 104 + 105 + /* "all temps" according to hwmon sysfs interface spec */ 106 + #define ADT7470_PWM_ALL_TEMPS 0x3FF 107 + 108 + /* How often do we reread sensors values? (In jiffies) */ 109 + #define SENSOR_REFRESH_INTERVAL (5 * HZ) 110 + 111 + /* How often do we reread sensor limit values? (In jiffies) */ 112 + #define LIMIT_REFRESH_INTERVAL (60 * HZ) 113 + 114 + /* sleep 1s while gathering temperature data */ 115 + #define TEMP_COLLECTION_TIME 1000 116 + 117 + #define power_of_2(x) (((x) & ((x) - 1)) == 0) 118 + 119 + /* datasheet says to divide this number by the fan reading to get fan rpm */ 120 + #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x)) 121 + #define FAN_RPM_TO_PERIOD FAN_PERIOD_TO_RPM 122 + #define FAN_PERIOD_INVALID 65535 123 + #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) 124 + 125 + struct adt7470_data { 126 + struct i2c_client client; 127 + struct class_device *class_dev; 128 + struct attribute_group attrs; 129 + struct mutex lock; 130 + char sensors_valid; 131 + char limits_valid; 132 + unsigned long sensors_last_updated; /* In jiffies */ 133 + unsigned long limits_last_updated; /* In jiffies */ 134 + 135 + s8 temp[ADT7470_TEMP_COUNT]; 136 + s8 temp_min[ADT7470_TEMP_COUNT]; 137 + s8 temp_max[ADT7470_TEMP_COUNT]; 138 + u16 fan[ADT7470_FAN_COUNT]; 139 + u16 fan_min[ADT7470_FAN_COUNT]; 140 + u16 fan_max[ADT7470_FAN_COUNT]; 141 + u16 alarms, alarms_mask; 142 + u8 force_pwm_max; 143 + u8 pwm[ADT7470_PWM_COUNT]; 144 + u8 pwm_max[ADT7470_PWM_COUNT]; 145 + u8 pwm_automatic[ADT7470_PWM_COUNT]; 146 + u8 pwm_min[ADT7470_PWM_COUNT]; 147 + s8 pwm_tmin[ADT7470_PWM_COUNT]; 148 + u8 pwm_auto_temp[ADT7470_PWM_COUNT]; 149 + }; 150 + 151 + static int adt7470_attach_adapter(struct i2c_adapter *adapter); 152 + static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind); 153 + static int adt7470_detach_client(struct i2c_client *client); 154 + 155 + static struct i2c_driver adt7470_driver = { 156 + .driver = { 157 + .name = "adt7470", 158 + }, 159 + .attach_adapter = adt7470_attach_adapter, 160 + .detach_client = adt7470_detach_client, 161 + }; 162 + 163 + /* 164 + * 16-bit registers on the ADT7470 are low-byte first. The data sheet says 165 + * that the low byte must be read before the high byte. 166 + */ 167 + static inline int adt7470_read_word_data(struct i2c_client *client, u8 reg) 168 + { 169 + u16 foo; 170 + foo = i2c_smbus_read_byte_data(client, reg); 171 + foo |= ((u16)i2c_smbus_read_byte_data(client, reg + 1) << 8); 172 + return foo; 173 + } 174 + 175 + static inline int adt7470_write_word_data(struct i2c_client *client, u8 reg, 176 + u16 value) 177 + { 178 + return i2c_smbus_write_byte_data(client, reg, value & 0xFF) 179 + && i2c_smbus_write_byte_data(client, reg + 1, value >> 8); 180 + } 181 + 182 + static void adt7470_init_client(struct i2c_client *client) 183 + { 184 + int reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 185 + 186 + if (reg < 0) { 187 + dev_err(&client->dev, "cannot read configuration register\n"); 188 + } else { 189 + /* start monitoring (and do a self-test) */ 190 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg | 3); 191 + } 192 + } 193 + 194 + static struct adt7470_data *adt7470_update_device(struct device *dev) 195 + { 196 + struct i2c_client *client = to_i2c_client(dev); 197 + struct adt7470_data *data = i2c_get_clientdata(client); 198 + unsigned long local_jiffies = jiffies; 199 + u8 cfg; 200 + int i; 201 + 202 + mutex_lock(&data->lock); 203 + if (time_before(local_jiffies, data->sensors_last_updated + 204 + SENSOR_REFRESH_INTERVAL) 205 + && data->sensors_valid) 206 + goto no_sensor_update; 207 + 208 + /* start reading temperature sensors */ 209 + cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 210 + cfg |= 0x80; 211 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); 212 + 213 + /* 214 + * Delay is 200ms * number of tmp05 sensors. Too bad 215 + * there's no way to figure out how many are connected. 216 + * For now, assume 1s will work. 217 + */ 218 + msleep(TEMP_COLLECTION_TIME); 219 + 220 + /* done reading temperature sensors */ 221 + cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 222 + cfg &= ~0x80; 223 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); 224 + 225 + for (i = 0; i < ADT7470_TEMP_COUNT; i++) 226 + data->temp[i] = i2c_smbus_read_byte_data(client, 227 + ADT7470_TEMP_REG(i)); 228 + 229 + for (i = 0; i < ADT7470_FAN_COUNT; i++) 230 + data->fan[i] = adt7470_read_word_data(client, 231 + ADT7470_REG_FAN(i)); 232 + 233 + for (i = 0; i < ADT7470_PWM_COUNT; i++) { 234 + int reg; 235 + int reg_mask; 236 + 237 + data->pwm[i] = i2c_smbus_read_byte_data(client, 238 + ADT7470_REG_PWM(i)); 239 + 240 + if (i % 2) 241 + reg_mask = ADT7470_PWM2_AUTO_MASK; 242 + else 243 + reg_mask = ADT7470_PWM1_AUTO_MASK; 244 + 245 + reg = ADT7470_REG_PWM_CFG(i); 246 + if (i2c_smbus_read_byte_data(client, reg) & reg_mask) 247 + data->pwm_automatic[i] = 1; 248 + else 249 + data->pwm_automatic[i] = 0; 250 + 251 + reg = ADT7470_REG_PWM_AUTO_TEMP(i); 252 + cfg = i2c_smbus_read_byte_data(client, reg); 253 + if (!(i % 2)) 254 + data->pwm_auto_temp[i] = cfg >> 4; 255 + else 256 + data->pwm_auto_temp[i] = cfg & 0xF; 257 + } 258 + 259 + if (i2c_smbus_read_byte_data(client, ADT7470_REG_CFG) & 260 + ADT7470_FSPD_MASK) 261 + data->force_pwm_max = 1; 262 + else 263 + data->force_pwm_max = 0; 264 + 265 + data->alarms = adt7470_read_word_data(client, ADT7470_REG_ALARM1); 266 + data->alarms_mask = adt7470_read_word_data(client, 267 + ADT7470_REG_ALARM1_MASK); 268 + 269 + data->sensors_last_updated = local_jiffies; 270 + data->sensors_valid = 1; 271 + 272 + no_sensor_update: 273 + if (time_before(local_jiffies, data->limits_last_updated + 274 + LIMIT_REFRESH_INTERVAL) 275 + && data->limits_valid) 276 + goto out; 277 + 278 + for (i = 0; i < ADT7470_TEMP_COUNT; i++) { 279 + data->temp_min[i] = i2c_smbus_read_byte_data(client, 280 + ADT7470_TEMP_MIN_REG(i)); 281 + data->temp_max[i] = i2c_smbus_read_byte_data(client, 282 + ADT7470_TEMP_MAX_REG(i)); 283 + } 284 + 285 + for (i = 0; i < ADT7470_FAN_COUNT; i++) { 286 + data->fan_min[i] = adt7470_read_word_data(client, 287 + ADT7470_REG_FAN_MIN(i)); 288 + data->fan_max[i] = adt7470_read_word_data(client, 289 + ADT7470_REG_FAN_MAX(i)); 290 + } 291 + 292 + for (i = 0; i < ADT7470_PWM_COUNT; i++) { 293 + data->pwm_max[i] = i2c_smbus_read_byte_data(client, 294 + ADT7470_REG_PWM_MAX(i)); 295 + data->pwm_min[i] = i2c_smbus_read_byte_data(client, 296 + ADT7470_REG_PWM_MIN(i)); 297 + data->pwm_tmin[i] = i2c_smbus_read_byte_data(client, 298 + ADT7470_REG_PWM_TMIN(i)); 299 + } 300 + 301 + data->limits_last_updated = local_jiffies; 302 + data->limits_valid = 1; 303 + 304 + out: 305 + mutex_unlock(&data->lock); 306 + return data; 307 + } 308 + 309 + static ssize_t show_temp_min(struct device *dev, 310 + struct device_attribute *devattr, 311 + char *buf) 312 + { 313 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 314 + struct adt7470_data *data = adt7470_update_device(dev); 315 + return sprintf(buf, "%d\n", 1000 * data->temp_min[attr->index]); 316 + } 317 + 318 + static ssize_t set_temp_min(struct device *dev, 319 + struct device_attribute *devattr, 320 + const char *buf, 321 + size_t count) 322 + { 323 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 324 + struct i2c_client *client = to_i2c_client(dev); 325 + struct adt7470_data *data = i2c_get_clientdata(client); 326 + int temp = simple_strtol(buf, NULL, 10) / 1000; 327 + 328 + mutex_lock(&data->lock); 329 + data->temp_min[attr->index] = temp; 330 + i2c_smbus_write_byte_data(client, ADT7470_TEMP_MIN_REG(attr->index), 331 + temp); 332 + mutex_unlock(&data->lock); 333 + 334 + return count; 335 + } 336 + 337 + static ssize_t show_temp_max(struct device *dev, 338 + struct device_attribute *devattr, 339 + char *buf) 340 + { 341 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 342 + struct adt7470_data *data = adt7470_update_device(dev); 343 + return sprintf(buf, "%d\n", 1000 * data->temp_max[attr->index]); 344 + } 345 + 346 + static ssize_t set_temp_max(struct device *dev, 347 + struct device_attribute *devattr, 348 + const char *buf, 349 + size_t count) 350 + { 351 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 352 + struct i2c_client *client = to_i2c_client(dev); 353 + struct adt7470_data *data = i2c_get_clientdata(client); 354 + int temp = simple_strtol(buf, NULL, 10) / 1000; 355 + 356 + mutex_lock(&data->lock); 357 + data->temp_max[attr->index] = temp; 358 + i2c_smbus_write_byte_data(client, ADT7470_TEMP_MAX_REG(attr->index), 359 + temp); 360 + mutex_unlock(&data->lock); 361 + 362 + return count; 363 + } 364 + 365 + static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 366 + char *buf) 367 + { 368 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 369 + struct adt7470_data *data = adt7470_update_device(dev); 370 + return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]); 371 + } 372 + 373 + static ssize_t show_alarms(struct device *dev, 374 + struct device_attribute *devattr, 375 + char *buf) 376 + { 377 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 378 + struct adt7470_data *data = adt7470_update_device(dev); 379 + 380 + if (attr->index) 381 + return sprintf(buf, "%x\n", data->alarms); 382 + else 383 + return sprintf(buf, "%x\n", data->alarms_mask); 384 + } 385 + 386 + static ssize_t show_fan_max(struct device *dev, 387 + struct device_attribute *devattr, 388 + char *buf) 389 + { 390 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 391 + struct adt7470_data *data = adt7470_update_device(dev); 392 + 393 + if (FAN_DATA_VALID(data->fan_max[attr->index])) 394 + return sprintf(buf, "%d\n", 395 + FAN_PERIOD_TO_RPM(data->fan_max[attr->index])); 396 + else 397 + return sprintf(buf, "0\n"); 398 + } 399 + 400 + static ssize_t set_fan_max(struct device *dev, 401 + struct device_attribute *devattr, 402 + const char *buf, size_t count) 403 + { 404 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 405 + struct i2c_client *client = to_i2c_client(dev); 406 + struct adt7470_data *data = i2c_get_clientdata(client); 407 + int temp = simple_strtol(buf, NULL, 10); 408 + 409 + if (!temp) 410 + return -EINVAL; 411 + temp = FAN_RPM_TO_PERIOD(temp); 412 + 413 + mutex_lock(&data->lock); 414 + data->fan_max[attr->index] = temp; 415 + adt7470_write_word_data(client, ADT7470_REG_FAN_MAX(attr->index), temp); 416 + mutex_unlock(&data->lock); 417 + 418 + return count; 419 + } 420 + 421 + static ssize_t show_fan_min(struct device *dev, 422 + struct device_attribute *devattr, 423 + char *buf) 424 + { 425 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 426 + struct adt7470_data *data = adt7470_update_device(dev); 427 + 428 + if (FAN_DATA_VALID(data->fan_min[attr->index])) 429 + return sprintf(buf, "%d\n", 430 + FAN_PERIOD_TO_RPM(data->fan_min[attr->index])); 431 + else 432 + return sprintf(buf, "0\n"); 433 + } 434 + 435 + static ssize_t set_fan_min(struct device *dev, 436 + struct device_attribute *devattr, 437 + const char *buf, size_t count) 438 + { 439 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 440 + struct i2c_client *client = to_i2c_client(dev); 441 + struct adt7470_data *data = i2c_get_clientdata(client); 442 + int temp = simple_strtol(buf, NULL, 10); 443 + 444 + if (!temp) 445 + return -EINVAL; 446 + temp = FAN_RPM_TO_PERIOD(temp); 447 + 448 + mutex_lock(&data->lock); 449 + data->fan_min[attr->index] = temp; 450 + adt7470_write_word_data(client, ADT7470_REG_FAN_MIN(attr->index), temp); 451 + mutex_unlock(&data->lock); 452 + 453 + return count; 454 + } 455 + 456 + static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 457 + char *buf) 458 + { 459 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 460 + struct adt7470_data *data = adt7470_update_device(dev); 461 + 462 + if (FAN_DATA_VALID(data->fan[attr->index])) 463 + return sprintf(buf, "%d\n", 464 + FAN_PERIOD_TO_RPM(data->fan[attr->index])); 465 + else 466 + return sprintf(buf, "0\n"); 467 + } 468 + 469 + static ssize_t show_force_pwm_max(struct device *dev, 470 + struct device_attribute *devattr, 471 + char *buf) 472 + { 473 + struct adt7470_data *data = adt7470_update_device(dev); 474 + return sprintf(buf, "%d\n", data->force_pwm_max); 475 + } 476 + 477 + static ssize_t set_force_pwm_max(struct device *dev, 478 + struct device_attribute *devattr, 479 + const char *buf, 480 + size_t count) 481 + { 482 + struct i2c_client *client = to_i2c_client(dev); 483 + struct adt7470_data *data = i2c_get_clientdata(client); 484 + int temp = simple_strtol(buf, NULL, 10); 485 + u8 reg; 486 + 487 + mutex_lock(&data->lock); 488 + data->force_pwm_max = temp; 489 + reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 490 + if (temp) 491 + reg |= ADT7470_FSPD_MASK; 492 + else 493 + reg &= ~ADT7470_FSPD_MASK; 494 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg); 495 + mutex_unlock(&data->lock); 496 + 497 + return count; 498 + } 499 + 500 + static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, 501 + char *buf) 502 + { 503 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 504 + struct adt7470_data *data = adt7470_update_device(dev); 505 + return sprintf(buf, "%d\n", data->pwm[attr->index]); 506 + } 507 + 508 + static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, 509 + const char *buf, size_t count) 510 + { 511 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 512 + struct i2c_client *client = to_i2c_client(dev); 513 + struct adt7470_data *data = i2c_get_clientdata(client); 514 + int temp = simple_strtol(buf, NULL, 10); 515 + 516 + mutex_lock(&data->lock); 517 + data->pwm[attr->index] = temp; 518 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM(attr->index), temp); 519 + mutex_unlock(&data->lock); 520 + 521 + return count; 522 + } 523 + 524 + static ssize_t show_pwm_max(struct device *dev, 525 + struct device_attribute *devattr, 526 + char *buf) 527 + { 528 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 529 + struct adt7470_data *data = adt7470_update_device(dev); 530 + return sprintf(buf, "%d\n", data->pwm_max[attr->index]); 531 + } 532 + 533 + static ssize_t set_pwm_max(struct device *dev, 534 + struct device_attribute *devattr, 535 + const char *buf, 536 + size_t count) 537 + { 538 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 539 + struct i2c_client *client = to_i2c_client(dev); 540 + struct adt7470_data *data = i2c_get_clientdata(client); 541 + int temp = simple_strtol(buf, NULL, 10); 542 + 543 + mutex_lock(&data->lock); 544 + data->pwm_max[attr->index] = temp; 545 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MAX(attr->index), 546 + temp); 547 + mutex_unlock(&data->lock); 548 + 549 + return count; 550 + } 551 + 552 + static ssize_t show_pwm_min(struct device *dev, 553 + struct device_attribute *devattr, 554 + char *buf) 555 + { 556 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 557 + struct adt7470_data *data = adt7470_update_device(dev); 558 + return sprintf(buf, "%d\n", data->pwm_min[attr->index]); 559 + } 560 + 561 + static ssize_t set_pwm_min(struct device *dev, 562 + struct device_attribute *devattr, 563 + const char *buf, 564 + size_t count) 565 + { 566 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 567 + struct i2c_client *client = to_i2c_client(dev); 568 + struct adt7470_data *data = i2c_get_clientdata(client); 569 + int temp = simple_strtol(buf, NULL, 10); 570 + 571 + mutex_lock(&data->lock); 572 + data->pwm_min[attr->index] = temp; 573 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MIN(attr->index), 574 + temp); 575 + mutex_unlock(&data->lock); 576 + 577 + return count; 578 + } 579 + 580 + static ssize_t show_pwm_tmax(struct device *dev, 581 + struct device_attribute *devattr, 582 + char *buf) 583 + { 584 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 585 + struct adt7470_data *data = adt7470_update_device(dev); 586 + /* the datasheet says that tmax = tmin + 20C */ 587 + return sprintf(buf, "%d\n", 1000 * (20 + data->pwm_tmin[attr->index])); 588 + } 589 + 590 + static ssize_t show_pwm_tmin(struct device *dev, 591 + struct device_attribute *devattr, 592 + char *buf) 593 + { 594 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 595 + struct adt7470_data *data = adt7470_update_device(dev); 596 + return sprintf(buf, "%d\n", 1000 * data->pwm_tmin[attr->index]); 597 + } 598 + 599 + static ssize_t set_pwm_tmin(struct device *dev, 600 + struct device_attribute *devattr, 601 + const char *buf, 602 + size_t count) 603 + { 604 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 605 + struct i2c_client *client = to_i2c_client(dev); 606 + struct adt7470_data *data = i2c_get_clientdata(client); 607 + int temp = simple_strtol(buf, NULL, 10) / 1000; 608 + 609 + mutex_lock(&data->lock); 610 + data->pwm_tmin[attr->index] = temp; 611 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_TMIN(attr->index), 612 + temp); 613 + mutex_unlock(&data->lock); 614 + 615 + return count; 616 + } 617 + 618 + static ssize_t show_pwm_auto(struct device *dev, 619 + struct device_attribute *devattr, 620 + char *buf) 621 + { 622 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 623 + struct adt7470_data *data = adt7470_update_device(dev); 624 + return sprintf(buf, "%d\n", 1 + data->pwm_automatic[attr->index]); 625 + } 626 + 627 + static ssize_t set_pwm_auto(struct device *dev, 628 + struct device_attribute *devattr, 629 + const char *buf, 630 + size_t count) 631 + { 632 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 633 + struct i2c_client *client = to_i2c_client(dev); 634 + struct adt7470_data *data = i2c_get_clientdata(client); 635 + int temp = simple_strtol(buf, NULL, 10); 636 + int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); 637 + int pwm_auto_reg_mask; 638 + u8 reg; 639 + 640 + if (attr->index % 2) 641 + pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; 642 + else 643 + pwm_auto_reg_mask = ADT7470_PWM1_AUTO_MASK; 644 + 645 + if (temp != 2 && temp != 1) 646 + return -EINVAL; 647 + temp--; 648 + 649 + mutex_lock(&data->lock); 650 + data->pwm_automatic[attr->index] = temp; 651 + reg = i2c_smbus_read_byte_data(client, pwm_auto_reg); 652 + if (temp) 653 + reg |= pwm_auto_reg_mask; 654 + else 655 + reg &= ~pwm_auto_reg_mask; 656 + i2c_smbus_write_byte_data(client, pwm_auto_reg, reg); 657 + mutex_unlock(&data->lock); 658 + 659 + return count; 660 + } 661 + 662 + static ssize_t show_pwm_auto_temp(struct device *dev, 663 + struct device_attribute *devattr, 664 + char *buf) 665 + { 666 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 667 + struct adt7470_data *data = adt7470_update_device(dev); 668 + u8 ctrl = data->pwm_auto_temp[attr->index]; 669 + 670 + if (ctrl) 671 + return sprintf(buf, "%d\n", 1 << (ctrl - 1)); 672 + else 673 + return sprintf(buf, "%d\n", ADT7470_PWM_ALL_TEMPS); 674 + } 675 + 676 + static int cvt_auto_temp(int input) 677 + { 678 + if (input == ADT7470_PWM_ALL_TEMPS) 679 + return 0; 680 + if (input < 1 || !power_of_2(input)) 681 + return -EINVAL; 682 + return ilog2(input) + 1; 683 + } 684 + 685 + static ssize_t set_pwm_auto_temp(struct device *dev, 686 + struct device_attribute *devattr, 687 + const char *buf, 688 + size_t count) 689 + { 690 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 691 + struct i2c_client *client = to_i2c_client(dev); 692 + struct adt7470_data *data = i2c_get_clientdata(client); 693 + int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10)); 694 + int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); 695 + u8 reg; 696 + 697 + if (temp < 0) 698 + return temp; 699 + 700 + mutex_lock(&data->lock); 701 + data->pwm_automatic[attr->index] = temp; 702 + reg = i2c_smbus_read_byte_data(client, pwm_auto_reg); 703 + 704 + if (!(attr->index % 2)) { 705 + reg &= 0xF; 706 + reg |= (temp << 4) & 0xF0; 707 + } else { 708 + reg &= 0xF0; 709 + reg |= temp & 0xF; 710 + } 711 + 712 + i2c_smbus_write_byte_data(client, pwm_auto_reg, reg); 713 + mutex_unlock(&data->lock); 714 + 715 + return count; 716 + } 717 + 718 + static SENSOR_DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL, 0); 719 + static SENSOR_DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarms, NULL, 1); 720 + 721 + static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, 722 + set_temp_max, 0); 723 + static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max, 724 + set_temp_max, 1); 725 + static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max, 726 + set_temp_max, 2); 727 + static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max, 728 + set_temp_max, 3); 729 + static SENSOR_DEVICE_ATTR(temp5_max, S_IWUSR | S_IRUGO, show_temp_max, 730 + set_temp_max, 4); 731 + static SENSOR_DEVICE_ATTR(temp6_max, S_IWUSR | S_IRUGO, show_temp_max, 732 + set_temp_max, 5); 733 + static SENSOR_DEVICE_ATTR(temp7_max, S_IWUSR | S_IRUGO, show_temp_max, 734 + set_temp_max, 6); 735 + static SENSOR_DEVICE_ATTR(temp8_max, S_IWUSR | S_IRUGO, show_temp_max, 736 + set_temp_max, 7); 737 + static SENSOR_DEVICE_ATTR(temp9_max, S_IWUSR | S_IRUGO, show_temp_max, 738 + set_temp_max, 8); 739 + static SENSOR_DEVICE_ATTR(temp10_max, S_IWUSR | S_IRUGO, show_temp_max, 740 + set_temp_max, 9); 741 + 742 + static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min, 743 + set_temp_min, 0); 744 + static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min, 745 + set_temp_min, 1); 746 + static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_temp_min, 747 + set_temp_min, 2); 748 + static SENSOR_DEVICE_ATTR(temp4_min, S_IWUSR | S_IRUGO, show_temp_min, 749 + set_temp_min, 3); 750 + static SENSOR_DEVICE_ATTR(temp5_min, S_IWUSR | S_IRUGO, show_temp_min, 751 + set_temp_min, 4); 752 + static SENSOR_DEVICE_ATTR(temp6_min, S_IWUSR | S_IRUGO, show_temp_min, 753 + set_temp_min, 5); 754 + static SENSOR_DEVICE_ATTR(temp7_min, S_IWUSR | S_IRUGO, show_temp_min, 755 + set_temp_min, 6); 756 + static SENSOR_DEVICE_ATTR(temp8_min, S_IWUSR | S_IRUGO, show_temp_min, 757 + set_temp_min, 7); 758 + static SENSOR_DEVICE_ATTR(temp9_min, S_IWUSR | S_IRUGO, show_temp_min, 759 + set_temp_min, 8); 760 + static SENSOR_DEVICE_ATTR(temp10_min, S_IWUSR | S_IRUGO, show_temp_min, 761 + set_temp_min, 9); 762 + 763 + static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 764 + static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); 765 + static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); 766 + static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3); 767 + static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4); 768 + static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5); 769 + static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6); 770 + static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7); 771 + static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_temp, NULL, 8); 772 + static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_temp, NULL, 9); 773 + 774 + static SENSOR_DEVICE_ATTR(fan1_max, S_IWUSR | S_IRUGO, show_fan_max, 775 + set_fan_max, 0); 776 + static SENSOR_DEVICE_ATTR(fan2_max, S_IWUSR | S_IRUGO, show_fan_max, 777 + set_fan_max, 1); 778 + static SENSOR_DEVICE_ATTR(fan3_max, S_IWUSR | S_IRUGO, show_fan_max, 779 + set_fan_max, 2); 780 + static SENSOR_DEVICE_ATTR(fan4_max, S_IWUSR | S_IRUGO, show_fan_max, 781 + set_fan_max, 3); 782 + 783 + static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, 784 + set_fan_min, 0); 785 + static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, 786 + set_fan_min, 1); 787 + static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, 788 + set_fan_min, 2); 789 + static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, 790 + set_fan_min, 3); 791 + 792 + static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); 793 + static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1); 794 + static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2); 795 + static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3); 796 + 797 + static SENSOR_DEVICE_ATTR(force_pwm_max, S_IWUSR | S_IRUGO, 798 + show_force_pwm_max, set_force_pwm_max, 0); 799 + 800 + static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0); 801 + static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1); 802 + static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2); 803 + static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3); 804 + 805 + static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO, 806 + show_pwm_min, set_pwm_min, 0); 807 + static SENSOR_DEVICE_ATTR(pwm2_auto_point1_pwm, S_IWUSR | S_IRUGO, 808 + show_pwm_min, set_pwm_min, 1); 809 + static SENSOR_DEVICE_ATTR(pwm3_auto_point1_pwm, S_IWUSR | S_IRUGO, 810 + show_pwm_min, set_pwm_min, 2); 811 + static SENSOR_DEVICE_ATTR(pwm4_auto_point1_pwm, S_IWUSR | S_IRUGO, 812 + show_pwm_min, set_pwm_min, 3); 813 + 814 + static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO, 815 + show_pwm_max, set_pwm_max, 0); 816 + static SENSOR_DEVICE_ATTR(pwm2_auto_point2_pwm, S_IWUSR | S_IRUGO, 817 + show_pwm_max, set_pwm_max, 1); 818 + static SENSOR_DEVICE_ATTR(pwm3_auto_point2_pwm, S_IWUSR | S_IRUGO, 819 + show_pwm_max, set_pwm_max, 2); 820 + static SENSOR_DEVICE_ATTR(pwm4_auto_point2_pwm, S_IWUSR | S_IRUGO, 821 + show_pwm_max, set_pwm_max, 3); 822 + 823 + static SENSOR_DEVICE_ATTR(pwm1_auto_point1_temp, S_IWUSR | S_IRUGO, 824 + show_pwm_tmin, set_pwm_tmin, 0); 825 + static SENSOR_DEVICE_ATTR(pwm2_auto_point1_temp, S_IWUSR | S_IRUGO, 826 + show_pwm_tmin, set_pwm_tmin, 1); 827 + static SENSOR_DEVICE_ATTR(pwm3_auto_point1_temp, S_IWUSR | S_IRUGO, 828 + show_pwm_tmin, set_pwm_tmin, 2); 829 + static SENSOR_DEVICE_ATTR(pwm4_auto_point1_temp, S_IWUSR | S_IRUGO, 830 + show_pwm_tmin, set_pwm_tmin, 3); 831 + 832 + static SENSOR_DEVICE_ATTR(pwm1_auto_point2_temp, S_IRUGO, show_pwm_tmax, 833 + NULL, 0); 834 + static SENSOR_DEVICE_ATTR(pwm2_auto_point2_temp, S_IRUGO, show_pwm_tmax, 835 + NULL, 1); 836 + static SENSOR_DEVICE_ATTR(pwm3_auto_point2_temp, S_IRUGO, show_pwm_tmax, 837 + NULL, 2); 838 + static SENSOR_DEVICE_ATTR(pwm4_auto_point2_temp, S_IRUGO, show_pwm_tmax, 839 + NULL, 3); 840 + 841 + static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 842 + set_pwm_auto, 0); 843 + static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 844 + set_pwm_auto, 1); 845 + static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 846 + set_pwm_auto, 2); 847 + static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 848 + set_pwm_auto, 3); 849 + 850 + static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IWUSR | S_IRUGO, 851 + show_pwm_auto_temp, set_pwm_auto_temp, 0); 852 + static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IWUSR | S_IRUGO, 853 + show_pwm_auto_temp, set_pwm_auto_temp, 1); 854 + static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IWUSR | S_IRUGO, 855 + show_pwm_auto_temp, set_pwm_auto_temp, 2); 856 + static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, 857 + show_pwm_auto_temp, set_pwm_auto_temp, 3); 858 + 859 + static struct attribute *adt7470_attr[] = 860 + { 861 + &sensor_dev_attr_alarms.dev_attr.attr, 862 + &sensor_dev_attr_alarm_mask.dev_attr.attr, 863 + &sensor_dev_attr_temp1_max.dev_attr.attr, 864 + &sensor_dev_attr_temp2_max.dev_attr.attr, 865 + &sensor_dev_attr_temp3_max.dev_attr.attr, 866 + &sensor_dev_attr_temp4_max.dev_attr.attr, 867 + &sensor_dev_attr_temp5_max.dev_attr.attr, 868 + &sensor_dev_attr_temp6_max.dev_attr.attr, 869 + &sensor_dev_attr_temp7_max.dev_attr.attr, 870 + &sensor_dev_attr_temp8_max.dev_attr.attr, 871 + &sensor_dev_attr_temp9_max.dev_attr.attr, 872 + &sensor_dev_attr_temp10_max.dev_attr.attr, 873 + &sensor_dev_attr_temp1_min.dev_attr.attr, 874 + &sensor_dev_attr_temp2_min.dev_attr.attr, 875 + &sensor_dev_attr_temp3_min.dev_attr.attr, 876 + &sensor_dev_attr_temp4_min.dev_attr.attr, 877 + &sensor_dev_attr_temp5_min.dev_attr.attr, 878 + &sensor_dev_attr_temp6_min.dev_attr.attr, 879 + &sensor_dev_attr_temp7_min.dev_attr.attr, 880 + &sensor_dev_attr_temp8_min.dev_attr.attr, 881 + &sensor_dev_attr_temp9_min.dev_attr.attr, 882 + &sensor_dev_attr_temp10_min.dev_attr.attr, 883 + &sensor_dev_attr_temp1_input.dev_attr.attr, 884 + &sensor_dev_attr_temp2_input.dev_attr.attr, 885 + &sensor_dev_attr_temp3_input.dev_attr.attr, 886 + &sensor_dev_attr_temp4_input.dev_attr.attr, 887 + &sensor_dev_attr_temp5_input.dev_attr.attr, 888 + &sensor_dev_attr_temp6_input.dev_attr.attr, 889 + &sensor_dev_attr_temp7_input.dev_attr.attr, 890 + &sensor_dev_attr_temp8_input.dev_attr.attr, 891 + &sensor_dev_attr_temp9_input.dev_attr.attr, 892 + &sensor_dev_attr_temp10_input.dev_attr.attr, 893 + &sensor_dev_attr_fan1_max.dev_attr.attr, 894 + &sensor_dev_attr_fan2_max.dev_attr.attr, 895 + &sensor_dev_attr_fan3_max.dev_attr.attr, 896 + &sensor_dev_attr_fan4_max.dev_attr.attr, 897 + &sensor_dev_attr_fan1_min.dev_attr.attr, 898 + &sensor_dev_attr_fan2_min.dev_attr.attr, 899 + &sensor_dev_attr_fan3_min.dev_attr.attr, 900 + &sensor_dev_attr_fan4_min.dev_attr.attr, 901 + &sensor_dev_attr_fan1_input.dev_attr.attr, 902 + &sensor_dev_attr_fan2_input.dev_attr.attr, 903 + &sensor_dev_attr_fan3_input.dev_attr.attr, 904 + &sensor_dev_attr_fan4_input.dev_attr.attr, 905 + &sensor_dev_attr_force_pwm_max.dev_attr.attr, 906 + &sensor_dev_attr_pwm1.dev_attr.attr, 907 + &sensor_dev_attr_pwm2.dev_attr.attr, 908 + &sensor_dev_attr_pwm3.dev_attr.attr, 909 + &sensor_dev_attr_pwm4.dev_attr.attr, 910 + &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr, 911 + &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, 912 + &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, 913 + &sensor_dev_attr_pwm4_auto_point1_pwm.dev_attr.attr, 914 + &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr, 915 + &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, 916 + &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, 917 + &sensor_dev_attr_pwm4_auto_point2_pwm.dev_attr.attr, 918 + &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr, 919 + &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr, 920 + &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr, 921 + &sensor_dev_attr_pwm4_auto_point1_temp.dev_attr.attr, 922 + &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr, 923 + &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr, 924 + &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr, 925 + &sensor_dev_attr_pwm4_auto_point2_temp.dev_attr.attr, 926 + &sensor_dev_attr_pwm1_enable.dev_attr.attr, 927 + &sensor_dev_attr_pwm2_enable.dev_attr.attr, 928 + &sensor_dev_attr_pwm3_enable.dev_attr.attr, 929 + &sensor_dev_attr_pwm4_enable.dev_attr.attr, 930 + &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, 931 + &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr, 932 + &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, 933 + &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr, 934 + NULL 935 + }; 936 + 937 + static int adt7470_attach_adapter(struct i2c_adapter *adapter) 938 + { 939 + if (!(adapter->class & I2C_CLASS_HWMON)) 940 + return 0; 941 + return i2c_probe(adapter, &addr_data, adt7470_detect); 942 + } 943 + 944 + static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind) 945 + { 946 + struct i2c_client *client; 947 + struct adt7470_data *data; 948 + int err = 0; 949 + 950 + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 951 + goto exit; 952 + 953 + if (!(data = kzalloc(sizeof(struct adt7470_data), GFP_KERNEL))) { 954 + err = -ENOMEM; 955 + goto exit; 956 + } 957 + 958 + client = &data->client; 959 + client->addr = address; 960 + client->adapter = adapter; 961 + client->driver = &adt7470_driver; 962 + 963 + i2c_set_clientdata(client, data); 964 + 965 + mutex_init(&data->lock); 966 + 967 + if (kind <= 0) { 968 + int vendor, device, revision; 969 + 970 + vendor = i2c_smbus_read_byte_data(client, ADT7470_REG_VENDOR); 971 + if (vendor != ADT7470_VENDOR) { 972 + err = -ENODEV; 973 + goto exit_free; 974 + } 975 + 976 + device = i2c_smbus_read_byte_data(client, ADT7470_REG_DEVICE); 977 + if (device != ADT7470_DEVICE) { 978 + err = -ENODEV; 979 + goto exit_free; 980 + } 981 + 982 + revision = i2c_smbus_read_byte_data(client, 983 + ADT7470_REG_REVISION); 984 + if (revision != ADT7470_REVISION) { 985 + err = -ENODEV; 986 + goto exit_free; 987 + } 988 + } else 989 + dev_dbg(&adapter->dev, "detection forced\n"); 990 + 991 + strlcpy(client->name, "adt7470", I2C_NAME_SIZE); 992 + 993 + if ((err = i2c_attach_client(client))) 994 + goto exit_free; 995 + 996 + dev_info(&client->dev, "%s chip found\n", client->name); 997 + 998 + /* Initialize the ADT7470 chip */ 999 + adt7470_init_client(client); 1000 + 1001 + /* Register sysfs hooks */ 1002 + data->attrs.attrs = adt7470_attr; 1003 + if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs))) 1004 + goto exit_detach; 1005 + 1006 + data->class_dev = hwmon_device_register(&client->dev); 1007 + if (IS_ERR(data->class_dev)) { 1008 + err = PTR_ERR(data->class_dev); 1009 + goto exit_remove; 1010 + } 1011 + 1012 + return 0; 1013 + 1014 + exit_remove: 1015 + sysfs_remove_group(&client->dev.kobj, &data->attrs); 1016 + exit_detach: 1017 + i2c_detach_client(client); 1018 + exit_free: 1019 + kfree(data); 1020 + exit: 1021 + return err; 1022 + } 1023 + 1024 + static int adt7470_detach_client(struct i2c_client *client) 1025 + { 1026 + struct adt7470_data *data = i2c_get_clientdata(client); 1027 + 1028 + hwmon_device_unregister(data->class_dev); 1029 + sysfs_remove_group(&client->dev.kobj, &data->attrs); 1030 + i2c_detach_client(client); 1031 + kfree(data); 1032 + return 0; 1033 + } 1034 + 1035 + static int __init adt7470_init(void) 1036 + { 1037 + return i2c_add_driver(&adt7470_driver); 1038 + } 1039 + 1040 + static void __exit adt7470_exit(void) 1041 + { 1042 + i2c_del_driver(&adt7470_driver); 1043 + } 1044 + 1045 + MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1046 + MODULE_DESCRIPTION("ADT7470 driver"); 1047 + MODULE_LICENSE("GPL"); 1048 + 1049 + module_init(adt7470_init); 1050 + module_exit(adt7470_exit);