thmc50.c (12580B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * thmc50.c - Part of lm_sensors, Linux kernel modules for hardware 4 * monitoring 5 * Copyright (C) 2007 Krzysztof Helt <krzysztof.h1@wp.pl> 6 * Based on 2.4 driver by Frodo Looijaard <frodol@dds.nl> and 7 * Philip Edelbrock <phil@netroedge.com> 8 */ 9 10#include <linux/module.h> 11#include <linux/init.h> 12#include <linux/slab.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#include <linux/jiffies.h> 19 20MODULE_LICENSE("GPL"); 21 22/* Addresses to scan */ 23static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; 24 25/* Insmod parameters */ 26enum chips { thmc50, adm1022 }; 27 28static unsigned short adm1022_temp3[16]; 29static unsigned int adm1022_temp3_num; 30module_param_array(adm1022_temp3, ushort, &adm1022_temp3_num, 0); 31MODULE_PARM_DESC(adm1022_temp3, 32 "List of adapter,address pairs to enable 3rd temperature (ADM1022 only)"); 33 34/* Many THMC50 constants specified below */ 35 36/* The THMC50 registers */ 37#define THMC50_REG_CONF 0x40 38#define THMC50_REG_COMPANY_ID 0x3E 39#define THMC50_REG_DIE_CODE 0x3F 40#define THMC50_REG_ANALOG_OUT 0x19 41/* 42 * The mirror status register cannot be used as 43 * reading it does not clear alarms. 44 */ 45#define THMC50_REG_INTR 0x41 46 47static const u8 THMC50_REG_TEMP[] = { 0x27, 0x26, 0x20 }; 48static const u8 THMC50_REG_TEMP_MIN[] = { 0x3A, 0x38, 0x2C }; 49static const u8 THMC50_REG_TEMP_MAX[] = { 0x39, 0x37, 0x2B }; 50static const u8 THMC50_REG_TEMP_CRITICAL[] = { 0x13, 0x14, 0x14 }; 51static const u8 THMC50_REG_TEMP_DEFAULT[] = { 0x17, 0x18, 0x18 }; 52 53#define THMC50_REG_CONF_nFANOFF 0x20 54#define THMC50_REG_CONF_PROGRAMMED 0x08 55 56/* Each client has this additional data */ 57struct thmc50_data { 58 struct i2c_client *client; 59 const struct attribute_group *groups[3]; 60 61 struct mutex update_lock; 62 enum chips type; 63 unsigned long last_updated; /* In jiffies */ 64 char has_temp3; /* !=0 if it is ADM1022 in temp3 mode */ 65 bool valid; /* true if following fields are valid */ 66 67 /* Register values */ 68 s8 temp_input[3]; 69 s8 temp_max[3]; 70 s8 temp_min[3]; 71 s8 temp_critical[3]; 72 u8 analog_out; 73 u8 alarms; 74}; 75 76static struct thmc50_data *thmc50_update_device(struct device *dev) 77{ 78 struct thmc50_data *data = dev_get_drvdata(dev); 79 struct i2c_client *client = data->client; 80 int timeout = HZ / 5 + (data->type == thmc50 ? HZ : 0); 81 82 mutex_lock(&data->update_lock); 83 84 if (time_after(jiffies, data->last_updated + timeout) 85 || !data->valid) { 86 87 int temps = data->has_temp3 ? 3 : 2; 88 int i; 89 int prog = i2c_smbus_read_byte_data(client, THMC50_REG_CONF); 90 91 prog &= THMC50_REG_CONF_PROGRAMMED; 92 93 for (i = 0; i < temps; i++) { 94 data->temp_input[i] = i2c_smbus_read_byte_data(client, 95 THMC50_REG_TEMP[i]); 96 data->temp_max[i] = i2c_smbus_read_byte_data(client, 97 THMC50_REG_TEMP_MAX[i]); 98 data->temp_min[i] = i2c_smbus_read_byte_data(client, 99 THMC50_REG_TEMP_MIN[i]); 100 data->temp_critical[i] = 101 i2c_smbus_read_byte_data(client, 102 prog ? THMC50_REG_TEMP_CRITICAL[i] 103 : THMC50_REG_TEMP_DEFAULT[i]); 104 } 105 data->analog_out = 106 i2c_smbus_read_byte_data(client, THMC50_REG_ANALOG_OUT); 107 data->alarms = 108 i2c_smbus_read_byte_data(client, THMC50_REG_INTR); 109 data->last_updated = jiffies; 110 data->valid = true; 111 } 112 113 mutex_unlock(&data->update_lock); 114 115 return data; 116} 117 118static ssize_t analog_out_show(struct device *dev, 119 struct device_attribute *attr, char *buf) 120{ 121 struct thmc50_data *data = thmc50_update_device(dev); 122 return sprintf(buf, "%d\n", data->analog_out); 123} 124 125static ssize_t analog_out_store(struct device *dev, 126 struct device_attribute *attr, 127 const char *buf, size_t count) 128{ 129 struct thmc50_data *data = dev_get_drvdata(dev); 130 struct i2c_client *client = data->client; 131 int config; 132 unsigned long tmp; 133 int err; 134 135 err = kstrtoul(buf, 10, &tmp); 136 if (err) 137 return err; 138 139 mutex_lock(&data->update_lock); 140 data->analog_out = clamp_val(tmp, 0, 255); 141 i2c_smbus_write_byte_data(client, THMC50_REG_ANALOG_OUT, 142 data->analog_out); 143 144 config = i2c_smbus_read_byte_data(client, THMC50_REG_CONF); 145 if (data->analog_out == 0) 146 config &= ~THMC50_REG_CONF_nFANOFF; 147 else 148 config |= THMC50_REG_CONF_nFANOFF; 149 i2c_smbus_write_byte_data(client, THMC50_REG_CONF, config); 150 151 mutex_unlock(&data->update_lock); 152 return count; 153} 154 155/* There is only one PWM mode = DC */ 156static ssize_t pwm_mode_show(struct device *dev, 157 struct device_attribute *attr, char *buf) 158{ 159 return sprintf(buf, "0\n"); 160} 161 162/* Temperatures */ 163static ssize_t temp_show(struct device *dev, struct device_attribute *attr, 164 char *buf) 165{ 166 int nr = to_sensor_dev_attr(attr)->index; 167 struct thmc50_data *data = thmc50_update_device(dev); 168 return sprintf(buf, "%d\n", data->temp_input[nr] * 1000); 169} 170 171static ssize_t temp_min_show(struct device *dev, 172 struct device_attribute *attr, char *buf) 173{ 174 int nr = to_sensor_dev_attr(attr)->index; 175 struct thmc50_data *data = thmc50_update_device(dev); 176 return sprintf(buf, "%d\n", data->temp_min[nr] * 1000); 177} 178 179static ssize_t temp_min_store(struct device *dev, 180 struct device_attribute *attr, const char *buf, 181 size_t count) 182{ 183 int nr = to_sensor_dev_attr(attr)->index; 184 struct thmc50_data *data = dev_get_drvdata(dev); 185 struct i2c_client *client = data->client; 186 long val; 187 int err; 188 189 err = kstrtol(buf, 10, &val); 190 if (err) 191 return err; 192 193 mutex_lock(&data->update_lock); 194 data->temp_min[nr] = clamp_val(val / 1000, -128, 127); 195 i2c_smbus_write_byte_data(client, THMC50_REG_TEMP_MIN[nr], 196 data->temp_min[nr]); 197 mutex_unlock(&data->update_lock); 198 return count; 199} 200 201static ssize_t temp_max_show(struct device *dev, 202 struct device_attribute *attr, char *buf) 203{ 204 int nr = to_sensor_dev_attr(attr)->index; 205 struct thmc50_data *data = thmc50_update_device(dev); 206 return sprintf(buf, "%d\n", data->temp_max[nr] * 1000); 207} 208 209static ssize_t temp_max_store(struct device *dev, 210 struct device_attribute *attr, const char *buf, 211 size_t count) 212{ 213 int nr = to_sensor_dev_attr(attr)->index; 214 struct thmc50_data *data = dev_get_drvdata(dev); 215 struct i2c_client *client = data->client; 216 long val; 217 int err; 218 219 err = kstrtol(buf, 10, &val); 220 if (err) 221 return err; 222 223 mutex_lock(&data->update_lock); 224 data->temp_max[nr] = clamp_val(val / 1000, -128, 127); 225 i2c_smbus_write_byte_data(client, THMC50_REG_TEMP_MAX[nr], 226 data->temp_max[nr]); 227 mutex_unlock(&data->update_lock); 228 return count; 229} 230 231static ssize_t temp_critical_show(struct device *dev, 232 struct device_attribute *attr, char *buf) 233{ 234 int nr = to_sensor_dev_attr(attr)->index; 235 struct thmc50_data *data = thmc50_update_device(dev); 236 return sprintf(buf, "%d\n", data->temp_critical[nr] * 1000); 237} 238 239static ssize_t alarm_show(struct device *dev, struct device_attribute *attr, 240 char *buf) 241{ 242 int index = to_sensor_dev_attr(attr)->index; 243 struct thmc50_data *data = thmc50_update_device(dev); 244 245 return sprintf(buf, "%u\n", (data->alarms >> index) & 1); 246} 247 248static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0); 249static SENSOR_DEVICE_ATTR_RW(temp1_min, temp_min, 0); 250static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_max, 0); 251static SENSOR_DEVICE_ATTR_RO(temp1_crit, temp_critical, 0); 252static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1); 253static SENSOR_DEVICE_ATTR_RW(temp2_min, temp_min, 1); 254static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1); 255static SENSOR_DEVICE_ATTR_RO(temp2_crit, temp_critical, 1); 256static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2); 257static SENSOR_DEVICE_ATTR_RW(temp3_min, temp_min, 2); 258static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_max, 2); 259static SENSOR_DEVICE_ATTR_RO(temp3_crit, temp_critical, 2); 260 261static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 0); 262static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 5); 263static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm, 1); 264static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, 7); 265static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, 2); 266 267static SENSOR_DEVICE_ATTR_RW(pwm1, analog_out, 0); 268static SENSOR_DEVICE_ATTR_RO(pwm1_mode, pwm_mode, 0); 269 270static struct attribute *thmc50_attributes[] = { 271 &sensor_dev_attr_temp1_max.dev_attr.attr, 272 &sensor_dev_attr_temp1_min.dev_attr.attr, 273 &sensor_dev_attr_temp1_input.dev_attr.attr, 274 &sensor_dev_attr_temp1_crit.dev_attr.attr, 275 &sensor_dev_attr_temp1_alarm.dev_attr.attr, 276 &sensor_dev_attr_temp2_max.dev_attr.attr, 277 &sensor_dev_attr_temp2_min.dev_attr.attr, 278 &sensor_dev_attr_temp2_input.dev_attr.attr, 279 &sensor_dev_attr_temp2_crit.dev_attr.attr, 280 &sensor_dev_attr_temp2_alarm.dev_attr.attr, 281 &sensor_dev_attr_temp2_fault.dev_attr.attr, 282 &sensor_dev_attr_pwm1.dev_attr.attr, 283 &sensor_dev_attr_pwm1_mode.dev_attr.attr, 284 NULL 285}; 286 287static const struct attribute_group thmc50_group = { 288 .attrs = thmc50_attributes, 289}; 290 291/* for ADM1022 3rd temperature mode */ 292static struct attribute *temp3_attributes[] = { 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 &sensor_dev_attr_temp3_crit.dev_attr.attr, 297 &sensor_dev_attr_temp3_alarm.dev_attr.attr, 298 &sensor_dev_attr_temp3_fault.dev_attr.attr, 299 NULL 300}; 301 302static const struct attribute_group temp3_group = { 303 .attrs = temp3_attributes, 304}; 305 306/* Return 0 if detection is successful, -ENODEV otherwise */ 307static int thmc50_detect(struct i2c_client *client, 308 struct i2c_board_info *info) 309{ 310 unsigned company; 311 unsigned revision; 312 unsigned config; 313 struct i2c_adapter *adapter = client->adapter; 314 const char *type_name; 315 316 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { 317 pr_debug("thmc50: detect failed, smbus byte data not supported!\n"); 318 return -ENODEV; 319 } 320 321 pr_debug("thmc50: Probing for THMC50 at 0x%2X on bus %d\n", 322 client->addr, i2c_adapter_id(client->adapter)); 323 324 company = i2c_smbus_read_byte_data(client, THMC50_REG_COMPANY_ID); 325 revision = i2c_smbus_read_byte_data(client, THMC50_REG_DIE_CODE); 326 config = i2c_smbus_read_byte_data(client, THMC50_REG_CONF); 327 if (revision < 0xc0 || (config & 0x10)) 328 return -ENODEV; 329 330 if (company == 0x41) { 331 int id = i2c_adapter_id(client->adapter); 332 int i; 333 334 type_name = "adm1022"; 335 for (i = 0; i + 1 < adm1022_temp3_num; i += 2) 336 if (adm1022_temp3[i] == id && 337 adm1022_temp3[i + 1] == client->addr) { 338 /* enable 2nd remote temp */ 339 config |= (1 << 7); 340 i2c_smbus_write_byte_data(client, 341 THMC50_REG_CONF, 342 config); 343 break; 344 } 345 } else if (company == 0x49) { 346 type_name = "thmc50"; 347 } else { 348 pr_debug("thmc50: Detection of THMC50/ADM1022 failed\n"); 349 return -ENODEV; 350 } 351 352 pr_debug("thmc50: Detected %s (version %x, revision %x)\n", 353 type_name, (revision >> 4) - 0xc, revision & 0xf); 354 355 strlcpy(info->type, type_name, I2C_NAME_SIZE); 356 357 return 0; 358} 359 360static void thmc50_init_client(struct thmc50_data *data) 361{ 362 struct i2c_client *client = data->client; 363 int config; 364 365 data->analog_out = i2c_smbus_read_byte_data(client, 366 THMC50_REG_ANALOG_OUT); 367 /* set up to at least 1 */ 368 if (data->analog_out == 0) { 369 data->analog_out = 1; 370 i2c_smbus_write_byte_data(client, THMC50_REG_ANALOG_OUT, 371 data->analog_out); 372 } 373 config = i2c_smbus_read_byte_data(client, THMC50_REG_CONF); 374 config |= 0x1; /* start the chip if it is in standby mode */ 375 if (data->type == adm1022 && (config & (1 << 7))) 376 data->has_temp3 = 1; 377 i2c_smbus_write_byte_data(client, THMC50_REG_CONF, config); 378} 379 380static const struct i2c_device_id thmc50_id[]; 381 382static int thmc50_probe(struct i2c_client *client) 383{ 384 struct device *dev = &client->dev; 385 struct thmc50_data *data; 386 struct device *hwmon_dev; 387 int idx = 0; 388 389 data = devm_kzalloc(dev, sizeof(struct thmc50_data), GFP_KERNEL); 390 if (!data) 391 return -ENOMEM; 392 393 data->client = client; 394 data->type = i2c_match_id(thmc50_id, client)->driver_data; 395 mutex_init(&data->update_lock); 396 397 thmc50_init_client(data); 398 399 /* sysfs hooks */ 400 data->groups[idx++] = &thmc50_group; 401 402 /* Register additional ADM1022 sysfs hooks */ 403 if (data->has_temp3) 404 data->groups[idx++] = &temp3_group; 405 406 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 407 data, data->groups); 408 return PTR_ERR_OR_ZERO(hwmon_dev); 409} 410 411static const struct i2c_device_id thmc50_id[] = { 412 { "adm1022", adm1022 }, 413 { "thmc50", thmc50 }, 414 { } 415}; 416MODULE_DEVICE_TABLE(i2c, thmc50_id); 417 418static struct i2c_driver thmc50_driver = { 419 .class = I2C_CLASS_HWMON, 420 .driver = { 421 .name = "thmc50", 422 }, 423 .probe_new = thmc50_probe, 424 .id_table = thmc50_id, 425 .detect = thmc50_detect, 426 .address_list = normal_i2c, 427}; 428 429module_i2c_driver(thmc50_driver); 430 431MODULE_AUTHOR("Krzysztof Helt <krzysztof.h1@wp.pl>"); 432MODULE_DESCRIPTION("THMC50 driver");