Linux Audio

Check our new training course

Loading...
v3.1
 
  1/*
  2    sis5595.c - Part of lm_sensors, Linux kernel modules
  3		for hardware monitoring
  4
  5    Copyright (C) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
  6			Kyösti Mälkki <kmalkki@cc.hut.fi>, and
  7			Mark D. Studebaker <mdsxyz123@yahoo.com>
  8    Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with
  9    the help of Jean Delvare <khali@linux-fr.org>
 10
 11    This program is free software; you can redistribute it and/or modify
 12    it under the terms of the GNU General Public License as published by
 13    the Free Software Foundation; either version 2 of the License, or
 14    (at your option) any later version.
 15
 16    This program is distributed in the hope that it will be useful,
 17    but WITHOUT ANY WARRANTY; without even the implied warranty of
 18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 19    GNU General Public License for more details.
 20
 21    You should have received a copy of the GNU General Public License
 22    along with this program; if not, write to the Free Software
 23    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 24*/
 25
 26/*
 27   SiS southbridge has a LM78-like chip integrated on the same IC.
 28   This driver is a customized copy of lm78.c
 29   
 30   Supports following revisions:
 31	Version		PCI ID		PCI Revision
 32	1		1039/0008	AF or less
 33	2		1039/0008	B0 or greater
 34
 35   Note: these chips contain a 0008 device which is incompatible with the
 36	 5595. We recognize these by the presence of the listed
 37	 "blacklist" PCI ID and refuse to load.
 38
 39   NOT SUPPORTED	PCI ID		BLACKLIST PCI ID	
 40	 540		0008		0540
 41	 550		0008		0550
 42	5513		0008		5511
 43	5581		0008		5597
 44	5582		0008		5597
 45	5597		0008		5597
 46	5598		0008		5597/5598
 47	 630		0008		0630
 48	 645		0008		0645
 49	 730		0008		0730
 50	 735		0008		0735
 51*/
 52
 53#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 54
 55#include <linux/module.h>
 56#include <linux/slab.h>
 57#include <linux/ioport.h>
 58#include <linux/pci.h>
 59#include <linux/platform_device.h>
 60#include <linux/hwmon.h>
 61#include <linux/hwmon-sysfs.h>
 62#include <linux/err.h>
 63#include <linux/init.h>
 64#include <linux/jiffies.h>
 65#include <linux/mutex.h>
 66#include <linux/sysfs.h>
 67#include <linux/acpi.h>
 68#include <linux/io.h>
 69
 70
 71/* If force_addr is set to anything different from 0, we forcibly enable
 72   the device at the given address. */
 
 73static u16 force_addr;
 74module_param(force_addr, ushort, 0);
 75MODULE_PARM_DESC(force_addr,
 76		 "Initialize the base address of the sensors");
 77
 78static struct platform_device *pdev;
 79
 80/* Many SIS5595 constants specified below */
 81
 82/* Length of ISA address segment */
 83#define SIS5595_EXTENT 8
 84/* PCI Config Registers */
 85#define SIS5595_BASE_REG 0x68
 86#define SIS5595_PIN_REG 0x7A
 87#define SIS5595_ENABLE_REG 0x7B
 88
 89/* Where are the ISA address/data registers relative to the base address */
 90#define SIS5595_ADDR_REG_OFFSET 5
 91#define SIS5595_DATA_REG_OFFSET 6
 92
 93/* The SIS5595 registers */
 94#define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
 95#define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
 96#define SIS5595_REG_IN(nr) (0x20 + (nr))
 97
 98#define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
 99#define SIS5595_REG_FAN(nr) (0x28 + (nr))
100
101/* On the first version of the chip, the temp registers are separate.
102   On the second version,
103   TEMP pin is shared with IN4, configured in PCI register 0x7A.
104   The registers are the same as well.
105   OVER and HYST are really MAX and MIN. */
 
 
106
107#define REV2MIN	0xb0
108#define SIS5595_REG_TEMP 	(( data->revision) >= REV2MIN) ? \
109					SIS5595_REG_IN(4) : 0x27
110#define SIS5595_REG_TEMP_OVER	(( data->revision) >= REV2MIN) ? \
111					SIS5595_REG_IN_MAX(4) : 0x39
112#define SIS5595_REG_TEMP_HYST	(( data->revision) >= REV2MIN) ? \
113					SIS5595_REG_IN_MIN(4) : 0x3a
114
115#define SIS5595_REG_CONFIG 0x40
116#define SIS5595_REG_ALARM1 0x41
117#define SIS5595_REG_ALARM2 0x42
118#define SIS5595_REG_FANDIV 0x47
119
120/* Conversions. Limit checking is only done on the TO_REG
121   variants. */
 
 
122
123/* IN: mV, (0V to 4.08V)
124   REG: 16mV/bit */
 
 
125static inline u8 IN_TO_REG(unsigned long val)
126{
127	unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
128	return (nval + 8) / 16;
129}
130#define IN_FROM_REG(val) ((val) *  16)
131
132static inline u8 FAN_TO_REG(long rpm, int div)
133{
134	if (rpm <= 0)
135		return 255;
136	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
 
 
137}
138
139static inline int FAN_FROM_REG(u8 val, int div)
140{
141	return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
142}
143
144/* TEMP: mC (-54.12C to +157.53C)
145   REG: 0.83C/bit + 52.12, two's complement  */
 
 
146static inline int TEMP_FROM_REG(s8 val)
147{
148	return val * 830 + 52120;
149}
150static inline s8 TEMP_TO_REG(int val)
151{
152	int nval = SENSORS_LIMIT(val, -54120, 157530) ;
153	return nval<0 ? (nval-5212-415)/830 : (nval-5212+415)/830;
154}
155
156/* FAN DIV: 1, 2, 4, or 8 (defaults to 2)
157   REG: 0, 1, 2, or 3 (respectively) (defaults to 1) */
 
 
158static inline u8 DIV_TO_REG(int val)
159{
160	return val==8 ? 3 : val==4 ? 2 : val==1 ? 0 : 1;
161}
162#define DIV_FROM_REG(val) (1 << (val))
163
164/* For each registered chip, we need to keep some data in memory.
165   The structure is dynamically allocated. */
 
 
166struct sis5595_data {
167	unsigned short addr;
168	const char *name;
169	struct device *hwmon_dev;
170	struct mutex lock;
171
172	struct mutex update_lock;
173	char valid;		/* !=0 if following fields are valid */
174	unsigned long last_updated;	/* In jiffies */
175	char maxins;		/* == 3 if temp enabled, otherwise == 4 */
176	u8 revision;		/* Reg. value */
177
178	u8 in[5];		/* Register value */
179	u8 in_max[5];		/* Register value */
180	u8 in_min[5];		/* Register value */
181	u8 fan[2];		/* Register value */
182	u8 fan_min[2];		/* Register value */
183	s8 temp;		/* Register value */
184	s8 temp_over;		/* Register value */
185	s8 temp_hyst;		/* Register value */
186	u8 fan_div[2];		/* Register encoding, shifted right */
187	u16 alarms;		/* Register encoding, combined */
188};
189
190static struct pci_dev *s_bridge;	/* pointer to the (only) sis5595 */
191
192static int sis5595_probe(struct platform_device *pdev);
193static int __devexit sis5595_remove(struct platform_device *pdev);
194
195static int sis5595_read_value(struct sis5595_data *data, u8 reg);
196static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value);
197static struct sis5595_data *sis5595_update_device(struct device *dev);
198static void sis5595_init_device(struct sis5595_data *data);
199
200static struct platform_driver sis5595_driver = {
201	.driver = {
202		.owner	= THIS_MODULE,
203		.name	= "sis5595",
204	},
205	.probe		= sis5595_probe,
206	.remove		= __devexit_p(sis5595_remove),
207};
208
209/* 4 Voltages */
210static ssize_t show_in(struct device *dev, struct device_attribute *da,
211		       char *buf)
212{
213	struct sis5595_data *data = sis5595_update_device(dev);
214	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
215	int nr = attr->index;
216	return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
217}
218
219static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
220			   char *buf)
221{
222	struct sis5595_data *data = sis5595_update_device(dev);
223	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
224	int nr = attr->index;
225	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
226}
227
228static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
229			   char *buf)
230{
231	struct sis5595_data *data = sis5595_update_device(dev);
232	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
233	int nr = attr->index;
234	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
235}
236
237static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
238			  const char *buf, size_t count)
239{
240	struct sis5595_data *data = dev_get_drvdata(dev);
241	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
242	int nr = attr->index;
243	unsigned long val = simple_strtoul(buf, NULL, 10);
 
 
 
 
 
244
245	mutex_lock(&data->update_lock);
246	data->in_min[nr] = IN_TO_REG(val);
247	sis5595_write_value(data, SIS5595_REG_IN_MIN(nr), data->in_min[nr]);
248	mutex_unlock(&data->update_lock);
249	return count;
250}
251
252static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
253			  const char *buf, size_t count)
254{
255	struct sis5595_data *data = dev_get_drvdata(dev);
256	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
257	int nr = attr->index;
258	unsigned long val = simple_strtoul(buf, NULL, 10);
 
 
 
 
 
259
260	mutex_lock(&data->update_lock);
261	data->in_max[nr] = IN_TO_REG(val);
262	sis5595_write_value(data, SIS5595_REG_IN_MAX(nr), data->in_max[nr]);
263	mutex_unlock(&data->update_lock);
264	return count;
265}
266
267#define show_in_offset(offset)					\
268static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,		\
269		show_in, NULL, offset);				\
270static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,	\
271		show_in_min, set_in_min, offset);		\
272static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,	\
273		show_in_max, set_in_max, offset);
274
275show_in_offset(0);
276show_in_offset(1);
277show_in_offset(2);
278show_in_offset(3);
279show_in_offset(4);
 
 
280
281/* Temperature */
282static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 
283{
284	struct sis5595_data *data = sis5595_update_device(dev);
285	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
286}
287
288static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
 
