1/* 2 * emc1403.c - SMSC Thermal Driver 3 * 4 * Copyright (C) 2008 Intel Corp 5 * 6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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; version 2 of the License. 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 20 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 21 */ 22 23#include <linux/module.h> 24#include <linux/init.h> 25#include <linux/slab.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/sysfs.h> 31#include <linux/mutex.h> 32#include <linux/regmap.h> 33 34#define THERMAL_PID_REG 0xfd 35#define THERMAL_SMSC_ID_REG 0xfe 36#define THERMAL_REVISION_REG 0xff 37 38enum emc1403_chip { emc1402, emc1403, emc1404 }; 39 40struct thermal_data { 41 struct regmap *regmap; 42 struct mutex mutex; 43 const struct attribute_group *groups[4]; 44}; 45 46static ssize_t show_temp(struct device *dev, 47 struct device_attribute *attr, char *buf) 48{ 49 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 50 struct thermal_data *data = dev_get_drvdata(dev); 51 unsigned int val; 52 int retval; 53 54 retval = regmap_read(data->regmap, sda->index, &val); 55 if (retval < 0) 56 return retval; 57 return sprintf(buf, "%d000\n", val); 58} 59 60static ssize_t show_bit(struct device *dev, 61 struct device_attribute *attr, char *buf) 62{ 63 struct sensor_device_attribute_2 *sda = to_sensor_dev_attr_2(attr); 64 struct thermal_data *data = dev_get_drvdata(dev); 65 unsigned int val; 66 int retval; 67 68 retval = regmap_read(data->regmap, sda->nr, &val); 69 if (retval < 0) 70 return retval; 71 return sprintf(buf, "%d\n", !!(val & sda->index)); 72} 73 74static ssize_t store_temp(struct device *dev, 75 struct device_attribute *attr, const char *buf, size_t count) 76{ 77 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 78 struct thermal_data *data = dev_get_drvdata(dev); 79 unsigned long val; 80 int retval; 81 82 if (kstrtoul(buf, 10, &val)) 83 return -EINVAL; 84 retval = regmap_write(data->regmap, sda->index, 85 DIV_ROUND_CLOSEST(val, 1000)); 86 if (retval < 0) 87 return retval; 88 return count; 89} 90 91static ssize_t store_bit(struct device *dev, 92 struct device_attribute *attr, const char *buf, size_t count) 93{ 94 struct sensor_device_attribute_2 *sda = to_sensor_dev_attr_2(attr); 95 struct thermal_data *data = dev_get_drvdata(dev); 96 unsigned long val; 97 int retval; 98 99 if (kstrtoul(buf, 10, &val)) 100 return -EINVAL; 101 102 retval = regmap_update_bits(data->regmap, sda->nr, sda->index, 103 val ? sda->index : 0); 104 if (retval < 0) 105 return retval; 106 return count; 107} 108 109static ssize_t show_hyst_common(struct device *dev, 110 struct device_attribute *attr, char *buf, 111 bool is_min) 112{ 113 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 114 struct thermal_data *data = dev_get_drvdata(dev); 115 struct regmap *regmap = data->regmap; 116 unsigned int limit; 117 unsigned int hyst; 118 int retval; 119 120 retval = regmap_read(regmap, sda->index, &limit); 121 if (retval < 0) 122 return retval; 123 124 retval = regmap_read(regmap, 0x21, &hyst); 125 if (retval < 0) 126 return retval; 127 128 return sprintf(buf, "%d000\n", is_min ? limit + hyst : limit - hyst); 129} 130 131static ssize_t show_hyst(struct device *dev, 132 struct device_attribute *attr, char *buf) 133{ 134 return show_hyst_common(dev, attr, buf, false); 135} 136 137static ssize_t show_min_hyst(struct device *dev, 138 struct device_attribute *attr, char *buf) 139{ 140 return show_hyst_common(dev, attr, buf, true); 141} 142 143static ssize_t store_hyst(struct device *dev, 144 struct device_attribute *attr, const char *buf, size_t count) 145{ 146 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 147 struct thermal_data *data = dev_get_drvdata(dev); 148 struct regmap *regmap = data->regmap; 149 unsigned int limit; 150 int retval; 151 int hyst; 152 unsigned long val; 153 154 if (kstrtoul(buf, 10, &val)) 155 return -EINVAL; 156 157 mutex_lock(&data->mutex); 158 retval = regmap_read(regmap, sda->index, &limit); 159 if (retval < 0) 160 goto fail; 161 162 hyst = limit * 1000 - val; 163 hyst = clamp_val(DIV_ROUND_CLOSEST(hyst, 1000), 0, 255); 164 retval = regmap_write(regmap, 0x21, hyst); 165 if (retval == 0) 166 retval = count; 167fail: 168 mutex_unlock(&data->mutex); 169 return retval; 170} 171 172/* 173 * Sensors. We pass the actual i2c register to the methods. 174 */ 175 176static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO | S_IWUSR, 177 show_temp, store_temp, 0x06); 178static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, 179 show_temp, store_temp, 0x05); 180static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO | S_IWUSR, 181 show_temp, store_temp, 0x20); 182static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0x00); 183static SENSOR_DEVICE_ATTR_2(temp1_min_alarm, S_IRUGO, 184 show_bit, NULL, 0x36, 0x01); 185static SENSOR_DEVICE_ATTR_2(temp1_max_alarm, S_IRUGO, 186 show_bit, NULL, 0x35, 0x01); 187static SENSOR_DEVICE_ATTR_2(temp1_crit_alarm, S_IRUGO, 188 show_bit, NULL, 0x37, 0x01); 189static SENSOR_DEVICE_ATTR(temp1_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x06); 190static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_hyst, NULL, 0x05); 191static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO | S_IWUSR, 192 show_hyst, store_hyst, 0x20); 193 194static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR, 195 show_temp, store_temp, 0x08); 196static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR, 197 show_temp, store_temp, 0x07); 198static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO | S_IWUSR, 199 show_temp, store_temp, 0x19); 200static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0x01); 201static SENSOR_DEVICE_ATTR_2(temp2_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x02); 202static SENSOR_DEVICE_ATTR_2(temp2_min_alarm, S_IRUGO, 203 show_bit, NULL, 0x36, 0x02); 204static SENSOR_DEVICE_ATTR_2(temp2_max_alarm, S_IRUGO, 205 show_bit, NULL, 0x35, 0x02); 206static SENSOR_DEVICE_ATTR_2(temp2_crit_alarm, S_IRUGO, 207 show_bit, NULL, 0x37, 0x02); 208static SENSOR_DEVICE_ATTR(temp2_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x08); 209static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO, show_hyst, NULL, 0x07); 210static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_hyst, NULL, 0x19); 211 212static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO | S_IWUSR, 213 show_temp, store_temp, 0x16); 214static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR, 215 show_temp, store_temp, 0x15); 216static SENSOR_DEVICE_ATTR(temp3_crit, S_IRUGO | S_IWUSR, 217 show_temp, store_temp, 0x1A); 218static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 0x23); 219static SENSOR_DEVICE_ATTR_2(temp3_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x04); 220static SENSOR_DEVICE_ATTR_2(temp3_min_alarm, S_IRUGO, 221 show_bit, NULL, 0x36, 0x04); 222static SENSOR_DEVICE_ATTR_2(temp3_max_alarm, S_IRUGO, 223 show_bit, NULL, 0x35, 0x04); 224static SENSOR_DEVICE_ATTR_2(temp3_crit_alarm, S_IRUGO, 225 show_bit, NULL, 0x37, 0x04); 226static SENSOR_DEVICE_ATTR(temp3_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x16); 227static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO, show_hyst, NULL, 0x15); 228static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_hyst, NULL, 0x1A); 229 230static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO | S_IWUSR, 231 show_temp, store_temp, 0x2D); 232static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO | S_IWUSR, 233 show_temp, store_temp, 0x2C); 234static SENSOR_DEVICE_ATTR(temp4_crit, S_IRUGO | S_IWUSR, 235 show_temp, store_temp, 0x30); 236static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 0x2A); 237static SENSOR_DEVICE_ATTR_2(temp4_fault, S_IRUGO, show_bit, NULL, 0x1b, 0x08); 238static SENSOR_DEVICE_ATTR_2(temp4_min_alarm, S_IRUGO, 239 show_bit, NULL, 0x36, 0x08); 240static SENSOR_DEVICE_ATTR_2(temp4_max_alarm, S_IRUGO, 241 show_bit, NULL, 0x35, 0x08); 242static SENSOR_DEVICE_ATTR_2(temp4_crit_alarm, S_IRUGO, 243 show_bit, NULL, 0x37, 0x08); 244static SENSOR_DEVICE_ATTR(temp4_min_hyst, S_IRUGO, show_min_hyst, NULL, 0x2D); 245static SENSOR_DEVICE_ATTR(temp4_max_hyst, S_IRUGO, show_hyst, NULL, 0x2C); 246static SENSOR_DEVICE_ATTR(temp4_crit_hyst, S_IRUGO, show_hyst, NULL, 0x30); 247 248static SENSOR_DEVICE_ATTR_2(power_state, S_IRUGO | S_IWUSR, 249 show_bit, store_bit, 0x03, 0x40); 250 251static struct attribute *emc1402_attrs[] = { 252 &sensor_dev_attr_temp1_min.dev_attr.attr, 253 &sensor_dev_attr_temp1_max.dev_attr.attr, 254 &sensor_dev_attr_temp1_crit.dev_attr.attr, 255 &sensor_dev_attr_temp1_input.dev_attr.attr, 256 &sensor_dev_attr_temp1_min_hyst.dev_attr.attr, 257 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 258 &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, 259 260 &sensor_dev_attr_temp2_min.dev_attr.attr, 261 &sensor_dev_attr_temp2_max.dev_attr.attr, 262 &sensor_dev_attr_temp2_crit.dev_attr.attr, 263 &sensor_dev_attr_temp2_input.dev_attr.attr, 264 &sensor_dev_attr_temp2_min_hyst.dev_attr.attr, 265 &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, 266 &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, 267 268 &sensor_dev_attr_power_state.dev_attr.attr, 269 NULL 270}; 271 272static const struct attribute_group emc1402_group = { 273 .attrs = emc1402_attrs, 274}; 275 276static struct attribute *emc1403_attrs[] = { 277 &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, 278 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 279 &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, 280 281 &sensor_dev_attr_temp2_fault.dev_attr.attr, 282 &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, 283 &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, 284 &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, 285 286 &sensor_dev_attr_temp3_min.dev_attr.attr, 287 &sensor_dev_attr_temp3_max.dev_attr.attr, 288 &sensor_dev_attr_temp3_crit.dev_attr.attr, 289 &sensor_dev_attr_temp3_input.dev_attr.attr, 290 &sensor_dev_attr_temp3_fault.dev_attr.attr, 291 &sensor_dev_attr_temp3_min_alarm.dev_attr.attr, 292 &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, 293 &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, 294 &sensor_dev_attr_temp3_min_hyst.dev_attr.attr, 295 &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, 296 &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr, 297 NULL 298}; 299 300static const struct attribute_group emc1403_group = { 301 .attrs = emc1403_attrs, 302}; 303 304static struct attribute *emc1404_attrs[] = { 305 &sensor_dev_attr_temp4_min.dev_attr.attr, 306 &sensor_dev_attr_temp4_max.dev_attr.attr, 307 &sensor_dev_attr_temp4_crit.dev_attr.attr, 308 &sensor_dev_attr_temp4_input.dev_attr.attr, 309 &sensor_dev_attr_temp4_fault.dev_attr.attr, 310 &sensor_dev_attr_temp4_min_alarm.dev_attr.attr, 311 &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, 312 &sensor_dev_attr_temp4_crit_alarm.dev_attr.attr, 313 &sensor_dev_attr_temp4_min_hyst.dev_attr.attr, 314 &sensor_dev_attr_temp4_max_hyst.dev_attr.attr, 315 &sensor_dev_attr_temp4_crit_hyst.dev_attr.attr, 316 NULL 317}; 318 319static const struct attribute_group emc1404_group = { 320 .attrs = emc1404_attrs, 321}; 322 323/* 324 * EMC14x2 uses a different register and different bits to report alarm and 325 * fault status. For simplicity, provide a separate attribute group for this 326 * chip series. 327 * Since we can not re-use the same attribute names, create a separate attribute 328 * array. 329 */ 330static struct sensor_device_attribute_2 emc1402_alarms[] = { 331 SENSOR_ATTR_2(temp1_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x20), 332 SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x40), 333 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x01), 334 335 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_bit, NULL, 0x02, 0x04), 336 SENSOR_ATTR_2(temp2_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x08), 337 SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x10), 338 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x02), 339}; 340 341static struct attribute *emc1402_alarm_attrs[] = { 342 &emc1402_alarms[0].dev_attr.attr, 343 &emc1402_alarms[1].dev_attr.attr, 344 &emc1402_alarms[2].dev_attr.attr, 345 &emc1402_alarms[3].dev_attr.attr, 346 &emc1402_alarms[4].dev_attr.attr, 347 &emc1402_alarms[5].dev_attr.attr, 348 &emc1402_alarms[6].dev_attr.attr, 349 NULL, 350}; 351 352static const struct attribute_group emc1402_alarm_group = { 353 .attrs = emc1402_alarm_attrs, 354}; 355 356static int emc1403_detect(struct i2c_client *client, 357 struct i2c_board_info *info) 358{ 359 int id; 360 /* Check if thermal chip is SMSC and EMC1403 or EMC1423 */ 361 362 id = i2c_smbus_read_byte_data(client, THERMAL_SMSC_ID_REG); 363 if (id != 0x5d) 364 return -ENODEV; 365 366 id = i2c_smbus_read_byte_data(client, THERMAL_PID_REG); 367 switch (id) { 368 case 0x20: 369 strlcpy(info->type, "emc1402", I2C_NAME_SIZE); 370 break; 371 case 0x21: 372 strlcpy(info->type, "emc1403", I2C_NAME_SIZE); 373 break; 374 case 0x22: 375 strlcpy(info->type, "emc1422", I2C_NAME_SIZE); 376 break; 377 case 0x23: 378 strlcpy(info->type, "emc1423", I2C_NAME_SIZE); 379 break; 380 case 0x25: 381 strlcpy(info->type, "emc1404", I2C_NAME_SIZE); 382 break; 383 case 0x27: 384 strlcpy(info->type, "emc1424", I2C_NAME_SIZE); 385 break; 386 default: 387 return -ENODEV; 388 } 389 390 id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG); 391 if (id < 0x01 || id > 0x04) 392 return -ENODEV; 393 394 return 0; 395} 396 397static bool emc1403_regmap_is_volatile(struct device *dev, unsigned int reg) 398{ 399 switch (reg) { 400 case 0x00: /* internal diode high byte */ 401 case 0x01: /* external diode 1 high byte */ 402 case 0x02: /* status */ 403 case 0x10: /* external diode 1 low byte */ 404 case 0x1b: /* external diode fault */ 405 case 0x23: /* external diode 2 high byte */ 406 case 0x24: /* external diode 2 low byte */ 407 case 0x29: /* internal diode low byte */ 408 case 0x2a: /* externl diode 3 high byte */ 409 case 0x2b: /* external diode 3 low byte */ 410 case 0x35: /* high limit status */ 411 case 0x36: /* low limit status */ 412 case 0x37: /* therm limit status */ 413 return true; 414 default: 415 return false; 416 } 417} 418 419static const struct regmap_config emc1403_regmap_config = { 420 .reg_bits = 8, 421 .val_bits = 8, 422 .cache_type = REGCACHE_RBTREE, 423 .volatile_reg = emc1403_regmap_is_volatile, 424}; 425 426static int emc1403_probe(struct i2c_client *client, 427 const struct i2c_device_id *id) 428{ 429 struct thermal_data *data; 430 struct device *hwmon_dev; 431 432 data = devm_kzalloc(&client->dev, sizeof(struct thermal_data), 433 GFP_KERNEL); 434 if (data == NULL) 435 return -ENOMEM; 436 437 data->regmap = devm_regmap_init_i2c(client, &emc1403_regmap_config); 438 if (IS_ERR(data->regmap)) 439 return PTR_ERR(data->regmap); 440 441 mutex_init(&data->mutex); 442 443 switch (id->driver_data) { 444 case emc1404: 445 data->groups[2] = &emc1404_group; 446 case emc1403: 447 data->groups[1] = &emc1403_group; 448 case emc1402: 449 data->groups[0] = &emc1402_group; 450 } 451 452 if (id->driver_data == emc1402) 453 data->groups[1] = &emc1402_alarm_group; 454 455 hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, 456 client->name, data, 457 data->groups); 458 if (IS_ERR(hwmon_dev)) 459 return PTR_ERR(hwmon_dev); 460 461 dev_info(&client->dev, "%s Thermal chip found\n", id->name); 462 return 0; 463} 464 465static const unsigned short emc1403_address_list[] = { 466 0x18, 0x1c, 0x29, 0x4c, 0x4d, 0x5c, I2C_CLIENT_END 467}; 468 469/* Last digit of chip name indicates number of channels */ 470static const struct i2c_device_id emc1403_idtable[] = { 471 { "emc1402", emc1402 }, 472 { "emc1403", emc1403 }, 473 { "emc1404", emc1404 }, 474 { "emc1412", emc1402 }, 475 { "emc1413", emc1403 }, 476 { "emc1414", emc1404 }, 477 { "emc1422", emc1402 }, 478 { "emc1423", emc1403 }, 479 { "emc1424", emc1404 }, 480 { } 481}; 482MODULE_DEVICE_TABLE(i2c, emc1403_idtable); 483 484static struct i2c_driver sensor_emc1403 = { 485 .class = I2C_CLASS_HWMON, 486 .driver = { 487 .name = "emc1403", 488 }, 489 .detect = emc1403_detect, 490 .probe = emc1403_probe, 491 .id_table = emc1403_idtable, 492 .address_list = emc1403_address_list, 493}; 494 495module_i2c_driver(sensor_emc1403); 496 497MODULE_AUTHOR("Kalhan Trisal <kalhan.trisal@intel.com"); 498MODULE_DESCRIPTION("emc1403 Thermal Driver"); 499MODULE_LICENSE("GPL v2"); 500