• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/hwmon/
1/*
2    lm78.c - Part of lm_sensors, Linux kernel modules for hardware
3             monitoring
4    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
5    Copyright (c) 2007        Jean Delvare <khali@linux-fr.org>
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*/
21
22#include <linux/module.h>
23#include <linux/init.h>
24#include <linux/slab.h>
25#include <linux/jiffies.h>
26#include <linux/i2c.h>
27#include <linux/platform_device.h>
28#include <linux/ioport.h>
29#include <linux/hwmon.h>
30#include <linux/hwmon-vid.h>
31#include <linux/hwmon-sysfs.h>
32#include <linux/err.h>
33#include <linux/mutex.h>
34#include <linux/io.h>
35
36/* ISA device, if found */
37static struct platform_device *pdev;
38
39/* Addresses to scan */
40static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
41						0x2e, 0x2f, I2C_CLIENT_END };
42static unsigned short isa_address = 0x290;
43
44enum chips { lm78, lm79 };
45
46/* Many LM78 constants specified below */
47
48/* Length of ISA address segment */
49#define LM78_EXTENT 8
50
51/* Where are the ISA address/data registers relative to the base address */
52#define LM78_ADDR_REG_OFFSET 5
53#define LM78_DATA_REG_OFFSET 6
54
55/* The LM78 registers */
56#define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
57#define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
58#define LM78_REG_IN(nr) (0x20 + (nr))
59
60#define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
61#define LM78_REG_FAN(nr) (0x28 + (nr))
62
63#define LM78_REG_TEMP 0x27
64#define LM78_REG_TEMP_OVER 0x39
65#define LM78_REG_TEMP_HYST 0x3a
66
67#define LM78_REG_ALARM1 0x41
68#define LM78_REG_ALARM2 0x42
69
70#define LM78_REG_VID_FANDIV 0x47
71
72#define LM78_REG_CONFIG 0x40
73#define LM78_REG_CHIPID 0x49
74#define LM78_REG_I2C_ADDR 0x48
75
76
77/* Conversions. Rounding and limit checking is only done on the TO_REG
78   variants. */
79
80/* IN: mV, (0V to 4.08V)
81   REG: 16mV/bit */
82static inline u8 IN_TO_REG(unsigned long val)
83{
84	unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
85	return (nval + 8) / 16;
86}
87#define IN_FROM_REG(val) ((val) *  16)
88
89static inline u8 FAN_TO_REG(long rpm, int div)
90{
91	if (rpm <= 0)
92		return 255;
93	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
94}
95
96static inline int FAN_FROM_REG(u8 val, int div)
97{
98	return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
99}
100
101/* TEMP: mC (-128C to +127C)
102   REG: 1C/bit, two's complement */
103static inline s8 TEMP_TO_REG(int val)
104{
105	int nval = SENSORS_LIMIT(val, -128000, 127000) ;
106	return nval<0 ? (nval-500)/1000 : (nval+500)/1000;
107}
108
109static inline int TEMP_FROM_REG(s8 val)
110{
111	return val * 1000;
112}
113
114#define DIV_FROM_REG(val) (1 << (val))
115
116struct lm78_data {
117	struct i2c_client *client;
118	struct device *hwmon_dev;
119	struct mutex lock;
120	enum chips type;
121
122	/* For ISA device only */
123	const char *name;
124	int isa_addr;
125
126	struct mutex update_lock;
127	char valid;		/* !=0 if following fields are valid */
128	unsigned long last_updated;	/* In jiffies */
129
130	u8 in[7];		/* Register value */
131	u8 in_max[7];		/* Register value */
132	u8 in_min[7];		/* Register value */
133	u8 fan[3];		/* Register value */
134	u8 fan_min[3];		/* Register value */
135	s8 temp;		/* Register value */
136	s8 temp_over;		/* Register value */
137	s8 temp_hyst;		/* Register value */
138	u8 fan_div[3];		/* Register encoding, shifted right */
139	u8 vid;			/* Register encoding, combined */
140	u16 alarms;		/* Register encoding, combined */
141};
142
143
144static int lm78_i2c_detect(struct i2c_client *client,
145			   struct i2c_board_info *info);
146static int lm78_i2c_probe(struct i2c_client *client,
147			  const struct i2c_device_id *id);
148static int lm78_i2c_remove(struct i2c_client *client);
149
150static int __devinit lm78_isa_probe(struct platform_device *pdev);
151static int __devexit lm78_isa_remove(struct platform_device *pdev);
152
153static int lm78_read_value(struct lm78_data *data, u8 reg);
154static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
155static struct lm78_data *lm78_update_device(struct device *dev);
156static void lm78_init_device(struct lm78_data *data);
157
158
159static const struct i2c_device_id lm78_i2c_id[] = {
160	{ "lm78", lm78 },
161	{ "lm79", lm79 },
162	{ }
163};
164MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
165
166static struct i2c_driver lm78_driver = {
167	.class		= I2C_CLASS_HWMON,
168	.driver = {
169		.name	= "lm78",
170	},
171	.probe		= lm78_i2c_probe,
172	.remove		= lm78_i2c_remove,
173	.id_table	= lm78_i2c_id,
174	.detect		= lm78_i2c_detect,
175	.address_list	= normal_i2c,
176};
177
178static struct platform_driver lm78_isa_driver = {
179	.driver = {
180		.owner	= THIS_MODULE,
181		.name	= "lm78",
182	},
183	.probe		= lm78_isa_probe,
184	.remove		= __devexit_p(lm78_isa_remove),
185};
186
187
188/* 7 Voltages */
189static ssize_t show_in(struct device *dev, struct device_attribute *da,
190		       char *buf)
191{
192	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
193	struct lm78_data *data = lm78_update_device(dev);
194	return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index]));
195}
196
197static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
198			   char *buf)
199{
200	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
201	struct lm78_data *data = lm78_update_device(dev);
202	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index]));
203}
204
205static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
206			   char *buf)
207{
208	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
209	struct lm78_data *data = lm78_update_device(dev);
210	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index]));
211}
212
213static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
214			  const char *buf, size_t count)
215{
216	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
217	struct lm78_data *data = dev_get_drvdata(dev);
218	unsigned long val = simple_strtoul(buf, NULL, 10);
219	int nr = attr->index;
220
221	mutex_lock(&data->update_lock);
222	data->in_min[nr] = IN_TO_REG(val);
223	lm78_write_value(data, LM78_REG_IN_MIN(nr), data->in_min[nr]);
224	mutex_unlock(&data->update_lock);
225	return count;
226}
227
228static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
229			  const char *buf, size_t count)
230{
231	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
232	struct lm78_data *data = dev_get_drvdata(dev);
233	unsigned long val = simple_strtoul(buf, NULL, 10);
234	int nr = attr->index;
235
236	mutex_lock(&data->update_lock);
237	data->in_max[nr] = IN_TO_REG(val);
238	lm78_write_value(data, LM78_REG_IN_MAX(nr), data->in_max[nr]);
239	mutex_unlock(&data->update_lock);
240	return count;
241}
242
243#define show_in_offset(offset)					\
244static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,		\
245		show_in, NULL, offset);				\
246static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,	\
247		show_in_min, set_in_min, offset);		\
248static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,	\
249		show_in_max, set_in_max, offset);
250
251show_in_offset(0);
252show_in_offset(1);
253show_in_offset(2);
254show_in_offset(3);
255show_in_offset(4);
256show_in_offset(5);
257show_in_offset(6);
258
259/* Temperature */
260static ssize_t show_temp(struct device *dev, struct device_attribute *da,
261			 char *buf)
262{
263	struct lm78_data *data = lm78_update_device(dev);
264	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
265}
266
267static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
268			      char *buf)
269{
270	struct lm78_data *data = lm78_update_device(dev);
271	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
272}
273
274static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
275			     const char *buf, size_t count)
276{
277	struct lm78_data *data = dev_get_drvdata(dev);
278	long val = simple_strtol(buf, NULL, 10);
279
280	mutex_lock(&data->update_lock);
281	data->temp_over = TEMP_TO_REG(val);
282	lm78_write_value(data, LM78_REG_TEMP_OVER, data->temp_over);
283	mutex_unlock(&data->update_lock);
284	return count;
285}
286
287static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
288			      char *buf)
289{
290	struct lm78_data *data = lm78_update_device(dev);
291	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
292}
293
294static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
295			     const char *buf, size_t count)
296{
297	struct lm78_data *data = dev_get_drvdata(dev);
298	long val = simple_strtol(buf, NULL, 10);
299
300	mutex_lock(&data->update_lock);
301	data->temp_hyst = TEMP_TO_REG(val);
302	lm78_write_value(data, LM78_REG_TEMP_HYST, data->temp_hyst);
303	mutex_unlock(&data->update_lock);
304	return count;
305}
306
307static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
308static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
309		show_temp_over, set_temp_over);
310static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
311		show_temp_hyst, set_temp_hyst);
312
313/* 3 Fans */
314static ssize_t show_fan(struct device *dev, struct device_attribute *da,
315			char *buf)
316{
317	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
318	struct lm78_data *data = lm78_update_device(dev);
319	int nr = attr->index;
320	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
321		DIV_FROM_REG(data->fan_div[nr])) );
322}
323
324static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
325			    char *buf)
326{
327	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
328	struct lm78_data *data = lm78_update_device(dev);
329	int nr = attr->index;
330	return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
331		DIV_FROM_REG(data->fan_div[nr])) );
332}
333
334static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
335			   const char *buf, size_t count)
336{
337	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
338	struct lm78_data *data = dev_get_drvdata(dev);
339	int nr = attr->index;
340	unsigned long val = simple_strtoul(buf, NULL, 10);
341
342	mutex_lock(&data->update_lock);
343	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
344	lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
345	mutex_unlock(&data->update_lock);
346	return count;
347}
348
349static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
350			    char *buf)
351{
352	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
353	struct lm78_data *data = lm78_update_device(dev);
354	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
355}
356
357/* Note: we save and restore the fan minimum here, because its value is
358   determined in part by the fan divisor.  This follows the principle of
359   least surprise; the user doesn't expect the fan minimum to change just
360   because the divisor changed. */
361static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
362			   const char *buf, size_t count)
363{
364	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
365	struct lm78_data *data = dev_get_drvdata(dev);
366	int nr = attr->index;
367	unsigned long val = simple_strtoul(buf, NULL, 10);
368	unsigned long min;
369	u8 reg;
370
371	mutex_lock(&data->update_lock);
372	min = FAN_FROM_REG(data->fan_min[nr],
373			   DIV_FROM_REG(data->fan_div[nr]));
374
375	switch (val) {
376	case 1: data->fan_div[nr] = 0; break;
377	case 2: data->fan_div[nr] = 1; break;
378	case 4: data->fan_div[nr] = 2; break;
379	case 8: data->fan_div[nr] = 3; break;
380	default:
381		dev_err(dev, "fan_div value %ld not "
382			"supported. Choose one of 1, 2, 4 or 8!\n", val);
383		mutex_unlock(&data->update_lock);
384		return -EINVAL;
385	}
386
387	reg = lm78_read_value(data, LM78_REG_VID_FANDIV);
388	switch (nr) {
389	case 0:
390		reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
391		break;
392	case 1:
393		reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
394		break;
395	}
396	lm78_write_value(data, LM78_REG_VID_FANDIV, reg);
397
398	data->fan_min[nr] =
399		FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
400	lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
401	mutex_unlock(&data->update_lock);
402
403	return count;
404}
405
406#define show_fan_offset(offset)				\
407static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,		\
408		show_fan, NULL, offset - 1);			\
409static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,	\
410		show_fan_min, set_fan_min, offset - 1);
411
412show_fan_offset(1);
413show_fan_offset(2);
414show_fan_offset(3);
415
416/* Fan 3 divisor is locked in H/W */
417static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
418		show_fan_div, set_fan_div, 0);
419static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
420		show_fan_div, set_fan_div, 1);
421static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
422
423/* VID */
424static ssize_t show_vid(struct device *dev, struct device_attribute *da,
425			char *buf)
426{
427	struct lm78_data *data = lm78_update_device(dev);
428	return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
429}
430static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
431
432/* Alarms */
433static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
434			   char *buf)
435{
436	struct lm78_data *data = lm78_update_device(dev);
437	return sprintf(buf, "%u\n", data->alarms);
438}
439static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
440
441static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
442			  char *buf)
443{
444	struct lm78_data *data = lm78_update_device(dev);
445	int nr = to_sensor_dev_attr(da)->index;
446	return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
447}
448static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
449static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
450static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
451static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
452static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
453static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
454static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
455static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
456static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
457static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
458static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
459
460static struct attribute *lm78_attributes[] = {
461	&sensor_dev_attr_in0_input.dev_attr.attr,
462	&sensor_dev_attr_in0_min.dev_attr.attr,
463	&sensor_dev_attr_in0_max.dev_attr.attr,
464	&sensor_dev_attr_in0_alarm.dev_attr.attr,
465	&sensor_dev_attr_in1_input.dev_attr.attr,
466	&sensor_dev_attr_in1_min.dev_attr.attr,
467	&sensor_dev_attr_in1_max.dev_attr.attr,
468	&sensor_dev_attr_in1_alarm.dev_attr.attr,
469	&sensor_dev_attr_in2_input.dev_attr.attr,
470	&sensor_dev_attr_in2_min.dev_attr.attr,
471	&sensor_dev_attr_in2_max.dev_attr.attr,
472	&sensor_dev_attr_in2_alarm.dev_attr.attr,
473	&sensor_dev_attr_in3_input.dev_attr.attr,
474	&sensor_dev_attr_in3_min.dev_attr.attr,
475	&sensor_dev_attr_in3_max.dev_attr.attr,
476	&sensor_dev_attr_in3_alarm.dev_attr.attr,
477	&sensor_dev_attr_in4_input.dev_attr.attr,
478	&sensor_dev_attr_in4_min.dev_attr.attr,
479	&sensor_dev_attr_in4_max.dev_attr.attr,
480	&sensor_dev_attr_in4_alarm.dev_attr.attr,
481	&sensor_dev_attr_in5_input.dev_attr.attr,
482	&sensor_dev_attr_in5_min.dev_attr.attr,
483	&sensor_dev_attr_in5_max.dev_attr.attr,
484	&sensor_dev_attr_in5_alarm.dev_attr.attr,
485	&sensor_dev_attr_in6_input.dev_attr.attr,
486	&sensor_dev_attr_in6_min.dev_attr.attr,
487	&sensor_dev_attr_in6_max.dev_attr.attr,
488	&sensor_dev_attr_in6_alarm.dev_attr.attr,
489	&dev_attr_temp1_input.attr,
490	&dev_attr_temp1_max.attr,
491	&dev_attr_temp1_max_hyst.attr,
492	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
493	&sensor_dev_attr_fan1_input.dev_attr.attr,
494	&sensor_dev_attr_fan1_min.dev_attr.attr,
495	&sensor_dev_attr_fan1_div.dev_attr.attr,
496	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
497	&sensor_dev_attr_fan2_input.dev_attr.attr,
498	&sensor_dev_attr_fan2_min.dev_attr.attr,
499	&sensor_dev_attr_fan2_div.dev_attr.attr,
500	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
501	&sensor_dev_attr_fan3_input.dev_attr.attr,
502	&sensor_dev_attr_fan3_min.dev_attr.attr,
503	&sensor_dev_attr_fan3_div.dev_attr.attr,
504	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
505	&dev_attr_alarms.attr,
506	&dev_attr_cpu0_vid.attr,
507
508	NULL
509};
510
511static const struct attribute_group lm78_group = {
512	.attrs = lm78_attributes,
513};
514
515/* I2C devices get this name attribute automatically, but for ISA devices
516   we must create it by ourselves. */
517static ssize_t show_name(struct device *dev, struct device_attribute
518			 *devattr, char *buf)
519{
520	struct lm78_data *data = dev_get_drvdata(dev);
521
522	return sprintf(buf, "%s\n", data->name);
523}
524static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
525
526/* Returns 1 if the I2C chip appears to be an alias of the ISA chip */
527static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
528{
529	struct lm78_data *isa;
530	int i;
531
532	if (!pdev)	/* No ISA chip */
533		return 0;
534	isa = platform_get_drvdata(pdev);
535
536	if (lm78_read_value(isa, LM78_REG_I2C_ADDR) != client->addr)
537		return 0;	/* Address doesn't match */
538	if ((lm78_read_value(isa, LM78_REG_CHIPID) & 0xfe) != (chipid & 0xfe))
539		return 0;	/* Chip type doesn't match */
540
541	/* We compare all the limit registers, the config register and the
542	 * interrupt mask registers */
543	for (i = 0x2b; i <= 0x3d; i++) {
544		if (lm78_read_value(isa, i) !=
545		    i2c_smbus_read_byte_data(client, i))
546			return 0;
547	}
548	if (lm78_read_value(isa, LM78_REG_CONFIG) !=
549	    i2c_smbus_read_byte_data(client, LM78_REG_CONFIG))
550		return 0;
551	for (i = 0x43; i <= 0x46; i++) {
552		if (lm78_read_value(isa, i) !=
553		    i2c_smbus_read_byte_data(client, i))
554			return 0;
555	}
556
557	return 1;
558}
559
560static int lm78_i2c_detect(struct i2c_client *client,
561			   struct i2c_board_info *info)
562{
563	int i;
564	struct lm78_data *isa = pdev ? platform_get_drvdata(pdev) : NULL;
565	const char *client_name;
566	struct i2c_adapter *adapter = client->adapter;
567	int address = client->addr;
568
569	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
570		return -ENODEV;
571
572	/* We block updates of the ISA device to minimize the risk of
573	   concurrent access to the same LM78 chip through different
574	   interfaces. */
575	if (isa)
576		mutex_lock(&isa->update_lock);
577
578	if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80)
579	 || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address)
580		goto err_nodev;
581
582	/* Explicitly prevent the misdetection of Winbond chips */
583	i = i2c_smbus_read_byte_data(client, 0x4f);
584	if (i == 0xa3 || i == 0x5c)
585		goto err_nodev;
586
587	/* Determine the chip type. */
588	i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID);
589	if (i == 0x00 || i == 0x20	/* LM78 */
590	 || i == 0x40)			/* LM78-J */
591		client_name = "lm78";
592	else if ((i & 0xfe) == 0xc0)
593		client_name = "lm79";
594	else
595		goto err_nodev;
596
597	if (lm78_alias_detect(client, i)) {
598		dev_dbg(&adapter->dev, "Device at 0x%02x appears to "
599			"be the same as ISA device\n", address);
600		goto err_nodev;
601	}
602
603	if (isa)
604		mutex_unlock(&isa->update_lock);
605
606	strlcpy(info->type, client_name, I2C_NAME_SIZE);
607
608	return 0;
609
610 err_nodev:
611	if (isa)
612		mutex_unlock(&isa->update_lock);
613	return -ENODEV;
614}
615
616static int lm78_i2c_probe(struct i2c_client *client,
617			  const struct i2c_device_id *id)
618{
619	struct lm78_data *data;
620	int err;
621
622	data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL);
623	if (!data)
624		return -ENOMEM;
625
626	i2c_set_clientdata(client, data);
627	data->client = client;
628	data->type = id->driver_data;
629
630	/* Initialize the LM78 chip */
631	lm78_init_device(data);
632
633	/* Register sysfs hooks */
634	err = sysfs_create_group(&client->dev.kobj, &lm78_group);
635	if (err)
636		goto ERROR3;
637
638	data->hwmon_dev = hwmon_device_register(&client->dev);
639	if (IS_ERR(data->hwmon_dev)) {
640		err = PTR_ERR(data->hwmon_dev);
641		goto ERROR4;
642	}
643
644	return 0;
645
646ERROR4:
647	sysfs_remove_group(&client->dev.kobj, &lm78_group);
648ERROR3:
649	kfree(data);
650	return err;
651}
652
653static int lm78_i2c_remove(struct i2c_client *client)
654{
655	struct lm78_data *data = i2c_get_clientdata(client);
656
657	hwmon_device_unregister(data->hwmon_dev);
658	sysfs_remove_group(&client->dev.kobj, &lm78_group);
659	kfree(data);
660
661	return 0;
662}
663
664static int __devinit lm78_isa_probe(struct platform_device *pdev)
665{
666	int err;
667	struct lm78_data *data;
668	struct resource *res;
669
670	/* Reserve the ISA region */
671	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
672	if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
673		err = -EBUSY;
674		goto exit;
675	}
676
677	if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
678		err = -ENOMEM;
679		goto exit_release_region;
680	}
681	mutex_init(&data->lock);
682	data->isa_addr = res->start;
683	platform_set_drvdata(pdev, data);
684
685	if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
686		data->type = lm79;
687		data->name = "lm79";
688	} else {
689		data->type = lm78;
690		data->name = "lm78";
691	}
692
693	/* Initialize the LM78 chip */
694	lm78_init_device(data);
695
696	/* Register sysfs hooks */
697	if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
698	 || (err = device_create_file(&pdev->dev, &dev_attr_name)))
699		goto exit_remove_files;
700
701	data->hwmon_dev = hwmon_device_register(&pdev->dev);
702	if (IS_ERR(data->hwmon_dev)) {
703		err = PTR_ERR(data->hwmon_dev);
704		goto exit_remove_files;
705	}
706
707	return 0;
708
709 exit_remove_files:
710	sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
711	device_remove_file(&pdev->dev, &dev_attr_name);
712	kfree(data);
713 exit_release_region:
714	release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
715 exit:
716	return err;
717}
718
719static int __devexit lm78_isa_remove(struct platform_device *pdev)
720{
721	struct lm78_data *data = platform_get_drvdata(pdev);
722	struct resource *res;
723
724	hwmon_device_unregister(data->hwmon_dev);
725	sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
726	device_remove_file(&pdev->dev, &dev_attr_name);
727	kfree(data);
728
729	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
730	release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
731
732	return 0;
733}
734
735/* The SMBus locks itself, but ISA access must be locked explicitly!
736   We don't want to lock the whole ISA bus, so we lock each client
737   separately.
738   We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
739   would slow down the LM78 access and should not be necessary.  */
740static int lm78_read_value(struct lm78_data *data, u8 reg)
741{
742	struct i2c_client *client = data->client;
743
744	if (!client) { /* ISA device */
745		int res;
746		mutex_lock(&data->lock);
747		outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
748		res = inb_p(data->isa_addr + LM78_DATA_REG_OFFSET);
749		mutex_unlock(&data->lock);
750		return res;
751	} else
752		return i2c_smbus_read_byte_data(client, reg);
753}
754
755/* The SMBus locks itself, but ISA access muse be locked explicitly!
756   We don't want to lock the whole ISA bus, so we lock each client
757   separately.
758   We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
759   would slow down the LM78 access and should not be necessary.
760   There are some ugly typecasts here, but the good new is - they should
761   nowhere else be necessary! */
762static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
763{
764	struct i2c_client *client = data->client;
765
766	if (!client) { /* ISA device */
767		mutex_lock(&data->lock);
768		outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
769		outb_p(value, data->isa_addr + LM78_DATA_REG_OFFSET);
770		mutex_unlock(&data->lock);
771		return 0;
772	} else
773		return i2c_smbus_write_byte_data(client, reg, value);
774}
775
776static void lm78_init_device(struct lm78_data *data)
777{
778	u8 config;
779	int i;
780
781	/* Start monitoring */
782	config = lm78_read_value(data, LM78_REG_CONFIG);
783	if ((config & 0x09) != 0x01)
784		lm78_write_value(data, LM78_REG_CONFIG,
785				 (config & 0xf7) | 0x01);
786
787	/* A few vars need to be filled upon startup */
788	for (i = 0; i < 3; i++) {
789		data->fan_min[i] = lm78_read_value(data,
790					LM78_REG_FAN_MIN(i));
791	}
792
793	mutex_init(&data->update_lock);
794}
795
796static struct lm78_data *lm78_update_device(struct device *dev)
797{
798	struct lm78_data *data = dev_get_drvdata(dev);
799	int i;
800
801	mutex_lock(&data->update_lock);
802
803	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
804	    || !data->valid) {
805
806		dev_dbg(dev, "Starting lm78 update\n");
807
808		for (i = 0; i <= 6; i++) {
809			data->in[i] =
810			    lm78_read_value(data, LM78_REG_IN(i));
811			data->in_min[i] =
812			    lm78_read_value(data, LM78_REG_IN_MIN(i));
813			data->in_max[i] =
814			    lm78_read_value(data, LM78_REG_IN_MAX(i));
815		}
816		for (i = 0; i < 3; i++) {
817			data->fan[i] =
818			    lm78_read_value(data, LM78_REG_FAN(i));
819			data->fan_min[i] =
820			    lm78_read_value(data, LM78_REG_FAN_MIN(i));
821		}
822		data->temp = lm78_read_value(data, LM78_REG_TEMP);
823		data->temp_over =
824		    lm78_read_value(data, LM78_REG_TEMP_OVER);
825		data->temp_hyst =
826		    lm78_read_value(data, LM78_REG_TEMP_HYST);
827		i = lm78_read_value(data, LM78_REG_VID_FANDIV);
828		data->vid = i & 0x0f;
829		if (data->type == lm79)
830			data->vid |=
831			    (lm78_read_value(data, LM78_REG_CHIPID) &
832			     0x01) << 4;
833		else
834			data->vid |= 0x10;
835		data->fan_div[0] = (i >> 4) & 0x03;
836		data->fan_div[1] = i >> 6;
837		data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
838		    (lm78_read_value(data, LM78_REG_ALARM2) << 8);
839		data->last_updated = jiffies;
840		data->valid = 1;
841
842		data->fan_div[2] = 1;
843	}
844
845	mutex_unlock(&data->update_lock);
846
847	return data;
848}
849
850/* return 1 if a supported chip is found, 0 otherwise */
851static int __init lm78_isa_found(unsigned short address)
852{
853	int val, save, found = 0;
854	int port;
855
856	/* Some boards declare base+0 to base+7 as a PNP device, some base+4
857	 * to base+7 and some base+5 to base+6. So we better request each port
858	 * individually for the probing phase. */
859	for (port = address; port < address + LM78_EXTENT; port++) {
860		if (!request_region(port, 1, "lm78")) {
861			pr_debug("lm78: Failed to request port 0x%x\n", port);
862			goto release;
863		}
864	}
865
866#define REALLY_SLOW_IO
867	/* We need the timeouts for at least some LM78-like
868	   chips. But only if we read 'undefined' registers. */
869	val = inb_p(address + 1);
870	if (inb_p(address + 2) != val
871	 || inb_p(address + 3) != val
872	 || inb_p(address + 7) != val)
873		goto release;
874#undef REALLY_SLOW_IO
875
876	/* We should be able to change the 7 LSB of the address port. The
877	   MSB (busy flag) should be clear initially, set after the write. */
878	save = inb_p(address + LM78_ADDR_REG_OFFSET);
879	if (save & 0x80)
880		goto release;
881	val = ~save & 0x7f;
882	outb_p(val, address + LM78_ADDR_REG_OFFSET);
883	if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
884		outb_p(save, address + LM78_ADDR_REG_OFFSET);
885		goto release;
886	}
887
888	/* We found a device, now see if it could be an LM78 */
889	outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
890	val = inb_p(address + LM78_DATA_REG_OFFSET);
891	if (val & 0x80)
892		goto release;
893	outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
894	val = inb_p(address + LM78_DATA_REG_OFFSET);
895	if (val < 0x03 || val > 0x77)	/* Not a valid I2C address */
896		goto release;
897
898	/* The busy flag should be clear again */
899	if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
900		goto release;
901
902	/* Explicitly prevent the misdetection of Winbond chips */
903	outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
904	val = inb_p(address + LM78_DATA_REG_OFFSET);
905	if (val == 0xa3 || val == 0x5c)
906		goto release;
907
908	/* Explicitly prevent the misdetection of ITE chips */
909	outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
910	val = inb_p(address + LM78_DATA_REG_OFFSET);
911	if (val == 0x90)
912		goto release;
913
914	/* Determine the chip type */
915	outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
916	val = inb_p(address + LM78_DATA_REG_OFFSET);
917	if (val == 0x00 || val == 0x20	/* LM78 */
918	 || val == 0x40			/* LM78-J */
919	 || (val & 0xfe) == 0xc0)	/* LM79 */
920		found = 1;
921
922	if (found)
923		pr_info("lm78: Found an %s chip at %#x\n",
924			val & 0x80 ? "LM79" : "LM78", (int)address);
925
926 release:
927	for (port--; port >= address; port--)
928		release_region(port, 1);
929	return found;
930}
931
932static int __init lm78_isa_device_add(unsigned short address)
933{
934	struct resource res = {
935		.start	= address,
936		.end	= address + LM78_EXTENT - 1,
937		.name	= "lm78",
938		.flags	= IORESOURCE_IO,
939	};
940	int err;
941
942	pdev = platform_device_alloc("lm78", address);
943	if (!pdev) {
944		err = -ENOMEM;
945		printk(KERN_ERR "lm78: Device allocation failed\n");
946		goto exit;
947	}
948
949	err = platform_device_add_resources(pdev, &res, 1);
950	if (err) {
951		printk(KERN_ERR "lm78: Device resource addition failed "
952		       "(%d)\n", err);
953		goto exit_device_put;
954	}
955
956	err = platform_device_add(pdev);
957	if (err) {
958		printk(KERN_ERR "lm78: Device addition failed (%d)\n",
959		       err);
960		goto exit_device_put;
961	}
962
963	return 0;
964
965 exit_device_put:
966	platform_device_put(pdev);
967 exit:
968	pdev = NULL;
969	return err;
970}
971
972static int __init sm_lm78_init(void)
973{
974	int res;
975
976	/* We register the ISA device first, so that we can skip the
977	 * registration of an I2C interface to the same device. */
978	if (lm78_isa_found(isa_address)) {
979		res = platform_driver_register(&lm78_isa_driver);
980		if (res)
981			goto exit;
982
983		/* Sets global pdev as a side effect */
984		res = lm78_isa_device_add(isa_address);
985		if (res)
986			goto exit_unreg_isa_driver;
987	}
988
989	res = i2c_add_driver(&lm78_driver);
990	if (res)
991		goto exit_unreg_isa_device;
992
993	return 0;
994
995 exit_unreg_isa_device:
996	platform_device_unregister(pdev);
997 exit_unreg_isa_driver:
998	platform_driver_unregister(&lm78_isa_driver);
999 exit:
1000	return res;
1001}
1002
1003static void __exit sm_lm78_exit(void)
1004{
1005	if (pdev) {
1006		platform_device_unregister(pdev);
1007		platform_driver_unregister(&lm78_isa_driver);
1008	}
1009	i2c_del_driver(&lm78_driver);
1010}
1011
1012
1013
1014MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
1015MODULE_DESCRIPTION("LM78/LM79 driver");
1016MODULE_LICENSE("GPL");
1017
1018module_init(sm_lm78_init);
1019module_exit(sm_lm78_exit);
1020