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