1*06160327SDavide Rizzo /* 2*06160327SDavide Rizzo * lm95241.c - Part of lm_sensors, Linux kernel modules for hardware 3*06160327SDavide Rizzo * monitoring 4*06160327SDavide Rizzo * Copyright (C) 2008 Davide Rizzo <elpa-rizzo@gmail.com> 5*06160327SDavide Rizzo * 6*06160327SDavide Rizzo * Based on the max1619 driver. The LM95241 is a sensor chip made by National 7*06160327SDavide Rizzo * Semiconductors. 8*06160327SDavide Rizzo * It reports up to three temperatures (its own plus up to 9*06160327SDavide Rizzo * two external ones). Complete datasheet can be 10*06160327SDavide Rizzo * obtained from National's website at: 11*06160327SDavide Rizzo * http://www.national.com/ds.cgi/LM/LM95241.pdf 12*06160327SDavide Rizzo * 13*06160327SDavide Rizzo * This program is free software; you can redistribute it and/or modify 14*06160327SDavide Rizzo * it under the terms of the GNU General Public License as published by 15*06160327SDavide Rizzo * the Free Software Foundation; either version 2 of the License, or 16*06160327SDavide Rizzo * (at your option) any later version. 17*06160327SDavide Rizzo * 18*06160327SDavide Rizzo * This program is distributed in the hope that it will be useful, 19*06160327SDavide Rizzo * but WITHOUT ANY WARRANTY; without even the implied warranty of 20*06160327SDavide Rizzo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21*06160327SDavide Rizzo * GNU General Public License for more details. 22*06160327SDavide Rizzo * 23*06160327SDavide Rizzo * You should have received a copy of the GNU General Public License 24*06160327SDavide Rizzo * along with this program; if not, write to the Free Software 25*06160327SDavide Rizzo * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 26*06160327SDavide Rizzo */ 27*06160327SDavide Rizzo 28*06160327SDavide Rizzo #include <linux/module.h> 29*06160327SDavide Rizzo #include <linux/init.h> 30*06160327SDavide Rizzo #include <linux/slab.h> 31*06160327SDavide Rizzo #include <linux/jiffies.h> 32*06160327SDavide Rizzo #include <linux/i2c.h> 33*06160327SDavide Rizzo #include <linux/hwmon.h> 34*06160327SDavide Rizzo #include <linux/hwmon-sysfs.h> 35*06160327SDavide Rizzo #include <linux/err.h> 36*06160327SDavide Rizzo #include <linux/mutex.h> 37*06160327SDavide Rizzo #include <linux/sysfs.h> 38*06160327SDavide Rizzo 39*06160327SDavide Rizzo static const unsigned short normal_i2c[] = { 40*06160327SDavide Rizzo 0x19, 0x2a, 0x2b, I2C_CLIENT_END}; 41*06160327SDavide Rizzo 42*06160327SDavide Rizzo /* Insmod parameters */ 43*06160327SDavide Rizzo I2C_CLIENT_INSMOD_1(lm95241); 44*06160327SDavide Rizzo 45*06160327SDavide Rizzo /* LM95241 registers */ 46*06160327SDavide Rizzo #define LM95241_REG_R_MAN_ID 0xFE 47*06160327SDavide Rizzo #define LM95241_REG_R_CHIP_ID 0xFF 48*06160327SDavide Rizzo #define LM95241_REG_R_STATUS 0x02 49*06160327SDavide Rizzo #define LM95241_REG_RW_CONFIG 0x03 50*06160327SDavide Rizzo #define LM95241_REG_RW_REM_FILTER 0x06 51*06160327SDavide Rizzo #define LM95241_REG_RW_TRUTHERM 0x07 52*06160327SDavide Rizzo #define LM95241_REG_W_ONE_SHOT 0x0F 53*06160327SDavide Rizzo #define LM95241_REG_R_LOCAL_TEMPH 0x10 54*06160327SDavide Rizzo #define LM95241_REG_R_REMOTE1_TEMPH 0x11 55*06160327SDavide Rizzo #define LM95241_REG_R_REMOTE2_TEMPH 0x12 56*06160327SDavide Rizzo #define LM95241_REG_R_LOCAL_TEMPL 0x20 57*06160327SDavide Rizzo #define LM95241_REG_R_REMOTE1_TEMPL 0x21 58*06160327SDavide Rizzo #define LM95241_REG_R_REMOTE2_TEMPL 0x22 59*06160327SDavide Rizzo #define LM95241_REG_RW_REMOTE_MODEL 0x30 60*06160327SDavide Rizzo 61*06160327SDavide Rizzo /* LM95241 specific bitfields */ 62*06160327SDavide Rizzo #define CFG_STOP 0x40 63*06160327SDavide Rizzo #define CFG_CR0076 0x00 64*06160327SDavide Rizzo #define CFG_CR0182 0x10 65*06160327SDavide Rizzo #define CFG_CR1000 0x20 66*06160327SDavide Rizzo #define CFG_CR2700 0x30 67*06160327SDavide Rizzo #define R1MS_SHIFT 0 68*06160327SDavide Rizzo #define R2MS_SHIFT 2 69*06160327SDavide Rizzo #define R1MS_MASK (0x01 << (R1MS_SHIFT)) 70*06160327SDavide Rizzo #define R2MS_MASK (0x01 << (R2MS_SHIFT)) 71*06160327SDavide Rizzo #define R1DF_SHIFT 1 72*06160327SDavide Rizzo #define R2DF_SHIFT 2 73*06160327SDavide Rizzo #define R1DF_MASK (0x01 << (R1DF_SHIFT)) 74*06160327SDavide Rizzo #define R2DF_MASK (0x01 << (R2DF_SHIFT)) 75*06160327SDavide Rizzo #define R1FE_MASK 0x01 76*06160327SDavide Rizzo #define R2FE_MASK 0x05 77*06160327SDavide Rizzo #define TT1_SHIFT 0 78*06160327SDavide Rizzo #define TT2_SHIFT 4 79*06160327SDavide Rizzo #define TT_OFF 0 80*06160327SDavide Rizzo #define TT_ON 1 81*06160327SDavide Rizzo #define TT_MASK 7 82*06160327SDavide Rizzo #define MANUFACTURER_ID 0x01 83*06160327SDavide Rizzo #define DEFAULT_REVISION 0xA4 84*06160327SDavide Rizzo 85*06160327SDavide Rizzo /* Conversions and various macros */ 86*06160327SDavide Rizzo #define TEMP_FROM_REG(val_h, val_l) (((val_h) & 0x80 ? (val_h) - 0x100 : \ 87*06160327SDavide Rizzo (val_h)) * 1000 + (val_l) * 1000 / 256) 88*06160327SDavide Rizzo 89*06160327SDavide Rizzo /* Functions declaration */ 90*06160327SDavide Rizzo static int lm95241_attach_adapter(struct i2c_adapter *adapter); 91*06160327SDavide Rizzo static int lm95241_detect(struct i2c_adapter *adapter, int address, 92*06160327SDavide Rizzo int kind); 93*06160327SDavide Rizzo static void lm95241_init_client(struct i2c_client *client); 94*06160327SDavide Rizzo static int lm95241_detach_client(struct i2c_client *client); 95*06160327SDavide Rizzo static struct lm95241_data *lm95241_update_device(struct device *dev); 96*06160327SDavide Rizzo 97*06160327SDavide Rizzo /* Driver data (common to all clients) */ 98*06160327SDavide Rizzo static struct i2c_driver lm95241_driver = { 99*06160327SDavide Rizzo .driver = { 100*06160327SDavide Rizzo .name = "lm95241", 101*06160327SDavide Rizzo }, 102*06160327SDavide Rizzo .attach_adapter = lm95241_attach_adapter, 103*06160327SDavide Rizzo .detach_client = lm95241_detach_client, 104*06160327SDavide Rizzo }; 105*06160327SDavide Rizzo 106*06160327SDavide Rizzo /* Client data (each client gets its own) */ 107*06160327SDavide Rizzo struct lm95241_data { 108*06160327SDavide Rizzo struct i2c_client client; 109*06160327SDavide Rizzo struct device *hwmon_dev; 110*06160327SDavide Rizzo struct mutex update_lock; 111*06160327SDavide Rizzo unsigned long last_updated, rate; /* in jiffies */ 112*06160327SDavide Rizzo char valid; /* zero until following fields are valid */ 113*06160327SDavide Rizzo /* registers values */ 114*06160327SDavide Rizzo u8 local_h, local_l; /* local */ 115*06160327SDavide Rizzo u8 remote1_h, remote1_l; /* remote1 */ 116*06160327SDavide Rizzo u8 remote2_h, remote2_l; /* remote2 */ 117*06160327SDavide Rizzo u8 config, model, trutherm; 118*06160327SDavide Rizzo }; 119*06160327SDavide Rizzo 120*06160327SDavide Rizzo /* Sysfs stuff */ 121*06160327SDavide Rizzo #define show_temp(value) \ 122*06160327SDavide Rizzo static ssize_t show_##value(struct device *dev, \ 123*06160327SDavide Rizzo struct device_attribute *attr, char *buf) \ 124*06160327SDavide Rizzo { \ 125*06160327SDavide Rizzo struct lm95241_data *data = lm95241_update_device(dev); \ 126*06160327SDavide Rizzo snprintf(buf, PAGE_SIZE - 1, "%d\n", \ 127*06160327SDavide Rizzo TEMP_FROM_REG(data->value##_h, data->value##_l)); \ 128*06160327SDavide Rizzo return strlen(buf); \ 129*06160327SDavide Rizzo } 130*06160327SDavide Rizzo show_temp(local); 131*06160327SDavide Rizzo show_temp(remote1); 132*06160327SDavide Rizzo show_temp(remote2); 133*06160327SDavide Rizzo 134*06160327SDavide Rizzo static ssize_t show_rate(struct device *dev, struct device_attribute *attr, 135*06160327SDavide Rizzo char *buf) 136*06160327SDavide Rizzo { 137*06160327SDavide Rizzo struct lm95241_data *data = lm95241_update_device(dev); 138*06160327SDavide Rizzo 139*06160327SDavide Rizzo snprintf(buf, PAGE_SIZE - 1, "%lu\n", 1000 * data->rate / HZ); 140*06160327SDavide Rizzo return strlen(buf); 141*06160327SDavide Rizzo } 142*06160327SDavide Rizzo 143*06160327SDavide Rizzo static ssize_t set_rate(struct device *dev, struct device_attribute *attr, 144*06160327SDavide Rizzo const char *buf, size_t count) 145*06160327SDavide Rizzo { 146*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); 147*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); 148*06160327SDavide Rizzo 149*06160327SDavide Rizzo strict_strtol(buf, 10, &data->rate); 150*06160327SDavide Rizzo data->rate = data->rate * HZ / 1000; 151*06160327SDavide Rizzo 152*06160327SDavide Rizzo return count; 153*06160327SDavide Rizzo } 154*06160327SDavide Rizzo 155*06160327SDavide Rizzo #define show_type(flag) \ 156*06160327SDavide Rizzo static ssize_t show_type##flag(struct device *dev, \ 157*06160327SDavide Rizzo struct device_attribute *attr, char *buf) \ 158*06160327SDavide Rizzo { \ 159*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 160*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 161*06160327SDavide Rizzo \ 162*06160327SDavide Rizzo snprintf(buf, PAGE_SIZE - 1, \ 163*06160327SDavide Rizzo data->model & R##flag##MS_MASK ? "1\n" : "2\n"); \ 164*06160327SDavide Rizzo return strlen(buf); \ 165*06160327SDavide Rizzo } 166*06160327SDavide Rizzo show_type(1); 167*06160327SDavide Rizzo show_type(2); 168*06160327SDavide Rizzo 169*06160327SDavide Rizzo #define show_min(flag) \ 170*06160327SDavide Rizzo static ssize_t show_min##flag(struct device *dev, \ 171*06160327SDavide Rizzo struct device_attribute *attr, char *buf) \ 172*06160327SDavide Rizzo { \ 173*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 174*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 175*06160327SDavide Rizzo \ 176*06160327SDavide Rizzo snprintf(buf, PAGE_SIZE - 1, \ 177*06160327SDavide Rizzo data->config & R##flag##DF_MASK ? \ 178*06160327SDavide Rizzo "-127000\n" : "0\n"); \ 179*06160327SDavide Rizzo return strlen(buf); \ 180*06160327SDavide Rizzo } 181*06160327SDavide Rizzo show_min(1); 182*06160327SDavide Rizzo show_min(2); 183*06160327SDavide Rizzo 184*06160327SDavide Rizzo #define show_max(flag) \ 185*06160327SDavide Rizzo static ssize_t show_max##flag(struct device *dev, \ 186*06160327SDavide Rizzo struct device_attribute *attr, char *buf) \ 187*06160327SDavide Rizzo { \ 188*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 189*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 190*06160327SDavide Rizzo \ 191*06160327SDavide Rizzo snprintf(buf, PAGE_SIZE - 1, \ 192*06160327SDavide Rizzo data->config & R##flag##DF_MASK ? \ 193*06160327SDavide Rizzo "127000\n" : "255000\n"); \ 194*06160327SDavide Rizzo return strlen(buf); \ 195*06160327SDavide Rizzo } 196*06160327SDavide Rizzo show_max(1); 197*06160327SDavide Rizzo show_max(2); 198*06160327SDavide Rizzo 199*06160327SDavide Rizzo #define set_type(flag) \ 200*06160327SDavide Rizzo static ssize_t set_type##flag(struct device *dev, \ 201*06160327SDavide Rizzo struct device_attribute *attr, \ 202*06160327SDavide Rizzo const char *buf, size_t count) \ 203*06160327SDavide Rizzo { \ 204*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 205*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 206*06160327SDavide Rizzo \ 207*06160327SDavide Rizzo long val; \ 208*06160327SDavide Rizzo strict_strtol(buf, 10, &val); \ 209*06160327SDavide Rizzo \ 210*06160327SDavide Rizzo if ((val == 1) || (val == 2)) { \ 211*06160327SDavide Rizzo \ 212*06160327SDavide Rizzo mutex_lock(&data->update_lock); \ 213*06160327SDavide Rizzo \ 214*06160327SDavide Rizzo data->trutherm &= ~(TT_MASK << TT##flag##_SHIFT); \ 215*06160327SDavide Rizzo if (val == 1) { \ 216*06160327SDavide Rizzo data->model |= R##flag##MS_MASK; \ 217*06160327SDavide Rizzo data->trutherm |= (TT_ON << TT##flag##_SHIFT); \ 218*06160327SDavide Rizzo } \ 219*06160327SDavide Rizzo else { \ 220*06160327SDavide Rizzo data->model &= ~R##flag##MS_MASK; \ 221*06160327SDavide Rizzo data->trutherm |= (TT_OFF << TT##flag##_SHIFT); \ 222*06160327SDavide Rizzo } \ 223*06160327SDavide Rizzo \ 224*06160327SDavide Rizzo data->valid = 0; \ 225*06160327SDavide Rizzo \ 226*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL, \ 227*06160327SDavide Rizzo data->model); \ 228*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM, \ 229*06160327SDavide Rizzo data->trutherm); \ 230*06160327SDavide Rizzo \ 231*06160327SDavide Rizzo mutex_unlock(&data->update_lock); \ 232*06160327SDavide Rizzo \ 233*06160327SDavide Rizzo } \ 234*06160327SDavide Rizzo return count; \ 235*06160327SDavide Rizzo } 236*06160327SDavide Rizzo set_type(1); 237*06160327SDavide Rizzo set_type(2); 238*06160327SDavide Rizzo 239*06160327SDavide Rizzo #define set_min(flag) \ 240*06160327SDavide Rizzo static ssize_t set_min##flag(struct device *dev, \ 241*06160327SDavide Rizzo struct device_attribute *devattr, const char *buf, size_t count) \ 242*06160327SDavide Rizzo { \ 243*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 244*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 245*06160327SDavide Rizzo \ 246*06160327SDavide Rizzo long val; \ 247*06160327SDavide Rizzo strict_strtol(buf, 10, &val); \ 248*06160327SDavide Rizzo \ 249*06160327SDavide Rizzo mutex_lock(&data->update_lock); \ 250*06160327SDavide Rizzo \ 251*06160327SDavide Rizzo if (val < 0) \ 252*06160327SDavide Rizzo data->config |= R##flag##DF_MASK; \ 253*06160327SDavide Rizzo else \ 254*06160327SDavide Rizzo data->config &= ~R##flag##DF_MASK; \ 255*06160327SDavide Rizzo \ 256*06160327SDavide Rizzo data->valid = 0; \ 257*06160327SDavide Rizzo \ 258*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, \ 259*06160327SDavide Rizzo data->config); \ 260*06160327SDavide Rizzo \ 261*06160327SDavide Rizzo mutex_unlock(&data->update_lock); \ 262*06160327SDavide Rizzo \ 263*06160327SDavide Rizzo return count; \ 264*06160327SDavide Rizzo } 265*06160327SDavide Rizzo set_min(1); 266*06160327SDavide Rizzo set_min(2); 267*06160327SDavide Rizzo 268*06160327SDavide Rizzo #define set_max(flag) \ 269*06160327SDavide Rizzo static ssize_t set_max##flag(struct device *dev, \ 270*06160327SDavide Rizzo struct device_attribute *devattr, const char *buf, size_t count) \ 271*06160327SDavide Rizzo { \ 272*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); \ 273*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); \ 274*06160327SDavide Rizzo \ 275*06160327SDavide Rizzo long val; \ 276*06160327SDavide Rizzo strict_strtol(buf, 10, &val); \ 277*06160327SDavide Rizzo \ 278*06160327SDavide Rizzo mutex_lock(&data->update_lock); \ 279*06160327SDavide Rizzo \ 280*06160327SDavide Rizzo if (val <= 127000) \ 281*06160327SDavide Rizzo data->config |= R##flag##DF_MASK; \ 282*06160327SDavide Rizzo else \ 283*06160327SDavide Rizzo data->config &= ~R##flag##DF_MASK; \ 284*06160327SDavide Rizzo \ 285*06160327SDavide Rizzo data->valid = 0; \ 286*06160327SDavide Rizzo \ 287*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, \ 288*06160327SDavide Rizzo data->config); \ 289*06160327SDavide Rizzo \ 290*06160327SDavide Rizzo mutex_unlock(&data->update_lock); \ 291*06160327SDavide Rizzo \ 292*06160327SDavide Rizzo return count; \ 293*06160327SDavide Rizzo } 294*06160327SDavide Rizzo set_max(1); 295*06160327SDavide Rizzo set_max(2); 296*06160327SDavide Rizzo 297*06160327SDavide Rizzo static DEVICE_ATTR(temp1_input, S_IRUGO, show_local, NULL); 298*06160327SDavide Rizzo static DEVICE_ATTR(temp2_input, S_IRUGO, show_remote1, NULL); 299*06160327SDavide Rizzo static DEVICE_ATTR(temp3_input, S_IRUGO, show_remote2, NULL); 300*06160327SDavide Rizzo static DEVICE_ATTR(temp2_type, S_IWUSR | S_IRUGO, show_type1, set_type1); 301*06160327SDavide Rizzo static DEVICE_ATTR(temp3_type, S_IWUSR | S_IRUGO, show_type2, set_type2); 302*06160327SDavide Rizzo static DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_min1, set_min1); 303*06160327SDavide Rizzo static DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_min2, set_min2); 304*06160327SDavide Rizzo static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_max1, set_max1); 305*06160327SDavide Rizzo static DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_max2, set_max2); 306*06160327SDavide Rizzo static DEVICE_ATTR(rate, S_IWUSR | S_IRUGO, show_rate, set_rate); 307*06160327SDavide Rizzo 308*06160327SDavide Rizzo static struct attribute *lm95241_attributes[] = { 309*06160327SDavide Rizzo &dev_attr_temp1_input.attr, 310*06160327SDavide Rizzo &dev_attr_temp2_input.attr, 311*06160327SDavide Rizzo &dev_attr_temp3_input.attr, 312*06160327SDavide Rizzo &dev_attr_temp2_type.attr, 313*06160327SDavide Rizzo &dev_attr_temp3_type.attr, 314*06160327SDavide Rizzo &dev_attr_temp2_min.attr, 315*06160327SDavide Rizzo &dev_attr_temp3_min.attr, 316*06160327SDavide Rizzo &dev_attr_temp2_max.attr, 317*06160327SDavide Rizzo &dev_attr_temp3_max.attr, 318*06160327SDavide Rizzo &dev_attr_rate.attr, 319*06160327SDavide Rizzo NULL 320*06160327SDavide Rizzo }; 321*06160327SDavide Rizzo 322*06160327SDavide Rizzo static const struct attribute_group lm95241_group = { 323*06160327SDavide Rizzo .attrs = lm95241_attributes, 324*06160327SDavide Rizzo }; 325*06160327SDavide Rizzo 326*06160327SDavide Rizzo /* Init/exit code */ 327*06160327SDavide Rizzo static int lm95241_attach_adapter(struct i2c_adapter *adapter) 328*06160327SDavide Rizzo { 329*06160327SDavide Rizzo if (!(adapter->class & I2C_CLASS_HWMON)) 330*06160327SDavide Rizzo return 0; 331*06160327SDavide Rizzo return i2c_probe(adapter, &addr_data, lm95241_detect); 332*06160327SDavide Rizzo } 333*06160327SDavide Rizzo 334*06160327SDavide Rizzo /* 335*06160327SDavide Rizzo * The following function does more than just detection. If detection 336*06160327SDavide Rizzo * succeeds, it also registers the new chip. 337*06160327SDavide Rizzo */ 338*06160327SDavide Rizzo static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind) 339*06160327SDavide Rizzo { 340*06160327SDavide Rizzo struct i2c_client *new_client; 341*06160327SDavide Rizzo struct lm95241_data *data; 342*06160327SDavide Rizzo int err = 0; 343*06160327SDavide Rizzo const char *name = ""; 344*06160327SDavide Rizzo 345*06160327SDavide Rizzo if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 346*06160327SDavide Rizzo goto exit; 347*06160327SDavide Rizzo 348*06160327SDavide Rizzo data = kzalloc(sizeof(struct lm95241_data), GFP_KERNEL); 349*06160327SDavide Rizzo if (!data) { 350*06160327SDavide Rizzo err = -ENOMEM; 351*06160327SDavide Rizzo goto exit; 352*06160327SDavide Rizzo } 353*06160327SDavide Rizzo 354*06160327SDavide Rizzo /* The common I2C client data is placed right before the 355*06160327SDavide Rizzo LM95241-specific data. */ 356*06160327SDavide Rizzo new_client = &data->client; 357*06160327SDavide Rizzo i2c_set_clientdata(new_client, data); 358*06160327SDavide Rizzo new_client->addr = address; 359*06160327SDavide Rizzo new_client->adapter = adapter; 360*06160327SDavide Rizzo new_client->driver = &lm95241_driver; 361*06160327SDavide Rizzo new_client->flags = 0; 362*06160327SDavide Rizzo 363*06160327SDavide Rizzo /* 364*06160327SDavide Rizzo * Now we do the remaining detection. A negative kind means that 365*06160327SDavide Rizzo * the driver was loaded with no force parameter (default), so we 366*06160327SDavide Rizzo * must both detect and identify the chip. A zero kind means that 367*06160327SDavide Rizzo * the driver was loaded with the force parameter, the detection 368*06160327SDavide Rizzo * step shall be skipped. A positive kind means that the driver 369*06160327SDavide Rizzo * was loaded with the force parameter and a given kind of chip is 370*06160327SDavide Rizzo * requested, so both the detection and the identification steps 371*06160327SDavide Rizzo * are skipped. 372*06160327SDavide Rizzo */ 373*06160327SDavide Rizzo if (kind < 0) { /* detection */ 374*06160327SDavide Rizzo if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) 375*06160327SDavide Rizzo != MANUFACTURER_ID) 376*06160327SDavide Rizzo || (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) 377*06160327SDavide Rizzo < DEFAULT_REVISION)) { 378*06160327SDavide Rizzo dev_dbg(&adapter->dev, 379*06160327SDavide Rizzo "LM95241 detection failed at 0x%02x.\n", 380*06160327SDavide Rizzo address); 381*06160327SDavide Rizzo goto exit_free; 382*06160327SDavide Rizzo } 383*06160327SDavide Rizzo } 384*06160327SDavide Rizzo 385*06160327SDavide Rizzo if (kind <= 0) { /* identification */ 386*06160327SDavide Rizzo if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) 387*06160327SDavide Rizzo == MANUFACTURER_ID) 388*06160327SDavide Rizzo && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) 389*06160327SDavide Rizzo >= DEFAULT_REVISION)) { 390*06160327SDavide Rizzo 391*06160327SDavide Rizzo kind = lm95241; 392*06160327SDavide Rizzo 393*06160327SDavide Rizzo if (kind <= 0) { /* identification failed */ 394*06160327SDavide Rizzo dev_info(&adapter->dev, "Unsupported chip\n"); 395*06160327SDavide Rizzo goto exit_free; 396*06160327SDavide Rizzo } 397*06160327SDavide Rizzo } 398*06160327SDavide Rizzo } 399*06160327SDavide Rizzo 400*06160327SDavide Rizzo if (kind == lm95241) 401*06160327SDavide Rizzo name = "lm95241"; 402*06160327SDavide Rizzo 403*06160327SDavide Rizzo /* We can fill in the remaining client fields */ 404*06160327SDavide Rizzo strlcpy(new_client->name, name, I2C_NAME_SIZE); 405*06160327SDavide Rizzo data->valid = 0; 406*06160327SDavide Rizzo mutex_init(&data->update_lock); 407*06160327SDavide Rizzo 408*06160327SDavide Rizzo /* Tell the I2C layer a new client has arrived */ 409*06160327SDavide Rizzo err = i2c_attach_client(new_client); 410*06160327SDavide Rizzo if (err) 411*06160327SDavide Rizzo goto exit_free; 412*06160327SDavide Rizzo 413*06160327SDavide Rizzo /* Initialize the LM95241 chip */ 414*06160327SDavide Rizzo lm95241_init_client(new_client); 415*06160327SDavide Rizzo 416*06160327SDavide Rizzo /* Register sysfs hooks */ 417*06160327SDavide Rizzo err = sysfs_create_group(&new_client->dev.kobj, &lm95241_group); 418*06160327SDavide Rizzo if (err) 419*06160327SDavide Rizzo goto exit_detach; 420*06160327SDavide Rizzo 421*06160327SDavide Rizzo data->hwmon_dev = hwmon_device_register(&new_client->dev); 422*06160327SDavide Rizzo if (IS_ERR(data->hwmon_dev)) { 423*06160327SDavide Rizzo err = PTR_ERR(data->hwmon_dev); 424*06160327SDavide Rizzo goto exit_remove_files; 425*06160327SDavide Rizzo } 426*06160327SDavide Rizzo 427*06160327SDavide Rizzo return 0; 428*06160327SDavide Rizzo 429*06160327SDavide Rizzo exit_remove_files: 430*06160327SDavide Rizzo sysfs_remove_group(&new_client->dev.kobj, &lm95241_group); 431*06160327SDavide Rizzo exit_detach: 432*06160327SDavide Rizzo i2c_detach_client(new_client); 433*06160327SDavide Rizzo exit_free: 434*06160327SDavide Rizzo kfree(data); 435*06160327SDavide Rizzo exit: 436*06160327SDavide Rizzo return err; 437*06160327SDavide Rizzo } 438*06160327SDavide Rizzo 439*06160327SDavide Rizzo static void lm95241_init_client(struct i2c_client *client) 440*06160327SDavide Rizzo { 441*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); 442*06160327SDavide Rizzo 443*06160327SDavide Rizzo data->rate = HZ; /* 1 sec default */ 444*06160327SDavide Rizzo data->valid = 0; 445*06160327SDavide Rizzo data->config = CFG_CR0076; 446*06160327SDavide Rizzo data->model = 0; 447*06160327SDavide Rizzo data->trutherm = (TT_OFF << TT1_SHIFT) | (TT_OFF << TT2_SHIFT); 448*06160327SDavide Rizzo 449*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, 450*06160327SDavide Rizzo data->config); 451*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_REM_FILTER, 452*06160327SDavide Rizzo R1FE_MASK | R2FE_MASK); 453*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM, 454*06160327SDavide Rizzo data->trutherm); 455*06160327SDavide Rizzo i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL, 456*06160327SDavide Rizzo data->model); 457*06160327SDavide Rizzo } 458*06160327SDavide Rizzo 459*06160327SDavide Rizzo static int lm95241_detach_client(struct i2c_client *client) 460*06160327SDavide Rizzo { 461*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); 462*06160327SDavide Rizzo int err; 463*06160327SDavide Rizzo 464*06160327SDavide Rizzo hwmon_device_unregister(data->hwmon_dev); 465*06160327SDavide Rizzo sysfs_remove_group(&client->dev.kobj, &lm95241_group); 466*06160327SDavide Rizzo 467*06160327SDavide Rizzo err = i2c_detach_client(client); 468*06160327SDavide Rizzo if (err) 469*06160327SDavide Rizzo return err; 470*06160327SDavide Rizzo 471*06160327SDavide Rizzo kfree(data); 472*06160327SDavide Rizzo return 0; 473*06160327SDavide Rizzo } 474*06160327SDavide Rizzo 475*06160327SDavide Rizzo static struct lm95241_data *lm95241_update_device(struct device *dev) 476*06160327SDavide Rizzo { 477*06160327SDavide Rizzo struct i2c_client *client = to_i2c_client(dev); 478*06160327SDavide Rizzo struct lm95241_data *data = i2c_get_clientdata(client); 479*06160327SDavide Rizzo 480*06160327SDavide Rizzo mutex_lock(&data->update_lock); 481*06160327SDavide Rizzo 482*06160327SDavide Rizzo if (time_after(jiffies, data->last_updated + data->rate) || 483*06160327SDavide Rizzo !data->valid) { 484*06160327SDavide Rizzo dev_dbg(&client->dev, "Updating lm95241 data.\n"); 485*06160327SDavide Rizzo data->local_h = 486*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 487*06160327SDavide Rizzo LM95241_REG_R_LOCAL_TEMPH); 488*06160327SDavide Rizzo data->local_l = 489*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 490*06160327SDavide Rizzo LM95241_REG_R_LOCAL_TEMPL); 491*06160327SDavide Rizzo data->remote1_h = 492*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 493*06160327SDavide Rizzo LM95241_REG_R_REMOTE1_TEMPH); 494*06160327SDavide Rizzo data->remote1_l = 495*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 496*06160327SDavide Rizzo LM95241_REG_R_REMOTE1_TEMPL); 497*06160327SDavide Rizzo data->remote2_h = 498*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 499*06160327SDavide Rizzo LM95241_REG_R_REMOTE2_TEMPH); 500*06160327SDavide Rizzo data->remote2_l = 501*06160327SDavide Rizzo i2c_smbus_read_byte_data(client, 502*06160327SDavide Rizzo LM95241_REG_R_REMOTE2_TEMPL); 503*06160327SDavide Rizzo data->last_updated = jiffies; 504*06160327SDavide Rizzo data->valid = 1; 505*06160327SDavide Rizzo } 506*06160327SDavide Rizzo 507*06160327SDavide Rizzo mutex_unlock(&data->update_lock); 508*06160327SDavide Rizzo 509*06160327SDavide Rizzo return data; 510*06160327SDavide Rizzo } 511*06160327SDavide Rizzo 512*06160327SDavide Rizzo static int __init sensors_lm95241_init(void) 513*06160327SDavide Rizzo { 514*06160327SDavide Rizzo return i2c_add_driver(&lm95241_driver); 515*06160327SDavide Rizzo } 516*06160327SDavide Rizzo 517*06160327SDavide Rizzo static void __exit sensors_lm95241_exit(void) 518*06160327SDavide Rizzo { 519*06160327SDavide Rizzo i2c_del_driver(&lm95241_driver); 520*06160327SDavide Rizzo } 521*06160327SDavide Rizzo 522*06160327SDavide Rizzo MODULE_AUTHOR("Davide Rizzo <elpa-rizzo@gmail.com>"); 523*06160327SDavide Rizzo MODULE_DESCRIPTION("LM95241 sensor driver"); 524*06160327SDavide Rizzo MODULE_LICENSE("GPL"); 525*06160327SDavide Rizzo 526*06160327SDavide Rizzo module_init(sensors_lm95241_init); 527*06160327SDavide Rizzo module_exit(sensors_lm95241_exit); 528