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