Blame view

drivers/hwmon/lm95241.c 12.6 KB
061603275   Davide Rizzo   hwmon: LM95241 dr...
1
  /*
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
2
   * Copyright (C) 2008, 2010 Davide Rizzo <elpa.rizzo@gmail.com>
061603275   Davide Rizzo   hwmon: LM95241 dr...
3
   *
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
4
5
6
   * The LM95241 is a sensor chip made by National Semiconductors.
   * It reports up to three temperatures (its own plus up to two external ones).
   * Complete datasheet can be obtained from National's website at:
061603275   Davide Rizzo   hwmon: LM95241 dr...
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   *   http://www.national.com/ds.cgi/LM/LM95241.pdf
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/slab.h>
  #include <linux/jiffies.h>
  #include <linux/i2c.h>
  #include <linux/hwmon.h>
  #include <linux/hwmon-sysfs.h>
  #include <linux/err.h>
  #include <linux/mutex.h>
  #include <linux/sysfs.h>
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
34
  #define DEVNAME "lm95241"
061603275   Davide Rizzo   hwmon: LM95241 dr...
35
  static const unsigned short normal_i2c[] = {
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
36
  	0x19, 0x2a, 0x2b, I2C_CLIENT_END };
061603275   Davide Rizzo   hwmon: LM95241 dr...
37

061603275   Davide Rizzo   hwmon: LM95241 dr...
38
39
40
41
42
43
44
  /* LM95241 registers */
  #define LM95241_REG_R_MAN_ID		0xFE
  #define LM95241_REG_R_CHIP_ID		0xFF
  #define LM95241_REG_R_STATUS		0x02
  #define LM95241_REG_RW_CONFIG		0x03
  #define LM95241_REG_RW_REM_FILTER	0x06
  #define LM95241_REG_RW_TRUTHERM		0x07
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
45
  #define LM95241_REG_W_ONE_SHOT		0x0F
061603275   Davide Rizzo   hwmon: LM95241 dr...
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  #define LM95241_REG_R_LOCAL_TEMPH	0x10
  #define LM95241_REG_R_REMOTE1_TEMPH	0x11
  #define LM95241_REG_R_REMOTE2_TEMPH	0x12
  #define LM95241_REG_R_LOCAL_TEMPL	0x20
  #define LM95241_REG_R_REMOTE1_TEMPL	0x21
  #define LM95241_REG_R_REMOTE2_TEMPL	0x22
  #define LM95241_REG_RW_REMOTE_MODEL	0x30
  
  /* LM95241 specific bitfields */
  #define CFG_STOP 0x40
  #define CFG_CR0076 0x00
  #define CFG_CR0182 0x10
  #define CFG_CR1000 0x20
  #define CFG_CR2700 0x30
  #define R1MS_SHIFT 0
  #define R2MS_SHIFT 2
  #define R1MS_MASK (0x01 << (R1MS_SHIFT))
  #define R2MS_MASK (0x01 << (R2MS_SHIFT))
  #define R1DF_SHIFT 1
  #define R2DF_SHIFT 2
  #define R1DF_MASK (0x01 << (R1DF_SHIFT))
  #define R2DF_MASK (0x01 << (R2DF_SHIFT))
  #define R1FE_MASK 0x01
  #define R2FE_MASK 0x05
  #define TT1_SHIFT 0
  #define TT2_SHIFT 4
  #define TT_OFF 0
  #define TT_ON 1
  #define TT_MASK 7
8c1d04192   Guenter Roeck   hwmon: (lm95241) ...
75
76
77
  #define NATSEMI_MAN_ID	0x01
  #define LM95231_CHIP_ID	0xA1
  #define LM95241_CHIP_ID	0xA4
061603275   Davide Rizzo   hwmon: LM95241 dr...
78

0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
79
80
81
82
83
84
85
86
  static const u8 lm95241_reg_address[] = {
  	LM95241_REG_R_LOCAL_TEMPH,
  	LM95241_REG_R_LOCAL_TEMPL,
  	LM95241_REG_R_REMOTE1_TEMPH,
  	LM95241_REG_R_REMOTE1_TEMPL,
  	LM95241_REG_R_REMOTE2_TEMPH,
  	LM95241_REG_R_REMOTE2_TEMPL
  };
061603275   Davide Rizzo   hwmon: LM95241 dr...
87

