cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sis5595.c (25193B)


      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	bool valid;		/* true 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 = true;
    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);