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

pc87360.c (52425B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  pc87360.c - Part of lm_sensors, Linux kernel modules
      4 *              for hardware monitoring
      5 *  Copyright (C) 2004, 2007 Jean Delvare <jdelvare@suse.de>
      6 *
      7 *  Copied from smsc47m1.c:
      8 *  Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
      9 *
     10 *  Supports the following chips:
     11 *
     12 *  Chip        #vin    #fan    #pwm    #temp   devid
     13 *  PC87360     -       2       2       -       0xE1
     14 *  PC87363     -       2       2       -       0xE8
     15 *  PC87364     -       3       3       -       0xE4
     16 *  PC87365     11      3       3       2       0xE5
     17 *  PC87366     11      3       3       3-4     0xE9
     18 *
     19 *  This driver assumes that no more than one chip is present, and one of
     20 *  the standard Super-I/O addresses is used (0x2E/0x2F or 0x4E/0x4F).
     21 */
     22
     23#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     24
     25#include <linux/module.h>
     26#include <linux/init.h>
     27#include <linux/slab.h>
     28#include <linux/jiffies.h>
     29#include <linux/platform_device.h>
     30#include <linux/hwmon.h>
     31#include <linux/hwmon-sysfs.h>
     32#include <linux/hwmon-vid.h>
     33#include <linux/err.h>
     34#include <linux/mutex.h>
     35#include <linux/acpi.h>
     36#include <linux/io.h>
     37
     38static u8 devid;
     39static struct platform_device *pdev;
     40static unsigned short extra_isa[3];
     41static u8 confreg[4];
     42
     43static int init = 1;
     44module_param(init, int, 0);
     45MODULE_PARM_DESC(init,
     46"Chip initialization level:\n"
     47" 0: None\n"
     48"*1: Forcibly enable internal voltage and temperature channels, except in9\n"
     49" 2: Forcibly enable all voltage and temperature channels, except in9\n"
     50" 3: Forcibly enable all voltage and temperature channels, including in9");
     51
     52static unsigned short force_id;
     53module_param(force_id, ushort, 0);
     54MODULE_PARM_DESC(force_id, "Override the detected device ID");
     55
     56/*
     57 * Super-I/O registers and operations
     58 */
     59
     60#define DEV	0x07	/* Register: Logical device select */
     61#define DEVID	0x20	/* Register: Device ID */
     62#define ACT	0x30	/* Register: Device activation */
     63#define BASE	0x60	/* Register: Base address */
     64
     65#define FSCM	0x09	/* Logical device: fans */
     66#define VLM	0x0d	/* Logical device: voltages */
     67#define TMS	0x0e	/* Logical device: temperatures */
     68#define LDNI_MAX 3
     69static const u8 logdev[LDNI_MAX] = { FSCM, VLM, TMS };
     70
     71#define LD_FAN		0
     72#define LD_IN		1
     73#define LD_TEMP		2
     74
     75static inline void superio_outb(int sioaddr, int reg, int val)
     76{
     77	outb(reg, sioaddr);
     78	outb(val, sioaddr + 1);
     79}
     80
     81static inline int superio_inb(int sioaddr, int reg)
     82{
     83	outb(reg, sioaddr);
     84	return inb(sioaddr + 1);
     85}
     86
     87static inline void superio_exit(int sioaddr)
     88{
     89	outb(0x02, sioaddr);
     90	outb(0x02, sioaddr + 1);
     91}
     92
     93/*
     94 * Logical devices
     95 */
     96
     97#define PC87360_EXTENT		0x10
     98#define PC87365_REG_BANK	0x09
     99#define NO_BANK			0xff
    100
    101/*
    102 * Fan registers and conversions
    103 */
    104
    105/* nr has to be 0 or 1 (PC87360/87363) or 2 (PC87364/87365/87366) */
    106#define PC87360_REG_PRESCALE(nr)	(0x00 + 2 * (nr))
    107#define PC87360_REG_PWM(nr)		(0x01 + 2 * (nr))
    108#define PC87360_REG_FAN_MIN(nr)		(0x06 + 3 * (nr))
    109#define PC87360_REG_FAN(nr)		(0x07 + 3 * (nr))
    110#define PC87360_REG_FAN_STATUS(nr)	(0x08 + 3 * (nr))
    111
    112#define FAN_FROM_REG(val, div)		((val) == 0 ? 0 : \
    113					 480000 / ((val) * (div)))
    114#define FAN_TO_REG(val, div)		((val) <= 100 ? 0 : \
    115					 480000 / ((val) * (div)))
    116#define FAN_DIV_FROM_REG(val)		(1 << (((val) >> 5) & 0x03))
    117#define FAN_STATUS_FROM_REG(val)	((val) & 0x07)
    118
    119#define FAN_CONFIG_MONITOR(val, nr)	(((val) >> (2 + (nr) * 3)) & 1)
    120#define FAN_CONFIG_CONTROL(val, nr)	(((val) >> (3 + (nr) * 3)) & 1)
    121#define FAN_CONFIG_INVERT(val, nr)	(((val) >> (4 + (nr) * 3)) & 1)
    122
    123#define PWM_FROM_REG(val, inv)		((inv) ? 255 - (val) : (val))
    124static inline u8 PWM_TO_REG(int val, int inv)
    125{
    126	if (inv)
    127		val = 255 - val;
    128	if (val < 0)
    129		return 0;
    130	if (val > 255)
    131		return 255;
    132	return val;
    133}
    134
    135/*
    136 * Voltage registers and conversions
    137 */
    138
    139#define PC87365_REG_IN_CONVRATE		0x07
    140#define PC87365_REG_IN_CONFIG		0x08
    141#define PC87365_REG_IN			0x0B
    142#define PC87365_REG_IN_MIN		0x0D
    143#define PC87365_REG_IN_MAX		0x0C
    144#define PC87365_REG_IN_STATUS		0x0A
    145#define PC87365_REG_IN_ALARMS1		0x00
    146#define PC87365_REG_IN_ALARMS2		0x01
    147#define PC87365_REG_VID			0x06
    148
    149#define IN_FROM_REG(val, ref)		(((val) * (ref) + 128) / 256)
    150#define IN_TO_REG(val, ref)		((val) < 0 ? 0 : \
    151					 (val) * 256 >= (ref) * 255 ? 255 : \
    152					 ((val) * 256 + (ref) / 2) / (ref))
    153
    154/*
    155 * Temperature registers and conversions
    156 */
    157
    158#define PC87365_REG_TEMP_CONFIG		0x08
    159#define PC87365_REG_TEMP		0x0B
    160#define PC87365_REG_TEMP_MIN		0x0D
    161#define PC87365_REG_TEMP_MAX		0x0C
    162#define PC87365_REG_TEMP_CRIT		0x0E
    163#define PC87365_REG_TEMP_STATUS		0x0A
    164#define PC87365_REG_TEMP_ALARMS		0x00
    165
    166#define TEMP_FROM_REG(val)		((val) * 1000)
    167#define TEMP_TO_REG(val)		((val) < -55000 ? -55 : \
    168					 (val) > 127000 ? 127 : \
    169					 (val) < 0 ? ((val) - 500) / 1000 : \
    170					 ((val) + 500) / 1000)
    171
    172/*
    173 * Device data
    174 */
    175
    176struct pc87360_data {
    177	const char *name;
    178	struct device *hwmon_dev;
    179	struct mutex lock;
    180	struct mutex update_lock;
    181	bool valid;		/* true if following fields are valid */
    182	unsigned long last_updated;	/* In jiffies */
    183
    184	int address[3];
    185
    186	u8 fannr, innr, tempnr;
    187
    188	u8 fan[3];		/* Register value */
    189	u8 fan_min[3];		/* Register value */
    190	u8 fan_status[3];	/* Register value */
    191	u8 pwm[3];		/* Register value */
    192	u16 fan_conf;		/* Configuration register values, combined */
    193
    194	u16 in_vref;		/* 1 mV/bit */
    195	u8 in[14];		/* Register value */
    196	u8 in_min[14];		/* Register value */
    197	u8 in_max[14];		/* Register value */
    198	u8 in_crit[3];		/* Register value */
    199	u8 in_status[14];	/* Register value */
    200	u16 in_alarms;		/* Register values, combined, masked */
    201	u8 vid_conf;		/* Configuration register value */
    202	u8 vrm;
    203	u8 vid;			/* Register value */
    204
    205	s8 temp[3];		/* Register value */
    206	s8 temp_min[3];		/* Register value */
    207	s8 temp_max[3];		/* Register value */
    208	s8 temp_crit[3];	/* Register value */
    209	u8 temp_status[3];	/* Register value */
    210	u8 temp_alarms;		/* Register value, masked */
    211};
    212
    213/*
    214 * Functions declaration
    215 */
    216
    217static int pc87360_probe(struct platform_device *pdev);
    218static int pc87360_remove(struct platform_device *pdev);
    219
    220static int pc87360_read_value(struct pc87360_data *data, u8 ldi, u8 bank,
    221			      u8 reg);
    222static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank,
    223				u8 reg, u8 value);
    224static void pc87360_init_device(struct platform_device *pdev,
    225				int use_thermistors);
    226static struct pc87360_data *pc87360_update_device(struct device *dev);
    227
    228/*
    229 * Driver data
    230 */
    231
    232static struct platform_driver pc87360_driver = {
    233	.driver = {
    234		.name	= "pc87360",
    235	},
    236	.probe		= pc87360_probe,
    237	.remove		= pc87360_remove,
    238};
    239
    240/*
    241 * Sysfs stuff
    242 */
    243
    244static ssize_t fan_input_show(struct device *dev,
    245			      struct device_attribute *devattr, char *buf)
    246{
    247	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    248	struct pc87360_data *data = pc87360_update_device(dev);
    249	return sprintf(buf, "%u\n", FAN_FROM_REG(data->fan[attr->index],
    250		       FAN_DIV_FROM_REG(data->fan_status[attr->index])));
    251}
    252static ssize_t fan_min_show(struct device *dev,
    253			    struct device_attribute *devattr, char *buf)
    254{
    255	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    256	struct pc87360_data *data = pc87360_update_device(dev);
    257	return sprintf(buf, "%u\n", FAN_FROM_REG(data->fan_min[attr->index],
    258		       FAN_DIV_FROM_REG(data->fan_status[attr->index])));
    259}
    260static ssize_t fan_div_show(struct device *dev,
    261			    struct device_attribute *devattr, char *buf)
    262{
    263	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    264	struct pc87360_data *data = pc87360_update_device(dev);
    265	return sprintf(buf, "%u\n",
    266		       FAN_DIV_FROM_REG(data->fan_status[attr->index]));
    267}
    268static ssize_t fan_status_show(struct device *dev,
    269			       struct device_attribute *devattr, char *buf)
    270{
    271	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    272	struct pc87360_data *data = pc87360_update_device(dev);
    273	return sprintf(buf, "%u\n",
    274		       FAN_STATUS_FROM_REG(data->fan_status[attr->index]));
    275}
    276static ssize_t fan_min_store(struct device *dev,
    277			     struct device_attribute *devattr,
    278			     const char *buf, size_t count)
    279{
    280	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    281	struct pc87360_data *data = dev_get_drvdata(dev);
    282	long fan_min;
    283	int err;
    284
    285	err = kstrtol(buf, 10, &fan_min);
    286	if (err)
    287		return err;
    288
    289	mutex_lock(&data->update_lock);
    290	fan_min = FAN_TO_REG(fan_min,
    291			     FAN_DIV_FROM_REG(data->fan_status[attr->index]));
    292
    293	/* If it wouldn't fit, change clock divisor */
    294	while (fan_min > 255
    295	    && (data->fan_status[attr->index] & 0x60) != 0x60) {
    296		fan_min >>= 1;
    297		data->fan[attr->index] >>= 1;
    298		data->fan_status[attr->index] += 0x20;
    299	}
    300	data->fan_min[attr->index] = fan_min > 255 ? 255 : fan_min;
    301	pc87360_write_value(data, LD_FAN, NO_BANK,
    302			    PC87360_REG_FAN_MIN(attr->index),
    303			    data->fan_min[attr->index]);
    304
    305	/* Write new divider, preserve alarm bits */
    306	pc87360_write_value(data, LD_FAN, NO_BANK,
    307			    PC87360_REG_FAN_STATUS(attr->index),
    308			    data->fan_status[attr->index] & 0xF9);
    309	mutex_unlock(&data->update_lock);
    310
    311	return count;
    312}
    313
    314static struct sensor_device_attribute fan_input[] = {
    315	SENSOR_ATTR_RO(fan1_input, fan_input, 0),
    316	SENSOR_ATTR_RO(fan2_input, fan_input, 1),
    317	SENSOR_ATTR_RO(fan3_input, fan_input, 2),
    318};
    319static struct sensor_device_attribute fan_status[] = {
    320	SENSOR_ATTR_RO(fan1_status, fan_status, 0),
    321	SENSOR_ATTR_RO(fan2_status, fan_status, 1),
    322	SENSOR_ATTR_RO(fan3_status, fan_status, 2),
    323};
    324static struct sensor_device_attribute fan_div[] = {
    325	SENSOR_ATTR_RO(fan1_div, fan_div, 0),
    326	SENSOR_ATTR_RO(fan2_div, fan_div, 1),
    327	SENSOR_ATTR_RO(fan3_div, fan_div, 2),
    328};
    329static struct sensor_device_attribute fan_min[] = {
    330	SENSOR_ATTR_RW(fan1_min, fan_min, 0),
    331	SENSOR_ATTR_RW(fan2_min, fan_min, 1),
    332	SENSOR_ATTR_RW(fan3_min, fan_min, 2),
    333};
    334
    335#define FAN_UNIT_ATTRS(X)		\
    336{	&fan_input[X].dev_attr.attr,	\
    337	&fan_status[X].dev_attr.attr,	\
    338	&fan_div[X].dev_attr.attr,	\
    339	&fan_min[X].dev_attr.attr,	\
    340	NULL				\
    341}
    342
    343static ssize_t pwm_show(struct device *dev, struct device_attribute *devattr,
    344			char *buf)
    345{
    346	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    347	struct pc87360_data *data = pc87360_update_device(dev);
    348	return sprintf(buf, "%u\n",
    349		       PWM_FROM_REG(data->pwm[attr->index],
    350				    FAN_CONFIG_INVERT(data->fan_conf,
    351						      attr->index)));
    352}
    353static ssize_t pwm_store(struct device *dev, struct device_attribute *devattr,
    354			 const char *buf, size_t count)
    355{
    356	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    357	struct pc87360_data *data = dev_get_drvdata(dev);
    358	long val;
    359	int err;
    360
    361	err = kstrtol(buf, 10, &val);
    362	if (err)
    363		return err;
    364
    365	mutex_lock(&data->update_lock);
    366	data->pwm[attr->index] = PWM_TO_REG(val,
    367			      FAN_CONFIG_INVERT(data->fan_conf, attr->index));
    368	pc87360_write_value(data, LD_FAN, NO_BANK, PC87360_REG_PWM(attr->index),
    369			    data->pwm[attr->index]);
    370	mutex_unlock(&data->update_lock);
    371	return count;
    372}
    373
    374static struct sensor_device_attribute pwm[] = {
    375	SENSOR_ATTR_RW(pwm1, pwm, 0),
    376	SENSOR_ATTR_RW(pwm2, pwm, 1),
    377	SENSOR_ATTR_RW(pwm3, pwm, 2),
    378};
    379
    380static struct attribute *pc8736x_fan_attr[][5] = {
    381	FAN_UNIT_ATTRS(0),
    382	FAN_UNIT_ATTRS(1),
    383	FAN_UNIT_ATTRS(2)
    384};
    385
    386static const struct attribute_group pc8736x_fan_attr_group[] = {
    387	{ .attrs = pc8736x_fan_attr[0], },
    388	{ .attrs = pc8736x_fan_attr[1], },
    389	{ .attrs = pc8736x_fan_attr[2], },
    390};
    391
    392static ssize_t in_input_show(struct device *dev,
    393			     struct device_attribute *devattr, char *buf)
    394{
    395	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    396	struct pc87360_data *data = pc87360_update_device(dev);
    397	return sprintf(buf, "%u\n", IN_FROM_REG(data->in[attr->index],
    398		       data->in_vref));
    399}
    400static ssize_t in_min_show(struct device *dev,
    401			   struct device_attribute *devattr, char *buf)
    402{
    403	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    404	struct pc87360_data *data = pc87360_update_device(dev);
    405	return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[attr->index],
    406		       data->in_vref));
    407}
    408static ssize_t in_max_show(struct device *dev,
    409			   struct device_attribute *devattr, char *buf)
    410{
    411	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    412	struct pc87360_data *data = pc87360_update_device(dev);
    413	return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[attr->index],
    414		       data->in_vref));
    415}
    416static ssize_t in_status_show(struct device *dev,
    417			      struct device_attribute *devattr, char *buf)
    418{
    419	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    420	struct pc87360_data *data = pc87360_update_device(dev);
    421	return sprintf(buf, "%u\n", data->in_status[attr->index]);
    422}
    423static ssize_t in_min_store(struct device *dev,
    424			    struct device_attribute *devattr, const char *buf,
    425			    size_t count)
    426{
    427	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    428	struct pc87360_data *data = dev_get_drvdata(dev);
    429	long val;
    430	int err;
    431
    432	err = kstrtol(buf, 10, &val);
    433	if (err)
    434		return err;
    435
    436	mutex_lock(&data->update_lock);
    437	data->in_min[attr->index] = IN_TO_REG(val, data->in_vref);
    438	pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_IN_MIN,
    439			    data->in_min[attr->index]);
    440	mutex_unlock(&data->update_lock);
    441	return count;
    442}
    443static ssize_t in_max_store(struct device *dev,
    444			    struct device_attribute *devattr, const char *buf,
    445			    size_t count)
    446{
    447	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    448	struct pc87360_data *data = dev_get_drvdata(dev);
    449	long val;
    450	int err;
    451
    452	err = kstrtol(buf, 10, &val);
    453	if (err)
    454		return err;
    455
    456	mutex_lock(&data->update_lock);
    457	data->in_max[attr->index] = IN_TO_REG(val,
    458			       data->in_vref);
    459	pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_IN_MAX,
    460			    data->in_max[attr->index]);
    461	mutex_unlock(&data->update_lock);
    462	return count;
    463}
    464
    465static struct sensor_device_attribute in_input[] = {
    466	SENSOR_ATTR_RO(in0_input, in_input, 0),
    467	SENSOR_ATTR_RO(in1_input, in_input, 1),
    468	SENSOR_ATTR_RO(in2_input, in_input, 2),
    469	SENSOR_ATTR_RO(in3_input, in_input, 3),
    470	SENSOR_ATTR_RO(in4_input, in_input, 4),
    471	SENSOR_ATTR_RO(in5_input, in_input, 5),
    472	SENSOR_ATTR_RO(in6_input, in_input, 6),
    473	SENSOR_ATTR_RO(in7_input, in_input, 7),
    474	SENSOR_ATTR_RO(in8_input, in_input, 8),
    475	SENSOR_ATTR_RO(in9_input, in_input, 9),
    476	SENSOR_ATTR_RO(in10_input, in_input, 10),
    477};
    478static struct sensor_device_attribute in_status[] = {
    479	SENSOR_ATTR_RO(in0_status, in_status, 0),
    480	SENSOR_ATTR_RO(in1_status, in_status, 1),
    481	SENSOR_ATTR_RO(in2_status, in_status, 2),
    482	SENSOR_ATTR_RO(in3_status, in_status, 3),
    483	SENSOR_ATTR_RO(in4_status, in_status, 4),
    484	SENSOR_ATTR_RO(in5_status, in_status, 5),
    485	SENSOR_ATTR_RO(in6_status, in_status, 6),
    486	SENSOR_ATTR_RO(in7_status, in_status, 7),
    487	SENSOR_ATTR_RO(in8_status, in_status, 8),
    488	SENSOR_ATTR_RO(in9_status, in_status, 9),
    489	SENSOR_ATTR_RO(in10_status, in_status, 10),
    490};
    491static struct sensor_device_attribute in_min[] = {
    492	SENSOR_ATTR_RW(in0_min, in_min, 0),
    493	SENSOR_ATTR_RW(in1_min, in_min, 1),
    494	SENSOR_ATTR_RW(in2_min, in_min, 2),
    495	SENSOR_ATTR_RW(in3_min, in_min, 3),
    496	SENSOR_ATTR_RW(in4_min, in_min, 4),
    497	SENSOR_ATTR_RW(in5_min, in_min, 5),
    498	SENSOR_ATTR_RW(in6_min, in_min, 6),
    499	SENSOR_ATTR_RW(in7_min, in_min, 7),
    500	SENSOR_ATTR_RW(in8_min, in_min, 8),
    501	SENSOR_ATTR_RW(in9_min, in_min, 9),
    502	SENSOR_ATTR_RW(in10_min, in_min, 10),
    503};
    504static struct sensor_device_attribute in_max[] = {
    505	SENSOR_ATTR_RW(in0_max, in_max, 0),
    506	SENSOR_ATTR_RW(in1_max, in_max, 1),
    507	SENSOR_ATTR_RW(in2_max, in_max, 2),
    508	SENSOR_ATTR_RW(in3_max, in_max, 3),
    509	SENSOR_ATTR_RW(in4_max, in_max, 4),
    510	SENSOR_ATTR_RW(in5_max, in_max, 5),
    511	SENSOR_ATTR_RW(in6_max, in_max, 6),
    512	SENSOR_ATTR_RW(in7_max, in_max, 7),
    513	SENSOR_ATTR_RW(in8_max, in_max, 8),
    514	SENSOR_ATTR_RW(in9_max, in_max, 9),
    515	SENSOR_ATTR_RW(in10_max, in_max, 10),
    516};
    517
    518/* (temp & vin) channel status register alarm bits (pdf sec.11.5.12) */
    519#define CHAN_ALM_MIN	0x02	/* min limit crossed */
    520#define CHAN_ALM_MAX	0x04	/* max limit exceeded */
    521#define TEMP_ALM_CRIT	0x08	/* temp crit exceeded (temp only) */
    522
    523/*
    524 * show_in_min/max_alarm() reads data from the per-channel status
    525 * register (sec 11.5.12), not the vin event status registers (sec
    526 * 11.5.2) that (legacy) show_in_alarm() resds (via data->in_alarms)
    527 */
    528
    529static ssize_t in_min_alarm_show(struct device *dev,
    530				 struct device_attribute *devattr, char *buf)
    531{
    532	struct pc87360_data *data = pc87360_update_device(dev);
    533	unsigned nr = to_sensor_dev_attr(devattr)->index;
    534
    535	return sprintf(buf, "%u\n", !!(data->in_status[nr] & CHAN_ALM_MIN));
    536}
    537static ssize_t in_max_alarm_show(struct device *dev,
    538				 struct device_attribute *devattr, char *buf)
    539{
    540	struct pc87360_data *data = pc87360_update_device(dev);
    541	unsigned nr = to_sensor_dev_attr(devattr)->index;
    542
    543	return sprintf(buf, "%u\n", !!(data->in_status[nr] & CHAN_ALM_MAX));
    544}
    545
    546static struct sensor_device_attribute in_min_alarm[] = {
    547	SENSOR_ATTR_RO(in0_min_alarm, in_min_alarm, 0),
    548	SENSOR_ATTR_RO(in1_min_alarm, in_min_alarm, 1),
    549	SENSOR_ATTR_RO(in2_min_alarm, in_min_alarm, 2),
    550	SENSOR_ATTR_RO(in3_min_alarm, in_min_alarm, 3),
    551	SENSOR_ATTR_RO(in4_min_alarm, in_min_alarm, 4),
    552	SENSOR_ATTR_RO(in5_min_alarm, in_min_alarm, 5),
    553	SENSOR_ATTR_RO(in6_min_alarm, in_min_alarm, 6),
    554	SENSOR_ATTR_RO(in7_min_alarm, in_min_alarm, 7),
    555	SENSOR_ATTR_RO(in8_min_alarm, in_min_alarm, 8),
    556	SENSOR_ATTR_RO(in9_min_alarm, in_min_alarm, 9),
    557	SENSOR_ATTR_RO(in10_min_alarm, in_min_alarm, 10),
    558};
    559static struct sensor_device_attribute in_max_alarm[] = {
    560	SENSOR_ATTR_RO(in0_max_alarm, in_max_alarm, 0),
    561	SENSOR_ATTR_RO(in1_max_alarm, in_max_alarm, 1),
    562	SENSOR_ATTR_RO(in2_max_alarm, in_max_alarm, 2),
    563	SENSOR_ATTR_RO(in3_max_alarm, in_max_alarm, 3),
    564	SENSOR_ATTR_RO(in4_max_alarm, in_max_alarm, 4),
    565	SENSOR_ATTR_RO(in5_max_alarm, in_max_alarm, 5),
    566	SENSOR_ATTR_RO(in6_max_alarm, in_max_alarm, 6),
    567	SENSOR_ATTR_RO(in7_max_alarm, in_max_alarm, 7),
    568	SENSOR_ATTR_RO(in8_max_alarm, in_max_alarm, 8),
    569	SENSOR_ATTR_RO(in9_max_alarm, in_max_alarm, 9),
    570	SENSOR_ATTR_RO(in10_max_alarm, in_max_alarm, 10),
    571};
    572
    573#define VIN_UNIT_ATTRS(X) \
    574	&in_input[X].dev_attr.attr,	\
    575	&in_status[X].dev_attr.attr,	\
    576	&in_min[X].dev_attr.attr,	\
    577	&in_max[X].dev_attr.attr,	\
    578	&in_min_alarm[X].dev_attr.attr,	\
    579	&in_max_alarm[X].dev_attr.attr
    580
    581static ssize_t cpu0_vid_show(struct device *dev,
    582			     struct device_attribute *attr, char *buf)
    583{
    584	struct pc87360_data *data = pc87360_update_device(dev);
    585	return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
    586}
    587static DEVICE_ATTR_RO(cpu0_vid);
    588
    589static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
    590			char *buf)
    591{
    592	struct pc87360_data *data = dev_get_drvdata(dev);
    593	return sprintf(buf, "%u\n", data->vrm);
    594}
    595static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
    596			 const char *buf, size_t count)
    597{
    598	struct pc87360_data *data = dev_get_drvdata(dev);
    599	unsigned long val;
    600	int err;
    601
    602	err = kstrtoul(buf, 10, &val);
    603	if (err)
    604		return err;
    605
    606	if (val > 255)
    607		return -EINVAL;
    608
    609	data->vrm = val;
    610	return count;
    611}
    612static DEVICE_ATTR_RW(vrm);
    613
    614static ssize_t alarms_in_show(struct device *dev,
    615			      struct device_attribute *attr, char *buf)
    616{
    617	struct pc87360_data *data = pc87360_update_device(dev);
    618	return sprintf(buf, "%u\n", data->in_alarms);
    619}
    620static DEVICE_ATTR_RO(alarms_in);
    621
    622static struct attribute *pc8736x_vin_attr_array[] = {
    623	VIN_UNIT_ATTRS(0),
    624	VIN_UNIT_ATTRS(1),
    625	VIN_UNIT_ATTRS(2),
    626	VIN_UNIT_ATTRS(3),
    627	VIN_UNIT_ATTRS(4),
    628	VIN_UNIT_ATTRS(5),
    629	VIN_UNIT_ATTRS(6),
    630	VIN_UNIT_ATTRS(7),
    631	VIN_UNIT_ATTRS(8),
    632	VIN_UNIT_ATTRS(9),
    633	VIN_UNIT_ATTRS(10),
    634	&dev_attr_cpu0_vid.attr,
    635	&dev_attr_vrm.attr,
    636	&dev_attr_alarms_in.attr,
    637	NULL
    638};
    639static const struct attribute_group pc8736x_vin_group = {
    640	.attrs = pc8736x_vin_attr_array,
    641};
    642
    643static ssize_t therm_input_show(struct device *dev,
    644				struct device_attribute *devattr, char *buf)
    645{
    646	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    647	struct pc87360_data *data = pc87360_update_device(dev);
    648	return sprintf(buf, "%u\n", IN_FROM_REG(data->in[attr->index],
    649		       data->in_vref));
    650}
    651static ssize_t therm_min_show(struct device *dev,
    652			      struct device_attribute *devattr, char *buf)
    653{
    654	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    655	struct pc87360_data *data = pc87360_update_device(dev);
    656	return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[attr->index],
    657		       data->in_vref));
    658}
    659static ssize_t therm_max_show(struct device *dev,
    660			      struct device_attribute *devattr, char *buf)
    661{
    662	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    663	struct pc87360_data *data = pc87360_update_device(dev);
    664	return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[attr->index],
    665		       data->in_vref));
    666}
    667static ssize_t therm_crit_show(struct device *dev,
    668			       struct device_attribute *devattr, char *buf)
    669{
    670	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    671	struct pc87360_data *data = pc87360_update_device(dev);
    672	return sprintf(buf, "%u\n", IN_FROM_REG(data->in_crit[attr->index-11],
    673		       data->in_vref));
    674}
    675static ssize_t therm_status_show(struct device *dev,
    676				 struct device_attribute *devattr, char *buf)
    677{
    678	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    679	struct pc87360_data *data = pc87360_update_device(dev);
    680	return sprintf(buf, "%u\n", data->in_status[attr->index]);
    681}
    682
    683static ssize_t therm_min_store(struct device *dev,
    684			       struct device_attribute *devattr,
    685			       const char *buf, size_t count)
    686{
    687	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    688	struct pc87360_data *data = dev_get_drvdata(dev);
    689	long val;
    690	int err;
    691
    692	err = kstrtol(buf, 10, &val);
    693	if (err)
    694		return err;
    695
    696	mutex_lock(&data->update_lock);
    697	data->in_min[attr->index] = IN_TO_REG(val, data->in_vref);
    698	pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_MIN,
    699			    data->in_min[attr->index]);
    700	mutex_unlock(&data->update_lock);
    701	return count;
    702}
    703
    704static ssize_t therm_max_store(struct device *dev,
    705			       struct device_attribute *devattr,
    706			       const char *buf, size_t count)
    707{
    708	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    709	struct pc87360_data *data = dev_get_drvdata(dev);
    710	long val;
    711	int err;
    712
    713	err = kstrtol(buf, 10, &val);
    714	if (err)
    715		return err;
    716
    717	mutex_lock(&data->update_lock);
    718	data->in_max[attr->index] = IN_TO_REG(val, data->in_vref);
    719	pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_MAX,
    720			    data->in_max[attr->index]);
    721	mutex_unlock(&data->update_lock);
    722	return count;
    723}
    724static ssize_t therm_crit_store(struct device *dev,
    725				struct device_attribute *devattr,
    726				const char *buf, size_t count)
    727{
    728	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    729	struct pc87360_data *data = dev_get_drvdata(dev);
    730	long val;
    731	int err;
    732
    733	err = kstrtol(buf, 10, &val);
    734	if (err)
    735		return err;
    736
    737	mutex_lock(&data->update_lock);
    738	data->in_crit[attr->index-11] = IN_TO_REG(val, data->in_vref);
    739	pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_CRIT,
    740			    data->in_crit[attr->index-11]);
    741	mutex_unlock(&data->update_lock);
    742	return count;
    743}
    744
    745/*
    746 * the +11 term below reflects the fact that VLM units 11,12,13 are
    747 * used in the chip to measure voltage across the thermistors
    748 */
    749static struct sensor_device_attribute therm_input[] = {
    750	SENSOR_ATTR_RO(temp4_input, therm_input, 0 + 11),
    751	SENSOR_ATTR_RO(temp5_input, therm_input, 1 + 11),
    752	SENSOR_ATTR_RO(temp6_input, therm_input, 2 + 11),
    753};
    754static struct sensor_device_attribute therm_status[] = {
    755	SENSOR_ATTR_RO(temp4_status, therm_status, 0 + 11),
    756	SENSOR_ATTR_RO(temp5_status, therm_status, 1 + 11),
    757	SENSOR_ATTR_RO(temp6_status, therm_status, 2 + 11),
    758};
    759static struct sensor_device_attribute therm_min[] = {
    760	SENSOR_ATTR_RW(temp4_min, therm_min, 0 + 11),
    761	SENSOR_ATTR_RW(temp5_min, therm_min, 1 + 11),
    762	SENSOR_ATTR_RW(temp6_min, therm_min, 2 + 11),
    763};
    764static struct sensor_device_attribute therm_max[] = {
    765	SENSOR_ATTR_RW(temp4_max, therm_max, 0 + 11),
    766	SENSOR_ATTR_RW(temp5_max, therm_max, 1 + 11),
    767	SENSOR_ATTR_RW(temp6_max, therm_max, 2 + 11),
    768};
    769static struct sensor_device_attribute therm_crit[] = {
    770	SENSOR_ATTR_RW(temp4_crit, therm_crit, 0 + 11),
    771	SENSOR_ATTR_RW(temp5_crit, therm_crit, 1 + 11),
    772	SENSOR_ATTR_RW(temp6_crit, therm_crit, 2 + 11),
    773};
    774
    775/*
    776 * show_therm_min/max_alarm() reads data from the per-channel voltage
    777 * status register (sec 11.5.12)
    778 */
    779
    780static ssize_t therm_min_alarm_show(struct device *dev,
    781				    struct device_attribute *devattr,
    782				    char *buf)
    783{
    784	struct pc87360_data *data = pc87360_update_device(dev);
    785	unsigned nr = to_sensor_dev_attr(devattr)->index;
    786
    787	return sprintf(buf, "%u\n", !!(data->in_status[nr] & CHAN_ALM_MIN));
    788}
    789static ssize_t therm_max_alarm_show(struct device *dev,
    790				    struct device_attribute *devattr,
    791				    char *buf)
    792{
    793	struct pc87360_data *data = pc87360_update_device(dev);
    794	unsigned nr = to_sensor_dev_attr(devattr)->index;
    795
    796	return sprintf(buf, "%u\n", !!(data->in_status[nr] & CHAN_ALM_MAX));
    797}
    798static ssize_t therm_crit_alarm_show(struct device *dev,
    799				     struct device_attribute *devattr,
    800				     char *buf)
    801{
    802	struct pc87360_data *data = pc87360_update_device(dev);
    803	unsigned nr = to_sensor_dev_attr(devattr)->index;
    804
    805	return sprintf(buf, "%u\n", !!(data->in_status[nr] & TEMP_ALM_CRIT));
    806}
    807
    808static struct sensor_device_attribute therm_min_alarm[] = {
    809	SENSOR_ATTR_RO(temp4_min_alarm, therm_min_alarm, 0 + 11),
    810	SENSOR_ATTR_RO(temp5_min_alarm, therm_min_alarm, 1 + 11),
    811	SENSOR_ATTR_RO(temp6_min_alarm, therm_min_alarm, 2 + 11),
    812};
    813static struct sensor_device_attribute therm_max_alarm[] = {
    814	SENSOR_ATTR_RO(temp4_max_alarm, therm_max_alarm, 0 + 11),
    815	SENSOR_ATTR_RO(temp5_max_alarm, therm_max_alarm, 1 + 11),
    816	SENSOR_ATTR_RO(temp6_max_alarm, therm_max_alarm, 2 + 11),
    817};
    818static struct sensor_device_attribute therm_crit_alarm[] = {
    819	SENSOR_ATTR_RO(temp4_crit_alarm, therm_crit_alarm, 0 + 11),
    820	SENSOR_ATTR_RO(temp5_crit_alarm, therm_crit_alarm, 1 + 11),
    821	SENSOR_ATTR_RO(temp6_crit_alarm, therm_crit_alarm, 2 + 11),
    822};
    823
    824#define THERM_UNIT_ATTRS(X) \
    825	&therm_input[X].dev_attr.attr,	\
    826	&therm_status[X].dev_attr.attr,	\
    827	&therm_min[X].dev_attr.attr,	\
    828	&therm_max[X].dev_attr.attr,	\
    829	&therm_crit[X].dev_attr.attr,	\
    830	&therm_min_alarm[X].dev_attr.attr, \
    831	&therm_max_alarm[X].dev_attr.attr, \
    832	&therm_crit_alarm[X].dev_attr.attr
    833
    834static struct attribute *pc8736x_therm_attr_array[] = {
    835	THERM_UNIT_ATTRS(0),
    836	THERM_UNIT_ATTRS(1),
    837	THERM_UNIT_ATTRS(2),
    838	NULL
    839};
    840static const struct attribute_group pc8736x_therm_group = {
    841	.attrs = pc8736x_therm_attr_array,
    842};
    843
    844static ssize_t temp_input_show(struct device *dev,
    845			       struct device_attribute *devattr, char *buf)
    846{
    847	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    848	struct pc87360_data *data = pc87360_update_device(dev);
    849	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index]));
    850}
    851
    852static ssize_t temp_min_show(struct device *dev,
    853			     struct device_attribute *devattr, char *buf)
    854{
    855	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    856	struct pc87360_data *data = pc87360_update_device(dev);
    857	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[attr->index]));
    858}
    859
    860static ssize_t temp_max_show(struct device *dev,
    861			     struct device_attribute *devattr, char *buf)
    862{
    863	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    864	struct pc87360_data *data = pc87360_update_device(dev);
    865	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[attr->index]));
    866}
    867
    868static ssize_t temp_crit_show(struct device *dev,
    869			      struct device_attribute *devattr, char *buf)
    870{
    871	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    872	struct pc87360_data *data = pc87360_update_device(dev);
    873	return sprintf(buf, "%d\n",
    874		       TEMP_FROM_REG(data->temp_crit[attr->index]));
    875}
    876
    877static ssize_t temp_status_show(struct device *dev,
    878				struct device_attribute *devattr, char *buf)
    879{
    880	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    881	struct pc87360_data *data = pc87360_update_device(dev);
    882	return sprintf(buf, "%d\n", data->temp_status[attr->index]);
    883}
    884
    885static ssize_t temp_min_store(struct device *dev,
    886			      struct device_attribute *devattr,
    887			      const char *buf, size_t count)
    888{
    889	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    890	struct pc87360_data *data = dev_get_drvdata(dev);
    891	long val;
    892	int err;
    893
    894	err = kstrtol(buf, 10, &val);
    895	if (err)
    896		return err;
    897
    898	mutex_lock(&data->update_lock);
    899	data->temp_min[attr->index] = TEMP_TO_REG(val);
    900	pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_MIN,
    901			    data->temp_min[attr->index]);
    902	mutex_unlock(&data->update_lock);
    903	return count;
    904}
    905
    906static ssize_t temp_max_store(struct device *dev,
    907			      struct device_attribute *devattr,
    908			      const char *buf, size_t count)
    909{
    910	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    911	struct pc87360_data *data = dev_get_drvdata(dev);
    912	long val;
    913	int err;
    914
    915	err = kstrtol(buf, 10, &val);
    916	if (err)
    917		return err;
    918
    919	mutex_lock(&data->update_lock);
    920	data->temp_max[attr->index] = TEMP_TO_REG(val);
    921	pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_MAX,
    922			    data->temp_max[attr->index]);
    923	mutex_unlock(&data->update_lock);
    924	return count;
    925}
    926
    927static ssize_t temp_crit_store(struct device *dev,
    928			       struct device_attribute *devattr,
    929			       const char *buf, size_t count)
    930{
    931	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
    932	struct pc87360_data *data = dev_get_drvdata(dev);
    933	long val;
    934	int err;
    935
    936	err = kstrtol(buf, 10, &val);
    937	if (err)
    938		return err;
    939
    940	mutex_lock(&data->update_lock);
    941	data->temp_crit[attr->index] = TEMP_TO_REG(val);
    942	pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_CRIT,
    943			    data->temp_crit[attr->index]);
    944	mutex_unlock(&data->update_lock);
    945	return count;
    946}
    947
    948static struct sensor_device_attribute temp_input[] = {
    949	SENSOR_ATTR_RO(temp1_input, temp_input, 0),
    950	SENSOR_ATTR_RO(temp2_input, temp_input, 1),
    951	SENSOR_ATTR_RO(temp3_input, temp_input, 2),
    952};
    953static struct sensor_device_attribute temp_status[] = {
    954	SENSOR_ATTR_RO(temp1_status, temp_status, 0),
    955	SENSOR_ATTR_RO(temp2_status, temp_status, 1),
    956	SENSOR_ATTR_RO(temp3_status, temp_status, 2),
    957};
    958static struct sensor_device_attribute temp_min[] = {
    959	SENSOR_ATTR_RW(temp1_min, temp_min, 0),
    960	SENSOR_ATTR_RW(temp2_min, temp_min, 1),
    961	SENSOR_ATTR_RW(temp3_min, temp_min, 2),
    962};
    963static struct sensor_device_attribute temp_max[] = {
    964	SENSOR_ATTR_RW(temp1_max, temp_max, 0),
    965	SENSOR_ATTR_RW(temp2_max, temp_max, 1),
    966	SENSOR_ATTR_RW(temp3_max, temp_max, 2),
    967};
    968static struct sensor_device_attribute temp_crit[] = {
    969	SENSOR_ATTR_RW(temp1_crit, temp_crit, 0),
    970	SENSOR_ATTR_RW(temp2_crit, temp_crit, 1),
    971	SENSOR_ATTR_RW(temp3_crit, temp_crit, 2),
    972};
    973
    974static ssize_t alarms_temp_show(struct device *dev,
    975				struct device_attribute *attr, char *buf)
    976{
    977	struct pc87360_data *data = pc87360_update_device(dev);
    978	return sprintf(buf, "%u\n", data->temp_alarms);
    979}
    980
    981static DEVICE_ATTR_RO(alarms_temp);
    982
    983/*
    984 * show_temp_min/max_alarm() reads data from the per-channel status
    985 * register (sec 12.3.7), not the temp event status registers (sec
    986 * 12.3.2) that show_temp_alarm() reads (via data->temp_alarms)
    987 */
    988
    989static ssize_t temp_min_alarm_show(struct device *dev,
    990				   struct device_attribute *devattr,
    991				   char *buf)
    992{
    993	struct pc87360_data *data = pc87360_update_device(dev);
    994	unsigned nr = to_sensor_dev_attr(devattr)->index;
    995
    996	return sprintf(buf, "%u\n", !!(data->temp_status[nr] & CHAN_ALM_MIN));
    997}
    998
    999static ssize_t temp_max_alarm_show(struct device *dev,
   1000				   struct device_attribute *devattr,
   1001				   char *buf)
   1002{
   1003	struct pc87360_data *data = pc87360_update_device(dev);
   1004	unsigned nr = to_sensor_dev_attr(devattr)->index;
   1005
   1006	return sprintf(buf, "%u\n", !!(data->temp_status[nr] & CHAN_ALM_MAX));
   1007}
   1008
   1009static ssize_t temp_crit_alarm_show(struct device *dev,
   1010				    struct device_attribute *devattr,
   1011				    char *buf)
   1012{
   1013	struct pc87360_data *data = pc87360_update_device(dev);
   1014	unsigned nr = to_sensor_dev_attr(devattr)->index;
   1015
   1016	return sprintf(buf, "%u\n", !!(data->temp_status[nr] & TEMP_ALM_CRIT));
   1017}
   1018
   1019static struct sensor_device_attribute temp_min_alarm[] = {
   1020	SENSOR_ATTR_RO(temp1_min_alarm, temp_min_alarm, 0),
   1021	SENSOR_ATTR_RO(temp2_min_alarm, temp_min_alarm, 1),
   1022	SENSOR_ATTR_RO(temp3_min_alarm, temp_min_alarm, 2),
   1023};
   1024
   1025static struct sensor_device_attribute temp_max_alarm[] = {
   1026	SENSOR_ATTR_RO(temp1_max_alarm, temp_max_alarm, 0),
   1027	SENSOR_ATTR_RO(temp2_max_alarm, temp_max_alarm, 1),
   1028	SENSOR_ATTR_RO(temp3_max_alarm, temp_max_alarm, 2),
   1029};
   1030
   1031static struct sensor_device_attribute temp_crit_alarm[] = {
   1032	SENSOR_ATTR_RO(temp1_crit_alarm, temp_crit_alarm, 0),
   1033	SENSOR_ATTR_RO(temp2_crit_alarm, temp_crit_alarm, 1),
   1034	SENSOR_ATTR_RO(temp3_crit_alarm, temp_crit_alarm, 2),
   1035};
   1036
   1037#define TEMP_FAULT	0x40	/* open diode */
   1038static ssize_t temp_fault_show(struct device *dev,
   1039			       struct device_attribute *devattr, char *buf)
   1040{
   1041	struct pc87360_data *data = pc87360_update_device(dev);
   1042	unsigned nr = to_sensor_dev_attr(devattr)->index;
   1043
   1044	return sprintf(buf, "%u\n", !!(data->temp_status[nr] & TEMP_FAULT));
   1045}
   1046static struct sensor_device_attribute temp_fault[] = {
   1047	SENSOR_ATTR_RO(temp1_fault, temp_fault, 0),
   1048	SENSOR_ATTR_RO(temp2_fault, temp_fault, 1),
   1049	SENSOR_ATTR_RO(temp3_fault, temp_fault, 2),
   1050};
   1051
   1052#define TEMP_UNIT_ATTRS(X)			\
   1053{	&temp_input[X].dev_attr.attr,		\
   1054	&temp_status[X].dev_attr.attr,		\
   1055	&temp_min[X].dev_attr.attr,		\
   1056	&temp_max[X].dev_attr.attr,		\
   1057	&temp_crit[X].dev_attr.attr,		\
   1058	&temp_min_alarm[X].dev_attr.attr,	\
   1059	&temp_max_alarm[X].dev_attr.attr,	\
   1060	&temp_crit_alarm[X].dev_attr.attr,	\
   1061	&temp_fault[X].dev_attr.attr,		\
   1062	NULL					\
   1063}
   1064
   1065static struct attribute *pc8736x_temp_attr[][10] = {
   1066	TEMP_UNIT_ATTRS(0),
   1067	TEMP_UNIT_ATTRS(1),
   1068	TEMP_UNIT_ATTRS(2)
   1069};
   1070
   1071static const struct attribute_group pc8736x_temp_attr_group[] = {
   1072	{ .attrs = pc8736x_temp_attr[0] },
   1073	{ .attrs = pc8736x_temp_attr[1] },
   1074	{ .attrs = pc8736x_temp_attr[2] }
   1075};
   1076
   1077static ssize_t name_show(struct device *dev,
   1078			struct device_attribute *devattr, char *buf)
   1079{
   1080	struct pc87360_data *data = dev_get_drvdata(dev);
   1081	return sprintf(buf, "%s\n", data->name);
   1082}
   1083
   1084static DEVICE_ATTR_RO(name);
   1085
   1086/*
   1087 * Device detection, registration and update
   1088 */
   1089
   1090static int __init pc87360_find(int sioaddr, u8 *devid,
   1091			       unsigned short *addresses)
   1092{
   1093	u16 val;
   1094	int i;
   1095	int nrdev; /* logical device count */
   1096
   1097	/* No superio_enter */
   1098
   1099	/* Identify device */
   1100	val = force_id ? force_id : superio_inb(sioaddr, DEVID);
   1101	switch (val) {
   1102	case 0xE1: /* PC87360 */
   1103	case 0xE8: /* PC87363 */
   1104	case 0xE4: /* PC87364 */
   1105		nrdev = 1;
   1106		break;
   1107	case 0xE5: /* PC87365 */
   1108	case 0xE9: /* PC87366 */
   1109		nrdev = 3;
   1110		break;
   1111	default:
   1112		superio_exit(sioaddr);
   1113		return -ENODEV;
   1114	}
   1115	/* Remember the device id */
   1116	*devid = val;
   1117
   1118	for (i = 0; i < nrdev; i++) {
   1119		/* select logical device */
   1120		superio_outb(sioaddr, DEV, logdev[i]);
   1121
   1122		val = superio_inb(sioaddr, ACT);
   1123		if (!(val & 0x01)) {
   1124			pr_info("Device 0x%02x not activated\n", logdev[i]);
   1125			continue;
   1126		}
   1127
   1128		val = (superio_inb(sioaddr, BASE) << 8)
   1129		    | superio_inb(sioaddr, BASE + 1);
   1130		if (!val) {
   1131			pr_info("Base address not set for device 0x%02x\n",
   1132				logdev[i]);
   1133			continue;
   1134		}
   1135
   1136		addresses[i] = val;
   1137
   1138		if (i == 0) { /* Fans */
   1139			confreg[0] = superio_inb(sioaddr, 0xF0);
   1140			confreg[1] = superio_inb(sioaddr, 0xF1);
   1141
   1142			pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 1,
   1143				 (confreg[0] >> 2) & 1, (confreg[0] >> 3) & 1,
   1144				 (confreg[0] >> 4) & 1);
   1145			pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 2,
   1146				 (confreg[0] >> 5) & 1, (confreg[0] >> 6) & 1,
   1147				 (confreg[0] >> 7) & 1);
   1148			pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 3,
   1149				 confreg[1] & 1, (confreg[1] >> 1) & 1,
   1150				 (confreg[1] >> 2) & 1);
   1151		} else if (i == 1) { /* Voltages */
   1152			/* Are we using thermistors? */
   1153			if (*devid == 0xE9) { /* PC87366 */
   1154				/*
   1155				 * These registers are not logical-device
   1156				 * specific, just that we won't need them if
   1157				 * we don't use the VLM device
   1158				 */
   1159				confreg[2] = superio_inb(sioaddr, 0x2B);
   1160				confreg[3] = superio_inb(sioaddr, 0x25);
   1161
   1162				if (confreg[2] & 0x40) {
   1163					pr_info("Using thermistors for temperature monitoring\n");
   1164				}
   1165				if (confreg[3] & 0xE0) {
   1166					pr_info("VID inputs routed (mode %u)\n",
   1167						confreg[3] >> 5);
   1168				}
   1169			}
   1170		}
   1171	}
   1172
   1173	superio_exit(sioaddr);
   1174	return 0;
   1175}
   1176
   1177static void pc87360_remove_files(struct device *dev)
   1178{
   1179	int i;
   1180
   1181	device_remove_file(dev, &dev_attr_name);
   1182	device_remove_file(dev, &dev_attr_alarms_temp);
   1183	for (i = 0; i < ARRAY_SIZE(pc8736x_temp_attr_group); i++)
   1184		sysfs_remove_group(&dev->kobj, &pc8736x_temp_attr_group[i]);
   1185	for (i = 0; i < ARRAY_SIZE(pc8736x_fan_attr_group); i++) {
   1186		sysfs_remove_group(&pdev->dev.kobj, &pc8736x_fan_attr_group[i]);
   1187		device_remove_file(dev, &pwm[i].dev_attr);
   1188	}
   1189	sysfs_remove_group(&dev->kobj, &pc8736x_therm_group);
   1190	sysfs_remove_group(&dev->kobj, &pc8736x_vin_group);
   1191}
   1192
   1193static int pc87360_probe(struct platform_device *pdev)
   1194{
   1195	int i;
   1196	struct pc87360_data *data;
   1197	int err = 0;
   1198	const char *name;
   1199	int use_thermistors = 0;
   1200	struct device *dev = &pdev->dev;
   1201
   1202	data = devm_kzalloc(dev, sizeof(struct pc87360_data), GFP_KERNEL);
   1203	if (!data)
   1204		return -ENOMEM;
   1205
   1206	switch (devid) {
   1207	default:
   1208		name = "pc87360";
   1209		data->fannr = 2;
   1210		break;
   1211	case 0xe8:
   1212		name = "pc87363";
   1213		data->fannr = 2;
   1214		break;
   1215	case 0xe4:
   1216		name = "pc87364";
   1217		data->fannr = 3;
   1218		break;
   1219	case 0xe5:
   1220		name = "pc87365";
   1221		data->fannr = extra_isa[0] ? 3 : 0;
   1222		data->innr = extra_isa[1] ? 11 : 0;
   1223		data->tempnr = extra_isa[2] ? 2 : 0;
   1224		break;
   1225	case 0xe9:
   1226		name = "pc87366";
   1227		data->fannr = extra_isa[0] ? 3 : 0;
   1228		data->innr = extra_isa[1] ? 14 : 0;
   1229		data->tempnr = extra_isa[2] ? 3 : 0;
   1230		break;
   1231	}
   1232
   1233	data->name = name;
   1234	mutex_init(&data->lock);
   1235	mutex_init(&data->update_lock);
   1236	platform_set_drvdata(pdev, data);
   1237
   1238	for (i = 0; i < LDNI_MAX; i++) {
   1239		data->address[i] = extra_isa[i];
   1240		if (data->address[i]
   1241		 && !devm_request_region(dev, extra_isa[i], PC87360_EXTENT,
   1242					 pc87360_driver.driver.name)) {
   1243			dev_err(dev,
   1244				"Region 0x%x-0x%x already in use!\n",
   1245				extra_isa[i], extra_isa[i]+PC87360_EXTENT-1);
   1246			return -EBUSY;
   1247		}
   1248	}
   1249
   1250	/* Retrieve the fans configuration from Super-I/O space */
   1251	if (data->fannr)
   1252		data->fan_conf = confreg[0] | (confreg[1] << 8);
   1253
   1254	/*
   1255	 * Use the correct reference voltage
   1256	 * Unless both the VLM and the TMS logical devices agree to
   1257	 * use an external Vref, the internal one is used.
   1258	 */
   1259	if (data->innr) {
   1260		i = pc87360_read_value(data, LD_IN, NO_BANK,
   1261				       PC87365_REG_IN_CONFIG);
   1262		if (data->tempnr) {
   1263			i &= pc87360_read_value(data, LD_TEMP, NO_BANK,
   1264						PC87365_REG_TEMP_CONFIG);
   1265		}
   1266		data->in_vref = (i&0x02) ? 3025 : 2966;
   1267		dev_dbg(dev, "Using %s reference voltage\n",
   1268			(i&0x02) ? "external" : "internal");
   1269
   1270		data->vid_conf = confreg[3];
   1271		data->vrm = vid_which_vrm();
   1272	}
   1273
   1274	/* Fan clock dividers may be needed before any data is read */
   1275	for (i = 0; i < data->fannr; i++) {
   1276		if (FAN_CONFIG_MONITOR(data->fan_conf, i))
   1277			data->fan_status[i] = pc87360_read_value(data,
   1278					      LD_FAN, NO_BANK,
   1279					      PC87360_REG_FAN_STATUS(i));
   1280	}
   1281
   1282	if (init > 0) {
   1283		if (devid == 0xe9 && data->address[1]) /* PC87366 */
   1284			use_thermistors = confreg[2] & 0x40;
   1285
   1286		pc87360_init_device(pdev, use_thermistors);
   1287	}
   1288
   1289	/* Register all-or-nothing sysfs groups */
   1290
   1291	if (data->innr) {
   1292		err = sysfs_create_group(&dev->kobj, &pc8736x_vin_group);
   1293		if (err)
   1294			goto error;
   1295	}
   1296
   1297	if (data->innr == 14) {
   1298		err = sysfs_create_group(&dev->kobj, &pc8736x_therm_group);
   1299		if (err)
   1300			goto error;
   1301	}
   1302
   1303	/* create device attr-files for varying sysfs groups */
   1304
   1305	if (data->tempnr) {
   1306		for (i = 0; i < data->tempnr; i++) {
   1307			err = sysfs_create_group(&dev->kobj,
   1308						 &pc8736x_temp_attr_group[i]);
   1309			if (err)
   1310				goto error;
   1311		}
   1312		err = device_create_file(dev, &dev_attr_alarms_temp);
   1313		if (err)
   1314			goto error;
   1315	}
   1316
   1317	for (i = 0; i < data->fannr; i++) {
   1318		if (FAN_CONFIG_MONITOR(data->fan_conf, i)) {
   1319			err = sysfs_create_group(&dev->kobj,
   1320						 &pc8736x_fan_attr_group[i]);
   1321			if (err)
   1322				goto error;
   1323		}
   1324		if (FAN_CONFIG_CONTROL(data->fan_conf, i)) {
   1325			err = device_create_file(dev, &pwm[i].dev_attr);
   1326			if (err)
   1327				goto error;
   1328		}
   1329	}
   1330
   1331	err = device_create_file(dev, &dev_attr_name);
   1332	if (err)
   1333		goto error;
   1334
   1335	data->hwmon_dev = hwmon_device_register(dev);
   1336	if (IS_ERR(data->hwmon_dev)) {
   1337		err = PTR_ERR(data->hwmon_dev);
   1338		goto error;
   1339	}
   1340	return 0;
   1341
   1342error:
   1343	pc87360_remove_files(dev);
   1344	return err;
   1345}
   1346
   1347static int pc87360_remove(struct platform_device *pdev)
   1348{
   1349	struct pc87360_data *data = platform_get_drvdata(pdev);
   1350
   1351	hwmon_device_unregister(data->hwmon_dev);
   1352	pc87360_remove_files(&pdev->dev);
   1353
   1354	return 0;
   1355}
   1356
   1357/*
   1358 * ldi is the logical device index
   1359 * bank is for voltages and temperatures only
   1360 */
   1361static int pc87360_read_value(struct pc87360_data *data, u8 ldi, u8 bank,
   1362			      u8 reg)
   1363{
   1364	int res;
   1365
   1366	mutex_lock(&(data->lock));
   1367	if (bank != NO_BANK)
   1368		outb_p(bank, data->address[ldi] + PC87365_REG_BANK);
   1369	res = inb_p(data->address[ldi] + reg);
   1370	mutex_unlock(&(data->lock));
   1371
   1372	return res;
   1373}
   1374
   1375static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank,
   1376				u8 reg, u8 value)
   1377{
   1378	mutex_lock(&(data->lock));
   1379	if (bank != NO_BANK)
   1380		outb_p(bank, data->address[ldi] + PC87365_REG_BANK);
   1381	outb_p(value, data->address[ldi] + reg);
   1382	mutex_unlock(&(data->lock));
   1383}
   1384
   1385/* (temp & vin) channel conversion status register flags (pdf sec.11.5.12) */
   1386#define CHAN_CNVRTD	0x80	/* new data ready */
   1387#define CHAN_ENA	0x01	/* enabled channel (temp or vin) */
   1388#define CHAN_ALM_ENA	0x10	/* propagate to alarms-reg ?? (chk val!) */
   1389#define CHAN_READY	(CHAN_ENA|CHAN_CNVRTD) /* sample ready mask */
   1390
   1391#define TEMP_OTS_OE	0x20	/* OTS Output Enable */
   1392#define VIN_RW1C_MASK	(CHAN_READY|CHAN_ALM_MAX|CHAN_ALM_MIN)   /* 0x87 */
   1393#define TEMP_RW1C_MASK	(VIN_RW1C_MASK|TEMP_ALM_CRIT|TEMP_FAULT) /* 0xCF */
   1394
   1395static void pc87360_init_device(struct platform_device *pdev,
   1396				int use_thermistors)
   1397{
   1398	struct pc87360_data *data = platform_get_drvdata(pdev);
   1399	int i, nr;
   1400	const u8 init_in[14] = { 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 1, 2, 2, 2 };
   1401	const u8 init_temp[3] = { 2, 2, 1 };
   1402	u8 reg;
   1403
   1404	if (init >= 2 && data->innr) {
   1405		reg = pc87360_read_value(data, LD_IN, NO_BANK,
   1406					 PC87365_REG_IN_CONVRATE);
   1407		dev_info(&pdev->dev,
   1408			 "VLM conversion set to 1s period, 160us delay\n");
   1409		pc87360_write_value(data, LD_IN, NO_BANK,
   1410				    PC87365_REG_IN_CONVRATE,
   1411				    (reg & 0xC0) | 0x11);
   1412	}
   1413
   1414	nr = data->innr < 11 ? data->innr : 11;
   1415	for (i = 0; i < nr; i++) {
   1416		reg = pc87360_read_value(data, LD_IN, i,
   1417					 PC87365_REG_IN_STATUS);
   1418		dev_dbg(&pdev->dev, "bios in%d status:0x%02x\n", i, reg);
   1419		if (init >= init_in[i]) {
   1420			/* Forcibly enable voltage channel */
   1421			if (!(reg & CHAN_ENA)) {
   1422				dev_dbg(&pdev->dev, "Forcibly enabling in%d\n",
   1423					i);
   1424				pc87360_write_value(data, LD_IN, i,
   1425						    PC87365_REG_IN_STATUS,
   1426						    (reg & 0x68) | 0x87);
   1427			}
   1428		}
   1429	}
   1430
   1431	/*
   1432	 * We can't blindly trust the Super-I/O space configuration bit,
   1433	 * most BIOS won't set it properly
   1434	 */
   1435	dev_dbg(&pdev->dev, "bios thermistors:%d\n", use_thermistors);
   1436	for (i = 11; i < data->innr; i++) {
   1437		reg = pc87360_read_value(data, LD_IN, i,
   1438					 PC87365_REG_TEMP_STATUS);
   1439		use_thermistors = use_thermistors || (reg & CHAN_ENA);
   1440		/* thermistors are temp[4-6], measured on vin[11-14] */
   1441		dev_dbg(&pdev->dev, "bios temp%d_status:0x%02x\n", i-7, reg);
   1442	}
   1443	dev_dbg(&pdev->dev, "using thermistors:%d\n", use_thermistors);
   1444
   1445	i = use_thermistors ? 2 : 0;
   1446	for (; i < data->tempnr; i++) {
   1447		reg = pc87360_read_value(data, LD_TEMP, i,
   1448					 PC87365_REG_TEMP_STATUS);
   1449		dev_dbg(&pdev->dev, "bios temp%d_status:0x%02x\n", i + 1, reg);
   1450		if (init >= init_temp[i]) {
   1451			/* Forcibly enable temperature channel */
   1452			if (!(reg & CHAN_ENA)) {
   1453				dev_dbg(&pdev->dev,
   1454					"Forcibly enabling temp%d\n", i + 1);
   1455				pc87360_write_value(data, LD_TEMP, i,
   1456						    PC87365_REG_TEMP_STATUS,
   1457						    0xCF);
   1458			}
   1459		}
   1460	}
   1461
   1462	if (use_thermistors) {
   1463		for (i = 11; i < data->innr; i++) {
   1464			if (init >= init_in[i]) {
   1465				/*
   1466				 * The pin may already be used by thermal
   1467				 * diodes
   1468				 */
   1469				reg = pc87360_read_value(data, LD_TEMP,
   1470				      (i - 11) / 2, PC87365_REG_TEMP_STATUS);
   1471				if (reg & CHAN_ENA) {
   1472					dev_dbg(&pdev->dev,
   1473			"Skipping temp%d, pin already in use by temp%d\n",
   1474						i - 7, (i - 11) / 2);
   1475					continue;
   1476				}
   1477
   1478				/* Forcibly enable thermistor channel */
   1479				reg = pc87360_read_value(data, LD_IN, i,
   1480							 PC87365_REG_IN_STATUS);
   1481				if (!(reg & CHAN_ENA)) {
   1482					dev_dbg(&pdev->dev,
   1483						"Forcibly enabling temp%d\n",
   1484						i - 7);
   1485					pc87360_write_value(data, LD_IN, i,
   1486						PC87365_REG_TEMP_STATUS,
   1487						(reg & 0x60) | 0x8F);
   1488				}
   1489			}
   1490		}
   1491	}
   1492
   1493	if (data->innr) {
   1494		reg = pc87360_read_value(data, LD_IN, NO_BANK,
   1495					 PC87365_REG_IN_CONFIG);
   1496		dev_dbg(&pdev->dev, "bios vin-cfg:0x%02x\n", reg);
   1497		if (reg & CHAN_ENA) {
   1498			dev_dbg(&pdev->dev,
   1499				"Forcibly enabling monitoring (VLM)\n");
   1500			pc87360_write_value(data, LD_IN, NO_BANK,
   1501					    PC87365_REG_IN_CONFIG,
   1502					    reg & 0xFE);
   1503		}
   1504	}
   1505
   1506	if (data->tempnr) {
   1507		reg = pc87360_read_value(data, LD_TEMP, NO_BANK,
   1508					 PC87365_REG_TEMP_CONFIG);
   1509		dev_dbg(&pdev->dev, "bios temp-cfg:0x%02x\n", reg);
   1510		if (reg & CHAN_ENA) {
   1511			dev_dbg(&pdev->dev,
   1512				"Forcibly enabling monitoring (TMS)\n");
   1513			pc87360_write_value(data, LD_TEMP, NO_BANK,
   1514					    PC87365_REG_TEMP_CONFIG,
   1515					    reg & 0xFE);
   1516		}
   1517
   1518		if (init >= 2) {
   1519			/* Chip config as documented by National Semi. */
   1520			pc87360_write_value(data, LD_TEMP, 0xF, 0xA, 0x08);
   1521			/*
   1522			 * We voluntarily omit the bank here, in case the
   1523			 * sequence itself matters. It shouldn't be a problem,
   1524			 * since nobody else is supposed to access the
   1525			 * device at that point.
   1526			 */
   1527			pc87360_write_value(data, LD_TEMP, NO_BANK, 0xB, 0x04);
   1528			pc87360_write_value(data, LD_TEMP, NO_BANK, 0xC, 0x35);
   1529			pc87360_write_value(data, LD_TEMP, NO_BANK, 0xD, 0x05);
   1530			pc87360_write_value(data, LD_TEMP, NO_BANK, 0xE, 0x05);
   1531		}
   1532	}
   1533}
   1534
   1535static void pc87360_autodiv(struct device *dev, int nr)
   1536{
   1537	struct pc87360_data *data = dev_get_drvdata(dev);
   1538	u8 old_min = data->fan_min[nr];
   1539
   1540	/* Increase clock divider if needed and possible */
   1541	if ((data->fan_status[nr] & 0x04) /* overflow flag */
   1542	 || (data->fan[nr] >= 224)) { /* next to overflow */
   1543		if ((data->fan_status[nr] & 0x60) != 0x60) {
   1544			data->fan_status[nr] += 0x20;
   1545			data->fan_min[nr] >>= 1;
   1546			data->fan[nr] >>= 1;
   1547			dev_dbg(dev,
   1548				"Increasing clock divider to %d for fan %d\n",
   1549				FAN_DIV_FROM_REG(data->fan_status[nr]), nr + 1);
   1550		}
   1551	} else {
   1552		/* Decrease clock divider if possible */
   1553		while (!(data->fan_min[nr] & 0x80) /* min "nails" divider */
   1554		 && data->fan[nr] < 85 /* bad accuracy */
   1555		 && (data->fan_status[nr] & 0x60) != 0x00) {
   1556			data->fan_status[nr] -= 0x20;
   1557			data->fan_min[nr] <<= 1;
   1558			data->fan[nr] <<= 1;
   1559			dev_dbg(dev,
   1560				"Decreasing clock divider to %d for fan %d\n",
   1561				FAN_DIV_FROM_REG(data->fan_status[nr]),
   1562				nr + 1);
   1563		}
   1564	}
   1565
   1566	/* Write new fan min if it changed */
   1567	if (old_min != data->fan_min[nr]) {
   1568		pc87360_write_value(data, LD_FAN, NO_BANK,
   1569				    PC87360_REG_FAN_MIN(nr),
   1570				    data->fan_min[nr]);
   1571	}
   1572}
   1573
   1574static struct pc87360_data *pc87360_update_device(struct device *dev)
   1575{
   1576	struct pc87360_data *data = dev_get_drvdata(dev);
   1577	u8 i;
   1578
   1579	mutex_lock(&data->update_lock);
   1580
   1581	if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) {
   1582		dev_dbg(dev, "Data update\n");
   1583
   1584		/* Fans */
   1585		for (i = 0; i < data->fannr; i++) {
   1586			if (FAN_CONFIG_MONITOR(data->fan_conf, i)) {
   1587				data->fan_status[i] =
   1588					pc87360_read_value(data, LD_FAN,
   1589					NO_BANK, PC87360_REG_FAN_STATUS(i));
   1590				data->fan[i] = pc87360_read_value(data, LD_FAN,
   1591					       NO_BANK, PC87360_REG_FAN(i));
   1592				data->fan_min[i] = pc87360_read_value(data,
   1593						   LD_FAN, NO_BANK,
   1594						   PC87360_REG_FAN_MIN(i));
   1595				/* Change clock divider if needed */
   1596				pc87360_autodiv(dev, i);
   1597				/* Clear bits and write new divider */
   1598				pc87360_write_value(data, LD_FAN, NO_BANK,
   1599						    PC87360_REG_FAN_STATUS(i),
   1600						    data->fan_status[i]);
   1601			}
   1602			if (FAN_CONFIG_CONTROL(data->fan_conf, i))
   1603				data->pwm[i] = pc87360_read_value(data, LD_FAN,
   1604					       NO_BANK, PC87360_REG_PWM(i));
   1605		}
   1606
   1607		/* Voltages */
   1608		for (i = 0; i < data->innr; i++) {
   1609			data->in_status[i] = pc87360_read_value(data, LD_IN, i,
   1610					     PC87365_REG_IN_STATUS);
   1611			/* Clear bits */
   1612			pc87360_write_value(data, LD_IN, i,
   1613					    PC87365_REG_IN_STATUS,
   1614					    data->in_status[i]);
   1615			if ((data->in_status[i] & CHAN_READY) == CHAN_READY) {
   1616				data->in[i] = pc87360_read_value(data, LD_IN,
   1617					      i, PC87365_REG_IN);
   1618			}
   1619			if (data->in_status[i] & CHAN_ENA) {
   1620				data->in_min[i] = pc87360_read_value(data,
   1621						  LD_IN, i,
   1622						  PC87365_REG_IN_MIN);
   1623				data->in_max[i] = pc87360_read_value(data,
   1624						  LD_IN, i,
   1625						  PC87365_REG_IN_MAX);
   1626				if (i >= 11)
   1627					data->in_crit[i-11] =
   1628						pc87360_read_value(data, LD_IN,
   1629						i, PC87365_REG_TEMP_CRIT);
   1630			}
   1631		}
   1632		if (data->innr) {
   1633			data->in_alarms = pc87360_read_value(data, LD_IN,
   1634					  NO_BANK, PC87365_REG_IN_ALARMS1)
   1635					| ((pc87360_read_value(data, LD_IN,
   1636					    NO_BANK, PC87365_REG_IN_ALARMS2)
   1637					    & 0x07) << 8);
   1638			data->vid = (data->vid_conf & 0xE0) ?
   1639				    pc87360_read_value(data, LD_IN,
   1640				    NO_BANK, PC87365_REG_VID) : 0x1F;
   1641		}
   1642
   1643		/* Temperatures */
   1644		for (i = 0; i < data->tempnr; i++) {
   1645			data->temp_status[i] = pc87360_read_value(data,
   1646					       LD_TEMP, i,
   1647					       PC87365_REG_TEMP_STATUS);
   1648			/* Clear bits */
   1649			pc87360_write_value(data, LD_TEMP, i,
   1650					    PC87365_REG_TEMP_STATUS,
   1651					    data->temp_status[i]);
   1652			if ((data->temp_status[i] & CHAN_READY) == CHAN_READY) {
   1653				data->temp[i] = pc87360_read_value(data,
   1654						LD_TEMP, i,
   1655						PC87365_REG_TEMP);
   1656			}
   1657			if (data->temp_status[i] & CHAN_ENA) {
   1658				data->temp_min[i] = pc87360_read_value(data,
   1659						    LD_TEMP, i,
   1660						    PC87365_REG_TEMP_MIN);
   1661				data->temp_max[i] = pc87360_read_value(data,
   1662						    LD_TEMP, i,
   1663						    PC87365_REG_TEMP_MAX);
   1664				data->temp_crit[i] = pc87360_read_value(data,
   1665						     LD_TEMP, i,
   1666						     PC87365_REG_TEMP_CRIT);
   1667			}
   1668		}
   1669		if (data->tempnr) {
   1670			data->temp_alarms = pc87360_read_value(data, LD_TEMP,
   1671					    NO_BANK, PC87365_REG_TEMP_ALARMS)
   1672					    & 0x3F;
   1673		}
   1674
   1675		data->last_updated = jiffies;
   1676		data->valid = true;
   1677	}
   1678
   1679	mutex_unlock(&data->update_lock);
   1680
   1681	return data;
   1682}
   1683
   1684static int __init pc87360_device_add(unsigned short address)
   1685{
   1686	struct resource res[3];
   1687	int err, i, res_count;
   1688
   1689	pdev = platform_device_alloc("pc87360", address);
   1690	if (!pdev) {
   1691		err = -ENOMEM;
   1692		pr_err("Device allocation failed\n");
   1693		goto exit;
   1694	}
   1695
   1696	memset(res, 0, 3 * sizeof(struct resource));
   1697	res_count = 0;
   1698	for (i = 0; i < 3; i++) {
   1699		if (!extra_isa[i])
   1700			continue;
   1701		res[res_count].start = extra_isa[i];
   1702		res[res_count].end = extra_isa[i] + PC87360_EXTENT - 1;
   1703		res[res_count].name = "pc87360";
   1704		res[res_count].flags = IORESOURCE_IO;
   1705
   1706		err = acpi_check_resource_conflict(&res[res_count]);
   1707		if (err)
   1708			goto exit_device_put;
   1709
   1710		res_count++;
   1711	}
   1712
   1713	err = platform_device_add_resources(pdev, res, res_count);
   1714	if (err) {
   1715		pr_err("Device resources addition failed (%d)\n", err);
   1716		goto exit_device_put;
   1717	}
   1718
   1719	err = platform_device_add(pdev);
   1720	if (err) {
   1721		pr_err("Device addition failed (%d)\n", err);
   1722		goto exit_device_put;
   1723	}
   1724
   1725	return 0;
   1726
   1727exit_device_put:
   1728	platform_device_put(pdev);
   1729exit:
   1730	return err;
   1731}
   1732
   1733static int __init pc87360_init(void)
   1734{
   1735	int err, i;
   1736	unsigned short address = 0;
   1737
   1738	if (pc87360_find(0x2e, &devid, extra_isa)
   1739	 && pc87360_find(0x4e, &devid, extra_isa)) {
   1740		pr_warn("PC8736x not detected, module not inserted\n");
   1741		return -ENODEV;
   1742	}
   1743
   1744	/* Arbitrarily pick one of the addresses */
   1745	for (i = 0; i < 3; i++) {
   1746		if (extra_isa[i] != 0x0000) {
   1747			address = extra_isa[i];
   1748			break;
   1749		}
   1750	}
   1751
   1752	if (address == 0x0000) {
   1753		pr_warn("No active logical device, module not inserted\n");
   1754		return -ENODEV;
   1755	}
   1756
   1757	err = platform_driver_register(&pc87360_driver);
   1758	if (err)
   1759		goto exit;
   1760
   1761	/* Sets global pdev as a side effect */
   1762	err = pc87360_device_add(address);
   1763	if (err)
   1764		goto exit_driver;
   1765
   1766	return 0;
   1767
   1768 exit_driver:
   1769	platform_driver_unregister(&pc87360_driver);
   1770 exit:
   1771	return err;
   1772}
   1773
   1774static void __exit pc87360_exit(void)
   1775{
   1776	platform_device_unregister(pdev);
   1777	platform_driver_unregister(&pc87360_driver);
   1778}
   1779
   1780
   1781MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
   1782MODULE_DESCRIPTION("PC8736x hardware monitor");
   1783MODULE_LICENSE("GPL");
   1784
   1785module_init(pc87360_init);
   1786module_exit(pc87360_exit);