061603275   Davide Rizzo   hwmon: LM95241 dr...
88
89
  /* Client data (each client gets its own) */
  struct lm95241_data {
061603275   Davide Rizzo   hwmon: LM95241 dr...
90
91
  	struct device *hwmon_dev;
  	struct mutex update_lock;
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
92
93
  	unsigned long last_updated, interval;	/* in jiffies */
  	char valid;		/* zero until following fields are valid */
061603275   Davide Rizzo   hwmon: LM95241 dr...
94
  	/* registers values */
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
95
  	u8 temp[ARRAY_SIZE(lm95241_reg_address)];
061603275   Davide Rizzo   hwmon: LM95241 dr...
96
97
  	u8 config, model, trutherm;
  };
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
98
  /* Conversions */
0c2a40e2f   Guenter Roeck   hwmon: (lm95241) ...
99
  static int temp_from_reg_signed(u8 val_h, u8 val_l)
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
100
  {
0c2a40e2f   Guenter Roeck   hwmon: (lm95241) ...
101
102
103
104
105
106
107
108
  	s16 val_hl = (val_h << 8) | val_l;
  	return val_hl * 1000 / 256;
  }
  
  static int temp_from_reg_unsigned(u8 val_h, u8 val_l)
  {
  	u16 val_hl = (val_h << 8) | val_l;
  	return val_hl * 1000 / 256;
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  }
  
  static struct lm95241_data *lm95241_update_device(struct device *dev)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  
  	mutex_lock(&data->update_lock);
  
  	if (time_after(jiffies, data->last_updated + data->interval) ||
  	    !data->valid) {
  		int i;
  
  		dev_dbg(&client->dev, "Updating lm95241 data.
  ");
  		for (i = 0; i < ARRAY_SIZE(lm95241_reg_address); i++)
  			data->temp[i]
  			  = i2c_smbus_read_byte_data(client,
  						     lm95241_reg_address[i]);
  		data->last_updated = jiffies;
  		data->valid = 1;
  	}
  
  	mutex_unlock(&data->update_lock);
  
  	return data;
  }
061603275   Davide Rizzo   hwmon: LM95241 dr...
136
  /* Sysfs stuff */
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
137
138
139
140
  static ssize_t show_input(struct device *dev, struct device_attribute *attr,
  			  char *buf)
  {
  	struct lm95241_data *data = lm95241_update_device(dev);
0c2a40e2f   Guenter Roeck   hwmon: (lm95241) ...
141
  	int index = to_sensor_dev_attr(attr)->index;
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
142
143
144
  
  	return snprintf(buf, PAGE_SIZE - 1, "%d
  ",
0c2a40e2f   Guenter Roeck   hwmon: (lm95241) ...
145
146
147
148
  			index == 0 || (data->config & (1 << (index / 2))) ?
  		temp_from_reg_signed(data->temp[index], data->temp[index + 1]) :
  		temp_from_reg_unsigned(data->temp[index],
  				       data->temp[index + 1]));
061603275   Davide Rizzo   hwmon: LM95241 dr...
149
  }
061603275   Davide Rizzo   hwmon: LM95241 dr...
150

0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
151
  static ssize_t show_type(struct device *dev, struct device_attribute *attr,
061603275   Davide Rizzo   hwmon: LM95241 dr...
152
153
  			 char *buf)
  {
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
154
155
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
061603275   Davide Rizzo   hwmon: LM95241 dr...
156

0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
157
158
159
160
  	return snprintf(buf, PAGE_SIZE - 1,
  		data->model & to_sensor_dev_attr(attr)->index ? "1
  " : "2
  ");
061603275   Davide Rizzo   hwmon: LM95241 dr...
161
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
162
  static ssize_t set_type(struct device *dev, struct device_attribute *attr,
061603275   Davide Rizzo   hwmon: LM95241 dr...
163
164
165
166
  			const char *buf, size_t count)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
61ec2da50   Jean Delvare   hwmon: (lm95241) ...
167
  	unsigned long val;
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
168
169
  	int shift;
  	u8 mask = to_sensor_dev_attr(attr)->index;
061603275   Davide Rizzo   hwmon: LM95241 dr...
170

179c4fdb5   Frans Meulenbroeks   hwmon: replaced s...
171
  	if (kstrtoul(buf, 10, &val) < 0)
61ec2da50   Jean Delvare   hwmon: (lm95241) ...
172
  		return -EINVAL;
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
173
174
  	if (val != 1 && val != 2)
  		return -EINVAL;
61ec2da50   Jean Delvare   hwmon: (lm95241) ...
175

0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  	shift = mask == R1MS_MASK ? TT1_SHIFT : TT2_SHIFT;
  
  	mutex_lock(&data->update_lock);
  
  	data->trutherm &= ~(TT_MASK << shift);
  	if (val == 1) {
  		data->model |= mask;
  		data->trutherm |= (TT_ON << shift);
  	} else {
  		data->model &= ~mask;
  		data->trutherm |= (TT_OFF << shift);
  	}
  	data->valid = 0;
  
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL,
  				  data->model);
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM,
  				  data->trutherm);
  
  	mutex_unlock(&data->update_lock);
