Blame view

drivers/hwmon/lm85.c 48.9 KB
74ba9207e   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  /*
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
3
4
5
6
7
8
   * lm85.c - Part of lm_sensors, Linux kernel modules for hardware
   *	    monitoring
   * Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
   * Copyright (c) 2002, 2003  Philip Pokorny <ppokorny@penguincomputing.com>
   * Copyright (c) 2003        Margit Schubert-While <margitsw@t-online.de>
   * Copyright (c) 2004        Justin Thiessen <jthiessen@penguincomputing.com>
590e85344   Jean Delvare   hwmon: (lm85) Dro...
9
   * Copyright (C) 2007--2014  Jean Delvare <jdelvare@suse.de>
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
10
11
   *
   * Chip details at	      <http://www.national.com/ds/LM/LM85.pdf>
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
12
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #include <linux/module.h>
00c0f9d3a   Javier Martinez Canillas   hwmon: (lm85) Add...
15
  #include <linux/of_device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
  #include <linux/init.h>
  #include <linux/slab.h>
  #include <linux/jiffies.h>
  #include <linux/i2c.h>
943b0830c   Mark M. Hoffman   [PATCH] I2C hwmon...
20
  #include <linux/hwmon.h>
303760b44   Jean Delvare   [PATCH] hwmon: hw...
21
  #include <linux/hwmon-vid.h>
b353a487b   Jean Delvare   hwmon: (lm85) Use...
22
  #include <linux/hwmon-sysfs.h>
943b0830c   Mark M. Hoffman   [PATCH] I2C hwmon...
23
  #include <linux/err.h>
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
24
  #include <linux/mutex.h>
0f3721c51   Bartosz Golaszewski   hwmon: (lm85) use...
25
  #include <linux/util_macros.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  
  /* Addresses to scan */
25e9c86d5   Mark M. Hoffman   hwmon: normal_i2c...
28
  static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29

e5e9f44c2   Jean Delvare   i2c: Drop I2C_CLI...
30
  enum chips {
11650cf02   Jeremy Gebben   hwmon: (lm85) sup...
31
  	lm85, lm96000,
e5e9f44c2   Jean Delvare   i2c: Drop I2C_CLI...
32
  	adm1027, adt7463, adt7468,
06923f844   Guenter Roeck   hwmon: (lm85) Add...
33
  	emc6d100, emc6d102, emc6d103, emc6d103s
e5e9f44c2   Jean Delvare   i2c: Drop I2C_CLI...
34
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
  
  /* The LM85 registers */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
37
38
39
  #define LM85_REG_IN(nr)			(0x20 + (nr))
  #define LM85_REG_IN_MIN(nr)		(0x44 + (nr) * 2)
  #define LM85_REG_IN_MAX(nr)		(0x45 + (nr) * 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
41
42
43
  #define LM85_REG_TEMP(nr)		(0x25 + (nr))
  #define LM85_REG_TEMP_MIN(nr)		(0x4e + (nr) * 2)
  #define LM85_REG_TEMP_MAX(nr)		(0x4f + (nr) * 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
  
  /* Fan speeds are LSB, MSB (2 bytes) */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
46
47
  #define LM85_REG_FAN(nr)		(0x28 + (nr) * 2)
  #define LM85_REG_FAN_MIN(nr)		(0x54 + (nr) * 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
49
  #define LM85_REG_PWM(nr)		(0x30 + (nr))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
51
52
  #define LM85_REG_COMPANY		0x3e
  #define LM85_REG_VERSTEP		0x3f
79b92f2ba   Darrick J. Wong   lm85: support adt...
53

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
54
55
56
57
  #define ADT7468_REG_CFG5		0x7c
  #define ADT7468_OFF64			(1 << 0)
  #define ADT7468_HFPWM			(1 << 1)
  #define IS_ADT7468_OFF64(data)		\
79b92f2ba   Darrick J. Wong   lm85: support adt...
58
  	((data)->type == adt7468 && !((data)->cfg5 & ADT7468_OFF64))
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
59
  #define IS_ADT7468_HFPWM(data)		\
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
60
  	((data)->type == adt7468 && !((data)->cfg5 & ADT7468_HFPWM))
79b92f2ba   Darrick J. Wong   lm85: support adt...
61

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
  /* These are the recognized values for the above regs */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
63
64
65
  #define LM85_COMPANY_NATIONAL		0x01
  #define LM85_COMPANY_ANALOG_DEV		0x41
  #define LM85_COMPANY_SMSC		0x5c
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  #define LM85_VERSTEP_LM85C		0x60
  #define LM85_VERSTEP_LM85B		0x62
  #define LM85_VERSTEP_LM96000_1		0x68
  #define LM85_VERSTEP_LM96000_2		0x69
  #define LM85_VERSTEP_ADM1027		0x60
  #define LM85_VERSTEP_ADT7463		0x62
  #define LM85_VERSTEP_ADT7463C		0x6A
  #define LM85_VERSTEP_ADT7468_1		0x71
  #define LM85_VERSTEP_ADT7468_2		0x72
  #define LM85_VERSTEP_EMC6D100_A0        0x60
  #define LM85_VERSTEP_EMC6D100_A1        0x61
  #define LM85_VERSTEP_EMC6D102		0x65
  #define LM85_VERSTEP_EMC6D103_A0	0x68
  #define LM85_VERSTEP_EMC6D103_A1	0x69
  #define LM85_VERSTEP_EMC6D103S		0x6A	/* Also known as EMC6D103:A2 */
  
  #define LM85_REG_CONFIG			0x40
  
  #define LM85_REG_ALARM1			0x41
  #define LM85_REG_ALARM2			0x42
  
  #define LM85_REG_VID			0x43
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
  
  /* Automated FAN control */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
90
91
92
93
94
95
96
97
98
99
100
  #define LM85_REG_AFAN_CONFIG(nr)	(0x5c + (nr))
  #define LM85_REG_AFAN_RANGE(nr)		(0x5f + (nr))
  #define LM85_REG_AFAN_SPIKE1		0x62
  #define LM85_REG_AFAN_MINPWM(nr)	(0x64 + (nr))
  #define LM85_REG_AFAN_LIMIT(nr)		(0x67 + (nr))
  #define LM85_REG_AFAN_CRITICAL(nr)	(0x6a + (nr))
  #define LM85_REG_AFAN_HYST1		0x6d
  #define LM85_REG_AFAN_HYST2		0x6e
  
  #define ADM1027_REG_EXTEND_ADC1		0x76
  #define ADM1027_REG_EXTEND_ADC2		0x77
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  
  #define EMC6D100_REG_ALARM3             0x7d
  /* IN5, IN6 and IN7 */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
104
105
106
107
108
109
110
  #define EMC6D100_REG_IN(nr)             (0x70 + ((nr) - 5))
  #define EMC6D100_REG_IN_MIN(nr)         (0x73 + ((nr) - 5) * 2)
  #define EMC6D100_REG_IN_MAX(nr)         (0x74 + ((nr) - 5) * 2)
  #define EMC6D102_REG_EXTEND_ADC1	0x85
  #define EMC6D102_REG_EXTEND_ADC2	0x86
  #define EMC6D102_REG_EXTEND_ADC3	0x87
  #define EMC6D102_REG_EXTEND_ADC4	0x88
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
111
112
113
114
  /*
   * Conversions. Rounding and limit checking is only done on the TO_REG
   * variants. Note that you should be a bit careful with which arguments
   * these macros are called: arguments may be evaluated more than once.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
   */
25985edce   Lucas De Marchi   Fix common misspe...
116
  /* IN are scaled according to built-in resistors */
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
117
  static const int lm85_scaling[] = {  /* .001 Volts */
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
118
119
120
121
  	2500, 2250, 3300, 5000, 12000,
  	3300, 1500, 1800 /*EMC6D100*/
  };
  #define SCALE(val, from, to)	(((val) * (to) + ((from) / 2)) / (from))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122

1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
123
  #define INS_TO_REG(n, val)	\
67b200348   Guenter Roeck   hwmon: (lm85) Fix...
124
125
  		SCALE(clamp_val(val, 0, 255 * lm85_scaling[n] / 192), \
  		      lm85_scaling[n], 192)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126

1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
127
  #define INSEXT_FROM_REG(n, val, ext)	\
5a4d3ef31   Jean Delvare   hwmon: (lm85) Cle...
128
  		SCALE(((val) << 4) + (ext), 192 << 4, lm85_scaling[n])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129

1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
130
  #define INS_FROM_REG(n, val)	SCALE((val), 192, lm85_scaling[n])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
  
  /* FAN speed is measured using 90kHz clock */
63f281a6e   Jean Delvare   hwmon: (lm85) Let...
133
134
135
136
  static inline u16 FAN_TO_REG(unsigned long val)
  {
  	if (!val)
  		return 0xffff;
2a844c148   Guenter Roeck   hwmon: Replace SE...
137
  	return clamp_val(5400000 / val, 1, 0xfffe);
63f281a6e   Jean Delvare   hwmon: (lm85) Let...
138
  }
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
139
140
  #define FAN_FROM_REG(val)	((val) == 0 ? -1 : (val) == 0xffff ? 0 : \
  				 5400000 / (val))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
  
  /* Temperature is reported in .001 degC increments */
  #define TEMP_TO_REG(val)	\
