1 /* Texas Instruments TMP102 SMBus temperature sensor driver 2 * 3 * Copyright (C) 2010 Steven King <sfking@fdwdc.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 #include <linux/module.h> 21 #include <linux/init.h> 22 #include <linux/slab.h> 23 #include <linux/i2c.h> 24 #include <linux/hwmon.h> 25 #include <linux/hwmon-sysfs.h> 26 #include <linux/err.h> 27 #include <linux/mutex.h> 28 #include <linux/device.h> 29 #include <linux/jiffies.h> 30 31 #define DRIVER_NAME "tmp102" 32 33 #define TMP102_TEMP_REG 0x00 34 #define TMP102_CONF_REG 0x01 35 /* note: these bit definitions are byte swapped */ 36 #define TMP102_CONF_SD 0x0100 37 #define TMP102_CONF_TM 0x0200 38 #define TMP102_CONF_POL 0x0400 39 #define TMP102_CONF_F0 0x0800 40 #define TMP102_CONF_F1 0x1000 41 #define TMP102_CONF_R0 0x2000 42 #define TMP102_CONF_R1 0x4000 43 #define TMP102_CONF_OS 0x8000 44 #define TMP102_CONF_EM 0x0010 45 #define TMP102_CONF_AL 0x0020 46 #define TMP102_CONF_CR0 0x0040 47 #define TMP102_CONF_CR1 0x0080 48 #define TMP102_TLOW_REG 0x02 49 #define TMP102_THIGH_REG 0x03 50 51 struct tmp102 { 52 struct device *hwmon_dev; 53 struct mutex lock; 54 u16 config_orig; 55 unsigned long last_update; 56 int temp[3]; 57 }; 58 59 /* convert left adjusted 13-bit TMP102 register value to milliCelsius */ 60 static inline int tmp102_reg_to_mC(s16 val) 61 { 62 return ((val & ~0x01) * 1000) / 128; 63 } 64 65 /* convert milliCelsius to left adjusted 13-bit TMP102 register value */ 66 static inline u16 tmp102_mC_to_reg(int val) 67 { 68 return (val * 128) / 1000; 69 } 70 71 static const u8 tmp102_reg[] = { 72 TMP102_TEMP_REG, 73 TMP102_TLOW_REG, 74 TMP102_THIGH_REG, 75 }; 76 77 static struct tmp102 *tmp102_update_device(struct i2c_client *client) 78 { 79 struct tmp102 *tmp102 = i2c_get_clientdata(client); 80 81 mutex_lock(&tmp102->lock); 82 if (time_after(jiffies, tmp102->last_update + HZ / 3)) { 83 int i; 84 for (i = 0; i < ARRAY_SIZE(tmp102->temp); ++i) { 85 int status = i2c_smbus_read_word_swapped(client, 86 tmp102_reg[i]); 87 if (status > -1) 88 tmp102->temp[i] = tmp102_reg_to_mC(status); 89 } 90 tmp102->last_update = jiffies; 91 } 92 mutex_unlock(&tmp102->lock); 93 return tmp102; 94 } 95 96 static ssize_t tmp102_show_temp(struct device *dev, 97 struct device_attribute *attr, 98 char *buf) 99 { 100 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 101 struct tmp102 *tmp102 = tmp102_update_device(to_i2c_client(dev)); 102 103 return sprintf(buf, "%d\n", tmp102->temp[sda->index]); 104 } 105 106 static ssize_t tmp102_set_temp(struct device *dev, 107 struct device_attribute *attr, 108 const char *buf, size_t count) 109 { 110 struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 111 struct i2c_client *client = to_i2c_client(dev); 112 struct tmp102 *tmp102 = i2c_get_clientdata(client); 113 long val; 114 int status; 115 116 if (kstrtol(buf, 10, &val) < 0) 117 return -EINVAL; 118 val = clamp_val(val, -256000, 255000); 119 120 mutex_lock(&tmp102->lock); 121 tmp102->temp[sda->index] = val; 122 status = i2c_smbus_write_word_swapped(client, tmp102_reg[sda->index], 123 tmp102_mC_to_reg(val)); 124 mutex_unlock(&tmp102->lock); 125 return status ? : count; 126 } 127 128 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp102_show_temp, NULL , 0); 129 130 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, tmp102_show_temp, 131 tmp102_set_temp, 1); 132 133 static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, tmp102_show_temp, 134 tmp102_set_temp, 2); 135 136 static struct attribute *tmp102_attributes[] = { 137 &sensor_dev_attr_temp1_input.dev_attr.attr, 138 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 139 &sensor_dev_attr_temp1_max.dev_attr.attr, 140 NULL 141 }; 142 143 static const struct attribute_group tmp102_attr_group = { 144 .attrs = tmp102_attributes, 145 }; 146 147 #define TMP102_CONFIG (TMP102_CONF_TM | TMP102_CONF_EM | TMP102_CONF_CR1) 148 #define TMP102_CONFIG_RD_ONLY (TMP102_CONF_R0 | TMP102_CONF_R1 | TMP102_CONF_AL) 149 150 static int tmp102_probe(struct i2c_client *client, 151 const struct i2c_device_id *id) 152 { 153 struct tmp102 *tmp102; 154 int status; 155 156 if (!i2c_check_functionality(client->adapter, 157 I2C_FUNC_SMBUS_WORD_DATA)) { 158 dev_err(&client->dev, 159 "adapter doesn't support SMBus word transactions\n"); 160 return -ENODEV; 161 } 162 163 tmp102 = devm_kzalloc(&client->dev, sizeof(*tmp102), GFP_KERNEL); 164 if (!tmp102) 165 return -ENOMEM; 166 167 i2c_set_clientdata(client, tmp102); 168 169 status = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG); 170 if (status < 0) { 171 dev_err(&client->dev, "error reading config register\n"); 172 return status; 173 } 174 tmp102->config_orig = status; 175 status = i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, 176 TMP102_CONFIG); 177 if (status < 0) { 178 dev_err(&client->dev, "error writing config register\n"); 179 goto fail_restore_config; 180 } 181 status = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG); 182 if (status < 0) { 183 dev_err(&client->dev, "error reading config register\n"); 184 goto fail_restore_config; 185 } 186 status &= ~TMP102_CONFIG_RD_ONLY; 187 if (status != TMP102_CONFIG) { 188 dev_err(&client->dev, "config settings did not stick\n"); 189 status = -ENODEV; 190 goto fail_restore_config; 191 } 192 tmp102->last_update = jiffies - HZ; 193 mutex_init(&tmp102->lock); 194 195 status = sysfs_create_group(&client->dev.kobj, &tmp102_attr_group); 196 if (status) { 197 dev_dbg(&client->dev, "could not create sysfs files\n"); 198 goto fail_restore_config; 199 } 200 tmp102->hwmon_dev = hwmon_device_register(&client->dev); 201 if (IS_ERR(tmp102->hwmon_dev)) { 202 dev_dbg(&client->dev, "unable to register hwmon device\n"); 203 status = PTR_ERR(tmp102->hwmon_dev); 204 goto fail_remove_sysfs; 205 } 206 207 dev_info(&client->dev, "initialized\n"); 208 209 return 0; 210 211 fail_remove_sysfs: 212 sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group); 213 fail_restore_config: 214 i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, 215 tmp102->config_orig); 216 return status; 217 } 218 219 static int tmp102_remove(struct i2c_client *client) 220 { 221 struct tmp102 *tmp102 = i2c_get_clientdata(client); 222 223 hwmon_device_unregister(tmp102->hwmon_dev); 224 sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group); 225 226 /* Stop monitoring if device was stopped originally */ 227 if (tmp102->config_orig & TMP102_CONF_SD) { 228 int config; 229 230 config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG); 231 if (config >= 0) 232 i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, 233 config | TMP102_CONF_SD); 234 } 235 236 return 0; 237 } 238 239 #ifdef CONFIG_PM 240 static int tmp102_suspend(struct device *dev) 241 { 242 struct i2c_client *client = to_i2c_client(dev); 243 int config; 244 245 config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG); 246 if (config < 0) 247 return config; 248 249 config |= TMP102_CONF_SD; 250 return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config); 251 } 252 253 static int tmp102_resume(struct device *dev) 254 { 255 struct i2c_client *client = to_i2c_client(dev); 256 int config; 257 258 config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG); 259 if (config < 0) 260 return config; 261 262 config &= ~TMP102_CONF_SD; 263 return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config); 264 } 265 266 static const struct dev_pm_ops tmp102_dev_pm_ops = { 267 .suspend = tmp102_suspend, 268 .resume = tmp102_resume, 269 }; 270 271 #define TMP102_DEV_PM_OPS (&tmp102_dev_pm_ops) 272 #else 273 #define TMP102_DEV_PM_OPS NULL 274 #endif /* CONFIG_PM */ 275 276 static const struct i2c_device_id tmp102_id[] = { 277 { "tmp102", 0 }, 278 { } 279 }; 280 MODULE_DEVICE_TABLE(i2c, tmp102_id); 281 282 static struct i2c_driver tmp102_driver = { 283 .driver.name = DRIVER_NAME, 284 .driver.pm = TMP102_DEV_PM_OPS, 285 .probe = tmp102_probe, 286 .remove = tmp102_remove, 287 .id_table = tmp102_id, 288 }; 289 290 module_i2c_driver(tmp102_driver); 291 292 MODULE_AUTHOR("Steven King <sfking@fdwdc.com>"); 293 MODULE_DESCRIPTION("Texas Instruments TMP102 temperature sensor driver"); 294 MODULE_LICENSE("GPL"); 295