061603275   Davide Rizzo   hwmon: LM95241 dr...
196
197
198
  
  	return count;
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
199
200
201
202
203
204
205
206
207
208
209
  static ssize_t show_min(struct device *dev, struct device_attribute *attr,
  			char *buf)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  
  	return snprintf(buf, PAGE_SIZE - 1,
  			data->config & to_sensor_dev_attr(attr)->index ?
  			"-127000
  " : "0
  ");
061603275   Davide Rizzo   hwmon: LM95241 dr...
210
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
211
212
213
214
215
216
217
  
  static ssize_t set_min(struct device *dev, struct device_attribute *attr,
  		       const char *buf, size_t count)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  	long val;
179c4fdb5   Frans Meulenbroeks   hwmon: replaced s...
218
  	if (kstrtol(buf, 10, &val) < 0)
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
  		return -EINVAL;
  	if (val < -128000)
  		return -EINVAL;
  
  	mutex_lock(&data->update_lock);
  
  	if (val < 0)
  		data->config |= to_sensor_dev_attr(attr)->index;
  	else
  		data->config &= ~to_sensor_dev_attr(attr)->index;
  	data->valid = 0;
  
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, data->config);
  
  	mutex_unlock(&data->update_lock);
  
  	return count;
061603275   Davide Rizzo   hwmon: LM95241 dr...
236
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
237
238
239
240
241
242
243
244
245
246
247
248
  
  static ssize_t show_max(struct device *dev, struct device_attribute *attr,
  			char *buf)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  
  	return snprintf(buf, PAGE_SIZE - 1,
  			data->config & to_sensor_dev_attr(attr)->index ?
  			"127000
  " : "255000
  ");
061603275   Davide Rizzo   hwmon: LM95241 dr...
249
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
250
251
252
253
254
255
256
  
  static ssize_t set_max(struct device *dev, struct device_attribute *attr,
  		       const char *buf, size_t count)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  	long val;
179c4fdb5   Frans Meulenbroeks   hwmon: replaced s...
257
  	if (kstrtol(buf, 10, &val) < 0)
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  		return -EINVAL;
  	if (val >= 256000)
  		return -EINVAL;
  
  	mutex_lock(&data->update_lock);
  
  	if (val <= 127000)
  		data->config |= to_sensor_dev_attr(attr)->index;
  	else
  		data->config &= ~to_sensor_dev_attr(attr)->index;
  	data->valid = 0;
  
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, data->config);
  
  	mutex_unlock(&data->update_lock);
  
  	return count;