289{
290	struct sis5595_data *data = sis5595_update_device(dev);
291	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
292}
293
294static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 
 
295{
296	struct sis5595_data *data = dev_get_drvdata(dev);
297	long val = simple_strtol(buf, NULL, 10);
 
 
 
 
 
298
299	mutex_lock(&data->update_lock);
300	data->temp_over = TEMP_TO_REG(val);
301	sis5595_write_value(data, SIS5595_REG_TEMP_OVER, data->temp_over);
302	mutex_unlock(&data->update_lock);
303	return count;
304}
305
306static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
 
307{
308	struct sis5595_data *data = sis5595_update_device(dev);
309	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
310}
311
312static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 
 
313{
314	struct sis5595_data *data = dev_get_drvdata(dev);
315	long val = simple_strtol(buf, NULL, 10);
 
 
 
 
 
316
317	mutex_lock(&data->update_lock);
318	data->temp_hyst = TEMP_TO_REG(val);
319	sis5595_write_value(data, SIS5595_REG_TEMP_HYST, data->temp_hyst);
320	mutex_unlock(&data->update_lock);
321	return count;
322}
323
324static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
325static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
326		show_temp_over, set_temp_over);
327static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
328		show_temp_hyst, set_temp_hyst);
329
330/* 2 Fans */
331static ssize_t show_fan(struct device *dev, struct device_attribute *da,
332			char *buf)
333{
334	struct sis5595_data *data = sis5595_update_device(dev);
335	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
336	int nr = attr->index;
337	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
338		DIV_FROM_REG(data->fan_div[nr])) );
339}
340
341static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
342			    char *buf)
343{
344	struct sis5595_data *data = sis5595_update_device(dev);
345	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
346	int nr = attr->index;
347	return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
348		DIV_FROM_REG(data->fan_div[nr])) );
349}
350
351static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
352			   const char *buf, size_t count)
353{
354	struct sis5595_data *data = dev_get_drvdata(dev);
355	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
356	int nr = attr->index;
357	unsigned long val = simple_strtoul(buf, NULL, 10);
 
 
 
 
 
358
359	mutex_lock(&data->update_lock);
360	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
361	sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
362	mutex_unlock(&data->update_lock);
363	return count;
364}
365
366static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
367			    char *buf)
368{
369	struct sis5595_data *data = sis5595_update_device(dev);
370	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
371	int nr = attr->index;
372	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]) );
373}
374
375/* Note: we save and restore the fan minimum here, because its value is
376   determined in part by the fan divisor.  This follows the principle of
377   least surprise; the user doesn't expect the fan minimum to change just
378   because the divisor changed. */
379static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
380			   const char *buf, size_t count)
 
 
381{
382	struct sis5595_data *data = dev_get_drvdata(dev);
383	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
384	int nr = attr->index;
385	unsigned long min;
386	unsigned long val = simple_strtoul(buf, NULL, 10);
387	int reg;
 
 
 
 
 
 
388
389	mutex_lock(&data->update_lock);
390	min = FAN_FROM_REG(data->fan_min[nr],
391			DIV_FROM_REG(data->fan_div[nr]));
392	reg = sis5595_read_value(data, SIS5595_REG_FANDIV);
393
394	switch (val) {
395	case 1: data->fan_div[nr] = 0; break;
396	case 2: data->fan_div[nr] = 1; break;
397	case 4: data->fan_div[nr] = 2; break;
398	case 8: data->fan_div[nr] = 3; break;
 
 
 
 
 
 
 
 
399	default:
400		dev_err(dev, "fan_div value %ld not "
401			"supported. Choose one of 1, 2, 4 or 8!\n", val);
 
402		mutex_unlock(&data->update_lock);
403		return -EINVAL;
404	}
405	
406	switch (nr) {
407	case 0:
408		reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
409		break;
410	case 1:
411		reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
412		break;
413	}
414	sis5595_write_value(data, SIS5595_REG_FANDIV, reg);
415	data->fan_min[nr] =
416		FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
417	sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
418	mutex_unlock(&data->update_lock);
419	return count;
420}
421
422#define show_fan_offset(offset)						\
423static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,			\
424		show_fan, NULL, offset - 1);				\
425static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,		\
426		show_fan_min, set_fan_min, offset - 1);			\
427static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR,		\
428		show_fan_div, set_fan_div, offset - 1);
429
430show_fan_offset(1);
431show_fan_offset(2);
432
433/* Alarms */
434static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 
435{
436	struct sis5595_data *data = sis5595_update_device(dev);
437	return sprintf(buf, "%d\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 sis5595_data *data = sis5595_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, 15);
453static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
454static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
455static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 15);
456
457static ssize_t show_name(struct device *dev, struct device_attribute *attr,
458			 char *buf)
459{
460	struct sis5595_data *data = dev_get_drvdata(dev);
461	return sprintf(buf, "%s\n", data->name);
462}
463static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
464
465static struct attribute *sis5595_attributes[] = {
466	&sensor_dev_attr_in0_input.dev_attr.attr,
467	&sensor_dev_attr_in0_min.dev_attr.attr,
468	&sensor_dev_attr_in0_max.dev_attr.attr,
469	&sensor_dev_attr_in0_alarm.dev_attr.attr,
470	&sensor_dev_attr_in1_input.dev_attr.attr,
471	&sensor_dev_attr_in1_min.dev_attr.attr,
472	&sensor_dev_attr_in1_max.dev_attr.attr,
473	&sensor_dev_attr_in1_alarm.dev_attr.attr,
474	&sensor_dev_attr_in2_input.dev_attr.attr,
475	&sensor_dev_attr_in2_min.dev_attr.attr,
476	&sensor_dev_attr_in2_max.dev_attr.attr,
477	&sensor_dev_attr_in2_alarm.dev_attr.attr,
478	&sensor_dev_attr_in3_input.dev_attr.attr,
479	&sensor_dev_attr_in3_min.dev_attr.attr,
480	&sensor_dev_attr_in3_max.dev_attr.attr,
481	&sensor_dev_attr_in3_alarm.dev_attr.attr,
482
483	&sensor_dev_attr_fan1_input.dev_attr.attr,
484	&sensor_dev_attr_fan1_min.dev_attr.attr,
485	&sensor_dev_attr_fan1_div.dev_attr.attr,
486	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
487	&sensor_dev_attr_fan2_input.dev_attr.attr,
488	&sensor_dev_attr_fan2_min.dev_attr.attr,
489	&sensor_dev_attr_fan2_div.dev_attr.attr,
490	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
491
492	&dev_attr_alarms.attr,
493	&dev_attr_name.attr,
494	NULL
495};
496
497static const struct attribute_group sis5595_group = {
498	.attrs = sis5595_attributes,
499};
500
501static struct attribute *sis5595_attributes_in4[] = {
502	&sensor_dev_attr_in4_input.dev_attr.attr,
503	&sensor_dev_attr_in4_min.dev_attr.attr,
504	&sensor_dev_attr_in4_max.dev_attr.attr,
505	&sensor_dev_attr_in4_alarm.dev_attr.attr,
506	NULL
507};
508
509static const struct attribute_group sis5595_group_in4 = {
510	.attrs = sis5595_attributes_in4,
511};
512
513static struct attribute *sis5595_attributes_temp1[] = {
514	&dev_attr_temp1_input.attr,
515	&dev_attr_temp1_max.attr,
516	&dev_attr_temp1_max_hyst.attr,
517	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
518	NULL
519};
520
521static const struct attribute_group sis5595_group_temp1 = {
522	.attrs = sis5595_attributes_temp1,
523};
524 
525/* This is called when the module is loaded */
526static int __devinit sis5595_probe(struct platform_device *pdev)
527{
528	int err = 0;
529	int i;
530	struct sis5595_data *data;
531	struct resource *res;
532	char val;
533
534	/* Reserve the ISA region */
535	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
536	if (!request_region(res->start, SIS5595_EXTENT,
537			    sis5595_driver.driver.name)) {
538		err = -EBUSY;
539		goto exit;
540	}
541
542	if (!(data = kzalloc(sizeof(struct sis5595_data), GFP_KERNEL))) {
543		err = -ENOMEM;
544		goto exit_release;
545	}
546
547	mutex_init(&data->lock);
548	mutex_init(&data->update_lock);
549	data->addr = res->start;
550	data->name = "sis5595";
551	platform_set_drvdata(pdev, data);
552
553	/* Check revision and pin registers to determine whether 4 or 5 voltages */
 
 
554	data->revision = s_bridge->revision;
555	/* 4 voltages, 1 temp */
556	data->maxins = 3;
557	if (data->revision >= REV2MIN) {
558		pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
559		if (!(val & 0x80))
560			/* 5 voltages, no temps */
561			data->maxins = 4;
562	}
563	
564	/* Initialize the SIS5595 chip */
565	sis5595_init_device(data);
566
567	/* A few vars need to be filled upon startup */
568	for (i = 0; i < 2; i++) {
569		data->fan_min[i] = sis5595_read_value(data,
570					SIS5595_REG_FAN_MIN(i));
571	}
572
573	/* Register sysfs hooks */
574	if ((err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group)))
575		goto exit_free;
 
576	if (data->maxins == 4) {
577		if ((err = sysfs_create_group(&pdev->dev.kobj,
578					      &sis5595_group_in4)))
579			goto exit_remove_files;
580	} else {
581		if ((err = sysfs_create_group(&pdev->dev.kobj,
582					      &sis5595_group_temp1)))
583			goto exit_remove_files;
584	}
585
586	data->hwmon_dev = hwmon_device_register(&pdev->dev);
587	if (IS_ERR(data->hwmon_dev)) {
588		err = PTR_ERR(data->hwmon_dev);
589		goto exit_remove_files;
590	}
591
592	return 0;
593
594exit_remove_files:
595	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
596	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
597	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
598exit_free:
599	kfree(data);
600exit_release:
601	release_region(res->start, SIS5595_EXTENT);
602exit:
603	return err;
604}
605
606static int __devexit sis5595_remove(struct platform_device *pdev)
607{
608	struct sis5595_data *data = platform_get_drvdata(pdev);
609
610	hwmon_device_unregister(data->hwmon_dev);
611	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
612	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
613	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
614
615	release_region(data->addr, SIS5595_EXTENT);
616	platform_set_drvdata(pdev, NULL);
617	kfree(data);
618
619	return 0;
620}
621
622
623/* ISA access must be locked explicitly. */
624static int sis5595_read_value(struct sis5595_data *data, u8 reg)
625{
626	int res;
627
628	mutex_lock(&data->lock);
629	outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
630	res = inb_p(data->addr + SIS5595_DATA_REG_OFFSET);
631	mutex_unlock(&data->lock);
632	return res;
633}
634
635static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value)
636{
637	mutex_lock(&data->lock);
638	outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
639	outb_p(value, data->addr + SIS5595_DATA_REG_OFFSET);
640	mutex_unlock(&data->lock);
641}
642
643/* Called when we have found a new SIS5595. */
644static void __devinit sis5595_init_device(struct sis5595_data *data)
645{
646	u8 config = sis5595_read_value(data, SIS5595_REG_CONFIG);
647	if (!(config & 0x01))
648		sis5595_write_value(data, SIS5595_REG_CONFIG,
649				(config & 0xf7) | 0x01);
650}
651
652static struct sis5595_data *sis5595_update_device(struct device *dev)
653{
654	struct sis5595_data *data = dev_get_drvdata(dev);
655	int i;
656
657	mutex_lock(&data->update_lock);
658
659	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
660	    || !data->valid) {
661
662		for (i = 0; i <= data->maxins; i++) {
663			data->in[i] =
664			    sis5595_read_value(data, SIS5595_REG_IN(i));
665			data->in_min[i] =
666			    sis5595_read_value(data,
667					       SIS5595_REG_IN_MIN(i));
668			data->in_max[i] =
669			    sis5595_read_value(data,
670					       SIS5595_REG_IN_MAX(i));
671		}
672		for (i = 0; i < 2; i++) {
673			data->fan[i] =
674			    sis5595_read_value(data, SIS5595_REG_FAN(i));
675			data->fan_min[i] =
676			    sis5595_read_value(data,
677					       SIS5595_REG_FAN_MIN(i));
678		}
679		if (data->maxins == 3) {
680			data->temp =
681			    sis5595_read_value(data, SIS5595_REG_TEMP);
682			data->temp_over =
683			    sis5595_read_value(data, SIS5595_REG_TEMP_OVER);
684			data->temp_hyst =
685			    sis5595_read_value(data, SIS5595_REG_TEMP_HYST);
686		}
687		i = sis5595_read_value(data, SIS5595_REG_FANDIV);
688		data->fan_div[0] = (i >> 4) & 0x03;
689		data->fan_div[1] = i >> 6;
690		data->alarms =
691		    sis5595_read_value(data, SIS5595_REG_ALARM1) |
692		    (sis5595_read_value(data, SIS5595_REG_ALARM2) << 8);
693		data->last_updated = jiffies;
694		data->valid = 1;
695	}
696
697	mutex_unlock(&data->update_lock);
698
699	return data;
700}
701
702static const struct pci_device_id sis5595_pci_ids[] = {
703	{ PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
704	{ 0, }
705};
706
707MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
708
709static int blacklist[] __devinitdata = {
710	PCI_DEVICE_ID_SI_540,
711	PCI_DEVICE_ID_SI_550,
712	PCI_DEVICE_ID_SI_630,
713	PCI_DEVICE_ID_SI_645,
714	PCI_DEVICE_ID_SI_730,
715	PCI_DEVICE_ID_SI_735,
716	PCI_DEVICE_ID_SI_5511, /* 5513 chip has the 0008 device but
717				  that ID shows up in other chips so we
718				  use the 5511 ID for recognition */
 
 
719	PCI_DEVICE_ID_SI_5597,
720	PCI_DEVICE_ID_SI_5598,
721	0 };
722
723static int __devinit sis5595_device_add(unsigned short address)
724{
725	struct resource res = {
726		.start	= address,
727		.end	= address + SIS5595_EXTENT - 1,
728		.name	= "sis5595",
729		.flags	= IORESOURCE_IO,
730	};
731	int err;
732
733	err = acpi_check_resource_conflict(&res);
734	if (err)
735		goto exit;
736
737	pdev = platform_device_alloc("sis5595", address);
738	if (!pdev) {
739		err = -ENOMEM;
740		pr_err("Device allocation failed\n");
741		goto exit;
742	}
743
744	err = platform_device_add_resources(pdev, &res, 1);
745	if (err) {
746		pr_err("Device resource addition failed (%d)\n", err);
747		goto exit_device_put;
748	}
749
750	err = platform_device_add(pdev);
751	if (err) {
752		pr_err("Device addition failed (%d)\n", err);
753		goto exit_device_put;
754	}
755
756	return 0;
757
758exit_device_put:
759	platform_device_put(pdev);
760exit:
761	return err;
762}
763
764static int __devinit sis5595_pci_probe(struct pci_dev *dev,
765				       const struct pci_device_id *id)
766{
767	u16 address;
768	u8 enable;
769	int *i;
770
771	for (i = blacklist; *i != 0; i++) {
772		struct pci_dev *d;
773		if ((d = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL))) {
774			dev_err(&d->dev, "Looked for SIS5595 but found unsupported device %.4x\n", *i);
 
 
 
775			pci_dev_put(d);
776			return -ENODEV;
777		}
778	}
779	
780	force_addr &= ~(SIS5595_EXTENT - 1);
781	if (force_addr) {
782		dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", force_addr);
783		pci_write_config_word(dev, SIS5595_BASE_REG, force_addr);
784	}
785
786	if (PCIBIOS_SUCCESSFUL !=
787	    pci_read_config_word(dev, SIS5595_BASE_REG, &address)) {
788		dev_err(&dev->dev, "Failed to read ISA address\n");
789		return -ENODEV;
790	}
791	
792	address &= ~(SIS5595_EXTENT - 1);
793	if (!address) {
794		dev_err(&dev->dev, "Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
 
795		return -ENODEV;
796	}
797	if (force_addr && address != force_addr) {
798		/* doesn't work for some chips? */
799		dev_err(&dev->dev, "Failed to force ISA address\n");
800		return -ENODEV;
801	}
802
803	if (PCIBIOS_SUCCESSFUL !=
804	    pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable)) {
805		dev_err(&dev->dev, "Failed to read enable register\n");
806		return -ENODEV;
807	}
808	if (!(enable & 0x80)) {
809		if ((PCIBIOS_SUCCESSFUL !=
810		     pci_write_config_byte(dev, SIS5595_ENABLE_REG,
811					   enable | 0x80))
812		 || (PCIBIOS_SUCCESSFUL !=
813		     pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable))
814		 || (!(enable & 0x80))) {
815			/* doesn't work for some chips! */
816			dev_err(&dev->dev, "Failed to enable HWM device\n");
817			return -ENODEV;
818		}
819	}
820
821	if (platform_driver_register(&sis5595_driver)) {
822		dev_dbg(&dev->dev, "Failed to register sis5595 driver\n");
823		goto exit;
824	}
825
826	s_bridge = pci_dev_get(dev);
827	/* Sets global pdev as a side effect */
828	if (sis5595_device_add(address))
829		goto exit_unregister;
830
831	/* Always return failure here.  This is to allow other drivers to bind
 
832	 * to this pci device.  We don't really want to have control over the
833	 * pci device, we only wanted to read as few register values from it.
834	 */
835	return -ENODEV;
836
837exit_unregister:
838	pci_dev_put(dev);
839	platform_driver_unregister(&sis5595_driver);
840exit:
841	return -ENODEV;
842}
843
844static struct pci_driver sis5595_pci_driver = {
845	.name            = "sis5595",
846	.id_table        = sis5595_pci_ids,
847	.probe           = sis5595_pci_probe,
848};
849
850static int __init sm_sis5595_init(void)
851{
852	return pci_register_driver(&sis5595_pci_driver);
853}
854
855static void __exit sm_sis5595_exit(void)
856{
857	pci_unregister_driver(&sis5595_pci_driver);
858	if (s_bridge != NULL) {
859		platform_device_unregister(pdev);
860		platform_driver_unregister(&sis5595_driver);
861		pci_dev_put(s_bridge);
862		s_bridge = NULL;
863	}
864}
865
866MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
867MODULE_DESCRIPTION("SiS 5595 Sensor device");
868MODULE_LICENSE("GPL");
869
870module_init(sm_sis5595_init);
871module_exit(sm_sis5595_exit);
v5.4
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * sis5595.c - Part of lm_sensors, Linux kernel modules
  4 *	       for hardware monitoring
  5 *
  6 * Copyright (C) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
  7 *			     Kyösti Mälkki <kmalkki@cc.hut.fi>, and
  8 *			     Mark D. Studebaker <mdsxyz123@yahoo.com>
  9 * Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with
 10 * the help of Jean Delvare <jdelvare@suse.de>
 11 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 12
 13/*
 14 * SiS southbridge has a LM78-like chip integrated on the same IC.
 15 * This driver is a customized copy of lm78.c
 16 *
 17 * Supports following revisions:
 18 *	Version		PCI ID		PCI Revision
 19 *	1		1039/0008	AF or less
 20 *	2		1039/0008	B0 or greater
 21 *
 22 *  Note: these chips contain a 0008 device which is incompatible with the
 23 *	 5595. We recognize these by the presence of the listed
 24 *	 "blacklist" PCI ID and refuse to load.
 25 *
 26 * NOT SUPPORTED	PCI ID		BLACKLIST PCI ID
 27 *	 540		0008		0540
 28 *	 550		0008		0550
 29 *	5513		0008		5511
 30 *	5581		0008		5597
 31 *	5582		0008		5597
 32 *	5597		0008		5597
 33 *	5598		0008		5597/5598
 34 *	 630		0008		0630
 35 *	 645		0008		0645
 36 *	 730		0008		0730
 37 *	 735		0008		0735
 38 */
 39
 40#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 41
 42#include <linux/module.h>
 43#include <linux/slab.h>
 44#include <linux/ioport.h>
 45#include <linux/pci.h>
 46#include <linux/platform_device.h>
 47#include <linux/hwmon.h>
 48#include <linux/hwmon-sysfs.h>
 49#include <linux/err.h>
 50#include <linux/init.h>
 51#include <linux/jiffies.h>
 52#include <linux/mutex.h>
 53#include <linux/sysfs.h>
 54#include <linux/acpi.h>
 55#include <linux/io.h>
 56
 57/*
 58 * If force_addr is set to anything different from 0, we forcibly enable
 59 * the device at the given address.
 60 */
 61static u16 force_addr;
 62module_param(force_addr, ushort, 0);
 63MODULE_PARM_DESC(force_addr,
 64		 "Initialize the base address of the sensors");
 65
 66static struct platform_device *pdev;
 67
 68/* Many SIS5595 constants specified below */
 69
 70/* Length of ISA address segment */
 71#define SIS5595_EXTENT 8
 72/* PCI Config Registers */
 73#define SIS5595_BASE_REG 0x68
 74#define SIS5595_PIN_REG 0x7A
 75#define SIS5595_ENABLE_REG 0x7B
 76
 77/* Where are the ISA address/data registers relative to the base address */
 78#define SIS5595_ADDR_REG_OFFSET 5
 79#define SIS5595_DATA_REG_OFFSET 6
 80
 81/* The SIS5595 registers */
 82#define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
 83#define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
 84#define SIS5595_REG_IN(nr) (0x20 + (nr))
 85
 86#define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
 87#define SIS5595_REG_FAN(nr) (0x28 + (nr))
 88
 89/*
 90 * On the first version of the chip, the temp registers are separate.
 91 * On the second version,
 92 * TEMP pin is shared with IN4, configured in PCI register 0x7A.
 93 * The registers are the same as well.
 94 * OVER and HYST are really MAX and MIN.
 95 */
 96
 97#define REV2MIN	0xb0
 98#define SIS5595_REG_TEMP	(((data->revision) >= REV2MIN) ? \
 99					SIS5595_REG_IN(4) : 0x27)
