1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * w83l785ts.c - Part of lm_sensors, Linux kernel modules for hardware 4 * monitoring 5 * Copyright (C) 2003-2009 Jean Delvare <jdelvare@suse.de> 6 * 7 * Inspired from the lm83 driver. The W83L785TS-S is a sensor chip made 8 * by Winbond. It reports a single external temperature with a 1 deg 9 * resolution and a 3 deg accuracy. Datasheet can be obtained from 10 * Winbond's website at: 11 * http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83L785TS-S.pdf 12 * 13 * Ported to Linux 2.6 by Wolfgang Ziegler <nuppla@gmx.at> and Jean Delvare 14 * <jdelvare@suse.de>. 15 * 16 * Thanks to James Bolt <james@evilpenguin.com> for benchmarking the read 17 * error handling mechanism. 18 */ 19 20 #include <linux/module.h> 21 #include <linux/delay.h> 22 #include <linux/init.h> 23 #include <linux/slab.h> 24 #include <linux/jiffies.h> 25 #include <linux/i2c.h> 26 #include <linux/hwmon.h> 27 #include <linux/hwmon-sysfs.h> 28 #include <linux/err.h> 29 #include <linux/mutex.h> 30 31 /* How many retries on register read error */ 32 #define MAX_RETRIES 5 33 34 /* 35 * Address to scan 36 * Address is fully defined internally and cannot be changed. 37 */ 38 39 static const unsigned short normal_i2c[] = { 0x2e, I2C_CLIENT_END }; 40 41 /* 42 * The W83L785TS-S registers 43 * Manufacturer ID is 0x5CA3 for Winbond. 44 */ 45 46 #define W83L785TS_REG_MAN_ID1 0x4D 47 #define W83L785TS_REG_MAN_ID2 0x4C 48 #define W83L785TS_REG_CHIP_ID 0x4E 49 #define W83L785TS_REG_CONFIG 0x40 50 #define W83L785TS_REG_TYPE 0x52 51 #define W83L785TS_REG_TEMP 0x27 52 #define W83L785TS_REG_TEMP_OVER 0x53 /* not sure about this one */ 53 54 /* 55 * Conversions 56 * The W83L785TS-S uses signed 8-bit values. 57 */ 58 59 #define TEMP_FROM_REG(val) ((val) * 1000) 60 61 /* 62 * Functions declaration 63 */ 64 65 static int w83l785ts_probe(struct i2c_client *client, 66 const struct i2c_device_id *id); 67 static int w83l785ts_detect(struct i2c_client *client, 68 struct i2c_board_info *info); 69 static int w83l785ts_remove(struct i2c_client *client); 70 static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval); 71 static struct w83l785ts_data *w83l785ts_update_device(struct device *dev); 72 73 /* 74 * Driver data (common to all clients) 75 */ 76 77 static const struct i2c_device_id w83l785ts_id[] = { 78 { "w83l785ts", 0 }, 79 { } 80 }; 81 MODULE_DEVICE_TABLE(i2c, w83l785ts_id); 82 83 static struct i2c_driver w83l785ts_driver = { 84 .class = I2C_CLASS_HWMON, 85 .driver = { 86 .name = "w83l785ts", 87 }, 88 .probe = w83l785ts_probe, 89 .remove = w83l785ts_remove, 90 .id_table = w83l785ts_id, 91 .detect = w83l785ts_detect, 92 .address_list = normal_i2c, 93 }; 94 95 /* 96 * Client data (each client gets its own) 97 */ 98 99 struct w83l785ts_data { 100 struct device *hwmon_dev; 101 struct mutex update_lock; 102 char valid; /* zero until following fields are valid */ 103 unsigned long last_updated; /* in jiffies */ 104 105 /* registers values */ 106 s8 temp[2]; /* 0: input, 1: critical limit */ 107 }; 108 109 /* 110 * Sysfs stuff 111 */ 112 113 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 114 char *buf) 115 { 116 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 117 struct w83l785ts_data *data = w83l785ts_update_device(dev); 118 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index])); 119 } 120 121 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 122 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_temp, NULL, 1); 123 124 /* 125 * Real code 126 */ 127 128 /* Return 0 if detection is successful, -ENODEV otherwise */ 129 static int w83l785ts_detect(struct i2c_client *client, 130 struct i2c_board_info *info) 131 { 132 struct i2c_adapter *adapter = client->adapter; 133 u16 man_id; 134 u8 chip_id; 135 136 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 137 return -ENODEV; 138 139 /* detection */ 140 if ((w83l785ts_read_value(client, W83L785TS_REG_CONFIG, 0) & 0x80) 141 || (w83l785ts_read_value(client, W83L785TS_REG_TYPE, 0) & 0xFC)) { 142 dev_dbg(&adapter->dev, 143 "W83L785TS-S detection failed at 0x%02x\n", 144 client->addr); 145 return -ENODEV; 146 } 147 148 /* Identification */ 149 man_id = (w83l785ts_read_value(client, W83L785TS_REG_MAN_ID1, 0) << 8) 150 + w83l785ts_read_value(client, W83L785TS_REG_MAN_ID2, 0); 151 chip_id = w83l785ts_read_value(client, W83L785TS_REG_CHIP_ID, 0); 152 153 if (man_id != 0x5CA3 /* Winbond */ 154 || chip_id != 0x70) { /* W83L785TS-S */ 155 dev_dbg(&adapter->dev, 156 "Unsupported chip (man_id=0x%04X, chip_id=0x%02X)\n", 157 man_id, chip_id); 158 return -ENODEV; 159 } 160 161 strlcpy(info->type, "w83l785ts", I2C_NAME_SIZE); 162 163 return 0; 164 } 165 166 static int w83l785ts_probe(struct i2c_client *client, 167 const struct i2c_device_id *id) 168 { 169 struct w83l785ts_data *data; 170 struct device *dev = &client->dev; 171 int err; 172 173 data = devm_kzalloc(dev, sizeof(struct w83l785ts_data), GFP_KERNEL); 174 if (!data) 175 return -ENOMEM; 176 177 i2c_set_clientdata(client, data); 178 mutex_init(&data->update_lock); 179 180 /* 181 * Initialize the W83L785TS chip 182 * Nothing yet, assume it is already started. 183 */ 184 185 err = device_create_file(dev, &sensor_dev_attr_temp1_input.dev_attr); 186 if (err) 187 return err; 188 189 err = device_create_file(dev, &sensor_dev_attr_temp1_max.dev_attr); 190 if (err) 191 goto exit_remove; 192 193 /* Register sysfs hooks */ 194 data->hwmon_dev = hwmon_device_register(dev); 195 if (IS_ERR(data->hwmon_dev)) { 196 err = PTR_ERR(data->hwmon_dev); 197 goto exit_remove; 198 } 199 200 return 0; 201 202 exit_remove: 203 device_remove_file(dev, &sensor_dev_attr_temp1_input.dev_attr); 204 device_remove_file(dev, &sensor_dev_attr_temp1_max.dev_attr); 205 return err; 206 } 207 208 static int w83l785ts_remove(struct i2c_client *client) 209 { 210 struct w83l785ts_data *data = i2c_get_clientdata(client); 211 212 hwmon_device_unregister(data->hwmon_dev); 213 device_remove_file(&client->dev, 214 &sensor_dev_attr_temp1_input.dev_attr); 215 device_remove_file(&client->dev, 216 &sensor_dev_attr_temp1_max.dev_attr); 217 218 return 0; 219 } 220 221 static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval) 222 { 223 int value, i; 224 struct device *dev; 225 const char *prefix; 226 227 /* 228 * We might be called during detection, at which point the client 229 * isn't yet fully initialized, so we can't use dev_dbg on it 230 */ 231 if (i2c_get_clientdata(client)) { 232 dev = &client->dev; 233 prefix = ""; 234 } else { 235 dev = &client->adapter->dev; 236 prefix = "w83l785ts: "; 237 } 238 239 /* 240 * Frequent read errors have been reported on Asus boards, so we 241 * retry on read errors. If it still fails (unlikely), return the 242 * default value requested by the caller. 243 */ 244 for (i = 1; i <= MAX_RETRIES; i++) { 245 value = i2c_smbus_read_byte_data(client, reg); 246 if (value >= 0) { 247 dev_dbg(dev, "%sRead 0x%02x from register 0x%02x.\n", 248 prefix, value, reg); 249 return value; 250 } 251 dev_dbg(dev, "%sRead failed, will retry in %d.\n", prefix, i); 252 msleep(i); 253 } 254 255 dev_err(dev, "%sCouldn't read value from register 0x%02x.\n", prefix, 256 reg); 257 return defval; 258 } 259 260 static struct w83l785ts_data *w83l785ts_update_device(struct device *dev) 261 { 262 struct i2c_client *client = to_i2c_client(dev); 263 struct w83l785ts_data *data = i2c_get_clientdata(client); 264 265 mutex_lock(&data->update_lock); 266 267 if (!data->valid || time_after(jiffies, data->last_updated + HZ * 2)) { 268 dev_dbg(&client->dev, "Updating w83l785ts data.\n"); 269 data->temp[0] = w83l785ts_read_value(client, 270 W83L785TS_REG_TEMP, data->temp[0]); 271 data->temp[1] = w83l785ts_read_value(client, 272 W83L785TS_REG_TEMP_OVER, data->temp[1]); 273 274 data->last_updated = jiffies; 275 data->valid = 1; 276 } 277 278 mutex_unlock(&data->update_lock); 279 280 return data; 281 } 282 283 module_i2c_driver(w83l785ts_driver); 284 285 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>"); 286 MODULE_DESCRIPTION("W83L785TS-S driver"); 287 MODULE_LICENSE("GPL"); 288