061603275   Davide Rizzo   hwmon: LM95241 dr...
275
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
276
277
278
279
280
281
282
283
284
  
  static ssize_t show_interval(struct device *dev, struct device_attribute *attr,
  			     char *buf)
  {
  	struct lm95241_data *data = lm95241_update_device(dev);
  
  	return snprintf(buf, PAGE_SIZE - 1, "%lu
  ", 1000 * data->interval
  			/ HZ);
061603275   Davide Rizzo   hwmon: LM95241 dr...
285
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
286
287
288
289
290
291
292
  
  static ssize_t set_interval(struct device *dev, struct device_attribute *attr,
  			    const char *buf, size_t count)
  {
  	struct i2c_client *client = to_i2c_client(dev);
  	struct lm95241_data *data = i2c_get_clientdata(client);
  	unsigned long val;
179c4fdb5   Frans Meulenbroeks   hwmon: replaced s...
293
  	if (kstrtoul(buf, 10, &val) < 0)
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
294
295
296
297
298
  		return -EINVAL;
  
  	data->interval = val * HZ / 1000;
  
  	return count;
061603275   Davide Rizzo   hwmon: LM95241 dr...
299
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  
  static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_input, NULL, 0);
  static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_input, NULL, 2);
  static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_input, NULL, 4);
  static SENSOR_DEVICE_ATTR(temp2_type, S_IWUSR | S_IRUGO, show_type, set_type,
  			  R1MS_MASK);
  static SENSOR_DEVICE_ATTR(temp3_type, S_IWUSR | S_IRUGO, show_type, set_type,
  			  R2MS_MASK);
  static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_min, set_min,
  			  R1DF_MASK);
  static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_min, set_min,
  			  R2DF_MASK);
  static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_max, set_max,
  			  R1DF_MASK);
  static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_max, set_max,
  			  R2DF_MASK);
bc482bf0c   Guenter Roeck   hwmon: (lm95241) ...
316
317
  static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_interval,
  		   set_interval);
061603275   Davide Rizzo   hwmon: LM95241 dr...
318
319
  
  static struct attribute *lm95241_attributes[] = {
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
320
321
322
323
324
325
326
327
328
  	&sensor_dev_attr_temp1_input.dev_attr.attr,
  	&sensor_dev_attr_temp2_input.dev_attr.attr,
  	&sensor_dev_attr_temp3_input.dev_attr.attr,
  	&sensor_dev_attr_temp2_type.dev_attr.attr,
  	&sensor_dev_attr_temp3_type.dev_attr.attr,
  	&sensor_dev_attr_temp2_min.dev_attr.attr,
  	&sensor_dev_attr_temp3_min.dev_attr.attr,
  	&sensor_dev_attr_temp2_max.dev_attr.attr,
  	&sensor_dev_attr_temp3_max.dev_attr.attr,
bc482bf0c   Guenter Roeck   hwmon: (lm95241) ...
329
  	&dev_attr_update_interval.attr,
061603275   Davide Rizzo   hwmon: LM95241 dr...
330
331
332
333
334
335
  	NULL
  };
  
  static const struct attribute_group lm95241_group = {
  	.attrs = lm95241_attributes,
  };
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
336
  /* Return 0 if detection is successful, -ENODEV otherwise */
310ec7921   Jean Delvare   i2c: Drop the kin...
337
  static int lm95241_detect(struct i2c_client *new_client,
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
338
  			  struct i2c_board_info *info)
061603275   Davide Rizzo   hwmon: LM95241 dr...
339
  {
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
340
  	struct i2c_adapter *adapter = new_client->adapter;
52df6440a   Jean Delvare   hwmon: Clean up d...
341
  	const char *name;
8c1d04192   Guenter Roeck   hwmon: (lm95241) ...
342
  	int mfg_id, chip_id;
061603275   Davide Rizzo   hwmon: LM95241 dr...
343
344
  
  	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
345
  		return -ENODEV;
061603275   Davide Rizzo   hwmon: LM95241 dr...
346

8c1d04192   Guenter Roeck   hwmon: (lm95241) ...
347
348
349
350
351
352
353
354
355
356
357
358
359
  	mfg_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID);
  	if (mfg_id != NATSEMI_MAN_ID)
  		return -ENODEV;
  
  	chip_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID);
  	switch (chip_id) {
  	case LM95231_CHIP_ID:
  		name = "lm95231";
  		break;
  	case LM95241_CHIP_ID:
  		name = "lm95241";
  		break;
  	default:
52df6440a   Jean Delvare   hwmon: Clean up d...
360
  		return -ENODEV;
061603275   Davide Rizzo   hwmon: LM95241 dr...
361
  	}
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
362
  	/* Fill the i2c board info */
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
363
364
365
  	strlcpy(info->type, name, I2C_NAME_SIZE);
  	return 0;
  }
061603275   Davide Rizzo   hwmon: LM95241 dr...
366

