linux/drivers/hwmon/max1668.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (c) 2011 David George <david.george@ska.ac.za>
   4 *
   5 * based on adm1021.c
   6 * some credit to Christoph Scheurer, but largely a rewrite
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/init.h>
  11#include <linux/slab.h>
  12#include <linux/jiffies.h>
  13#include <linux/i2c.h>
  14#include <linux/hwmon.h>
  15#include <linux/hwmon-sysfs.h>
  16#include <linux/err.h>
  17#include <linux/mutex.h>
  18
  19/* Addresses to scan */
  20static const unsigned short max1668_addr_list[] = {
  21        0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END };
  22
  23/* max1668 registers */
  24
  25#define MAX1668_REG_TEMP(nr)    (nr)
  26#define MAX1668_REG_STAT1       0x05
  27#define MAX1668_REG_STAT2       0x06
  28#define MAX1668_REG_MAN_ID      0xfe
  29#define MAX1668_REG_DEV_ID      0xff
  30
  31/* limits */
  32
  33/* write high limits */
  34#define MAX1668_REG_LIMH_WR(nr) (0x13 + 2 * (nr))
  35/* write low limits */
  36#define MAX1668_REG_LIML_WR(nr) (0x14 + 2 * (nr))
  37/* read high limits */
  38#define MAX1668_REG_LIMH_RD(nr) (0x08 + 2 * (nr))
  39/* read low limits */
  40#define MAX1668_REG_LIML_RD(nr) (0x09 + 2 * (nr))
  41
  42/* manufacturer and device ID Constants */
  43#define MAN_ID_MAXIM            0x4d
  44#define DEV_ID_MAX1668          0x3
  45#define DEV_ID_MAX1805          0x5
  46#define DEV_ID_MAX1989          0xb
  47
  48/* read only mode module parameter */
  49static bool read_only;
  50module_param(read_only, bool, 0);
  51MODULE_PARM_DESC(read_only, "Don't set any values, read only mode");
  52
  53enum chips { max1668, max1805, max1989 };
  54
  55struct max1668_data {
  56        struct i2c_client *client;
  57        const struct attribute_group *groups[3];
  58        enum chips type;
  59
  60        struct mutex update_lock;
  61        char valid;             /* !=0 if following fields are valid */
  62        unsigned long last_updated;     /* In jiffies */
  63
  64        /* 1x local and 4x remote */
  65        s8 temp_max[5];
  66        s8 temp_min[5];
  67        s8 temp[5];
  68        u16 alarms;
  69};
  70
  71static struct max1668_data *max1668_update_device(struct device *dev)
  72{
  73        struct max1668_data *data = dev_get_drvdata(dev);
  74        struct i2c_client *client = data->client;
  75        struct max1668_data *ret = data;
  76        s32 val;
  77        int i;
  78
  79        mutex_lock(&data->update_lock);
  80
  81        if (data->valid && !time_after(jiffies,
  82                        data->last_updated + HZ + HZ / 2))
  83                goto abort;
  84
  85        for (i = 0; i < 5; i++) {
  86                val = i2c_smbus_read_byte_data(client, MAX1668_REG_TEMP(i));
  87                if (unlikely(val < 0)) {
  88                        ret = ERR_PTR(val);
  89                        goto abort;
  90                }
  91                data->temp[i] = (s8) val;
  92
  93                val = i2c_smbus_read_byte_data(client, MAX1668_REG_LIMH_RD(i));
  94                if (unlikely(val < 0)) {
  95                        ret = ERR_PTR(val);
  96                        goto abort;
  97                }
  98                data->temp_max[i] = (s8) val;
  99
 100                val = i2c_smbus_read_byte_data(client, MAX1668_REG_LIML_RD(i));
 101                if (unlikely(val < 0)) {
 102                        ret = ERR_PTR(val);
 103                        goto abort;
 104                }
 105                data->temp_min[i] = (s8) val;
 106        }
 107
 108        val = i2c_smbus_read_byte_data(client, MAX1668_REG_STAT1);
 109        if (unlikely(val < 0)) {
 110                ret = ERR_PTR(val);
 111                goto abort;
 112        }
 113        data->alarms = val << 8;
 114
 115        val = i2c_smbus_read_byte_data(client, MAX1668_REG_STAT2);
 116        if (unlikely(val < 0)) {
 117                ret = ERR_PTR(val);
 118                goto abort;
 119        }
 120        data->alarms |= val;
 121
 122        data->last_updated = jiffies;
 123        data->valid = 1;
 124abort:
 125        mutex_unlock(&data->update_lock);
 126
 127        return ret;
 128}
 129
 130static ssize_t show_temp(struct device *dev,
 131                         struct device_attribute *devattr, char *buf)
 132{
 133        int index = to_sensor_dev_attr(devattr)->index;
 134        struct max1668_data *data = max1668_update_device(dev);
 135
 136        if (IS_ERR(data))
 137                return PTR_ERR(data);
 138
 139        return sprintf(buf, "%d\n", data->temp[index] * 1000);
 140}
 141
 142static ssize_t show_temp_max(struct device *dev,
 143                             struct device_attribute *devattr, char *buf)
 144{
 145        int index = to_sensor_dev_attr(devattr)->index;
 146        struct max1668_data *data = max1668_update_device(dev);
 147
 148        if (IS_ERR(data))
 149                return PTR_ERR(data);
 150
 151        return sprintf(buf, "%d\n", data->temp_max[index] * 1000);
 152}
 153
 154static ssize_t show_temp_min(struct device *dev,
 155                             struct device_attribute *devattr, char *buf)
 156{
 157        int index = to_sensor_dev_attr(devattr)->index;
 158        struct max1668_data *data = max1668_update_device(dev);
 159
 160        if (IS_ERR(data))
 161                return PTR_ERR(data);
 162
 163        return sprintf(buf, "%d\n", data->temp_min[index] * 1000);
 164}
 165
 166static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
 167                          char *buf)
 168{
 169        int index = to_sensor_dev_attr(attr)->index;
 170        struct max1668_data *data = max1668_update_device(dev);
 171
 172        if (IS_ERR(data))
 173                return PTR_ERR(data);
 174
 175        return sprintf(buf, "%u\n", (data->alarms >> index) & 0x1);
 176}
 177
 178static ssize_t show_fault(struct device *dev,
 179                          struct device_attribute *devattr, char *buf)
 180{
 181        int index = to_sensor_dev_attr(devattr)->index;
 182        struct max1668_data *data = max1668_update_device(dev);
 183
 184        if (IS_ERR(data))
 185                return PTR_ERR(data);
 186
 187        return sprintf(buf, "%u\n",
 188                       (data->alarms & (1 << 12)) && data->temp[index] == 127);
 189}
 190
 191static ssize_t set_temp_max(struct device *dev,
 192                            struct device_attribute *devattr,
 193                            const char *buf, size_t count)
 194{
 195        int index = to_sensor_dev_attr(devattr)->index;
 196        struct max1668_data *data = dev_get_drvdata(dev);
 197        struct i2c_client *client = data->client;
 198        long temp;
 199        int ret;
 200
 201        ret = kstrtol(buf, 10, &temp);
 202        if (ret < 0)
 203                return ret;
 204
 205        mutex_lock(&data->update_lock);
 206        data->temp_max[index] = clamp_val(temp/1000, -128, 127);
 207        ret = i2c_smbus_write_byte_data(client,
 208                                        MAX1668_REG_LIMH_WR(index),
 209                                        data->temp_max[index]);
 210        if (ret < 0)
 211                count = ret;
 212        mutex_unlock(&data->update_lock);
 213
 214        return count;
 215}
 216
 217static ssize_t set_temp_min(struct device *dev,
 218                            struct device_attribute *devattr,
 219                            const char *buf, size_t count)
 220{
 221        int index = to_sensor_dev_attr(devattr)->index;
 222        struct max1668_data *data = dev_get_drvdata(dev);
 223        struct i2c_client *client = data->client;
 224        long temp;
 225        int ret;
 226
 227        ret = kstrtol(buf, 10, &temp);
 228        if (ret < 0)
 229                return ret;
 230
 231        mutex_lock(&data->update_lock);
 232        data->temp_min[index] = clamp_val(temp/1000, -128, 127);
 233        ret = i2c_smbus_write_byte_data(client,
 234                                        MAX1668_REG_LIML_WR(index),
 235                                        data->temp_min[index]);
 236        if (ret < 0)
 237                count = ret;
 238        mutex_unlock(&data->update_lock);
 239
 240        return count;
 241}
 242
 243static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
 244static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max,
 245                                set_temp_max, 0);
 246static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO, show_temp_min,
 247                                set_temp_min, 0);
 248static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
 249static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO, show_temp_max,
 250                                set_temp_max, 1);
 251static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO, show_temp_min,
 252                                set_temp_min, 1);
 253static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
 254static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO, show_temp_max,
 255                                set_temp_max, 2);
 256static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO, show_temp_min,
 257                                set_temp_min, 2);
 258static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3);
 259static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO, show_temp_max,
 260                                set_temp_max, 3);
 261static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO, show_temp_min,
 262                                set_temp_min, 3);
 263static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4);
 264static SENSOR_DEVICE_ATTR(temp5_max, S_IRUGO, show_temp_max,
 265                                set_temp_max, 4);
 266static SENSOR_DEVICE_ATTR(temp5_min, S_IRUGO, show_temp_min,
 267                                set_temp_min, 4);
 268
 269static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 14);
 270static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 13);
 271static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 7);
 272static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 6);
 273static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_alarm, NULL, 5);
 274static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_alarm, NULL, 4);
 275static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO, show_alarm, NULL, 3);
 276static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO, show_alarm, NULL, 2);
 277static SENSOR_DEVICE_ATTR(temp5_min_alarm, S_IRUGO, show_alarm, NULL, 1);
 278static SENSOR_DEVICE_ATTR(temp5_max_alarm, S_IRUGO, show_alarm, NULL, 0);
 279
 280static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_fault, NULL, 1);
 281static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_fault, NULL, 2);
 282static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_fault, NULL, 3);
 283static SENSOR_DEVICE_ATTR(temp5_fault, S_IRUGO, show_fault, NULL, 4);
 284
 285/* Attributes common to MAX1668, MAX1989 and MAX1805 */
 286static struct attribute *max1668_attribute_common[] = {
 287        &sensor_dev_attr_temp1_max.dev_attr.attr,
 288        &sensor_dev_attr_temp1_min.dev_attr.attr,
 289        &sensor_dev_attr_temp1_input.dev_attr.attr,
 290        &sensor_dev_attr_temp2_max.dev_attr.attr,
 291        &sensor_dev_attr_temp2_min.dev_attr.attr,
 292        &sensor_dev_attr_temp2_input.dev_attr.attr,
 293        &sensor_dev_attr_temp3_max.dev_attr.attr,
 294        &sensor_dev_attr_temp3_min.dev_attr.attr,
 295        &sensor_dev_attr_temp3_input.dev_attr.attr,
 296
 297        &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
 298        &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
 299        &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
 300        &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
 301        &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
 302        &sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
 303
 304        &sensor_dev_attr_temp2_fault.dev_attr.attr,
 305        &sensor_dev_attr_temp3_fault.dev_attr.attr,
 306        NULL
 307};
 308
 309/* Attributes not present on MAX1805 */
 310static struct attribute *max1668_attribute_unique[] = {
 311        &sensor_dev_attr_temp4_max.dev_attr.attr,
 312        &sensor_dev_attr_temp4_min.dev_attr.attr,
 313        &sensor_dev_attr_temp4_input.dev_attr.attr,
 314        &sensor_dev_attr_temp5_max.dev_attr.attr,
 315        &sensor_dev_attr_temp5_min.dev_attr.attr,
 316        &sensor_dev_attr_temp5_input.dev_attr.attr,
 317
 318        &sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
 319        &sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
 320        &sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
 321        &sensor_dev_attr_temp5_min_alarm.dev_attr.attr,
 322
 323        &sensor_dev_attr_temp4_fault.dev_attr.attr,
 324        &sensor_dev_attr_temp5_fault.dev_attr.attr,
 325        NULL
 326};
 327
 328static umode_t max1668_attribute_mode(struct kobject *kobj,
 329                                     struct attribute *attr, int index)
 330{
 331        umode_t ret = S_IRUGO;
 332        if (read_only)
 333                return ret;
 334        if (attr == &sensor_dev_attr_temp1_max.dev_attr.attr ||
 335            attr == &sensor_dev_attr_temp2_max.dev_attr.attr ||
 336            attr == &sensor_dev_attr_temp3_max.dev_attr.attr ||
 337            attr == &sensor_dev_attr_temp4_max.dev_attr.attr ||
 338            attr == &sensor_dev_attr_temp5_max.dev_attr.attr ||
 339            attr == &sensor_dev_attr_temp1_min.dev_attr.attr ||
 340            attr == &sensor_dev_attr_temp2_min.dev_attr.attr ||
 341            attr == &sensor_dev_attr_temp3_min.dev_attr.attr ||
 342            attr == &sensor_dev_attr_temp4_min.dev_attr.attr ||
 343            attr == &sensor_dev_attr_temp5_min.dev_attr.attr)
 344                ret |= S_IWUSR;
 345        return ret;
 346}
 347
 348static const struct attribute_group max1668_group_common = {
 349        .attrs = max1668_attribute_common,
 350        .is_visible = max1668_attribute_mode
 351};
 352
 353static const struct attribute_group max1668_group_unique = {
 354        .attrs = max1668_attribute_unique,
 355        .is_visible = max1668_attribute_mode
 356};
 357
 358/* Return 0 if detection is successful, -ENODEV otherwise */
 359static int max1668_detect(struct i2c_client *client,
 360                          struct i2c_board_info *info)
 361{
 362        struct i2c_adapter *adapter = client->adapter;
 363        const char *type_name;
 364        int man_id, dev_id;
 365
 366        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 367                return -ENODEV;
 368
 369        /* Check for unsupported part */
 370        man_id = i2c_smbus_read_byte_data(client, MAX1668_REG_MAN_ID);
 371        if (man_id != MAN_ID_MAXIM)
 372                return -ENODEV;
 373
 374        dev_id = i2c_smbus_read_byte_data(client, MAX1668_REG_DEV_ID);
 375        if (dev_id < 0)
 376                return -ENODEV;
 377
 378        type_name = NULL;
 379        if (dev_id == DEV_ID_MAX1668)
 380                type_name = "max1668";
 381        else if (dev_id == DEV_ID_MAX1805)
 382                type_name = "max1805";
 383        else if (dev_id == DEV_ID_MAX1989)
 384                type_name = "max1989";
 385
 386        if (!type_name)
 387                return -ENODEV;
 388
 389        strlcpy(info->type, type_name, I2C_NAME_SIZE);
 390
 391        return 0;
 392}
 393
 394static int max1668_probe(struct i2c_client *client,
 395                         const struct i2c_device_id *id)
 396{
 397        struct i2c_adapter *adapter = client->adapter;
 398        struct device *dev = &client->dev;
 399        struct device *hwmon_dev;
 400        struct max1668_data *data;
 401
 402        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 403                return -ENODEV;
 404
 405        data = devm_kzalloc(dev, sizeof(struct max1668_data), GFP_KERNEL);
 406        if (!data)
 407                return -ENOMEM;
 408
 409        data->client = client;
 410        data->type = id->driver_data;
 411        mutex_init(&data->update_lock);
 412
 413        /* sysfs hooks */
 414        data->groups[0] = &max1668_group_common;
 415        if (data->type == max1668 || data->type == max1989)
 416                data->groups[1] = &max1668_group_unique;
 417
 418        hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
 419                                                           data, data->groups);
 420        return PTR_ERR_OR_ZERO(hwmon_dev);
 421}
 422
 423static const struct i2c_device_id max1668_id[] = {
 424        { "max1668", max1668 },
 425        { "max1805", max1805 },
 426        { "max1989", max1989 },
 427        { }
 428};
 429MODULE_DEVICE_TABLE(i2c, max1668_id);
 430
 431/* This is the driver that will be inserted */
 432static struct i2c_driver max1668_driver = {
 433        .class = I2C_CLASS_HWMON,
 434        .driver = {
 435                  .name = "max1668",
 436                  },
 437        .probe = max1668_probe,
 438        .id_table = max1668_id,
 439        .detect = max1668_detect,
 440        .address_list = max1668_addr_list,
 441};
 442
 443module_i2c_driver(max1668_driver);
 444
 445MODULE_AUTHOR("David George <david.george@ska.ac.za>");
 446MODULE_DESCRIPTION("MAX1668 remote temperature sensor driver");
 447MODULE_LICENSE("GPL");
 448