gl518sm.c (20785B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * gl518sm.c - Part of lm_sensors, Linux kernel modules for hardware 4 * monitoring 5 * Copyright (C) 1998, 1999 Frodo Looijaard <frodol@dds.nl> and 6 * Kyosti Malkki <kmalkki@cc.hut.fi> 7 * Copyright (C) 2004 Hong-Gunn Chew <hglinux@gunnet.org> and 8 * Jean Delvare <jdelvare@suse.de> 9 * 10 * Ported to Linux 2.6 by Hong-Gunn Chew with the help of Jean Delvare 11 * and advice of Greg Kroah-Hartman. 12 * 13 * Notes about the port: 14 * Release 0x00 of the GL518SM chipset doesn't support reading of in0, 15 * in1 nor in2. The original driver had an ugly workaround to get them 16 * anyway (changing limits and watching alarms trigger and wear off). 17 * We did not keep that part of the original driver in the Linux 2.6 18 * version, since it was making the driver significantly more complex 19 * with no real benefit. 20 */ 21 22#include <linux/module.h> 23#include <linux/init.h> 24#include <linux/slab.h> 25#include <linux/jiffies.h> 26#include <linux/i2c.h> 27#include <linux/hwmon.h> 28#include <linux/hwmon-sysfs.h> 29#include <linux/err.h> 30#include <linux/mutex.h> 31#include <linux/sysfs.h> 32 33/* Addresses to scan */ 34static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; 35 36enum chips { gl518sm_r00, gl518sm_r80 }; 37 38/* Many GL518 constants specified below */ 39 40/* The GL518 registers */ 41#define GL518_REG_CHIP_ID 0x00 42#define GL518_REG_REVISION 0x01 43#define GL518_REG_VENDOR_ID 0x02 44#define GL518_REG_CONF 0x03 45#define GL518_REG_TEMP_IN 0x04 46#define GL518_REG_TEMP_MAX 0x05 47#define GL518_REG_TEMP_HYST 0x06 48#define GL518_REG_FAN_COUNT 0x07 49#define GL518_REG_FAN_LIMIT 0x08 50#define GL518_REG_VIN1_LIMIT 0x09 51#define GL518_REG_VIN2_LIMIT 0x0a 52#define GL518_REG_VIN3_LIMIT 0x0b 53#define GL518_REG_VDD_LIMIT 0x0c 54#define GL518_REG_VIN3 0x0d 55#define GL518_REG_MISC 0x0f 56#define GL518_REG_ALARM 0x10 57#define GL518_REG_MASK 0x11 58#define GL518_REG_INT 0x12 59#define GL518_REG_VIN2 0x13 60#define GL518_REG_VIN1 0x14 61#define GL518_REG_VDD 0x15 62 63 64/* 65 * Conversions. Rounding and limit checking is only done on the TO_REG 66 * variants. Note that you should be a bit careful with which arguments 67 * these macros are called: arguments may be evaluated more than once. 68 * Fixing this is just not worth it. 69 */ 70 71#define RAW_FROM_REG(val) val 72 73#define BOOL_FROM_REG(val) ((val) ? 0 : 1) 74#define BOOL_TO_REG(val) ((val) ? 0 : 1) 75 76#define TEMP_CLAMP(val) clamp_val(val, -119000, 136000) 77#define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 119) 78#define TEMP_FROM_REG(val) (((val) - 119) * 1000) 79 80static inline u8 FAN_TO_REG(long rpm, int div) 81{ 82 long rpmdiv; 83 if (rpm == 0) 84 return 0; 85 rpmdiv = clamp_val(rpm, 1, 960000) * div; 86 return clamp_val((480000 + rpmdiv / 2) / rpmdiv, 1, 255); 87} 88#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) * (div)))) 89 90#define IN_CLAMP(val) clamp_val(val, 0, 255 * 19) 91#define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19) 92#define IN_FROM_REG(val) ((val) * 19) 93 94#define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4) 95#define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95) 96#define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4) 97 98#define DIV_FROM_REG(val) (1 << (val)) 99 100#define BEEP_MASK_TO_REG(val) ((val) & 0x7f & data->alarm_mask) 101#define BEEP_MASK_FROM_REG(val) ((val) & 0x7f) 102 103/* Each client has this additional data */ 104struct gl518_data { 105 struct i2c_client *client; 106 const struct attribute_group *groups[3]; 107 enum chips type; 108 109 struct mutex update_lock; 110 bool valid; /* true if following fields are valid */ 111 unsigned long last_updated; /* In jiffies */ 112 113 u8 voltage_in[4]; /* Register values; [0] = VDD */ 114 u8 voltage_min[4]; /* Register values; [0] = VDD */ 115 u8 voltage_max[4]; /* Register values; [0] = VDD */ 116 u8 fan_in[2]; 117 u8 fan_min[2]; 118 u8 fan_div[2]; /* Register encoding, shifted right */ 119 u8 fan_auto1; /* Boolean */ 120 u8 temp_in; /* Register values */ 121 u8 temp_max; /* Register values */ 122 u8 temp_hyst; /* Register values */ 123 u8 alarms; /* Register value */ 124 u8 alarm_mask; 125 u8 beep_mask; /* Register value */ 126 u8 beep_enable; /* Boolean */ 127}; 128 129/* 130 * Registers 0x07 to 0x0c are word-sized, others are byte-sized 131 * GL518 uses a high-byte first convention, which is exactly opposite to 132 * the SMBus standard. 133 */ 134static int gl518_read_value(struct i2c_client *client, u8 reg) 135{ 136 if ((reg >= 0x07) && (reg <= 0x0c)) 137 return i2c_smbus_read_word_swapped(client, reg); 138 else 139 return i2c_smbus_read_byte_data(client, reg); 140} 141 142static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value) 143{ 144 if ((reg >= 0x07) && (reg <= 0x0c)) 145 return i2c_smbus_write_word_swapped(client, reg, value); 146 else 147 return i2c_smbus_write_byte_data(client, reg, value); 148} 149 150static struct gl518_data *gl518_update_device(struct device *dev) 151{ 152 struct gl518_data *data = dev_get_drvdata(dev); 153 struct i2c_client *client = data->client; 154 int val; 155 156 mutex_lock(&data->update_lock); 157 158 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) 159 || !data->valid) { 160 dev_dbg(&client->dev, "Starting gl518 update\n"); 161 162 data->alarms = gl518_read_value(client, GL518_REG_INT); 163 data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); 164 165 val = gl518_read_value(client, GL518_REG_VDD_LIMIT); 166 data->voltage_min[0] = val & 0xff; 167 data->voltage_max[0] = (val >> 8) & 0xff; 168 val = gl518_read_value(client, GL518_REG_VIN1_LIMIT); 169 data->voltage_min[1] = val & 0xff; 170 data->voltage_max[1] = (val >> 8) & 0xff; 171 val = gl518_read_value(client, GL518_REG_VIN2_LIMIT); 172 data->voltage_min[2] = val & 0xff; 173 data->voltage_max[2] = (val >> 8) & 0xff; 174 val = gl518_read_value(client, GL518_REG_VIN3_LIMIT); 175 data->voltage_min[3] = val & 0xff; 176 data->voltage_max[3] = (val >> 8) & 0xff; 177 178 val = gl518_read_value(client, GL518_REG_FAN_COUNT); 179 data->fan_in[0] = (val >> 8) & 0xff; 180 data->fan_in[1] = val & 0xff; 181 182 val = gl518_read_value(client, GL518_REG_FAN_LIMIT); 183 data->fan_min[0] = (val >> 8) & 0xff; 184 data->fan_min[1] = val & 0xff; 185 186 data->temp_in = gl518_read_value(client, GL518_REG_TEMP_IN); 187 data->temp_max = 188 gl518_read_value(client, GL518_REG_TEMP_MAX); 189 data->temp_hyst = 190 gl518_read_value(client, GL518_REG_TEMP_HYST); 191 192 val = gl518_read_value(client, GL518_REG_MISC); 193 data->fan_div[0] = (val >> 6) & 0x03; 194 data->fan_div[1] = (val >> 4) & 0x03; 195 data->fan_auto1 = (val >> 3) & 0x01; 196 197 data->alarms &= data->alarm_mask; 198 199 val = gl518_read_value(client, GL518_REG_CONF); 200 data->beep_enable = (val >> 2) & 1; 201 202 if (data->type != gl518sm_r00) { 203 data->voltage_in[0] = 204 gl518_read_value(client, GL518_REG_VDD); 205 data->voltage_in[1] = 206 gl518_read_value(client, GL518_REG_VIN1); 207 data->voltage_in[2] = 208 gl518_read_value(client, GL518_REG_VIN2); 209 } 210 data->voltage_in[3] = 211 gl518_read_value(client, GL518_REG_VIN3); 212 213 data->last_updated = jiffies; 214 data->valid = true; 215 } 216 217 mutex_unlock(&data->update_lock); 218 219 return data; 220} 221 222/* 223 * Sysfs stuff 224 */ 225 226#define show(type, suffix, value) \ 227static ssize_t show_##suffix(struct device *dev, \ 228 struct device_attribute *attr, char *buf) \ 229{ \ 230 struct gl518_data *data = gl518_update_device(dev); \ 231 return sprintf(buf, "%d\n", type##_FROM_REG(data->value)); \ 232} 233 234show(TEMP, temp_input1, temp_in); 235show(TEMP, temp_max1, temp_max); 236show(TEMP, temp_hyst1, temp_hyst); 237show(BOOL, fan_auto1, fan_auto1); 238show(VDD, in_input0, voltage_in[0]); 239show(IN, in_input1, voltage_in[1]); 240show(IN, in_input2, voltage_in[2]); 241show(IN, in_input3, voltage_in[3]); 242show(VDD, in_min0, voltage_min[0]); 243show(IN, in_min1, voltage_min[1]); 244show(IN, in_min2, voltage_min[2]); 245show(IN, in_min3, voltage_min[3]); 246show(VDD, in_max0, voltage_max[0]); 247show(IN, in_max1, voltage_max[1]); 248show(IN, in_max2, voltage_max[2]); 249show(IN, in_max3, voltage_max[3]); 250show(RAW, alarms, alarms); 251show(BOOL, beep_enable, beep_enable); 252show(BEEP_MASK, beep_mask, beep_mask); 253 254static ssize_t fan_input_show(struct device *dev, 255 struct device_attribute *attr, char *buf) 256{ 257 int nr = to_sensor_dev_attr(attr)->index; 258 struct gl518_data *data = gl518_update_device(dev); 259 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_in[nr], 260 DIV_FROM_REG(data->fan_div[nr]))); 261} 262 263static ssize_t fan_min_show(struct device *dev, struct device_attribute *attr, 264 char *buf) 265{ 266 int nr = to_sensor_dev_attr(attr)->index; 267 struct gl518_data *data = gl518_update_device(dev); 268 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr], 269 DIV_FROM_REG(data->fan_div[nr]))); 270} 271 272static ssize_t fan_div_show(struct device *dev, struct device_attribute *attr, 273 char *buf) 274{ 275 int nr = to_sensor_dev_attr(attr)->index; 276 struct gl518_data *data = gl518_update_device(dev); 277 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr])); 278} 279 280#define set(type, suffix, value, reg) \ 281static ssize_t set_##suffix(struct device *dev, \ 282 struct device_attribute *attr, \ 283 const char *buf, size_t count) \ 284{ \ 285 struct gl518_data *data = dev_get_drvdata(dev); \ 286 struct i2c_client *client = data->client; \ 287 long val; \ 288 int err = kstrtol(buf, 10, &val); \ 289 if (err) \ 290 return err; \ 291 \ 292 mutex_lock(&data->update_lock); \ 293 data->value = type##_TO_REG(val); \ 294 gl518_write_value(client, reg, data->value); \ 295 mutex_unlock(&data->update_lock); \ 296 return count; \ 297} 298 299#define set_bits(type, suffix, value, reg, mask, shift) \ 300static ssize_t set_##suffix(struct device *dev, \ 301 struct device_attribute *attr, \ 302 const char *buf, size_t count) \ 303{ \ 304 struct gl518_data *data = dev_get_drvdata(dev); \ 305 struct i2c_client *client = data->client; \ 306 int regvalue; \ 307 unsigned long val; \ 308 int err = kstrtoul(buf, 10, &val); \ 309 if (err) \ 310 return err; \ 311 \ 312 mutex_lock(&data->update_lock); \ 313 regvalue = gl518_read_value(client, reg); \ 314 data->value = type##_TO_REG(val); \ 315 regvalue = (regvalue & ~mask) | (data->value << shift); \ 316 gl518_write_value(client, reg, regvalue); \ 317 mutex_unlock(&data->update_lock); \ 318 return count; \ 319} 320 321#define set_low(type, suffix, value, reg) \ 322 set_bits(type, suffix, value, reg, 0x00ff, 0) 323#define set_high(type, suffix, value, reg) \ 324 set_bits(type, suffix, value, reg, 0xff00, 8) 325 326set(TEMP, temp_max1, temp_max, GL518_REG_TEMP_MAX); 327set(TEMP, temp_hyst1, temp_hyst, GL518_REG_TEMP_HYST); 328set_bits(BOOL, fan_auto1, fan_auto1, GL518_REG_MISC, 0x08, 3); 329set_low(VDD, in_min0, voltage_min[0], GL518_REG_VDD_LIMIT); 330set_low(IN, in_min1, voltage_min[1], GL518_REG_VIN1_LIMIT); 331set_low(IN, in_min2, voltage_min[2], GL518_REG_VIN2_LIMIT); 332set_low(IN, in_min3, voltage_min[3], GL518_REG_VIN3_LIMIT); 333set_high(VDD, in_max0, voltage_max[0], GL518_REG_VDD_LIMIT); 334set_high(IN, in_max1, voltage_max[1], GL518_REG_VIN1_LIMIT); 335set_high(IN, in_max2, voltage_max[2], GL518_REG_VIN2_LIMIT); 336set_high(IN, in_max3, voltage_max[3], GL518_REG_VIN3_LIMIT); 337set_bits(BOOL, beep_enable, beep_enable, GL518_REG_CONF, 0x04, 2); 338set(BEEP_MASK, beep_mask, beep_mask, GL518_REG_ALARM); 339 340static ssize_t fan_min_store(struct device *dev, 341 struct device_attribute *attr, const char *buf, 342 size_t count) 343{ 344 struct gl518_data *data = dev_get_drvdata(dev); 345 struct i2c_client *client = data->client; 346 int nr = to_sensor_dev_attr(attr)->index; 347 int regvalue; 348 unsigned long val; 349 int err; 350 351 err = kstrtoul(buf, 10, &val); 352 if (err) 353 return err; 354 355 mutex_lock(&data->update_lock); 356 regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); 357 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); 358 regvalue = (regvalue & (0xff << (8 * nr))) 359 | (data->fan_min[nr] << (8 * (1 - nr))); 360 gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue); 361 362 data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); 363 if (data->fan_min[nr] == 0) 364 data->alarm_mask &= ~(0x20 << nr); 365 else 366 data->alarm_mask |= (0x20 << nr); 367 data->beep_mask &= data->alarm_mask; 368 gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); 369 370 mutex_unlock(&data->update_lock); 371 return count; 372} 373 374static ssize_t fan_div_store(struct device *dev, 375 struct device_attribute *attr, const char *buf, 376 size_t count) 377{ 378 struct gl518_data *data = dev_get_drvdata(dev); 379 struct i2c_client *client = data->client; 380 int nr = to_sensor_dev_attr(attr)->index; 381 int regvalue; 382 unsigned long val; 383 int err; 384 385 err = kstrtoul(buf, 10, &val); 386 if (err) 387 return err; 388 389 switch (val) { 390 case 1: 391 val = 0; 392 break; 393 case 2: 394 val = 1; 395 break; 396 case 4: 397 val = 2; 398 break; 399 case 8: 400 val = 3; 401 break; 402 default: 403 dev_err(dev, 404 "Invalid fan clock divider %lu, choose one of 1, 2, 4 or 8\n", 405 val); 406 return -EINVAL; 407 } 408 409 mutex_lock(&data->update_lock); 410 regvalue = gl518_read_value(client, GL518_REG_MISC); 411 data->fan_div[nr] = val; 412 regvalue = (regvalue & ~(0xc0 >> (2 * nr))) 413 | (data->fan_div[nr] << (6 - 2 * nr)); 414 gl518_write_value(client, GL518_REG_MISC, regvalue); 415 mutex_unlock(&data->update_lock); 416 return count; 417} 418 419static DEVICE_ATTR(temp1_input, 0444, show_temp_input1, NULL); 420static DEVICE_ATTR(temp1_max, 0644, show_temp_max1, set_temp_max1); 421static DEVICE_ATTR(temp1_max_hyst, 0644, 422 show_temp_hyst1, set_temp_hyst1); 423static DEVICE_ATTR(fan1_auto, 0644, show_fan_auto1, set_fan_auto1); 424static SENSOR_DEVICE_ATTR_RO(fan1_input, fan_input, 0); 425static SENSOR_DEVICE_ATTR_RO(fan2_input, fan_input, 1); 426static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0); 427static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1); 428static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0); 429static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1); 430static DEVICE_ATTR(in0_input, 0444, show_in_input0, NULL); 431static DEVICE_ATTR(in1_input, 0444, show_in_input1, NULL); 432static DEVICE_ATTR(in2_input, 0444, show_in_input2, NULL); 433static DEVICE_ATTR(in3_input, 0444, show_in_input3, NULL); 434static DEVICE_ATTR(in0_min, 0644, show_in_min0, set_in_min0); 435static DEVICE_ATTR(in1_min, 0644, show_in_min1, set_in_min1); 436static DEVICE_ATTR(in2_min, 0644, show_in_min2, set_in_min2); 437static DEVICE_ATTR(in3_min, 0644, show_in_min3, set_in_min3); 438static DEVICE_ATTR(in0_max, 0644, show_in_max0, set_in_max0); 439static DEVICE_ATTR(in1_max, 0644, show_in_max1, set_in_max1); 440static DEVICE_ATTR(in2_max, 0644, show_in_max2, set_in_max2); 441static DEVICE_ATTR(in3_max, 0644, show_in_max3, set_in_max3); 442static DEVICE_ATTR(alarms, 0444, show_alarms, NULL); 443static DEVICE_ATTR(beep_enable, 0644, 444 show_beep_enable, set_beep_enable); 445static DEVICE_ATTR(beep_mask, 0644, 446 show_beep_mask, set_beep_mask); 447 448static ssize_t alarm_show(struct device *dev, struct device_attribute *attr, 449 char *buf) 450{ 451 int bitnr = to_sensor_dev_attr(attr)->index; 452 struct gl518_data *data = gl518_update_device(dev); 453 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); 454} 455 456static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0); 457static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1); 458static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2); 459static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3); 460static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4); 461static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 5); 462static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 6); 463 464static ssize_t beep_show(struct device *dev, struct device_attribute *attr, 465 char *buf) 466{ 467 int bitnr = to_sensor_dev_attr(attr)->index; 468 struct gl518_data *data = gl518_update_device(dev); 469 return sprintf(buf, "%u\n", (data->beep_mask >> bitnr) & 1); 470} 471 472static ssize_t beep_store(struct device *dev, struct device_attribute *attr, 473 const char *buf, size_t count) 474{ 475 struct gl518_data *data = dev_get_drvdata(dev); 476 struct i2c_client *client = data->client; 477 int bitnr = to_sensor_dev_attr(attr)->index; 478 unsigned long bit; 479 int err; 480 481 err = kstrtoul(buf, 10, &bit); 482 if (err) 483 return err; 484 485 if (bit & ~1) 486 return -EINVAL; 487 488 mutex_lock(&data->update_lock); 489 data->beep_mask = gl518_read_value(client, GL518_REG_ALARM); 490 if (bit) 491 data->beep_mask |= (1 << bitnr); 492 else 493 data->beep_mask &= ~(1 << bitnr); 494 gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); 495 mutex_unlock(&data->update_lock); 496 return count; 497} 498 499static SENSOR_DEVICE_ATTR_RW(in0_beep, beep, 0); 500static SENSOR_DEVICE_ATTR_RW(in1_beep, beep, 1); 501static SENSOR_DEVICE_ATTR_RW(in2_beep, beep, 2); 502static SENSOR_DEVICE_ATTR_RW(in3_beep, beep, 3); 503static SENSOR_DEVICE_ATTR_RW(temp1_beep, beep, 4); 504static SENSOR_DEVICE_ATTR_RW(fan1_beep, beep, 5); 505static SENSOR_DEVICE_ATTR_RW(fan2_beep, beep, 6); 506 507static struct attribute *gl518_attributes[] = { 508 &dev_attr_in3_input.attr, 509 &dev_attr_in0_min.attr, 510 &dev_attr_in1_min.attr, 511 &dev_attr_in2_min.attr, 512 &dev_attr_in3_min.attr, 513 &dev_attr_in0_max.attr, 514 &dev_attr_in1_max.attr, 515 &dev_attr_in2_max.attr, 516 &dev_attr_in3_max.attr, 517 &sensor_dev_attr_in0_alarm.dev_attr.attr, 518 &sensor_dev_attr_in1_alarm.dev_attr.attr, 519 &sensor_dev_attr_in2_alarm.dev_attr.attr, 520 &sensor_dev_attr_in3_alarm.dev_attr.attr, 521 &sensor_dev_attr_in0_beep.dev_attr.attr, 522 &sensor_dev_attr_in1_beep.dev_attr.attr, 523 &sensor_dev_attr_in2_beep.dev_attr.attr, 524 &sensor_dev_attr_in3_beep.dev_attr.attr, 525 526 &dev_attr_fan1_auto.attr, 527 &sensor_dev_attr_fan1_input.dev_attr.attr, 528 &sensor_dev_attr_fan2_input.dev_attr.attr, 529 &sensor_dev_attr_fan1_min.dev_attr.attr, 530 &sensor_dev_attr_fan2_min.dev_attr.attr, 531 &sensor_dev_attr_fan1_div.dev_attr.attr, 532 &sensor_dev_attr_fan2_div.dev_attr.attr, 533 &sensor_dev_attr_fan1_alarm.dev_attr.attr, 534 &sensor_dev_attr_fan2_alarm.dev_attr.attr, 535 &sensor_dev_attr_fan1_beep.dev_attr.attr, 536 &sensor_dev_attr_fan2_beep.dev_attr.attr, 537 538 &dev_attr_temp1_input.attr, 539 &dev_attr_temp1_max.attr, 540 &dev_attr_temp1_max_hyst.attr, 541 &sensor_dev_attr_temp1_alarm.dev_attr.attr, 542 &sensor_dev_attr_temp1_beep.dev_attr.attr, 543 544 &dev_attr_alarms.attr, 545 &dev_attr_beep_enable.attr, 546 &dev_attr_beep_mask.attr, 547 NULL 548}; 549 550static const struct attribute_group gl518_group = { 551 .attrs = gl518_attributes, 552}; 553 554static struct attribute *gl518_attributes_r80[] = { 555 &dev_attr_in0_input.attr, 556 &dev_attr_in1_input.attr, 557 &dev_attr_in2_input.attr, 558 NULL 559}; 560 561static const struct attribute_group gl518_group_r80 = { 562 .attrs = gl518_attributes_r80, 563}; 564 565/* 566 * Real code 567 */ 568 569/* Return 0 if detection is successful, -ENODEV otherwise */ 570static int gl518_detect(struct i2c_client *client, struct i2c_board_info *info) 571{ 572 struct i2c_adapter *adapter = client->adapter; 573 int rev; 574 575 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | 576 I2C_FUNC_SMBUS_WORD_DATA)) 577 return -ENODEV; 578 579 /* Now, we do the remaining detection. */ 580 if ((gl518_read_value(client, GL518_REG_CHIP_ID) != 0x80) 581 || (gl518_read_value(client, GL518_REG_CONF) & 0x80)) 582 return -ENODEV; 583 584 /* Determine the chip type. */ 585 rev = gl518_read_value(client, GL518_REG_REVISION); 586 if (rev != 0x00 && rev != 0x80) 587 return -ENODEV; 588 589 strlcpy(info->type, "gl518sm", I2C_NAME_SIZE); 590 591 return 0; 592} 593 594/* 595 * Called when we have found a new GL518SM. 596 * Note that we preserve D4:NoFan2 and D2:beep_enable. 597 */ 598static void gl518_init_client(struct i2c_client *client) 599{ 600 /* Make sure we leave D7:Reset untouched */ 601 u8 regvalue = gl518_read_value(client, GL518_REG_CONF) & 0x7f; 602 603 /* Comparator mode (D3=0), standby mode (D6=0) */ 604 gl518_write_value(client, GL518_REG_CONF, (regvalue &= 0x37)); 605 606 /* Never interrupts */ 607 gl518_write_value(client, GL518_REG_MASK, 0x00); 608 609 /* Clear status register (D5=1), start (D6=1) */ 610 gl518_write_value(client, GL518_REG_CONF, 0x20 | regvalue); 611 gl518_write_value(client, GL518_REG_CONF, 0x40 | regvalue); 612} 613 614static int gl518_probe(struct i2c_client *client) 615{ 616 struct device *dev = &client->dev; 617 struct device *hwmon_dev; 618 struct gl518_data *data; 619 int revision; 620 621 data = devm_kzalloc(dev, sizeof(struct gl518_data), GFP_KERNEL); 622 if (!data) 623 return -ENOMEM; 624 625 data->client = client; 626 revision = gl518_read_value(client, GL518_REG_REVISION); 627 data->type = revision == 0x80 ? gl518sm_r80 : gl518sm_r00; 628 mutex_init(&data->update_lock); 629 630 /* Initialize the GL518SM chip */ 631 data->alarm_mask = 0xff; 632 gl518_init_client(client); 633 634 /* sysfs hooks */ 635 data->groups[0] = &gl518_group; 636 if (data->type == gl518sm_r80) 637 data->groups[1] = &gl518_group_r80; 638 639 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 640 data, data->groups); 641 return PTR_ERR_OR_ZERO(hwmon_dev); 642} 643 644static const struct i2c_device_id gl518_id[] = { 645 { "gl518sm", 0 }, 646 { } 647}; 648MODULE_DEVICE_TABLE(i2c, gl518_id); 649 650static struct i2c_driver gl518_driver = { 651 .class = I2C_CLASS_HWMON, 652 .driver = { 653 .name = "gl518sm", 654 }, 655 .probe_new = gl518_probe, 656 .id_table = gl518_id, 657 .detect = gl518_detect, 658 .address_list = normal_i2c, 659}; 660 661module_i2c_driver(gl518_driver); 662 663MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, " 664 "Kyosti Malkki <kmalkki@cc.hut.fi> and " 665 "Hong-Gunn Chew <hglinux@gunnet.org>"); 666MODULE_DESCRIPTION("GL518SM driver"); 667MODULE_LICENSE("GPL");