3248c3b77   Guenter Roeck   hwmon: (lm85) Fix...
144
  		DIV_ROUND_CLOSEST(clamp_val((val), -127000, 127000), 1000)
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
145
  #define TEMPEXT_FROM_REG(val, ext)	\
5a4d3ef31   Jean Delvare   hwmon: (lm85) Cle...
146
147
  		SCALE(((val) << 4) + (ext), 16, 1000)
  #define TEMP_FROM_REG(val)	((val) * 1000)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148

2a844c148   Guenter Roeck   hwmon: Replace SE...
149
  #define PWM_TO_REG(val)			clamp_val(val, 0, 255)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  #define PWM_FROM_REG(val)		(val)
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
151
152
  /*
   * ZONEs have the following parameters:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
   *    Limit (low) temp,           1. degC
   *    Hysteresis (below limit),   1. degC (0-15)
   *    Range of speed control,     .1 degC (2-80)
   *    Critical (high) temp,       1. degC
   *
   * FAN PWMs have the following parameters:
   *    Reference Zone,                 1, 2, 3, etc.
   *    Spinup time,                    .05 sec
   *    PWM value at limit/low temp,    1 count
   *    PWM Frequency,                  1. Hz
   *    PWM is Min or OFF below limit,  flag
   *    Invert PWM output,              flag
   *
   * Some chips filter the temp, others the fan.
   *    Filter constant (or disabled)   .1 seconds
   */
  
  /* These are the zone temperature range encodings in .001 degree C */
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
171
  static const int lm85_range_map[] = {
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
172
173
174
  	2000, 2500, 3300, 4000, 5000, 6600, 8000, 10000,
  	13300, 16000, 20000, 26600, 32000, 40000, 53300, 80000
  };
3248c3b77   Guenter Roeck   hwmon: (lm85) Fix...
175
  static int RANGE_TO_REG(long range)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  {
0f3721c51   Bartosz Golaszewski   hwmon: (lm85) use...
177
  	return find_closest(range, lm85_range_map, ARRAY_SIZE(lm85_range_map));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  }
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
179
  #define RANGE_FROM_REG(val)	lm85_range_map[(val) & 0x0f]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
  /* These are the PWM frequency encodings */
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
182
  static const int lm85_freq_map[] = { /* 1 Hz */
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
183
184
  	10, 15, 23, 30, 38, 47, 61, 94
  };
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
185

e9b95485c   Jeremy Gebben   hwmon: (lm85) add...
186
187
188
189
  static const int lm96000_freq_map[] = { /* 1 Hz */
  	10, 15, 23, 30, 38, 47, 61, 94,
  	22500, 24000, 25700, 25700, 27700, 27700, 30000, 30000
  };
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
190
  static const int adm1027_freq_map[] = { /* 1 Hz */
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
191
  	11, 15, 22, 29, 35, 44, 59, 88
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
192
  };