100#define SIS5595_REG_TEMP_OVER	(((data->revision) >= REV2MIN) ? \
101					SIS5595_REG_IN_MAX(4) : 0x39)
102#define SIS5595_REG_TEMP_HYST	(((data->revision) >= REV2MIN) ? \
103					SIS5595_REG_IN_MIN(4) : 0x3a)
104
105#define SIS5595_REG_CONFIG 0x40
106#define SIS5595_REG_ALARM1 0x41
107#define SIS5595_REG_ALARM2 0x42
108#define SIS5595_REG_FANDIV 0x47
109
110/*
111 * Conversions. Limit checking is only done on the TO_REG
112 * variants.
113 */
114
115/*
116 * IN: mV, (0V to 4.08V)
117 * REG: 16mV/bit
118 */
119static inline u8 IN_TO_REG(unsigned long val)
120{
121	unsigned long nval = clamp_val(val, 0, 4080);
122	return (nval + 8) / 16;
123}
124#define IN_FROM_REG(val) ((val) *  16)
125
126static inline u8 FAN_TO_REG(long rpm, int div)
127{
128	if (rpm <= 0)
129		return 255;
130	if (rpm > 1350000)
131		return 1;
132	return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
133}
134
135static inline int FAN_FROM_REG(u8 val, int div)
136{
137	return val == 0 ? -1 : val == 255 ? 0 : 1350000 / (val * div);
138}
139
140/*
141 * TEMP: mC (-54.12C to +157.53C)
142 * REG: 0.83C/bit + 52.12, two's complement
143 */
144static inline int TEMP_FROM_REG(s8 val)
145{
146	return val * 830 + 52120;
147}
148static inline s8 TEMP_TO_REG(long val)
149{
150	int nval = clamp_val(val, -54120, 157530) ;
151	return nval < 0 ? (nval - 5212 - 415) / 830 : (nval - 5212 + 415) / 830;
152}
153
154/*
155 * FAN DIV: 1, 2, 4, or 8 (defaults to 2)
156 * REG: 0, 1, 2, or 3 (respectively) (defaults to 1)
157 */
158static inline u8 DIV_TO_REG(int val)
159{
160	return val == 8 ? 3 : val == 4 ? 2 : val == 1 ? 0 : 1;
161}
162#define DIV_FROM_REG(val) (1 << (val))
163
164/*
165 * For each registered chip, we need to keep some data in memory.
166 * The structure is dynamically allocated.
167 */
168struct sis5595_data {
169	unsigned short addr;
170	const char *name;
171	struct device *hwmon_dev;
172	struct mutex lock;
173
174	struct mutex update_lock;
175	char valid;		/* !=0 if following fields are valid */
176	unsigned long last_updated;	/* In jiffies */
177	char maxins;		/* == 3 if temp enabled, otherwise == 4 */
178	u8 revision;		/* Reg. value */
179
180	u8 in[5];		/* Register value */
181	u8 in_max[5];		/* Register value */
182	u8 in_min[5];		/* Register value */
183	u8 fan[2];		/* Register value */
184	u8 fan_min[2];		/* Register value */
185	s8 temp;		/* Register value */
186	s8 temp_over;		/* Register value */
187	s8 temp_hyst;		/* Register value */
188	u8 fan_div[2];		/* Register encoding, shifted right */
189	u16 alarms;		/* Register encoding, combined */
190};
191
192static struct pci_dev *s_bridge;	/* pointer to the (only) sis5595 */
193
194static int sis5595_probe(struct platform_device *pdev);
195static int sis5595_remove(struct platform_device *pdev);
196
197static int sis5595_read_value(struct sis5595_data *data, u8 reg);
198static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value);
199static struct sis5595_data *sis5595_update_device(struct device *dev);
200static void sis5595_init_device(struct sis5595_data *data);
201
202static struct platform_driver sis5595_driver = {
203	.driver = {
 
204		.name	= "sis5595",
205	},
206	.probe		= sis5595_probe,
207	.remove		= sis5595_remove,
208};
209
210/* 4 Voltages */
211static ssize_t in_show(struct device *dev, struct device_attribute *da,
212		       char *buf)
213{
214	struct sis5595_data *data = sis5595_update_device(dev);
215	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
216	int nr = attr->index;
217	return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
218}
219
220static ssize_t in_min_show(struct device *dev, struct device_attribute *da,
221			   char *buf)
222{
223	struct sis5595_data *data = sis5595_update_device(dev);
224	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
225	int nr = attr->index;
226	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
227}
228
229static ssize_t in_max_show(struct device *dev, struct device_attribute *da,
230			   char *buf)
231{
232	struct sis5595_data *data = sis5595_update_device(dev);
233	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
234	int nr = attr->index;
235	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
236}
237
238static ssize_t in_min_store(struct device *dev, struct device_attribute *da,
239			    const char *buf, size_t count)
240{
241	struct sis5595_data *data = dev_get_drvdata(dev);
242	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
243	int nr = attr->index;
244	unsigned long val;
245	int err;
246
247	err = kstrtoul(buf, 10, &val);
248	if (err)
249		return err;
250
251	mutex_lock(&data->update_lock);
252	data->in_min[nr] = IN_TO_REG(val);
253	sis5595_write_value(data, SIS5595_REG_IN_MIN(nr), data->in_min[nr]);
254	mutex_unlock(&data->update_lock);
255	return count;
256}
257
258static ssize_t in_max_store(struct device *dev, struct device_attribute *da,
259			    const char *buf, size_t count)
260{
261	struct sis5595_data *data = dev_get_drvdata(dev);
262	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
263	int nr = attr->index;
264	unsigned long val;
265	int err;
266
267	err = kstrtoul(buf, 10, &val);
268	if (err)
269		return err;
270
271	mutex_lock(&data->update_lock);
272	data->in_max[nr] = IN_TO_REG(val);
273	sis5595_write_value(data, SIS5595_REG_IN_MAX(nr), data->in_max[nr]);
274	mutex_unlock(&data->update_lock);
275	return count;
276}
277
278static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
279static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
280static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
281static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
282static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
283static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
284static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
285static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
286static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
287static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
288static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
289static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
290static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
291static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
292static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
293
294/* Temperature */
295static ssize_t temp1_input_show(struct device *dev,
296				struct device_attribute *attr, char *buf)
297{
298	struct sis5595_data *data = sis5595_update_device(dev);
299	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
300}
301
302static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
303			      char *buf)
304{
305	struct sis5595_data *data = sis5595_update_device(dev);
306	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
307}
308
309static ssize_t temp1_max_store(struct device *dev,
310			       struct device_attribute *attr, const char *buf,
311			       size_t count)
312{
313	struct sis5595_data *data = dev_get_drvdata(dev);
314	long val;
315	int err;
316
317	err = kstrtol(buf, 10, &val);
318	if (err)
319		return err;
320
321	mutex_lock(&data->update_lock);
322	data->temp_over = TEMP_TO_REG(val);
323	sis5595_write_value(data, SIS5595_REG_TEMP_OVER, data->temp_over);
324	mutex_unlock(&data->update_lock);
325	return count;
326}
327
328static ssize_t temp1_max_hyst_show(struct device *dev,
329				   struct device_attribute *attr, char *buf)
330{
331	struct sis5595_data *data = sis5595_update_device(dev);
332	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
333}
334
335static ssize_t temp1_max_hyst_store(struct device *dev,
336				    struct device_attribute *attr,
337				    const char *buf, size_t count)
338{
339	struct sis5595_data *data = dev_get_drvdata(dev);
340	long val;
341	int err;
342
343	err = kstrtol(buf, 10, &val);
344	if (err)
345		return err;
346
347	mutex_lock(&data->update_lock);
348	data->temp_hyst = TEMP_TO_REG(val);
349	sis5595_write_value(data, SIS5595_REG_TEMP_HYST, data->temp_hyst);
350	mutex_unlock(&data->update_lock);
351	return count;
352}
353
354static DEVICE_ATTR_RO(temp1_input);
355static DEVICE_ATTR_RW(temp1_max);
356static DEVICE_ATTR_RW(temp1_max_hyst);
 
 
357
358/* 2 Fans */
359static ssize_t fan_show(struct device *dev, struct device_attribute *da,
360			char *buf)
361{
362	struct sis5595_data *data = sis5595_update_device(dev);
363	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
364	int nr = attr->index;
365	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
366		DIV_FROM_REG(data->fan_div[nr])));
367}
368
369static ssize_t fan_min_show(struct device *dev, struct device_attribute *da,
370			    char *buf)
371{
372	struct sis5595_data *data = sis5595_update_device(dev);
373	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
374	int nr = attr->index;
375	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
376		DIV_FROM_REG(data->fan_div[nr])));
377}
378
379static ssize_t fan_min_store(struct device *dev, struct device_attribute *da,
380			     const char *buf, size_t count)
381{
382	struct sis5595_data *data = dev_get_drvdata(dev);
383	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
384	int nr = attr->index;
385	unsigned long val;
386	int err;
387
388	err = kstrtoul(buf, 10, &val);
389	if (err)
390		return err;
391
392	mutex_lock(&data->update_lock);
393	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
394	sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
395	mutex_unlock(&data->update_lock);
396	return count;
397}
398
399static ssize_t fan_div_show(struct device *dev, struct device_attribute *da,
400			    char *buf)
401{
402	struct sis5595_data *data = sis5595_update_device(dev);
403	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
404	int nr = attr->index;
405	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
406}
407
408/*
409 * Note: we save and restore the fan minimum here, because its value is
410 * determined in part by the fan divisor.  This follows the principle of
411 * least surprise; the user doesn't expect the fan minimum to change just
412 * because the divisor changed.
413 */
414static ssize_t fan_div_store(struct device *dev, struct device_attribute *da,
415			     const char *buf, size_t count)
416{
417	struct sis5595_data *data = dev_get_drvdata(dev);
418	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
419	int nr = attr->index;
420	unsigned long min;
 
421	int reg;
422	unsigned long val;
423	int err;
424
425	err = kstrtoul(buf, 10, &val);
426	if (err)
427		return err;
428
429	mutex_lock(&data->update_lock);
430	min = FAN_FROM_REG(data->fan_min[nr],
431			DIV_FROM_REG(data->fan_div[nr]));
432	reg = sis5595_read_value(data, SIS5595_REG_FANDIV);
433
434	switch (val) {
435	case 1:
436		data->fan_div[nr] = 0;
437		break;
438	case 2:
439		data->fan_div[nr] = 1;
440		break;
441	case 4:
442		data->fan_div[nr] = 2;
443		break;
444	case 8:
445		data->fan_div[nr] = 3;
446		break;
447	default:
448		dev_err(dev,
449			"fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n",
450			val);
451		mutex_unlock(&data->update_lock);
452		return -EINVAL;
453	}
454
455	switch (nr) {
456	case 0:
457		reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
458		break;
459	case 1:
460		reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
461		break;
462	}
463	sis5595_write_value(data, SIS5595_REG_FANDIV, reg);
464	data->fan_min[nr] =
465		FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
466	sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
467	mutex_unlock(&data->update_lock);
468	return count;
469}
470
471static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
472static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
473static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
474static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
475static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
476static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
 
 
 
 
477
478/* Alarms */
479static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
480			   char *buf)
481{
482	struct sis5595_data *data = sis5595_update_device(dev);
483	return sprintf(buf, "%d\n", data->alarms);
484}
485static DEVICE_ATTR_RO(alarms);
486
487static ssize_t alarm_show(struct device *dev, struct device_attribute *da,
488			  char *buf)
489{
490	struct sis5595_data *data = sis5595_update_device(dev);
491	int nr = to_sensor_dev_attr(da)->index;
492	return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
493}
494static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
495static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
496static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
497static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
498static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 15);
499static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
500static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
501static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 15);
502
503static ssize_t name_show(struct device *dev, struct device_attribute *attr,
504			 char *buf)
505{
506	struct sis5595_data *data = dev_get_drvdata(dev);
507	return sprintf(buf, "%s\n", data->name);
508}
509static DEVICE_ATTR_RO(name);
510
511static struct attribute *sis5595_attributes[] = {
512	&sensor_dev_attr_in0_input.dev_attr.attr,
513	&sensor_dev_attr_in0_min.dev_attr.attr,
514	&sensor_dev_attr_in0_max.dev_attr.attr,
515	&sensor_dev_attr_in0_alarm.dev_attr.attr,
516	&sensor_dev_attr_in1_input.dev_attr.attr,
517	&sensor_dev_attr_in1_min.dev_attr.attr,
518	&sensor_dev_attr_in1_max.dev_attr.attr,
519	&sensor_dev_attr_in1_alarm.dev_attr.attr,
520	&sensor_dev_attr_in2_input.dev_attr.attr,
521	&sensor_dev_attr_in2_min.dev_attr.attr,
522	&sensor_dev_attr_in2_max.dev_attr.attr,
523	&sensor_dev_attr_in2_alarm.dev_attr.attr,
524	&sensor_dev_attr_in3_input.dev_attr.attr,
525	&sensor_dev_attr_in3_min.dev_attr.attr,
526	&sensor_dev_attr_in3_max.dev_attr.attr,
527	&sensor_dev_attr_in3_alarm.dev_attr.attr,
528
529	&sensor_dev_attr_fan1_input.dev_attr.attr,
530	&sensor_dev_attr_fan1_min.dev_attr.attr,
531	&sensor_dev_attr_fan1_div.dev_attr.attr,
532	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
533	&sensor_dev_attr_fan2_input.dev_attr.attr,
534	&sensor_dev_attr_fan2_min.dev_attr.attr,
535	&sensor_dev_attr_fan2_div.dev_attr.attr,
536	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
537
538	&dev_attr_alarms.attr,
539	&dev_attr_name.attr,
540	NULL
541};
542
543static const struct attribute_group sis5595_group = {
544	.attrs = sis5595_attributes,
545};
546
547static struct attribute *sis5595_attributes_in4[] = {
548	&sensor_dev_attr_in4_input.dev_attr.attr,
549	&sensor_dev_attr_in4_min.dev_attr.attr,
550	&sensor_dev_attr_in4_max.dev_attr.attr,
551	&sensor_dev_attr_in4_alarm.dev_attr.attr,
552	NULL
553};
554
555static const struct attribute_group sis5595_group_in4 = {
556	.attrs = sis5595_attributes_in4,
557};
558
559static struct attribute *sis5595_attributes_temp1[] = {
560	&dev_attr_temp1_input.attr,
561	&dev_attr_temp1_max.attr,
562	&dev_attr_temp1_max_hyst.attr,
563	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
564	NULL
565};
566
567static const struct attribute_group sis5595_group_temp1 = {
568	.attrs = sis5595_attributes_temp1,
569};
570
571/* This is called when the module is loaded */
572static int sis5595_probe(struct platform_device *pdev)
573{
574	int err = 0;
575	int i;
576	struct sis5595_data *data;
577	struct resource *res;
578	char val;
579
580	/* Reserve the ISA region */
581	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
582	if (!devm_request_region(&pdev->dev, res->start, SIS5595_EXTENT,
583				 sis5595_driver.driver.name))
584		return -EBUSY;
585
586	data = devm_kzalloc(&pdev->dev, sizeof(struct sis5595_data),
587			    GFP_KERNEL);
588	if (!data)
589		return -ENOMEM;
 
 
590
591	mutex_init(&data->lock);
592	mutex_init(&data->update_lock);
593	data->addr = res->start;
594	data->name = "sis5595";
595	platform_set_drvdata(pdev, data);
596
597	/*
598	 * Check revision and pin registers to determine whether 4 or 5 voltages
599	 */
600	data->revision = s_bridge->revision;
601	/* 4 voltages, 1 temp */
602	data->maxins = 3;
603	if (data->revision >= REV2MIN) {
604		pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
605		if (!(val & 0x80))
606			/* 5 voltages, no temps */
607			data->maxins = 4;
608	}
609
610	/* Initialize the SIS5595 chip */
611	sis5595_init_device(data);
612
613	/* A few vars need to be filled upon startup */
614	for (i = 0; i < 2; i++) {
615		data->fan_min[i] = sis5595_read_value(data,
616					SIS5595_REG_FAN_MIN(i));
617	}
618
619	/* Register sysfs hooks */
620	err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group);
621	if (err)
622		return err;
623	if (data->maxins == 4) {
624		err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_in4);
625		if (err)
626			goto exit_remove_files;
627	} else {
628		err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_temp1);
629		if (err)
630			goto exit_remove_files;
631	}
632
633	data->hwmon_dev = hwmon_device_register(&pdev->dev);
634	if (IS_ERR(data->hwmon_dev)) {
635		err = PTR_ERR(data->hwmon_dev);
636		goto exit_remove_files;
637	}
638
639	return 0;
640
641exit_remove_files:
642	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
643	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
644	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
 
 
 
 
 
