linux/drivers/hwmon/gl520sm.c
<<
>>
Prefs
   1/*
   2 * gl520sm.c - Part of lm_sensors, Linux kernel modules for hardware
   3 *             monitoring
   4 * Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>,
   5 *                           Kyösti Mälkki <kmalkki@cc.hut.fi>
   6 * Copyright (c) 2005   Maarten Deprez <maartendeprez@users.sourceforge.net>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21 *
  22 */
  23
  24#include <linux/module.h>
  25#include <linux/init.h>
  26#include <linux/slab.h>
  27#include <linux/jiffies.h>
  28#include <linux/i2c.h>
  29#include <linux/hwmon.h>
  30#include <linux/hwmon-sysfs.h>
  31#include <linux/hwmon-vid.h>
  32#include <linux/err.h>
  33#include <linux/mutex.h>
  34#include <linux/sysfs.h>
  35
  36/* Type of the extra sensor */
  37static unsigned short extra_sensor_type;
  38module_param(extra_sensor_type, ushort, 0);
  39MODULE_PARM_DESC(extra_sensor_type, "Type of extra sensor (0=autodetect, 1=temperature, 2=voltage)");
  40
  41/* Addresses to scan */
  42static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
  43
  44/*
  45 * Many GL520 constants specified below
  46 * One of the inputs can be configured as either temp or voltage.
  47 * That's why _TEMP2 and _IN4 access the same register
  48 */
  49
  50/* The GL520 registers */
  51#define GL520_REG_CHIP_ID               0x00
  52#define GL520_REG_REVISION              0x01
  53#define GL520_REG_CONF                  0x03
  54#define GL520_REG_MASK                  0x11
  55
  56#define GL520_REG_VID_INPUT             0x02
  57
  58static const u8 GL520_REG_IN_INPUT[]    = { 0x15, 0x14, 0x13, 0x0d, 0x0e };
  59static const u8 GL520_REG_IN_LIMIT[]    = { 0x0c, 0x09, 0x0a, 0x0b };
  60static const u8 GL520_REG_IN_MIN[]      = { 0x0c, 0x09, 0x0a, 0x0b, 0x18 };
  61static const u8 GL520_REG_IN_MAX[]      = { 0x0c, 0x09, 0x0a, 0x0b, 0x17 };
  62
  63static const u8 GL520_REG_TEMP_INPUT[]          = { 0x04, 0x0e };
  64static const u8 GL520_REG_TEMP_MAX[]            = { 0x05, 0x17 };
  65static const u8 GL520_REG_TEMP_MAX_HYST[]       = { 0x06, 0x18 };
  66
  67#define GL520_REG_FAN_INPUT             0x07
  68#define GL520_REG_FAN_MIN               0x08
  69#define GL520_REG_FAN_DIV               0x0f
  70#define GL520_REG_FAN_OFF               GL520_REG_FAN_DIV
  71
  72#define GL520_REG_ALARMS                0x12
  73#define GL520_REG_BEEP_MASK             0x10
  74#define GL520_REG_BEEP_ENABLE           GL520_REG_CONF
  75
  76/* Client data */
  77struct gl520_data {
  78        struct i2c_client *client;
  79        const struct attribute_group *groups[3];
  80        struct mutex update_lock;
  81        char valid;             /* zero until the following fields are valid */
  82        unsigned long last_updated;     /* in jiffies */
  83
  84        u8 vid;
  85        u8 vrm;
  86        u8 in_input[5];         /* [0] = VVD */
  87        u8 in_min[5];           /* [0] = VDD */
  88        u8 in_max[5];           /* [0] = VDD */
  89        u8 fan_input[2];
  90        u8 fan_min[2];
  91        u8 fan_div[2];
  92        u8 fan_off;
  93        u8 temp_input[2];
  94        u8 temp_max[2];
  95        u8 temp_max_hyst[2];
  96        u8 alarms;
  97        u8 beep_enable;
  98        u8 beep_mask;
  99        u8 alarm_mask;
 100        u8 two_temps;
 101};
 102
 103/*
 104 * Registers 0x07 to 0x0c are word-sized, others are byte-sized
 105 * GL520 uses a high-byte first convention
 106 */
 107static int gl520_read_value(struct i2c_client *client, u8 reg)
 108{
 109        if ((reg >= 0x07) && (reg <= 0x0c))
 110                return i2c_smbus_read_word_swapped(client, reg);
 111        else
 112                return i2c_smbus_read_byte_data(client, reg);
 113}
 114
 115static int gl520_write_value(struct i2c_client *client, u8 reg, u16 value)
 116{
 117        if ((reg >= 0x07) && (reg <= 0x0c))
 118                return i2c_smbus_write_word_swapped(client, reg, value);
 119        else
 120                return i2c_smbus_write_byte_data(client, reg, value);
 121}
 122
 123static struct gl520_data *gl520_update_device(struct device *dev)
 124{
 125        struct gl520_data *data = dev_get_drvdata(dev);
 126        struct i2c_client *client = data->client;
 127        int val, i;
 128
 129        mutex_lock(&data->update_lock);
 130
 131        if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
 132
 133                dev_dbg(&client->dev, "Starting gl520sm update\n");
 134
 135                data->alarms = gl520_read_value(client, GL520_REG_ALARMS);
 136                data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
 137                data->vid = gl520_read_value(client,
 138                                             GL520_REG_VID_INPUT) & 0x1f;
 139
 140                for (i = 0; i < 4; i++) {
 141                        data->in_input[i] = gl520_read_value(client,
 142                                                        GL520_REG_IN_INPUT[i]);
 143                        val = gl520_read_value(client, GL520_REG_IN_LIMIT[i]);
 144                        data->in_min[i] = val & 0xff;
 145                        data->in_max[i] = (val >> 8) & 0xff;
 146                }
 147
 148                val = gl520_read_value(client, GL520_REG_FAN_INPUT);
 149                data->fan_input[0] = (val >> 8) & 0xff;
 150                data->fan_input[1] = val & 0xff;
 151
 152                val = gl520_read_value(client, GL520_REG_FAN_MIN);
 153                data->fan_min[0] = (val >> 8) & 0xff;
 154                data->fan_min[1] = val & 0xff;
 155
 156                data->temp_input[0] = gl520_read_value(client,
 157                                                GL520_REG_TEMP_INPUT[0]);
 158                data->temp_max[0] = gl520_read_value(client,
 159                                                GL520_REG_TEMP_MAX[0]);
 160                data->temp_max_hyst[0] = gl520_read_value(client,
 161                                                GL520_REG_TEMP_MAX_HYST[0]);
 162
 163                val = gl520_read_value(client, GL520_REG_FAN_DIV);
 164                data->fan_div[0] = (val >> 6) & 0x03;
 165                data->fan_div[1] = (val >> 4) & 0x03;
 166                data->fan_off = (val >> 2) & 0x01;
 167
 168                data->alarms &= data->alarm_mask;
 169
 170                val = gl520_read_value(client, GL520_REG_CONF);
 171                data->beep_enable = !((val >> 2) & 1);
 172
 173                /* Temp1 and Vin4 are the same input */
 174                if (data->two_temps) {
 175                        data->temp_input[1] = gl520_read_value(client,
 176                                                GL520_REG_TEMP_INPUT[1]);
 177                        data->temp_max[1] = gl520_read_value(client,
 178                                                GL520_REG_TEMP_MAX[1]);
 179                        data->temp_max_hyst[1] = gl520_read_value(client,
 180                                                GL520_REG_TEMP_MAX_HYST[1]);
 181                } else {
 182                        data->in_input[4] = gl520_read_value(client,
 183                                                GL520_REG_IN_INPUT[4]);
 184                        data->in_min[4] = gl520_read_value(client,
 185                                                GL520_REG_IN_MIN[4]);
 186                        data->in_max[4] = gl520_read_value(client,
 187                                                GL520_REG_IN_MAX[4]);
 188                }
 189
 190                data->last_updated = jiffies;
 191                data->valid = 1;
 192        }
 193
 194        mutex_unlock(&data->update_lock);
 195
 196        return data;
 197}
 198
 199/*
 200 * Sysfs stuff
 201 */
 202
 203static ssize_t get_cpu_vid(struct device *dev, struct device_attribute *attr,
 204                           char *buf)
 205{
 206        struct gl520_data *data = gl520_update_device(dev);
 207        return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
 208}
 209static DEVICE_ATTR(cpu0_vid, S_IRUGO, get_cpu_vid, NULL);
 210
 211#define VDD_FROM_REG(val) (((val) * 95 + 2) / 4)
 212#define VDD_TO_REG(val) clamp_val((((val) * 4 + 47) / 95), 0, 255)
 213
 214#define IN_FROM_REG(val) ((val) * 19)
 215#define IN_TO_REG(val) clamp_val((((val) + 9) / 19), 0, 255)
 216
 217static ssize_t get_in_input(struct device *dev, struct device_attribute *attr,
 218                            char *buf)
 219{
 220        int n = to_sensor_dev_attr(attr)->index;
 221        struct gl520_data *data = gl520_update_device(dev);
 222        u8 r = data->in_input[n];
 223
 224        if (n == 0)
 225                return sprintf(buf, "%d\n", VDD_FROM_REG(r));
 226        else
 227                return sprintf(buf, "%d\n", IN_FROM_REG(r));
 228}
 229
 230static ssize_t get_in_min(struct device *dev, struct device_attribute *attr,
 231                          char *buf)
 232{
 233        int n = to_sensor_dev_attr(attr)->index;
 234        struct gl520_data *data = gl520_update_device(dev);
 235        u8 r = data->in_min[n];
 236
 237        if (n == 0)
 238                return sprintf(buf, "%d\n", VDD_FROM_REG(r));
 239        else
 240                return sprintf(buf, "%d\n", IN_FROM_REG(r));
 241}
 242
 243static ssize_t get_in_max(struct device *dev, struct device_attribute *attr,
 244                          char *buf)
 245{
 246        int n = to_sensor_dev_attr(attr)->index;
 247        struct gl520_data *data = gl520_update_device(dev);
 248        u8 r = data->in_max[n];
 249
 250        if (n == 0)
 251                return sprintf(buf, "%d\n", VDD_FROM_REG(r));
 252        else
 253                return sprintf(buf, "%d\n", IN_FROM_REG(r));
 254}
 255
 256static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
 257                          const char *buf, size_t count)
 258{
 259        struct gl520_data *data = dev_get_drvdata(dev);
 260        struct i2c_client *client = data->client;
 261        int n = to_sensor_dev_attr(attr)->index;
 262        u8 r;
 263        long v;
 264        int err;
 265
 266        err = kstrtol(buf, 10, &v);
 267        if (err)
 268                return err;
 269
 270        mutex_lock(&data->update_lock);
 271
 272        if (n == 0)
 273                r = VDD_TO_REG(v);
 274        else
 275                r = IN_TO_REG(v);
 276
 277        data->in_min[n] = r;
 278
 279        if (n < 4)
 280                gl520_write_value(client, GL520_REG_IN_MIN[n],
 281                                  (gl520_read_value(client, GL520_REG_IN_MIN[n])
 282                                   & ~0xff) | r);
 283        else
 284                gl520_write_value(client, GL520_REG_IN_MIN[n], r);
 285
 286        mutex_unlock(&data->update_lock);
 287        return count;
 288}
 289
 290static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
 291                          const char *buf, size_t count)
 292{
 293        struct gl520_data *data = dev_get_drvdata(dev);
 294        struct i2c_client *client = data->client;
 295        int n = to_sensor_dev_attr(attr)->index;
 296        u8 r;
 297        long v;
 298        int err;
 299
 300        err = kstrtol(buf, 10, &v);
 301        if (err)
 302                return err;
 303
 304        if (n == 0)
 305                r = VDD_TO_REG(v);
 306        else
 307                r = IN_TO_REG(v);
 308
 309        mutex_lock(&data->update_lock);
 310
 311        data->in_max[n] = r;
 312
 313        if (n < 4)
 314                gl520_write_value(client, GL520_REG_IN_MAX[n],
 315                                  (gl520_read_value(client, GL520_REG_IN_MAX[n])
 316                                   & ~0xff00) | (r << 8));
 317        else
 318                gl520_write_value(client, GL520_REG_IN_MAX[n], r);
 319
 320        mutex_unlock(&data->update_lock);
 321        return count;
 322}
 323
 324static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, get_in_input, NULL, 0);
 325static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, get_in_input, NULL, 1);
 326static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, get_in_input, NULL, 2);
 327static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, get_in_input, NULL, 3);
 328static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, get_in_input, NULL, 4);
 329static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO | S_IWUSR,
 330                get_in_min, set_in_min, 0);
 331static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR,
 332                get_in_min, set_in_min, 1);
 333static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
 334                get_in_min, set_in_min, 2);
 335static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
 336                get_in_min, set_in_min, 3);
 337static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
 338                get_in_min, set_in_min, 4);
 339static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR,
 340                get_in_max, set_in_max, 0);
 341static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR,
 342                get_in_max, set_in_max, 1);
 343static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
 344                get_in_max, set_in_max, 2);
 345static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
 346                get_in_max, set_in_max, 3);
 347static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
 348                get_in_max, set_in_max, 4);
 349
 350#define DIV_FROM_REG(val) (1 << (val))
 351#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) << (div))))
 352#define FAN_TO_REG(val, div) ((val) <= 0 ? 0 : \
 353        clamp_val((480000 + ((val) << ((div)-1))) / ((val) << (div)), 1, 255))
 354
 355static ssize_t get_fan_input(struct device *dev, struct device_attribute *attr,
 356                             char *buf)
 357{
 358        int n = to_sensor_dev_attr(attr)->index;
 359        struct gl520_data *data = gl520_update_device(dev);
 360
 361        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_input[n],
 362                                                 data->fan_div[n]));
 363}
 364
 365static ssize_t get_fan_min(struct device *dev, struct device_attribute *attr,
 366                           char *buf)
 367{
 368        int n = to_sensor_dev_attr(attr)->index;
 369        struct gl520_data *data = gl520_update_device(dev);
 370
 371        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[n],
 372                                                 data->fan_div[n]));
 373}
 374
 375static ssize_t get_fan_div(struct device *dev, struct device_attribute *attr,
 376                           char *buf)
 377{
 378        int n = to_sensor_dev_attr(attr)->index;
 379        struct gl520_data *data = gl520_update_device(dev);
 380
 381        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[n]));
 382}
 383
 384static ssize_t get_fan_off(struct device *dev, struct device_attribute *attr,
 385                           char *buf)
 386{
 387        struct gl520_data *data = gl520_update_device(dev);
 388        return sprintf(buf, "%d\n", data->fan_off);
 389}
 390
 391static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
 392                           const char *buf, size_t count)
 393{
 394        struct gl520_data *data = dev_get_drvdata(dev);
 395        struct i2c_client *client = data->client;
 396        int n = to_sensor_dev_attr(attr)->index;
 397        u8 r;
 398        unsigned long v;
 399        int err;
 400
 401        err = kstrtoul(buf, 10, &v);
 402        if (err)
 403                return err;
 404
 405        mutex_lock(&data->update_lock);
 406        r = FAN_TO_REG(v, data->fan_div[n]);
 407        data->fan_min[n] = r;
 408
 409        if (n == 0)
 410                gl520_write_value(client, GL520_REG_FAN_MIN,
 411                                  (gl520_read_value(client, GL520_REG_FAN_MIN)
 412                                   & ~0xff00) | (r << 8));
 413        else
 414                gl520_write_value(client, GL520_REG_FAN_MIN,
 415                                  (gl520_read_value(client, GL520_REG_FAN_MIN)
 416                                   & ~0xff) | r);
 417
 418        data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
 419        if (data->fan_min[n] == 0)
 420                data->alarm_mask &= (n == 0) ? ~0x20 : ~0x40;
 421        else
 422                data->alarm_mask |= (n == 0) ? 0x20 : 0x40;
 423        data->beep_mask &= data->alarm_mask;
 424        gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
 425
 426        mutex_unlock(&data->update_lock);
 427        return count;
 428}
 429
 430static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
 431                           const char *buf, size_t count)
 432{
 433        struct gl520_data *data = dev_get_drvdata(dev);
 434        struct i2c_client *client = data->client;
 435        int n = to_sensor_dev_attr(attr)->index;
 436        u8 r;
 437        unsigned long v;
 438        int err;
 439
 440        err = kstrtoul(buf, 10, &v);
 441        if (err)
 442                return err;
 443
 444        switch (v) {
 445        case 1:
 446                r = 0;
 447                break;
 448        case 2:
 449                r = 1;
 450                break;
 451        case 4:
 452                r = 2;
 453                break;
 454        case 8:
 455                r = 3;
 456                break;
 457        default:
 458                dev_err(&client->dev,
 459        "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n", v);
 460                return -EINVAL;
 461        }
 462
 463        mutex_lock(&data->update_lock);
 464        data->fan_div[n] = r;
 465
 466        if (n == 0)
 467                gl520_write_value(client, GL520_REG_FAN_DIV,
 468                                  (gl520_read_value(client, GL520_REG_FAN_DIV)
 469                                   & ~0xc0) | (r << 6));
 470        else
 471                gl520_write_value(client, GL520_REG_FAN_DIV,
 472                                  (gl520_read_value(client, GL520_REG_FAN_DIV)
 473                                   & ~0x30) | (r << 4));
 474
 475        mutex_unlock(&data->update_lock);
 476        return count;
 477}
 478
 479static ssize_t set_fan_off(struct device *dev, struct device_attribute *attr,
 480                           const char *buf, size_t count)
 481{
 482        struct gl520_data *data = dev_get_drvdata(dev);
 483        struct i2c_client *client = data->client;
 484        u8 r;
 485        unsigned long v;
 486        int err;
 487
 488        err = kstrtoul(buf, 10, &v);
 489        if (err)
 490                return err;
 491
 492        r = (v ? 1 : 0);
 493
 494        mutex_lock(&data->update_lock);
 495        data->fan_off = r;
 496        gl520_write_value(client, GL520_REG_FAN_OFF,
 497                          (gl520_read_value(client, GL520_REG_FAN_OFF)
 498                           & ~0x0c) | (r << 2));
 499        mutex_unlock(&data->update_lock);
 500        return count;
 501}
 502
 503static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan_input, NULL, 0);
 504static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan_input, NULL, 1);
 505static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
 506                get_fan_min, set_fan_min, 0);
 507static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
 508                get_fan_min, set_fan_min, 1);
 509static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
 510                get_fan_div, set_fan_div, 0);
 511static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
 512                get_fan_div, set_fan_div, 1);
 513static DEVICE_ATTR(fan1_off, S_IRUGO | S_IWUSR,
 514                get_fan_off, set_fan_off);
 515
 516#define TEMP_FROM_REG(val) (((val) - 130) * 1000)
 517#define TEMP_TO_REG(val) clamp_val(((((val) < 0 ? \
 518                        (val) - 500 : (val) + 500) / 1000) + 130), 0, 255)
 519
 520static ssize_t get_temp_input(struct device *dev, struct device_attribute *attr,
 521                              char *buf)
 522{
 523        int n = to_sensor_dev_attr(attr)->index;
 524        struct gl520_data *data = gl520_update_device(dev);
 525
 526        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_input[n]));
 527}
 528
 529static ssize_t get_temp_max(struct device *dev, struct device_attribute *attr,
 530                            char *buf)
 531{
 532        int n = to_sensor_dev_attr(attr)->index;
 533        struct gl520_data *data = gl520_update_device(dev);
 534
 535        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[n]));
 536}
 537
 538static ssize_t get_temp_max_hyst(struct device *dev,
 539                                 struct device_attribute *attr, char *buf)
 540{
 541        int n = to_sensor_dev_attr(attr)->index;
 542        struct gl520_data *data = gl520_update_device(dev);
 543
 544        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max_hyst[n]));
 545}
 546
 547static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
 548                            const char *buf, size_t count)
 549{
 550        struct gl520_data *data = dev_get_drvdata(dev);
 551        struct i2c_client *client = data->client;
 552        int n = to_sensor_dev_attr(attr)->index;
 553        long v;
 554        int err;
 555
 556        err = kstrtol(buf, 10, &v);
 557        if (err)
 558                return err;
 559
 560        mutex_lock(&data->update_lock);
 561        data->temp_max[n] = TEMP_TO_REG(v);
 562        gl520_write_value(client, GL520_REG_TEMP_MAX[n], data->temp_max[n]);
 563        mutex_unlock(&data->update_lock);
 564        return count;
 565}
 566
 567static ssize_t set_temp_max_hyst(struct device *dev, struct device_attribute
 568                                 *attr, const char *buf, size_t count)
 569{
 570        struct gl520_data *data = dev_get_drvdata(dev);
 571        struct i2c_client *client = data->client;
 572        int n = to_sensor_dev_attr(attr)->index;
 573        long v;
 574        int err;
 575
 576        err = kstrtol(buf, 10, &v);
 577        if (err)
 578                return err;
 579
 580        mutex_lock(&data->update_lock);
 581        data->temp_max_hyst[n] = TEMP_TO_REG(v);
 582        gl520_write_value(client, GL520_REG_TEMP_MAX_HYST[n],
 583                          data->temp_max_hyst[n]);
 584        mutex_unlock(&data->update_lock);
 585        return count;
 586}
 587
 588static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, get_temp_input, NULL, 0);
 589static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, get_temp_input, NULL, 1);
 590static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
 591                get_temp_max, set_temp_max, 0);
 592static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
 593                get_temp_max, set_temp_max, 1);
 594static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
 595                get_temp_max_hyst, set_temp_max_hyst, 0);
 596static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
 597                get_temp_max_hyst, set_temp_max_hyst, 1);
 598
 599static ssize_t get_alarms(struct device *dev, struct device_attribute *attr,
 600                          char *buf)
 601{
 602        struct gl520_data *data = gl520_update_device(dev);
 603        return sprintf(buf, "%d\n", data->alarms);
 604}
 605
 606static ssize_t get_beep_enable(struct device *dev, struct device_attribute
 607                               *attr, char *buf)
 608{
 609        struct gl520_data *data = gl520_update_device(dev);
 610        return sprintf(buf, "%d\n", data->beep_enable);
 611}
 612
 613static ssize_t get_beep_mask(struct device *dev, struct device_attribute *attr,
 614                             char *buf)
 615{
 616        struct gl520_data *data = gl520_update_device(dev);
 617        return sprintf(buf, "%d\n", data->beep_mask);
 618}
 619
 620static ssize_t set_beep_enable(struct device *dev, struct device_attribute
 621                               *attr, const char *buf, size_t count)
 622{
 623        struct gl520_data *data = dev_get_drvdata(dev);
 624        struct i2c_client *client = data->client;
 625        u8 r;
 626        unsigned long v;
 627        int err;
 628
 629        err = kstrtoul(buf, 10, &v);
 630        if (err)
 631                return err;
 632
 633        r = (v ? 0 : 1);
 634
 635        mutex_lock(&data->update_lock);
 636        data->beep_enable = !r;
 637        gl520_write_value(client, GL520_REG_BEEP_ENABLE,
 638                          (gl520_read_value(client, GL520_REG_BEEP_ENABLE)
 639                           & ~0x04) | (r << 2));
 640        mutex_unlock(&data->update_lock);
 641        return count;
 642}
 643
 644static ssize_t set_beep_mask(struct device *dev, struct device_attribute *attr,
 645                             const char *buf, size_t count)
 646{
 647        struct gl520_data *data = dev_get_drvdata(dev);
 648        struct i2c_client *client = data->client;
 649        unsigned long r;
 650        int err;
 651
 652        err = kstrtoul(buf, 10, &r);
 653        if (err)
 654                return err;
 655
 656        mutex_lock(&data->update_lock);
 657        r &= data->alarm_mask;
 658        data->beep_mask = r;
 659        gl520_write_value(client, GL520_REG_BEEP_MASK, r);
 660        mutex_unlock(&data->update_lock);
 661        return count;
 662}
 663
 664static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
 665static DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR,
 666                get_beep_enable, set_beep_enable);
 667static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR,
 668                get_beep_mask, set_beep_mask);
 669
 670static ssize_t get_alarm(struct device *dev, struct device_attribute *attr,
 671                         char *buf)
 672{
 673        int bit_nr = to_sensor_dev_attr(attr)->index;
 674        struct gl520_data *data = gl520_update_device(dev);
 675
 676        return sprintf(buf, "%d\n", (data->alarms >> bit_nr) & 1);
 677}
 678
 679static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, get_alarm, NULL, 0);
 680static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, get_alarm, NULL, 1);
 681static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, get_alarm, NULL, 2);
 682static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, get_alarm, NULL, 3);
 683static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, get_alarm, NULL, 4);
 684static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, get_alarm, NULL, 5);
 685static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, get_alarm, NULL, 6);
 686static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, get_alarm, NULL, 7);
 687static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, get_alarm, NULL, 7);
 688
 689static ssize_t get_beep(struct device *dev, struct device_attribute *attr,
 690                        char *buf)
 691{
 692        int bitnr = to_sensor_dev_attr(attr)->index;
 693        struct gl520_data *data = gl520_update_device(dev);
 694
 695        return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);
 696}
 697
 698static ssize_t set_beep(struct device *dev, struct device_attribute *attr,
 699                        const char *buf, size_t count)
 700{
 701        struct gl520_data *data = dev_get_drvdata(dev);
 702        struct i2c_client *client = data->client;
 703        int bitnr = to_sensor_dev_attr(attr)->index;
 704        unsigned long bit;
 705
 706        int err;
 707
 708        err = kstrtoul(buf, 10, &bit);
 709        if (err)
 710                return err;
 711        if (bit & ~1)
 712                return -EINVAL;
 713
 714        mutex_lock(&data->update_lock);
 715        data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
 716        if (bit)
 717                data->beep_mask |= (1 << bitnr);
 718        else
 719                data->beep_mask &= ~(1 << bitnr);
 720        gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
 721        mutex_unlock(&data->update_lock);
 722        return count;
 723}
 724
 725static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 0);
 726static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 1);
 727static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 2);
 728static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 3);
 729static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 4);
 730static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 5);
 731static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 6);
 732static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 7);
 733static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO | S_IWUSR, get_beep, set_beep, 7);
 734
 735static struct attribute *gl520_attributes[] = {
 736        &dev_attr_cpu0_vid.attr,
 737
 738        &sensor_dev_attr_in0_input.dev_attr.attr,
 739        &sensor_dev_attr_in0_min.dev_attr.attr,
 740        &sensor_dev_attr_in0_max.dev_attr.attr,
 741        &sensor_dev_attr_in0_alarm.dev_attr.attr,
 742        &sensor_dev_attr_in0_beep.dev_attr.attr,
 743        &sensor_dev_attr_in1_input.dev_attr.attr,
 744        &sensor_dev_attr_in1_min.dev_attr.attr,
 745        &sensor_dev_attr_in1_max.dev_attr.attr,
 746        &sensor_dev_attr_in1_alarm.dev_attr.attr,
 747        &sensor_dev_attr_in1_beep.dev_attr.attr,
 748        &sensor_dev_attr_in2_input.dev_attr.attr,
 749        &sensor_dev_attr_in2_min.dev_attr.attr,
 750        &sensor_dev_attr_in2_max.dev_attr.attr,
 751        &sensor_dev_attr_in2_alarm.dev_attr.attr,
 752        &sensor_dev_attr_in2_beep.dev_attr.attr,
 753        &sensor_dev_attr_in3_input.dev_attr.attr,
 754        &sensor_dev_attr_in3_min.dev_attr.attr,
 755        &sensor_dev_attr_in3_max.dev_attr.attr,
 756        &sensor_dev_attr_in3_alarm.dev_attr.attr,
 757        &sensor_dev_attr_in3_beep.dev_attr.attr,
 758
 759        &sensor_dev_attr_fan1_input.dev_attr.attr,
 760        &sensor_dev_attr_fan1_min.dev_attr.attr,
 761        &sensor_dev_attr_fan1_div.dev_attr.attr,
 762        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 763        &sensor_dev_attr_fan1_beep.dev_attr.attr,
 764        &dev_attr_fan1_off.attr,
 765        &sensor_dev_attr_fan2_input.dev_attr.attr,
 766        &sensor_dev_attr_fan2_min.dev_attr.attr,
 767        &sensor_dev_attr_fan2_div.dev_attr.attr,
 768        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 769        &sensor_dev_attr_fan2_beep.dev_attr.attr,
 770
 771        &sensor_dev_attr_temp1_input.dev_attr.attr,
 772        &sensor_dev_attr_temp1_max.dev_attr.attr,
 773        &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
 774        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 775        &sensor_dev_attr_temp1_beep.dev_attr.attr,
 776
 777        &dev_attr_alarms.attr,
 778        &dev_attr_beep_enable.attr,
 779        &dev_attr_beep_mask.attr,
 780        NULL
 781};
 782
 783static const struct attribute_group gl520_group = {
 784        .attrs = gl520_attributes,
 785};
 786
 787static struct attribute *gl520_attributes_in4[] = {
 788        &sensor_dev_attr_in4_input.dev_attr.attr,
 789        &sensor_dev_attr_in4_min.dev_attr.attr,
 790        &sensor_dev_attr_in4_max.dev_attr.attr,
 791        &sensor_dev_attr_in4_alarm.dev_attr.attr,
 792        &sensor_dev_attr_in4_beep.dev_attr.attr,
 793        NULL
 794};
 795
 796static struct attribute *gl520_attributes_temp2[] = {
 797        &sensor_dev_attr_temp2_input.dev_attr.attr,
 798        &sensor_dev_attr_temp2_max.dev_attr.attr,
 799        &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
 800        &sensor_dev_attr_temp2_alarm.dev_attr.attr,
 801        &sensor_dev_attr_temp2_beep.dev_attr.attr,
 802        NULL
 803};
 804
 805static const struct attribute_group gl520_group_in4 = {
 806        .attrs = gl520_attributes_in4,
 807};
 808
 809static const struct attribute_group gl520_group_temp2 = {
 810        .attrs = gl520_attributes_temp2,
 811};
 812
 813
 814/*
 815 * Real code
 816 */
 817
 818/* Return 0 if detection is successful, -ENODEV otherwise */
 819static int gl520_detect(struct i2c_client *client, struct i2c_board_info *info)
 820{
 821        struct i2c_adapter *adapter = client->adapter;
 822
 823        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
 824                                     I2C_FUNC_SMBUS_WORD_DATA))
 825                return -ENODEV;
 826
 827        /* Determine the chip type. */
 828        if ((gl520_read_value(client, GL520_REG_CHIP_ID) != 0x20) ||
 829            ((gl520_read_value(client, GL520_REG_REVISION) & 0x7f) != 0x00) ||
 830            ((gl520_read_value(client, GL520_REG_CONF) & 0x80) != 0x00)) {
 831                dev_dbg(&client->dev, "Unknown chip type, skipping\n");
 832                return -ENODEV;
 833        }
 834
 835        strlcpy(info->type, "gl520sm", I2C_NAME_SIZE);
 836
 837        return 0;
 838}
 839
 840/* Called when we have found a new GL520SM. */
 841static void gl520_init_client(struct i2c_client *client)
 842{
 843        struct gl520_data *data = i2c_get_clientdata(client);
 844        u8 oldconf, conf;
 845
 846        conf = oldconf = gl520_read_value(client, GL520_REG_CONF);
 847
 848        data->alarm_mask = 0xff;
 849        data->vrm = vid_which_vrm();
 850
 851        if (extra_sensor_type == 1)
 852                conf &= ~0x10;
 853        else if (extra_sensor_type == 2)
 854                conf |= 0x10;
 855        data->two_temps = !(conf & 0x10);
 856
 857        /* If IRQ# is disabled, we can safely force comparator mode */
 858        if (!(conf & 0x20))
 859                conf &= 0xf7;
 860
 861        /* Enable monitoring if needed */
 862        conf |= 0x40;
 863
 864        if (conf != oldconf)
 865                gl520_write_value(client, GL520_REG_CONF, conf);
 866
 867        gl520_update_device(&(client->dev));
 868
 869        if (data->fan_min[0] == 0)
 870                data->alarm_mask &= ~0x20;
 871        if (data->fan_min[1] == 0)
 872                data->alarm_mask &= ~0x40;
 873
 874        data->beep_mask &= data->alarm_mask;
 875        gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
 876}
 877
 878static int gl520_probe(struct i2c_client *client,
 879                       const struct i2c_device_id *id)
 880{
 881        struct device *dev = &client->dev;
 882        struct device *hwmon_dev;
 883        struct gl520_data *data;
 884
 885        data = devm_kzalloc(dev, sizeof(struct gl520_data), GFP_KERNEL);
 886        if (!data)
 887                return -ENOMEM;
 888
 889        i2c_set_clientdata(client, data);
 890        mutex_init(&data->update_lock);
 891        data->client = client;
 892
 893        /* Initialize the GL520SM chip */
 894        gl520_init_client(client);
 895
 896        /* sysfs hooks */
 897        data->groups[0] = &gl520_group;
 898
 899        if (data->two_temps)
 900                data->groups[1] = &gl520_group_temp2;
 901        else
 902                data->groups[1] = &gl520_group_in4;
 903
 904        hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
 905                                                           data, data->groups);
 906        return PTR_ERR_OR_ZERO(hwmon_dev);
 907}
 908
 909static const struct i2c_device_id gl520_id[] = {
 910        { "gl520sm", 0 },
 911        { }
 912};
 913MODULE_DEVICE_TABLE(i2c, gl520_id);
 914
 915static struct i2c_driver gl520_driver = {
 916        .class          = I2C_CLASS_HWMON,
 917        .driver = {
 918                .name   = "gl520sm",
 919        },
 920        .probe          = gl520_probe,
 921        .id_table       = gl520_id,
 922        .detect         = gl520_detect,
 923        .address_list   = normal_i2c,
 924};
 925
 926module_i2c_driver(gl520_driver);
 927
 928MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
 929        "Kyösti Mälkki <kmalkki@cc.hut.fi>, "
 930        "Maarten Deprez <maartendeprez@users.sourceforge.net>");
 931MODULE_DESCRIPTION("GL520SM driver");
 932MODULE_LICENSE("GPL");
 933