0f3721c51   Bartosz Golaszewski   hwmon: (lm85) use...
193
194
  static int FREQ_TO_REG(const int *map,
  		       unsigned int map_size, unsigned long freq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  {
0f3721c51   Bartosz Golaszewski   hwmon: (lm85) use...
196
  	return find_closest(freq, map, map_size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
  }
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
198

57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
199
  static int FREQ_FROM_REG(const int *map, unsigned int map_size, u8 reg)
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
200
  {
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
201
  	return map[reg % map_size];
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
202
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
204
205
  /*
   * Since we can't use strings, I'm abusing these numbers
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
211
212
213
214
215
   *   to stand in for the following meanings:
   *      1 -- PWM responds to Zone 1
   *      2 -- PWM responds to Zone 2
   *      3 -- PWM responds to Zone 3
   *     23 -- PWM responds to the higher temp of Zone 2 or 3
   *    123 -- PWM responds to highest of Zone 1, 2, or 3
   *      0 -- PWM is always at 0% (ie, off)
   *     -1 -- PWM is always at 100%
   *     -2 -- PWM responds to manual control
   */
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
216
217
  static const int lm85_zone_map[] = { 1, 2, 3, -1, 0, 23, 123, -2 };
  #define ZONE_FROM_REG(val)	lm85_zone_map[(val) >> 5]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218

1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
219
  static int ZONE_TO_REG(int zone)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
  {
  	int i;
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
222
223
224
225
  	for (i = 0; i <= 7; ++i)
  		if (zone == lm85_zone_map[i])
  			break;
  	if (i > 7)   /* Not found. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
  		i = 3;  /* Always 100% */
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
227
  	return i << 5;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
  }
2a844c148   Guenter Roeck   hwmon: Replace SE...
229
  #define HYST_TO_REG(val)	clamp_val(((val) + 500) / 1000, 0, 15)
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
230
  #define HYST_FROM_REG(val)	((val) * 1000)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

09770b261   Guenter Roeck   hwmon: (lm85) Fix...
232
233
  /*
   * Chip sampling rates
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
236
237
238
239
240
241
242
243
244
245
246
247
   *
   * Some sensors are not updated more frequently than once per second
   *    so it doesn't make sense to read them more often than that.
   *    We cache the results and return the saved data if the driver
   *    is called again before a second has elapsed.
   *
   * Also, there is significant configuration data for this chip
   *    given the automatic PWM fan control that is possible.  There
   *    are about 47 bytes of config data to only 22 bytes of actual
   *    readings.  So, we keep the config data up to date in the cache
   *    when it is written and only sample it once every 1 *minute*
   */
  #define LM85_DATA_INTERVAL  (HZ + HZ / 2)
  #define LM85_CONFIG_INTERVAL  (1 * 60 * HZ)
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
248
249
  /*
   * LM85 can automatically adjust fan speeds based on temperature
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
254
255
256
257
   * This structure encapsulates an entire Zone config.  There are
   * three zones (one for each temperature input) on the lm85
   */
  struct lm85_zone {
  	s8 limit;	/* Low temp limit */
  	u8 hyst;	/* Low limit hysteresis. (0-15) */
  	u8 range;	/* Temp range, encoded */
  	s8 critical;	/* "All fans ON" temp limit */
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
258
259
  	u8 max_desired; /*
  			 * Actual "max" temperature specified.  Preserved
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
261
262
263
264
265
266
  			 * to prevent "drift" as other autofan control
  			 * values change.
  			 */
  };
  
  struct lm85_autofan {
  	u8 config;	/* Register value */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
268
269
  	u8 min_pwm;	/* Minimum PWM value, encoded */
  	u8 min_off;	/* Min PWM or OFF below "limit", flag */
  };
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
270
271
272
273
  /*
   * For each registered chip, we need to keep some data in memory.
   * The structure is dynamically allocated.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
  struct lm85_data {
746f68841   Axel Lin   hwmon: (lm85) Con...
275
276
  	struct i2c_client *client;
  	const struct attribute_group *groups[6];
8a0795d9b   Jean Delvare   hwmon: (lm85) Sup...
277
  	const int *freq_map;
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
278
  	unsigned int freq_map_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
  	enum chips type;
de2488058   Guenter Roeck   hwmon: (lm85) Use...
280
  	bool has_vid5;	/* true if VID5 is configured for ADT7463 or ADT7468 */
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
281
  	struct mutex update_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
284
285
286
287
288
289
290
291
  	int valid;		/* !=0 if following fields are valid */
  	unsigned long last_reading;	/* In jiffies */
  	unsigned long last_config;	/* In jiffies */
  
  	u8 in[8];		/* Register value */
  	u8 in_max[8];		/* Register value */
  	u8 in_min[8];		/* Register value */
  	s8 temp[3];		/* Register value */
  	s8 temp_min[3];		/* Register value */
  	s8 temp_max[3];		/* Register value */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
294
  	u16 fan[4];		/* Register value */
  	u16 fan_min[4];		/* Register value */
  	u8 pwm[3];		/* Register value */
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
295
  	u8 pwm_freq[3];		/* Register encoding */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
  	u8 temp_ext[3];		/* Decoded values */
  	u8 in_ext[8];		/* Decoded values */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
  	u8 vid;			/* Register value */
  	u8 vrm;			/* VRM version */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
  	u32 alarms;		/* Register encoding, combined */
79b92f2ba   Darrick J. Wong   lm85: support adt...
301
  	u8 cfg5;		/* Config Register 5 on ADT7468 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
304
  	struct lm85_autofan autofan[3];
  	struct lm85_zone zone[3];
  };
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
305
306
307
  static int lm85_read_value(struct i2c_client *client, u8 reg)
  {
  	int res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308

6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
  	/* What size location is it? */
  	switch (reg) {
  	case LM85_REG_FAN(0):  /* Read WORD data */
  	case LM85_REG_FAN(1):
  	case LM85_REG_FAN(2):
  	case LM85_REG_FAN(3):
  	case LM85_REG_FAN_MIN(0):
  	case LM85_REG_FAN_MIN(1):
  	case LM85_REG_FAN_MIN(2):
  	case LM85_REG_FAN_MIN(3):
  	case LM85_REG_ALARM1:	/* Read both bytes at once */
  		res = i2c_smbus_read_byte_data(client, reg) & 0xff;
  		res |= i2c_smbus_read_byte_data(client, reg + 1) << 8;
  		break;
  	default:	/* Read BYTE data */
  		res = i2c_smbus_read_byte_data(client, reg);
  		break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327

6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
328
329
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330

6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
  static void lm85_write_value(struct i2c_client *client, u8 reg, int value)
  {
  	switch (reg) {
  	case LM85_REG_FAN(0):  /* Write WORD data */
  	case LM85_REG_FAN(1):
  	case LM85_REG_FAN(2):
  	case LM85_REG_FAN(3):
  	case LM85_REG_FAN_MIN(0):
  	case LM85_REG_FAN_MIN(1):
  	case LM85_REG_FAN_MIN(2):
  	case LM85_REG_FAN_MIN(3):
  	/* NOTE: ALARM is read only, so not included here */
  		i2c_smbus_write_byte_data(client, reg, value & 0xff);
  		i2c_smbus_write_byte_data(client, reg + 1, value >> 8);
  		break;
  	default:	/* Write BYTE data */
  		i2c_smbus_write_byte_data(client, reg, value);
  		break;
  	}
  }
67712d019   Jean Delvare   hwmon: (lm85) Con...
351

6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
352
353
  static struct lm85_data *lm85_update_device(struct device *dev)
  {
746f68841   Axel Lin   hwmon: (lm85) Con...
354
355
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
  	int i;
  
  	mutex_lock(&data->update_lock);
  
  	if (!data->valid ||
  	     time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL)) {
  		/* Things that change quickly */
  		dev_dbg(&client->dev, "Reading sensor values
  ");
  
  		/*
  		 * Have to read extended bits first to "freeze" the
  		 * more significant bits that are read later.
  		 * There are 2 additional resolution bits per channel and we
  		 * have room for 4, so we shift them to the left.
  		 */
  		if (data->type == adm1027 || data->type == adt7463 ||
  		    data->type == adt7468) {
  			int ext1 = lm85_read_value(client,
  						   ADM1027_REG_EXTEND_ADC1);
  			int ext2 =  lm85_read_value(client,
  						    ADM1027_REG_EXTEND_ADC2);
  			int val = (ext1 << 8) + ext2;
  
  			for (i = 0; i <= 4; i++)
  				data->in_ext[i] =
  					((val >> (i * 2)) & 0x03) << 2;
  
  			for (i = 0; i <= 2; i++)
  				data->temp_ext[i] =
  					(val >> ((i + 4) * 2)) & 0x0c;
  		}
  
  		data->vid = lm85_read_value(client, LM85_REG_VID);
  
  		for (i = 0; i <= 3; ++i) {
  			data->in[i] =
  			    lm85_read_value(client, LM85_REG_IN(i));
  			data->fan[i] =
  			    lm85_read_value(client, LM85_REG_FAN(i));
  		}
  
  		if (!data->has_vid5)
  			data->in[4] = lm85_read_value(client, LM85_REG_IN(4));
  
  		if (data->type == adt7468)
  			data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5);
  
  		for (i = 0; i <= 2; ++i) {
  			data->temp[i] =
  			    lm85_read_value(client, LM85_REG_TEMP(i));
  			data->pwm[i] =
  			    lm85_read_value(client, LM85_REG_PWM(i));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409

6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
  			if (IS_ADT7468_OFF64(data))
  				data->temp[i] -= 64;
  		}
  
  		data->alarms = lm85_read_value(client, LM85_REG_ALARM1);
  
  		if (data->type == emc6d100) {
  			/* Three more voltage sensors */
  			for (i = 5; i <= 7; ++i) {
  				data->in[i] = lm85_read_value(client,
  							EMC6D100_REG_IN(i));
  			}
  			/* More alarm bits */
  			data->alarms |= lm85_read_value(client,
  						EMC6D100_REG_ALARM3) << 16;
  		} else if (data->type == emc6d102 || data->type == emc6d103 ||
  			   data->type == emc6d103s) {
  			/*
  			 * Have to read LSB bits after the MSB ones because
  			 * the reading of the MSB bits has frozen the
  			 * LSBs (backward from the ADM1027).
  			 */
  			int ext1 = lm85_read_value(client,
  						   EMC6D102_REG_EXTEND_ADC1);
  			int ext2 = lm85_read_value(client,
  						   EMC6D102_REG_EXTEND_ADC2);
  			int ext3 = lm85_read_value(client,
  						   EMC6D102_REG_EXTEND_ADC3);
  			int ext4 = lm85_read_value(client,
  						   EMC6D102_REG_EXTEND_ADC4);
  			data->in_ext[0] = ext3 & 0x0f;
  			data->in_ext[1] = ext4 & 0x0f;
  			data->in_ext[2] = ext4 >> 4;
  			data->in_ext[3] = ext3 >> 4;
  			data->in_ext[4] = ext2 >> 4;
  
  			data->temp_ext[0] = ext1 & 0x0f;
  			data->temp_ext[1] = ext2 & 0x0f;
  			data->temp_ext[2] = ext1 >> 4;
  		}
  
  		data->last_reading = jiffies;
  	}  /* last_reading */
  
  	if (!data->valid ||
  	     time_after(jiffies, data->last_config + LM85_CONFIG_INTERVAL)) {
  		/* Things that don't change often */
  		dev_dbg(&client->dev, "Reading config values
  ");
  
  		for (i = 0; i <= 3; ++i) {
  			data->in_min[i] =
  			    lm85_read_value(client, LM85_REG_IN_MIN(i));
  			data->in_max[i] =
  			    lm85_read_value(client, LM85_REG_IN_MAX(i));
  			data->fan_min[i] =
  			    lm85_read_value(client, LM85_REG_FAN_MIN(i));
  		}
  
  		if (!data->has_vid5)  {
  			data->in_min[4] = lm85_read_value(client,
  					  LM85_REG_IN_MIN(4));
  			data->in_max[4] = lm85_read_value(client,
  					  LM85_REG_IN_MAX(4));
  		}
  
  		if (data->type == emc6d100) {
  			for (i = 5; i <= 7; ++i) {
  				data->in_min[i] = lm85_read_value(client,
  						EMC6D100_REG_IN_MIN(i));
  				data->in_max[i] = lm85_read_value(client,
  						EMC6D100_REG_IN_MAX(i));
  			}
  		}
  
  		for (i = 0; i <= 2; ++i) {
  			int val;
  
  			data->temp_min[i] =
  			    lm85_read_value(client, LM85_REG_TEMP_MIN(i));
  			data->temp_max[i] =
  			    lm85_read_value(client, LM85_REG_TEMP_MAX(i));
  
  			data->autofan[i].config =
  			    lm85_read_value(client, LM85_REG_AFAN_CONFIG(i));
  			val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i));
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
496
  			data->pwm_freq[i] = val % data->freq_map_size;
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
  			data->zone[i].range = val >> 4;
  			data->autofan[i].min_pwm =
  			    lm85_read_value(client, LM85_REG_AFAN_MINPWM(i));
  			data->zone[i].limit =
  			    lm85_read_value(client, LM85_REG_AFAN_LIMIT(i));
  			data->zone[i].critical =
  			    lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i));
  
  			if (IS_ADT7468_OFF64(data)) {
  				data->temp_min[i] -= 64;
  				data->temp_max[i] -= 64;
  				data->zone[i].limit -= 64;
  				data->zone[i].critical -= 64;
  			}
  		}
  
  		if (data->type != emc6d103s) {
  			i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
  			data->autofan[0].min_off = (i & 0x20) != 0;
  			data->autofan[1].min_off = (i & 0x40) != 0;
  			data->autofan[2].min_off = (i & 0x80) != 0;
  
  			i = lm85_read_value(client, LM85_REG_AFAN_HYST1);
  			data->zone[0].hyst = i >> 4;
  			data->zone[1].hyst = i & 0x0f;
  
  			i = lm85_read_value(client, LM85_REG_AFAN_HYST2);
  			data->zone[2].hyst = i >> 4;
  		}
  
  		data->last_config = jiffies;
  	}  /* last_config */
  
  	data->valid = 1;
  
  	mutex_unlock(&data->update_lock);
  
  	return data;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
536
537
  
  /* 4 Fans */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
538
539
  static ssize_t fan_show(struct device *dev, struct device_attribute *attr,
  			char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
541
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
543
544
  	return sprintf(buf, "%d
  ", FAN_FROM_REG(data->fan[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
546

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
547
548
  static ssize_t fan_min_show(struct device *dev, struct device_attribute *attr,
  			    char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
550
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
552
553
  	return sprintf(buf, "%d
  ", FAN_FROM_REG(data->fan_min[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
555

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
556
557
558
  static ssize_t fan_min_store(struct device *dev,
  			     struct device_attribute *attr, const char *buf,
  			     size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
560
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
561
562
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
563
564
565
566
567
568
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
570
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571
572
  	data->fan_min[nr] = FAN_TO_REG(val);
  	lm85_write_value(client, LM85_REG_FAN_MIN(nr), data->fan_min[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
573
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574
575
  	return count;
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
576
577
578
579
580
581
582
583
  static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
  static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
  static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
  static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
  static SENSOR_DEVICE_ATTR_RO(fan3_input, fan, 2);
  static SENSOR_DEVICE_ATTR_RW(fan3_min, fan_min, 2);
  static SENSOR_DEVICE_ATTR_RO(fan4_input, fan, 3);
  static SENSOR_DEVICE_ATTR_RW(fan4_min, fan_min, 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
585
  
  /* vid, vrm, alarms */
d0ed69d55   Julia Lawall   hwmon: (lm85) use...
586
587
  static ssize_t cpu0_vid_show(struct device *dev,
  			     struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
  {
  	struct lm85_data *data = lm85_update_device(dev);
9c516ef49   Jean Delvare   [PATCH] hwmon: Su...
590
  	int vid;
de2488058   Guenter Roeck   hwmon: (lm85) Use...
591
  	if (data->has_vid5) {
9c516ef49   Jean Delvare   [PATCH] hwmon: Su...
592
593
594
595
596
597
598
599
600
  		/* 6-pin VID (VRM 10) */
  		vid = vid_from_reg(data->vid & 0x3f, data->vrm);
  	} else {
  		/* 5-pin VID (VRM 9) */
  		vid = vid_from_reg(data->vid & 0x1f, data->vrm);
  	}
  
  	return sprintf(buf, "%d
  ", vid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
  }
d0ed69d55   Julia Lawall   hwmon: (lm85) use...
602
  static DEVICE_ATTR_RO(cpu0_vid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603

d0ed69d55   Julia Lawall   hwmon: (lm85) use...
604
605
  static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
  			char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
  {
90d6619a9   Jean Delvare   hwmon: VRM is not...
607
  	struct lm85_data *data = dev_get_drvdata(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
610
  	return sprintf(buf, "%ld
  ", (long) data->vrm);
  }
d0ed69d55   Julia Lawall   hwmon: (lm85) use...
611
612
  static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
  			 const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
  {
8f74efe81   Jean Delvare   hwmon: VRM is not...
614
  	struct lm85_data *data = dev_get_drvdata(dev);
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
615
616
617
618
619
620
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
3248c3b77   Guenter Roeck   hwmon: (lm85) Fix...
621
622
  	if (val > 255)
  		return -EINVAL;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
623
  	data->vrm = val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
  	return count;
  }
d0ed69d55   Julia Lawall   hwmon: (lm85) use...
626
  static DEVICE_ATTR_RW(vrm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627

d0ed69d55   Julia Lawall   hwmon: (lm85) use...
628
629
  static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
  			   char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
631
  {
  	struct lm85_data *data = lm85_update_device(dev);
68188ba7d   Jean Delvare   [PATCH] I2C: Kill...
632
633
  	return sprintf(buf, "%u
  ", data->alarms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
634
  }
d0ed69d55   Julia Lawall   hwmon: (lm85) use...
635
  static DEVICE_ATTR_RO(alarms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
637
638
  static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
  			  char *buf)
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
639
640
641
642
643
644
  {
  	int nr = to_sensor_dev_attr(attr)->index;
  	struct lm85_data *data = lm85_update_device(dev);
  	return sprintf(buf, "%u
  ", (data->alarms >> nr) & 1);
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
  static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
  static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
  static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
  static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 8);
  static SENSOR_DEVICE_ATTR_RO(in5_alarm, alarm, 18);
  static SENSOR_DEVICE_ATTR_RO(in6_alarm, alarm, 16);
  static SENSOR_DEVICE_ATTR_RO(in7_alarm, alarm, 17);
  static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4);
  static SENSOR_DEVICE_ATTR_RO(temp1_fault, alarm, 14);
  static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 5);
  static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm, 6);
  static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, 15);
  static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 10);
  static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 11);
  static SENSOR_DEVICE_ATTR_RO(fan3_alarm, alarm, 12);
  static SENSOR_DEVICE_ATTR_RO(fan4_alarm, alarm, 13);
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
662

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
663
  /* pwm */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
664
665
  static ssize_t pwm_show(struct device *dev, struct device_attribute *attr,
  			char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
667
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
669
670
  	return sprintf(buf, "%d
  ", PWM_FROM_REG(data->pwm[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
672

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
673
674
  static ssize_t pwm_store(struct device *dev, struct device_attribute *attr,
  			 const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
675
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
676
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
677
678
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
679
680
681
682
683
684
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
686
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
687
688
  	data->pwm[nr] = PWM_TO_REG(val);
  	lm85_write_value(client, LM85_REG_PWM(nr), data->pwm[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
689
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690
691
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
692

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
693
694
  static ssize_t pwm_enable_show(struct device *dev,
  			       struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
695
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
696
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
  	struct lm85_data *data = lm85_update_device(dev);
4b4df95dc   Jean Delvare   hwmon: (lm85) Ret...
698
  	int pwm_zone, enable;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
699
700
  
  	pwm_zone = ZONE_FROM_REG(data->autofan[nr].config);
4b4df95dc   Jean Delvare   hwmon: (lm85) Ret...
701
702
703
704
705
706
707
708
709
710
711
712
713
  	switch (pwm_zone) {
  	case -1:	/* PWM is always at 100% */
  		enable = 0;
  		break;
  	case 0:		/* PWM is always at 0% */
  	case -2:	/* PWM responds to manual control */
  		enable = 1;
  		break;
  	default:	/* PWM in automatic mode */
  		enable = 2;
  	}
  	return sprintf(buf, "%d
  ", enable);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
715
716
717
  static ssize_t pwm_enable_store(struct device *dev,
  				struct device_attribute *attr,
  				const char *buf, size_t count)
455f791ea   Jean Delvare   hwmon: (lm85) Mak...
718
719
  {
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
720
721
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
455f791ea   Jean Delvare   hwmon: (lm85) Mak...
722
  	u8 config;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
723
724
725
726
727
728
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
455f791ea   Jean Delvare   hwmon: (lm85) Mak...
729
730
731
732
733
734
735
736
737
  
  	switch (val) {
  	case 0:
  		config = 3;
  		break;
  	case 1:
  		config = 7;
  		break;
  	case 2:
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
738
739
740
741
  		/*
  		 * Here we have to choose arbitrarily one of the 5 possible
  		 * configurations; I go for the safest
  		 */
455f791ea   Jean Delvare   hwmon: (lm85) Mak...
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
  		config = 6;
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	mutex_lock(&data->update_lock);
  	data->autofan[nr].config = lm85_read_value(client,
  		LM85_REG_AFAN_CONFIG(nr));
  	data->autofan[nr].config = (data->autofan[nr].config & ~0xe0)
  		| (config << 5);
  	lm85_write_value(client, LM85_REG_AFAN_CONFIG(nr),
  		data->autofan[nr].config);
  	mutex_unlock(&data->update_lock);
  	return count;
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
758
759
  static ssize_t pwm_freq_show(struct device *dev,
  			     struct device_attribute *attr, char *buf)
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
760
761
762
  {
  	int nr = to_sensor_dev_attr(attr)->index;
  	struct lm85_data *data = lm85_update_device(dev);
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
763
764
765
766
767
  	int freq;
  
  	if (IS_ADT7468_HFPWM(data))
  		freq = 22500;
  	else
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
768
769
  		freq = FREQ_FROM_REG(data->freq_map, data->freq_map_size,
  				     data->pwm_freq[nr]);
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
770
771
772
  
  	return sprintf(buf, "%d
  ", freq);
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
773
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
774
775
776
  static ssize_t pwm_freq_store(struct device *dev,
  			      struct device_attribute *attr, const char *buf,
  			      size_t count)
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
777
778
  {
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
779
780
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
781
782
783
784
785
786
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
787
788
  
  	mutex_lock(&data->update_lock);
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
789
790
  	/*
  	 * The ADT7468 has a special high-frequency PWM output mode,
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
791
  	 * where all PWM outputs are driven by a 22.5 kHz clock.
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
792
793
  	 * This might confuse the user, but there's not much we can do.
  	 */
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
794
795
796
797
  	if (data->type == adt7468 && val >= 11300) {	/* High freq. mode */
  		data->cfg5 &= ~ADT7468_HFPWM;
  		lm85_write_value(client, ADT7468_REG_CFG5, data->cfg5);
  	} else {					/* Low freq. mode */
0f3721c51   Bartosz Golaszewski   hwmon: (lm85) use...
798
  		data->pwm_freq[nr] = FREQ_TO_REG(data->freq_map,
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
799
  						 data->freq_map_size, val);
f6c61cff8   Jean Delvare   hwmon: (lm85) Add...
800
801
802
803
804
805
806
807
  		lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
  				 (data->zone[nr].range << 4)
  				 | data->pwm_freq[nr]);
  		if (data->type == adt7468) {
  			data->cfg5 |= ADT7468_HFPWM;
  			lm85_write_value(client, ADT7468_REG_CFG5, data->cfg5);
  		}
  	}
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
808
809
810
  	mutex_unlock(&data->update_lock);
  	return count;
  }
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
811
812
813
814
815
816
817
818
819
  static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm1_enable, pwm_enable, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm1_freq, pwm_freq, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm2, pwm, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm2_enable, pwm_enable, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm2_freq, pwm_freq, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm3, pwm, 2);
  static SENSOR_DEVICE_ATTR_RW(pwm3_enable, pwm_enable, 2);
  static SENSOR_DEVICE_ATTR_RW(pwm3_freq, pwm_freq, 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820
821
  
  /* Voltages */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
822
823
  static ssize_t in_show(struct device *dev, struct device_attribute *attr,
  		       char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
825
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
826
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
827
828
829
  	return sprintf(buf, "%d
  ", INSEXT_FROM_REG(nr, data->in[nr],
  						    data->in_ext[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
831

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
832
833
  static ssize_t in_min_show(struct device *dev, struct device_attribute *attr,
  			   char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
834
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
835
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
837
838
  	return sprintf(buf, "%d
  ", INS_FROM_REG(nr, data->in_min[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
840

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
841
842
  static ssize_t in_min_store(struct device *dev, struct device_attribute *attr,
  			    const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
844
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
845
846
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
847
848
849
850
851
852
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
854
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
855
856
  	data->in_min[nr] = INS_TO_REG(nr, val);
  	lm85_write_value(client, LM85_REG_IN_MIN(nr), data->in_min[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
857
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
858
859
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
860

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
861
862
  static ssize_t in_max_show(struct device *dev, struct device_attribute *attr,
  			   char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
863
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
864
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
866
867
  	return sprintf(buf, "%d
  ", INS_FROM_REG(nr, data->in_max[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
868
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
869

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
870
871
  static ssize_t in_max_store(struct device *dev, struct device_attribute *attr,
  			    const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
873
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
874
875
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
876
877
878
879
880
881
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
883
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
885
  	data->in_max[nr] = INS_TO_REG(nr, val);
  	lm85_write_value(client, LM85_REG_IN_MAX(nr), data->in_max[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
886
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887
888
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
889

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
  static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
  static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
  static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
  static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
  static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
  static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
  static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
  static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
  static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
  static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
  static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
  static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
  static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
  static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
  static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
  static SENSOR_DEVICE_ATTR_RO(in5_input, in, 5);
  static SENSOR_DEVICE_ATTR_RW(in5_min, in_min, 5);
  static SENSOR_DEVICE_ATTR_RW(in5_max, in_max, 5);
  static SENSOR_DEVICE_ATTR_RO(in6_input, in, 6);
  static SENSOR_DEVICE_ATTR_RW(in6_min, in_min, 6);
  static SENSOR_DEVICE_ATTR_RW(in6_max, in_max, 6);
  static SENSOR_DEVICE_ATTR_RO(in7_input, in, 7);
  static SENSOR_DEVICE_ATTR_RW(in7_min, in_min, 7);
  static SENSOR_DEVICE_ATTR_RW(in7_max, in_max, 7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
914
915
  
  /* Temps */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
916
917
  static ssize_t temp_show(struct device *dev, struct device_attribute *attr,
  			 char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
919
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
921
922
923
  	return sprintf(buf, "%d
  ", TEMPEXT_FROM_REG(data->temp[nr],
  						     data->temp_ext[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
925

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
926
927
  static ssize_t temp_min_show(struct device *dev,
  			     struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
929
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
930
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
931
932
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->temp_min[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
933
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
934

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
935
936
937
  static ssize_t temp_min_store(struct device *dev,
  			      struct device_attribute *attr, const char *buf,
  			      size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
939
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
940
941
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
942
943
944
945
946
947
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948

79b92f2ba   Darrick J. Wong   lm85: support adt...
949
950
  	if (IS_ADT7468_OFF64(data))
  		val += 64;
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
951
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
953
  	data->temp_min[nr] = TEMP_TO_REG(val);
  	lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
954
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
955
956
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
957

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
958
959
  static ssize_t temp_max_show(struct device *dev,
  			     struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
961
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
963
964
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->temp_max[nr]));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
966

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
967
968
969
  static ssize_t temp_max_store(struct device *dev,
  			      struct device_attribute *attr, const char *buf,
  			      size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
970
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
971
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
972
973
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
974
975
976
977
978
979
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980

79b92f2ba   Darrick J. Wong   lm85: support adt...
981
982
  	if (IS_ADT7468_OFF64(data))
  		val += 64;
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
983
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
985
  	data->temp_max[nr] = TEMP_TO_REG(val);
  	lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
986
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
987
988
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
989

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
990
991
992
993
994
995
996
997
998
  static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
  static SENSOR_DEVICE_ATTR_RW(temp1_min, temp_min, 0);
  static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_max, 0);
  static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
  static SENSOR_DEVICE_ATTR_RW(temp2_min, temp_min, 1);
  static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1);
  static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
  static SENSOR_DEVICE_ATTR_RW(temp3_min, temp_min, 2);
  static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_max, 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
1000
  
  /* Automatic PWM control */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1001
1002
1003
  static ssize_t pwm_auto_channels_show(struct device *dev,
  				      struct device_attribute *attr,
  				      char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1005
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1007
1008
  	return sprintf(buf, "%d
  ", ZONE_FROM_REG(data->autofan[nr].config));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1010

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1011
1012
1013
  static ssize_t pwm_auto_channels_store(struct device *dev,
  				       struct device_attribute *attr,
  				       const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1015
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1016
1017
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1018
1019
1020
1021
1022
1023
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1024

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1025
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
  	data->autofan[nr].config = (data->autofan[nr].config & (~0xe0))
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1027
  		| ZONE_TO_REG(val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1028
1029
  	lm85_write_value(client, LM85_REG_AFAN_CONFIG(nr),
  		data->autofan[nr].config);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1030
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
1032
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1033

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1034
1035
  static ssize_t pwm_auto_pwm_min_show(struct device *dev,
  				     struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1036
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1037
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1038
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1039
1040
  	return sprintf(buf, "%d
  ", PWM_FROM_REG(data->autofan[nr].min_pwm));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1042

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1043
1044
1045
  static ssize_t pwm_auto_pwm_min_store(struct device *dev,
  				      struct device_attribute *attr,
  				      const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1047
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1048
1049
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1050
1051
1052
1053
1054
1055
  	unsigned long val;
  	int err;
  
  	err = kstrtoul(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1056

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1057
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1058
1059
1060
  	data->autofan[nr].min_pwm = PWM_TO_REG(val);
  	lm85_write_value(client, LM85_REG_AFAN_MINPWM(nr),
  		data->autofan[nr].min_pwm);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1061
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1062
1063
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1064

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1065
1066
1067
  static ssize_t pwm_auto_pwm_minctl_show(struct device *dev,
  					struct device_attribute *attr,
  					char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1069
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1070
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1071
1072
  	return sprintf(buf, "%d
  ", data->autofan[nr].min_off);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1073
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1074

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1075
1076
1077
  static ssize_t pwm_auto_pwm_minctl_store(struct device *dev,
  					 struct device_attribute *attr,
  					 const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1078
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1079
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1080
1081
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
7133e56f2   Jean Delvare   hwmon: (lm85) Don...
1082
  	u8 tmp;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1083
1084
1085
1086
1087
1088
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1090
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  	data->autofan[nr].min_off = val;
7133e56f2   Jean Delvare   hwmon: (lm85) Don...
1092
1093
1094
1095
1096
  	tmp = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
  	tmp &= ~(0x20 << nr);
  	if (data->autofan[nr].min_off)
  		tmp |= 0x20 << nr;
  	lm85_write_value(client, LM85_REG_AFAN_SPIKE1, tmp);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1097
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1098
1099
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1100

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1101
1102
1103
1104
1105
1106
1107
1108
1109
  static SENSOR_DEVICE_ATTR_RW(pwm1_auto_channels, pwm_auto_channels, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm1_auto_pwm_min, pwm_auto_pwm_min, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm1_auto_pwm_minctl, pwm_auto_pwm_minctl, 0);
  static SENSOR_DEVICE_ATTR_RW(pwm2_auto_channels, pwm_auto_channels, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm2_auto_pwm_min, pwm_auto_pwm_min, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm2_auto_pwm_minctl, pwm_auto_pwm_minctl, 1);
  static SENSOR_DEVICE_ATTR_RW(pwm3_auto_channels, pwm_auto_channels, 2);
  static SENSOR_DEVICE_ATTR_RW(pwm3_auto_pwm_min, pwm_auto_pwm_min, 2);
  static SENSOR_DEVICE_ATTR_RW(pwm3_auto_pwm_minctl, pwm_auto_pwm_minctl, 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
1111
  
  /* Temperature settings for automatic PWM control */
7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1112
1113
1114
  static ssize_t temp_auto_temp_off_show(struct device *dev,
  				       struct device_attribute *attr,
  				       char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1115
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1116
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1117
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1118
1119
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->zone[nr].limit) -
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1120
1121
  		HYST_FROM_REG(data->zone[nr].hyst));
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1122

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1123
1124
1125
  static ssize_t temp_auto_temp_off_store(struct device *dev,
  					struct device_attribute *attr,
  					const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1127
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1128
1129
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1130
  	int min;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1131
1132
1133
1134
1135
1136
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1137

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1138
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1139
  	min = TEMP_FROM_REG(data->zone[nr].limit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1140
  	data->zone[nr].hyst = HYST_TO_REG(min - val);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1141
  	if (nr == 0 || nr == 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1142
1143
  		lm85_write_value(client, LM85_REG_AFAN_HYST1,
  			(data->zone[0].hyst << 4)
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1144
  			| data->zone[1].hyst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
1146
  	} else {
  		lm85_write_value(client, LM85_REG_AFAN_HYST2,
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1147
  			(data->zone[2].hyst << 4));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
  	}
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1149
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1150
1151
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1152

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1153
1154
1155
  static ssize_t temp_auto_temp_min_show(struct device *dev,
  				       struct device_attribute *attr,
  				       char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1156
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1157
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1159
1160
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->zone[nr].limit));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1162

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1163
1164
1165
  static ssize_t temp_auto_temp_min_store(struct device *dev,
  					struct device_attribute *attr,
  					const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1166
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1167
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1168
1169
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1170
1171
1172
1173
1174
1175
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1176

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1177
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
  	data->zone[nr].limit = TEMP_TO_REG(val);
  	lm85_write_value(client, LM85_REG_AFAN_LIMIT(nr),
  		data->zone[nr].limit);
  
  /* Update temp_auto_max and temp_auto_range */
  	data->zone[nr].range = RANGE_TO_REG(
  		TEMP_FROM_REG(data->zone[nr].max_desired) -
  		TEMP_FROM_REG(data->zone[nr].limit));
  	lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
  		((data->zone[nr].range & 0x0f) << 4)
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
1188
  		| data->pwm_freq[nr]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1189

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1190
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
1192
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1193

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1194
1195
1196
  static ssize_t temp_auto_temp_max_show(struct device *dev,
  				       struct device_attribute *attr,
  				       char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1197
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1198
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1200
1201
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->zone[nr].limit) +
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1202
1203
  		RANGE_FROM_REG(data->zone[nr].range));
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1204

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1205
1206
1207
  static ssize_t temp_auto_temp_max_store(struct device *dev,
  					struct device_attribute *attr,
  					const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1208
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1209
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1210
1211
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212
  	int min;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1213
1214
1215
1216
1217
1218
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1219

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1220
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
1222
1223
1224
1225
1226
  	min = TEMP_FROM_REG(data->zone[nr].limit);
  	data->zone[nr].max_desired = TEMP_TO_REG(val);
  	data->zone[nr].range = RANGE_TO_REG(
  		val - min);
  	lm85_write_value(client, LM85_REG_AFAN_RANGE(nr),
  		((data->zone[nr].range & 0x0f) << 4)
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
1227
  		| data->pwm_freq[nr]);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1228
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1229
1230
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1231

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1232
1233
1234
  static ssize_t temp_auto_temp_crit_show(struct device *dev,
  					struct device_attribute *attr,
  					char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1235
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1236
  	int nr = to_sensor_dev_attr(attr)->index;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237
  	struct lm85_data *data = lm85_update_device(dev);
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1238
1239
  	return sprintf(buf, "%d
  ", TEMP_FROM_REG(data->zone[nr].critical));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1240
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1241

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1242
1243
1244
  static ssize_t temp_auto_temp_crit_store(struct device *dev,
  					 struct device_attribute *attr,
  					 const char *buf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245
  {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1246
  	int nr = to_sensor_dev_attr(attr)->index;
746f68841   Axel Lin   hwmon: (lm85) Con...
1247
1248
  	struct lm85_data *data = dev_get_drvdata(dev);
  	struct i2c_client *client = data->client;
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1249
1250
1251
1252
1253
1254
  	long val;
  	int err;
  
  	err = kstrtol(buf, 10, &val);
  	if (err)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1255

9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1256
  	mutex_lock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
1258
1259
  	data->zone[nr].critical = TEMP_TO_REG(val);
  	lm85_write_value(client, LM85_REG_AFAN_CRITICAL(nr),
  		data->zone[nr].critical);
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1260
  	mutex_unlock(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1261
1262
  	return count;
  }
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1263

7bc85e492   Guenter Roeck   hwmon: (lm85) Use...
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
  static SENSOR_DEVICE_ATTR_RW(temp1_auto_temp_off, temp_auto_temp_off, 0);
  static SENSOR_DEVICE_ATTR_RW(temp1_auto_temp_min, temp_auto_temp_min, 0);
  static SENSOR_DEVICE_ATTR_RW(temp1_auto_temp_max, temp_auto_temp_max, 0);
  static SENSOR_DEVICE_ATTR_RW(temp1_auto_temp_crit, temp_auto_temp_crit, 0);
  static SENSOR_DEVICE_ATTR_RW(temp2_auto_temp_off, temp_auto_temp_off, 1);
  static SENSOR_DEVICE_ATTR_RW(temp2_auto_temp_min, temp_auto_temp_min, 1);
  static SENSOR_DEVICE_ATTR_RW(temp2_auto_temp_max, temp_auto_temp_max, 1);
  static SENSOR_DEVICE_ATTR_RW(temp2_auto_temp_crit, temp_auto_temp_crit, 1);
  static SENSOR_DEVICE_ATTR_RW(temp3_auto_temp_off, temp_auto_temp_off, 2);
  static SENSOR_DEVICE_ATTR_RW(temp3_auto_temp_min, temp_auto_temp_min, 2);
  static SENSOR_DEVICE_ATTR_RW(temp3_auto_temp_max, temp_auto_temp_max, 2);
  static SENSOR_DEVICE_ATTR_RW(temp3_auto_temp_crit, temp_auto_temp_crit, 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1276

0501a3816   Mark M. Hoffman   hwmon: Fix unchec...
1277
  static struct attribute *lm85_attributes[] = {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1278
1279
1280
1281
1282
1283
1284
1285
  	&sensor_dev_attr_fan1_input.dev_attr.attr,
  	&sensor_dev_attr_fan2_input.dev_attr.attr,
  	&sensor_dev_attr_fan3_input.dev_attr.attr,
  	&sensor_dev_attr_fan4_input.dev_attr.attr,
  	&sensor_dev_attr_fan1_min.dev_attr.attr,
  	&sensor_dev_attr_fan2_min.dev_attr.attr,
  	&sensor_dev_attr_fan3_min.dev_attr.attr,
  	&sensor_dev_attr_fan4_min.dev_attr.attr,
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
1286
1287
1288
1289
  	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
  	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
  	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
  	&sensor_dev_attr_fan4_alarm.dev_attr.attr,
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1290
1291
1292
1293
1294
1295
1296
  
  	&sensor_dev_attr_pwm1.dev_attr.attr,
  	&sensor_dev_attr_pwm2.dev_attr.attr,
  	&sensor_dev_attr_pwm3.dev_attr.attr,
  	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
  	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
  	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
34e7dc6ca   Jean Delvare   hwmon: (lm85) Imp...
1297
1298
1299
  	&sensor_dev_attr_pwm1_freq.dev_attr.attr,
  	&sensor_dev_attr_pwm2_freq.dev_attr.attr,
  	&sensor_dev_attr_pwm3_freq.dev_attr.attr,
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
  
  	&sensor_dev_attr_in0_input.dev_attr.attr,
  	&sensor_dev_attr_in1_input.dev_attr.attr,
  	&sensor_dev_attr_in2_input.dev_attr.attr,
  	&sensor_dev_attr_in3_input.dev_attr.attr,
  	&sensor_dev_attr_in0_min.dev_attr.attr,
  	&sensor_dev_attr_in1_min.dev_attr.attr,
  	&sensor_dev_attr_in2_min.dev_attr.attr,
  	&sensor_dev_attr_in3_min.dev_attr.attr,
  	&sensor_dev_attr_in0_max.dev_attr.attr,
  	&sensor_dev_attr_in1_max.dev_attr.attr,
  	&sensor_dev_attr_in2_max.dev_attr.attr,
  	&sensor_dev_attr_in3_max.dev_attr.attr,
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
1313
1314
1315
1316
  	&sensor_dev_attr_in0_alarm.dev_attr.attr,
  	&sensor_dev_attr_in1_alarm.dev_attr.attr,
  	&sensor_dev_attr_in2_alarm.dev_attr.attr,
  	&sensor_dev_attr_in3_alarm.dev_attr.attr,
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
  
  	&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_temp1_min.dev_attr.attr,
  	&sensor_dev_attr_temp2_min.dev_attr.attr,
  	&sensor_dev_attr_temp3_min.dev_attr.attr,
  	&sensor_dev_attr_temp1_max.dev_attr.attr,
  	&sensor_dev_attr_temp2_max.dev_attr.attr,
  	&sensor_dev_attr_temp3_max.dev_attr.attr,
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
1327
1328
1329
1330
1331
  	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
  	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
  	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
  	&sensor_dev_attr_temp1_fault.dev_attr.attr,
  	&sensor_dev_attr_temp3_fault.dev_attr.attr,
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1332
1333
1334
1335
1336
1337
1338
  
  	&sensor_dev_attr_pwm1_auto_channels.dev_attr.attr,
  	&sensor_dev_attr_pwm2_auto_channels.dev_attr.attr,
  	&sensor_dev_attr_pwm3_auto_channels.dev_attr.attr,
  	&sensor_dev_attr_pwm1_auto_pwm_min.dev_attr.attr,
  	&sensor_dev_attr_pwm2_auto_pwm_min.dev_attr.attr,
  	&sensor_dev_attr_pwm3_auto_pwm_min.dev_attr.attr,
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1339

b353a487b   Jean Delvare   hwmon: (lm85) Use...
1340
1341
1342
1343
1344
1345
1346
1347
1348
  	&sensor_dev_attr_temp1_auto_temp_min.dev_attr.attr,
  	&sensor_dev_attr_temp2_auto_temp_min.dev_attr.attr,
  	&sensor_dev_attr_temp3_auto_temp_min.dev_attr.attr,
  	&sensor_dev_attr_temp1_auto_temp_max.dev_attr.attr,
  	&sensor_dev_attr_temp2_auto_temp_max.dev_attr.attr,
  	&sensor_dev_attr_temp3_auto_temp_max.dev_attr.attr,
  	&sensor_dev_attr_temp1_auto_temp_crit.dev_attr.attr,
  	&sensor_dev_attr_temp2_auto_temp_crit.dev_attr.attr,
  	&sensor_dev_attr_temp3_auto_temp_crit.dev_attr.attr,
0501a3816   Mark M. Hoffman   hwmon: Fix unchec...
1349
1350
1351
  	&dev_attr_vrm.attr,
  	&dev_attr_cpu0_vid.attr,
  	&dev_attr_alarms.attr,
0501a3816   Mark M. Hoffman   hwmon: Fix unchec...
1352
1353
1354
1355
1356
1357
  	NULL
  };
  
  static const struct attribute_group lm85_group = {
  	.attrs = lm85_attributes,
  };
06923f844   Guenter Roeck   hwmon: (lm85) Add...
1358
1359
1360
1361
  static struct attribute *lm85_attributes_minctl[] = {
  	&sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr,
  	&sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr,
  	&sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr,
5f441e225   Jean Delvare   hwmon: (lm85) Add...
1362
  	NULL
06923f844   Guenter Roeck   hwmon: (lm85) Add...
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
  };
  
  static const struct attribute_group lm85_group_minctl = {
  	.attrs = lm85_attributes_minctl,
  };
  
  static struct attribute *lm85_attributes_temp_off[] = {
  	&sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr,
  	&sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr,
  	&sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr,
5f441e225   Jean Delvare   hwmon: (lm85) Add...
1373
  	NULL
06923f844   Guenter Roeck   hwmon: (lm85) Add...
1374
1375
1376
1377
1378
  };
  
  static const struct attribute_group lm85_group_temp_off = {
  	.attrs = lm85_attributes_temp_off,
  };
6b9aad2d8   Jean Delvare   hwmon: (lm85) Exp...
1379
  static struct attribute *lm85_attributes_in4[] = {
b353a487b   Jean Delvare   hwmon: (lm85) Use...
1380
1381
1382
  	&sensor_dev_attr_in4_input.dev_attr.attr,
  	&sensor_dev_attr_in4_min.dev_attr.attr,
  	&sensor_dev_attr_in4_max.dev_attr.attr,
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
1383
  	&sensor_dev_attr_in4_alarm.dev_attr.attr,
0501a3816   Mark M. Hoffman   hwmon: Fix unchec...
1384
1385
  	NULL
  };
6b9aad2d8   Jean Delvare   hwmon: (lm85) Exp...
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
  static const struct attribute_group lm85_group_in4 = {
  	.attrs = lm85_attributes_in4,
  };
  
  static struct attribute *lm85_attributes_in567[] = {
  	&sensor_dev_attr_in5_input.dev_attr.attr,
  	&sensor_dev_attr_in6_input.dev_attr.attr,
  	&sensor_dev_attr_in7_input.dev_attr.attr,
  	&sensor_dev_attr_in5_min.dev_attr.attr,
  	&sensor_dev_attr_in6_min.dev_attr.attr,
  	&sensor_dev_attr_in7_min.dev_attr.attr,
  	&sensor_dev_attr_in5_max.dev_attr.attr,
  	&sensor_dev_attr_in6_max.dev_attr.attr,
  	&sensor_dev_attr_in7_max.dev_attr.attr,
bf76e9d3c   Jean Delvare   hwmon: (lm85) Add...
1400
1401
1402
  	&sensor_dev_attr_in5_alarm.dev_attr.attr,
  	&sensor_dev_attr_in6_alarm.dev_attr.attr,
  	&sensor_dev_attr_in7_alarm.dev_attr.attr,
6b9aad2d8   Jean Delvare   hwmon: (lm85) Exp...
1403
1404
1405
1406
1407
  	NULL
  };
  
  static const struct attribute_group lm85_group_in567 = {
  	.attrs = lm85_attributes_in567,
0501a3816   Mark M. Hoffman   hwmon: Fix unchec...
1408
  };
5f4475947   Jean Delvare   hwmon: (lm85) Sim...
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
  static void lm85_init_client(struct i2c_client *client)
  {
  	int value;
  
  	/* Start monitoring if needed */
  	value = lm85_read_value(client, LM85_REG_CONFIG);
  	if (!(value & 0x01)) {
  		dev_info(&client->dev, "Starting monitoring
  ");
  		lm85_write_value(client, LM85_REG_CONFIG, value | 0x01);
  	}
  
  	/* Warn about unusual configuration bits */
  	if (value & 0x02)
  		dev_warn(&client->dev, "Device configuration is locked
  ");
  	if (!(value & 0x04))
  		dev_warn(&client->dev, "Device is not ready
  ");
  }
5cfaf3381   Jean Delvare   hwmon: (lm85) Don...
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
  static int lm85_is_fake(struct i2c_client *client)
  {
  	/*
  	 * Differenciate between real LM96000 and Winbond WPCD377I. The latter
  	 * emulate the former except that it has no hardware monitoring function
  	 * so the readings are always 0.
  	 */
  	int i;
  	u8 in_temp, fan;
  
  	for (i = 0; i < 8; i++) {
  		in_temp = i2c_smbus_read_byte_data(client, 0x20 + i);
  		fan = i2c_smbus_read_byte_data(client, 0x28 + i);
  		if (in_temp != 0x00 || fan != 0xff)
  			return 0;
  	}
  
  	return 1;
  }
67712d019   Jean Delvare   hwmon: (lm85) Con...
1448
  /* Return 0 if detection is successful, -ENODEV otherwise */
310ec7921   Jean Delvare   i2c: Drop the kin...
1449
  static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
  {
67712d019   Jean Delvare   hwmon: (lm85) Con...
1451
1452
  	struct i2c_adapter *adapter = client->adapter;
  	int address = client->addr;
590e85344   Jean Delvare   hwmon: (lm85) Dro...
1453
  	const char *type_name = NULL;
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1454
  	int company, verstep;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1455

e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
1456
  	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1457
  		/* We need to be able to do byte I/O */
67712d019   Jean Delvare   hwmon: (lm85) Con...
1458
  		return -ENODEV;
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1459
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460

d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1461
1462
1463
  	/* Determine the chip type */
  	company = lm85_read_value(client, LM85_REG_COMPANY);
  	verstep = lm85_read_value(client, LM85_REG_VERSTEP);
b55f37572   Guenter Roeck   hwmon: Fix checkp...
1464
1465
1466
  	dev_dbg(&adapter->dev,
  		"Detecting device at 0x%02x with COMPANY: 0x%02x and VERSTEP: 0x%02x
  ",
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1467
  		address, company, verstep);
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
  	if (company == LM85_COMPANY_NATIONAL) {
  		switch (verstep) {
  		case LM85_VERSTEP_LM85C:
  			type_name = "lm85c";
  			break;
  		case LM85_VERSTEP_LM85B:
  			type_name = "lm85b";
  			break;
  		case LM85_VERSTEP_LM96000_1:
  		case LM85_VERSTEP_LM96000_2:
  			/* Check for Winbond WPCD377I */
  			if (lm85_is_fake(client)) {
  				dev_dbg(&adapter->dev,
  					"Found Winbond WPCD377I, ignoring
  ");
  				return -ENODEV;
69fc1feba   Jean Delvare   hwmon: (lm85) Rew...
1484
  			}
11650cf02   Jeremy Gebben   hwmon: (lm85) sup...
1485
  			type_name = "lm96000";
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
  			break;
  		}
  	} else if (company == LM85_COMPANY_ANALOG_DEV) {
  		switch (verstep) {
  		case LM85_VERSTEP_ADM1027:
  			type_name = "adm1027";
  			break;
  		case LM85_VERSTEP_ADT7463:
  		case LM85_VERSTEP_ADT7463C:
  			type_name = "adt7463";
  			break;
  		case LM85_VERSTEP_ADT7468_1:
  		case LM85_VERSTEP_ADT7468_2:
  			type_name = "adt7468";
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1501
  		}
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
  	} else if (company == LM85_COMPANY_SMSC) {
  		switch (verstep) {
  		case LM85_VERSTEP_EMC6D100_A0:
  		case LM85_VERSTEP_EMC6D100_A1:
  			/* Note: we can't tell a '100 from a '101 */
  			type_name = "emc6d100";
  			break;
  		case LM85_VERSTEP_EMC6D102:
  			type_name = "emc6d102";
  			break;
f065a93e1   Jan Beulich   hwmon: (lm85) ext...
1512
1513
1514
1515
  		case LM85_VERSTEP_EMC6D103_A0:
  		case LM85_VERSTEP_EMC6D103_A1:
  			type_name = "emc6d103";
  			break;
f065a93e1   Jan Beulich   hwmon: (lm85) ext...
1516
1517
1518
  		case LM85_VERSTEP_EMC6D103S:
  			type_name = "emc6d103s";
  			break;
d42a2eb5a   Jean Delvare   hwmon: (lm85) Cle...
1519
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1520
  	}
590e85344   Jean Delvare   hwmon: (lm85) Dro...
1521
1522
  	if (!type_name)
  		return -ENODEV;
67712d019   Jean Delvare   hwmon: (lm85) Con...
1523
1524
1525
1526
  	strlcpy(info->type, type_name, I2C_NAME_SIZE);
  
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1527

746f68841   Axel Lin   hwmon: (lm85) Con...
1528
  static int lm85_probe(struct i2c_client *client, const struct i2c_device_id *id)
67712d019   Jean Delvare   hwmon: (lm85) Con...
1529
  {
746f68841   Axel Lin   hwmon: (lm85) Con...
1530
1531
  	struct device *dev = &client->dev;
  	struct device *hwmon_dev;
67712d019   Jean Delvare   hwmon: (lm85) Con...
1532
  	struct lm85_data *data;
746f68841   Axel Lin   hwmon: (lm85) Con...
1533
  	int idx = 0;
67712d019   Jean Delvare   hwmon: (lm85) Con...
1534

746f68841   Axel Lin   hwmon: (lm85) Con...
1535
  	data = devm_kzalloc(dev, sizeof(struct lm85_data), GFP_KERNEL);
67712d019   Jean Delvare   hwmon: (lm85) Con...
1536
1537
  	if (!data)
  		return -ENOMEM;
746f68841   Axel Lin   hwmon: (lm85) Con...
1538
  	data->client = client;
00c0f9d3a   Javier Martinez Canillas   hwmon: (lm85) Add...
1539
1540
1541
1542
  	if (client->dev.of_node)
  		data->type = (enum chips)of_device_get_match_data(&client->dev);
  	else
  		data->type = id->driver_data;
9a61bf630   Ingo Molnar   [PATCH] hwmon: Se...
1543
  	mutex_init(&data->update_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1544

67712d019   Jean Delvare   hwmon: (lm85) Con...
1545
1546
1547
1548
  	/* Fill in the chip specific driver values */
  	switch (data->type) {
  	case adm1027:
  	case adt7463:
fa7a5797e   Jean Delvare   hwmon: (lm85) Fix...
1549
  	case adt7468:
67712d019   Jean Delvare   hwmon: (lm85) Con...
1550
1551
  	case emc6d100:
  	case emc6d102:
f065a93e1   Jan Beulich   hwmon: (lm85) ext...
1552
  	case emc6d103:
06923f844   Guenter Roeck   hwmon: (lm85) Add...
1553
  	case emc6d103s:
67712d019   Jean Delvare   hwmon: (lm85) Con...
1554
  		data->freq_map = adm1027_freq_map;
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
1555
  		data->freq_map_size = ARRAY_SIZE(adm1027_freq_map);
67712d019   Jean Delvare   hwmon: (lm85) Con...
1556
  		break;
e9b95485c   Jeremy Gebben   hwmon: (lm85) add...
1557
1558
1559
1560
  	case lm96000:
  		data->freq_map = lm96000_freq_map;
  		data->freq_map_size = ARRAY_SIZE(lm96000_freq_map);
  		break;
67712d019   Jean Delvare   hwmon: (lm85) Con...
1561
1562
  	default:
  		data->freq_map = lm85_freq_map;
57bc30196   Jeremy Gebben   hwmon: (lm85) rem...
1563
  		data->freq_map_size = ARRAY_SIZE(lm85_freq_map);
67712d019   Jean Delvare   hwmon: (lm85) Con...
1564
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1565
1566
  
  	/* Set the VRM version */
303760b44   Jean Delvare   [PATCH] hwmon: hw...
1567
  	data->vrm = vid_which_vrm();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1568
1569
  
  	/* Initialize the LM85 chip */
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
1570
  	lm85_init_client(client);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1571

746f68841   Axel Lin   hwmon: (lm85) Con...
1572
1573
  	/* sysfs hooks */
  	data->groups[idx++] = &lm85_group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1574

06923f844   Guenter Roeck   hwmon: (lm85) Add...
1575
1576
  	/* minctl and temp_off exist on all chips except emc6d103s */
  	if (data->type != emc6d103s) {
746f68841   Axel Lin   hwmon: (lm85) Con...
1577
1578
  		data->groups[idx++] = &lm85_group_minctl;
  		data->groups[idx++] = &lm85_group_temp_off;
06923f844   Guenter Roeck   hwmon: (lm85) Add...
1579
  	}
09770b261   Guenter Roeck   hwmon: (lm85) Fix...
1580
1581
1582
1583
  	/*
  	 * The ADT7463/68 have an optional VRM 10 mode where pin 21 is used
  	 * as a sixth digital VID input rather than an analog input.
  	 */
de2488058   Guenter Roeck   hwmon: (lm85) Use...
1584
1585
1586
1587
1588
  	if (data->type == adt7463 || data->type == adt7468) {
  		u8 vid = lm85_read_value(client, LM85_REG_VID);
  		if (vid & 0x80)
  			data->has_vid5 = true;
  	}
746f68841   Axel Lin   hwmon: (lm85) Con...
1589
1590
  	if (!data->has_vid5)
  		data->groups[idx++] = &lm85_group_in4;
6b9aad2d8   Jean Delvare   hwmon: (lm85) Exp...
1591
1592
  
  	/* The EMC6D100 has 3 additional voltage inputs */
746f68841   Axel Lin   hwmon: (lm85) Con...
1593
1594
  	if (data->type == emc6d100)
  		data->groups[idx++] = &lm85_group_in567;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1595

746f68841   Axel Lin   hwmon: (lm85) Con...
1596
1597
1598
  	hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
  							   data, data->groups);
  	return PTR_ERR_OR_ZERO(hwmon_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1599
  }
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
1600
1601
1602
1603
1604
1605
1606
  static const struct i2c_device_id lm85_id[] = {
  	{ "adm1027", adm1027 },
  	{ "adt7463", adt7463 },
  	{ "adt7468", adt7468 },
  	{ "lm85", lm85 },
  	{ "lm85b", lm85 },
  	{ "lm85c", lm85 },
11650cf02   Jeremy Gebben   hwmon: (lm85) sup...
1607
  	{ "lm96000", lm96000 },
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
1608
1609
1610
1611
1612
1613
1614
1615
  	{ "emc6d100", emc6d100 },
  	{ "emc6d101", emc6d100 },
  	{ "emc6d102", emc6d102 },
  	{ "emc6d103", emc6d103 },
  	{ "emc6d103s", emc6d103s },
  	{ }
  };
  MODULE_DEVICE_TABLE(i2c, lm85_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1616

20b497ab9   Guenter Roeck   hwmon: (lm85) Fix...
1617
  static const struct of_device_id __maybe_unused lm85_of_match[] = {
00c0f9d3a   Javier Martinez Canillas   hwmon: (lm85) Add...
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
  	{
  		.compatible = "adi,adm1027",
  		.data = (void *)adm1027
  	},
  	{
  		.compatible = "adi,adt7463",
  		.data = (void *)adt7463
  	},
  	{
  		.compatible = "adi,adt7468",
  		.data = (void *)adt7468
  	},
  	{
  		.compatible = "national,lm85",
  		.data = (void *)lm85
  	},
  	{
  		.compatible = "national,lm85b",
  		.data = (void *)lm85
  	},
  	{
  		.compatible = "national,lm85c",
  		.data = (void *)lm85
  	},
  	{
11650cf02   Jeremy Gebben   hwmon: (lm85) sup...
1643
1644
1645
1646
  		.compatible = "ti,lm96000",
  		.data = (void *)lm96000
  	},
  	{
00c0f9d3a   Javier Martinez Canillas   hwmon: (lm85) Add...
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
  		.compatible = "smsc,emc6d100",
  		.data = (void *)emc6d100
  	},
  	{
  		.compatible = "smsc,emc6d101",
  		.data = (void *)emc6d100
  	},
  	{
  		.compatible = "smsc,emc6d102",
  		.data = (void *)emc6d102
  	},
  	{
  		.compatible = "smsc,emc6d103",
  		.data = (void *)emc6d103
  	},
  	{
  		.compatible = "smsc,emc6d103s",
  		.data = (void *)emc6d103s
  	},
  	{ },
  };
  MODULE_DEVICE_TABLE(of, lm85_of_match);
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
1669
1670
1671
1672
  static struct i2c_driver lm85_driver = {
  	.class		= I2C_CLASS_HWMON,
  	.driver = {
  		.name   = "lm85",
00c0f9d3a   Javier Martinez Canillas   hwmon: (lm85) Add...
1673
  		.of_match_table = of_match_ptr(lm85_of_match),
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
1674
1675
  	},
  	.probe		= lm85_probe,
6fd5dd583   Axel Lin   hwmon: (lm85) Avo...
1676
1677
1678
1679
  	.id_table	= lm85_id,
  	.detect		= lm85_detect,
  	.address_list	= normal_i2c,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680

f0967eea8   Axel Lin   hwmon: convert dr...
1681
  module_i2c_driver(lm85_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1683
  MODULE_LICENSE("GPL");
1f44809ac   Jean Delvare   hwmon: (lm85) Cod...
1684
1685
  MODULE_AUTHOR("Philip Pokorny <ppokorny@penguincomputing.com>, "
  	"Margit Schubert-While <margitsw@t-online.de>, "
e89e22b23   Jean Delvare   hwmon: (lm85) Mis...
1686
  	"Justin Thiessen <jthiessen@penguincomputing.com>");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1687
  MODULE_DESCRIPTION("LM85-B, LM85-C driver");