645	return err;
646}
647
648static int sis5595_remove(struct platform_device *pdev)
649{
650	struct sis5595_data *data = platform_get_drvdata(pdev);
651
652	hwmon_device_unregister(data->hwmon_dev);
653	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
654	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
655	sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
656
 
 
 
 
657	return 0;
658}
659
 
660/* ISA access must be locked explicitly. */
661static int sis5595_read_value(struct sis5595_data *data, u8 reg)
662{
663	int res;
664
665	mutex_lock(&data->lock);
666	outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
667	res = inb_p(data->addr + SIS5595_DATA_REG_OFFSET);
668	mutex_unlock(&data->lock);
669	return res;
670}
671
672static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value)
673{
674	mutex_lock(&data->lock);
675	outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
676	outb_p(value, data->addr + SIS5595_DATA_REG_OFFSET);
677	mutex_unlock(&data->lock);
678}
679
680/* Called when we have found a new SIS5595. */
681static void sis5595_init_device(struct sis5595_data *data)
682{
683	u8 config = sis5595_read_value(data, SIS5595_REG_CONFIG);
684	if (!(config & 0x01))
685		sis5595_write_value(data, SIS5595_REG_CONFIG,
686				(config & 0xf7) | 0x01);
687}
688
689static struct sis5595_data *sis5595_update_device(struct device *dev)
690{
691	struct sis5595_data *data = dev_get_drvdata(dev);
692	int i;
693
694	mutex_lock(&data->update_lock);
695
696	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
697	    || !data->valid) {
698
699		for (i = 0; i <= data->maxins; i++) {
700			data->in[i] =
701			    sis5595_read_value(data, SIS5595_REG_IN(i));
702			data->in_min[i] =
703			    sis5595_read_value(data,
704					       SIS5595_REG_IN_MIN(i));
705			data->in_max[i] =
706			    sis5595_read_value(data,
707					       SIS5595_REG_IN_MAX(i));
708		}
709		for (i = 0; i < 2; i++) {
710			data->fan[i] =
711			    sis5595_read_value(data, SIS5595_REG_FAN(i));
712			data->fan_min[i] =
713			    sis5595_read_value(data,
714					       SIS5595_REG_FAN_MIN(i));
715		}
716		if (data->maxins == 3) {
717			data->temp =
718			    sis5595_read_value(data, SIS5595_REG_TEMP);
719			data->temp_over =
720			    sis5595_read_value(data, SIS5595_REG_TEMP_OVER);
721			data->temp_hyst =
722			    sis5595_read_value(data, SIS5595_REG_TEMP_HYST);
723		}
724		i = sis5595_read_value(data, SIS5595_REG_FANDIV);
725		data->fan_div[0] = (i >> 4) & 0x03;
726		data->fan_div[1] = i >> 6;
727		data->alarms =
728		    sis5595_read_value(data, SIS5595_REG_ALARM1) |
729		    (sis5595_read_value(data, SIS5595_REG_ALARM2) << 8);
730		data->last_updated = jiffies;
731		data->valid = 1;
732	}
733
734	mutex_unlock(&data->update_lock);
735
736	return data;
737}
738
739static const struct pci_device_id sis5595_pci_ids[] = {
740	{ PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
741	{ 0, }
742};
743
744MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
745
746static int blacklist[] = {
747	PCI_DEVICE_ID_SI_540,
748	PCI_DEVICE_ID_SI_550,
749	PCI_DEVICE_ID_SI_630,
750	PCI_DEVICE_ID_SI_645,
751	PCI_DEVICE_ID_SI_730,
752	PCI_DEVICE_ID_SI_735,
753	PCI_DEVICE_ID_SI_5511, /*
754				* 5513 chip has the 0008 device but
755				* that ID shows up in other chips so we
756				* use the 5511 ID for recognition
757				*/
758	PCI_DEVICE_ID_SI_5597,
759	PCI_DEVICE_ID_SI_5598,
760	0 };
761
762static int sis5595_device_add(unsigned short address)
763{
764	struct resource res = {
765		.start	= address,
766		.end	= address + SIS5595_EXTENT - 1,
767		.name	= "sis5595",
768		.flags	= IORESOURCE_IO,
769	};
770	int err;
771
772	err = acpi_check_resource_conflict(&res);
773	if (err)
774		goto exit;
775
776	pdev = platform_device_alloc("sis5595", address);
777	if (!pdev) {
778		err = -ENOMEM;
779		pr_err("Device allocation failed\n");
780		goto exit;
781	}
782
783	err = platform_device_add_resources(pdev, &res, 1);
784	if (err) {
785		pr_err("Device resource addition failed (%d)\n", err);
786		goto exit_device_put;
787	}
788
789	err = platform_device_add(pdev);
790	if (err) {
791		pr_err("Device addition failed (%d)\n", err);
792		goto exit_device_put;
793	}
794
795	return 0;
796
797exit_device_put:
798	platform_device_put(pdev);
799exit:
800	return err;
801}
802
803static int sis5595_pci_probe(struct pci_dev *dev,
804				       const struct pci_device_id *id)
805{
806	u16 address;
807	u8 enable;
808	int *i;
809
810	for (i = blacklist; *i != 0; i++) {
811		struct pci_dev *d;
812		d = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL);
813		if (d) {
814			dev_err(&d->dev,
815				"Looked for SIS5595 but found unsupported device %.4x\n",
816				*i);
817			pci_dev_put(d);
818			return -ENODEV;
819		}
820	}
821
822	force_addr &= ~(SIS5595_EXTENT - 1);
823	if (force_addr) {
824		dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", force_addr);
825		pci_write_config_word(dev, SIS5595_BASE_REG, force_addr);
826	}
827
828	if (PCIBIOS_SUCCESSFUL !=
829	    pci_read_config_word(dev, SIS5595_BASE_REG, &address)) {
830		dev_err(&dev->dev, "Failed to read ISA address\n");
831		return -ENODEV;
832	}
833
834	address &= ~(SIS5595_EXTENT - 1);
835	if (!address) {
836		dev_err(&dev->dev,
837			"Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
838		return -ENODEV;
839	}
840	if (force_addr && address != force_addr) {
841		/* doesn't work for some chips? */
842		dev_err(&dev->dev, "Failed to force ISA address\n");
843		return -ENODEV;
844	}
845
846	if (PCIBIOS_SUCCESSFUL !=
847	    pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable)) {
848		dev_err(&dev->dev, "Failed to read enable register\n");
849		return -ENODEV;
850	}
851	if (!(enable & 0x80)) {
852		if ((PCIBIOS_SUCCESSFUL !=
853		     pci_write_config_byte(dev, SIS5595_ENABLE_REG,
854					   enable | 0x80))
855		 || (PCIBIOS_SUCCESSFUL !=
856		     pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable))
857		 || (!(enable & 0x80))) {
858			/* doesn't work for some chips! */
859			dev_err(&dev->dev, "Failed to enable HWM device\n");
860			return -ENODEV;
861		}
862	}
863
864	if (platform_driver_register(&sis5595_driver)) {
865		dev_dbg(&dev->dev, "Failed to register sis5595 driver\n");
866		goto exit;
867	}
868
869	s_bridge = pci_dev_get(dev);
870	/* Sets global pdev as a side effect */
871	if (sis5595_device_add(address))
872		goto exit_unregister;
873
874	/*
875	 * Always return failure here.  This is to allow other drivers to bind
876	 * to this pci device.  We don't really want to have control over the
877	 * pci device, we only wanted to read as few register values from it.
878	 */
879	return -ENODEV;
880
881exit_unregister:
882	pci_dev_put(dev);
883	platform_driver_unregister(&sis5595_driver);
884exit:
885	return -ENODEV;
886}
887
888static struct pci_driver sis5595_pci_driver = {
889	.name            = "sis5595",
890	.id_table        = sis5595_pci_ids,
891	.probe           = sis5595_pci_probe,
892};
893
894static int __init sm_sis5595_init(void)
895{
896	return pci_register_driver(&sis5595_pci_driver);
897}
898
899static void __exit sm_sis5595_exit(void)
900{
901	pci_unregister_driver(&sis5595_pci_driver);
902	if (s_bridge != NULL) {
903		platform_device_unregister(pdev);
904		platform_driver_unregister(&sis5595_driver);
905		pci_dev_put(s_bridge);
906		s_bridge = NULL;
907	}
908}
909
910MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
911MODULE_DESCRIPTION("SiS 5595 Sensor device");
912MODULE_LICENSE("GPL");
913
914module_init(sm_sis5595_init);
915module_exit(sm_sis5595_exit);