0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  static void lm95241_init_client(struct i2c_client *client)
  {
  	struct lm95241_data *data = i2c_get_clientdata(client);
  
  	data->interval = HZ;	/* 1 sec default */
  	data->valid = 0;
  	data->config = CFG_CR0076;
  	data->model = 0;
  	data->trutherm = (TT_OFF << TT1_SHIFT) | (TT_OFF << TT2_SHIFT);
  
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, data->config);
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_REM_FILTER,
  				  R1FE_MASK | R2FE_MASK);
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM,
  				  data->trutherm);
  	i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL,
  				  data->model);
  }
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
385
386
387
388
389
  static int lm95241_probe(struct i2c_client *new_client,
  			 const struct i2c_device_id *id)
  {
  	struct lm95241_data *data;
  	int err;
061603275   Davide Rizzo   hwmon: LM95241 dr...
390

797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
391
392
393
394
395
396
397
398
  	data = kzalloc(sizeof(struct lm95241_data), GFP_KERNEL);
  	if (!data) {
  		err = -ENOMEM;
  		goto exit;
  	}
  
  	i2c_set_clientdata(new_client, data);
  	mutex_init(&data->update_lock);
061603275   Davide Rizzo   hwmon: LM95241 dr...
399
400
401
402
403
404
405
  
  	/* Initialize the LM95241 chip */
  	lm95241_init_client(new_client);
  
  	/* Register sysfs hooks */
  	err = sysfs_create_group(&new_client->dev.kobj, &lm95241_group);
  	if (err)
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
406
  		goto exit_free;
061603275   Davide Rizzo   hwmon: LM95241 dr...
407
408
409
410
411
412
413
414
415
416
417
  
  	data->hwmon_dev = hwmon_device_register(&new_client->dev);
  	if (IS_ERR(data->hwmon_dev)) {
  		err = PTR_ERR(data->hwmon_dev);
  		goto exit_remove_files;
  	}
  
  	return 0;
  
  exit_remove_files:
  	sysfs_remove_group(&new_client->dev.kobj, &lm95241_group);
061603275   Davide Rizzo   hwmon: LM95241 dr...
418
419
420
421
422
  exit_free:
  	kfree(data);
  exit:
  	return err;
  }
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
423
  static int lm95241_remove(struct i2c_client *client)
061603275   Davide Rizzo   hwmon: LM95241 dr...
424
425
  {
  	struct lm95241_data *data = i2c_get_clientdata(client);
061603275   Davide Rizzo   hwmon: LM95241 dr...
426
427
428
  
  	hwmon_device_unregister(data->hwmon_dev);
  	sysfs_remove_group(&client->dev.kobj, &lm95241_group);
061603275   Davide Rizzo   hwmon: LM95241 dr...
429
430
431
  	kfree(data);
  	return 0;
  }
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
432
433
  /* Driver data (common to all clients) */
  static const struct i2c_device_id lm95241_id[] = {
8c1d04192   Guenter Roeck   hwmon: (lm95241) ...
434
435
  	{ "lm95231", 0 },
  	{ "lm95241", 0 },
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
436
437
438
439
440
441
442
  	{ }
  };
  MODULE_DEVICE_TABLE(i2c, lm95241_id);
  
  static struct i2c_driver lm95241_driver = {
  	.class		= I2C_CLASS_HWMON,
  	.driver = {
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
443
  		.name	= DEVNAME,
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
444
445
446
447
448
  	},
  	.probe		= lm95241_probe,
  	.remove		= lm95241_remove,
  	.id_table	= lm95241_id,
  	.detect		= lm95241_detect,
c3813d6af   Jean Delvare   i2c: Get rid of s...
449
  	.address_list	= normal_i2c,
797eaa4b0   Jean Delvare   hwmon: (lm95241) ...
450
  };
061603275   Davide Rizzo   hwmon: LM95241 dr...
451
452
453
454
455
456
457
458
459
  static int __init sensors_lm95241_init(void)
  {
  	return i2c_add_driver(&lm95241_driver);
  }
  
  static void __exit sensors_lm95241_exit(void)
  {
  	i2c_del_driver(&lm95241_driver);
  }
0f1deb4b8   Davide Rizzo   hwmon: (lm95241) ...
460
  MODULE_AUTHOR("Davide Rizzo <elpa.rizzo@gmail.com>");
061603275   Davide Rizzo   hwmon: LM95241 dr...
461
462
463
464
465
  MODULE_DESCRIPTION("LM95241 sensor driver");
  MODULE_LICENSE("GPL");
  
  module_init(sensors_lm95241_init);
  module_exit(sensors_lm95241_exit);