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

gl520sm.c (25308B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * gl520sm.c - Part of lm_sensors, Linux kernel modules for hardware
      4 *	       monitoring
      5 * Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>,
      6 *			     Kyösti Mälkki <kmalkki@cc.hut.fi>
      7 * Copyright (c) 2005	Maarten Deprez <maartendeprez@users.sourceforge.net>
      8 */
      9
     10#include <linux/module.h>
     11#include <linux/init.h>
     12#include <linux/slab.h>
     13#include <linux/jiffies.h>
     14#include <linux/i2c.h>
     15#include <linux/hwmon.h>
     16#include <linux/hwmon-sysfs.h>
     17#include <linux/hwmon-vid.h>
     18#include <linux/err.h>
     19#include <linux/mutex.h>
     20#include <linux/sysfs.h>
     21
     22/* Type of the extra sensor */
     23static unsigned short extra_sensor_type;
     24module_param(extra_sensor_type, ushort, 0);
     25MODULE_PARM_DESC(extra_sensor_type, "Type of extra sensor (0=autodetect, 1=temperature, 2=voltage)");
     26
     27/* Addresses to scan */
     28static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
     29
     30/*
     31 * Many GL520 constants specified below
     32 * One of the inputs can be configured as either temp or voltage.
     33 * That's why _TEMP2 and _IN4 access the same register
     34 */
     35
     36/* The GL520 registers */
     37#define GL520_REG_CHIP_ID		0x00
     38#define GL520_REG_REVISION		0x01
     39#define GL520_REG_CONF			0x03
     40#define GL520_REG_MASK			0x11
     41
     42#define GL520_REG_VID_INPUT		0x02
     43
     44static const u8 GL520_REG_IN_INPUT[]	= { 0x15, 0x14, 0x13, 0x0d, 0x0e };
     45static const u8 GL520_REG_IN_LIMIT[]	= { 0x0c, 0x09, 0x0a, 0x0b };
     46static const u8 GL520_REG_IN_MIN[]	= { 0x0c, 0x09, 0x0a, 0x0b, 0x18 };
     47static const u8 GL520_REG_IN_MAX[]	= { 0x0c, 0x09, 0x0a, 0x0b, 0x17 };
     48
     49static const u8 GL520_REG_TEMP_INPUT[]		= { 0x04, 0x0e };
     50static const u8 GL520_REG_TEMP_MAX[]		= { 0x05, 0x17 };
     51static const u8 GL520_REG_TEMP_MAX_HYST[]	= { 0x06, 0x18 };
     52
     53#define GL520_REG_FAN_INPUT		0x07
     54#define GL520_REG_FAN_MIN		0x08
     55#define GL520_REG_FAN_DIV		0x0f
     56#define GL520_REG_FAN_OFF		GL520_REG_FAN_DIV
     57
     58#define GL520_REG_ALARMS		0x12
     59#define GL520_REG_BEEP_MASK		0x10
     60#define GL520_REG_BEEP_ENABLE		GL520_REG_CONF
     61
     62/* Client data */
     63struct gl520_data {
     64	struct i2c_client *client;
     65	const struct attribute_group *groups[3];
     66	struct mutex update_lock;
     67	bool valid;		/* false until the following fields are valid */
     68	unsigned long last_updated;	/* in jiffies */
     69
     70	u8 vid;
     71	u8 vrm;
     72	u8 in_input[5];		/* [0] = VVD */
     73	u8 in_min[5];		/* [0] = VDD */
     74	u8 in_max[5];		/* [0] = VDD */
     75	u8 fan_input[2];
     76	u8 fan_min[2];
     77	u8 fan_div[2];
     78	u8 fan_off;
     79	u8 temp_input[2];
     80	u8 temp_max[2];
     81	u8 temp_max_hyst[2];
     82	u8 alarms;
     83	u8 beep_enable;
     84	u8 beep_mask;
     85	u8 alarm_mask;
     86	u8 two_temps;
     87};
     88
     89/*
     90 * Registers 0x07 to 0x0c are word-sized, others are byte-sized
     91 * GL520 uses a high-byte first convention
     92 */
     93static int gl520_read_value(struct i2c_client *client, u8 reg)
     94{
     95	if ((reg >= 0x07) && (reg <= 0x0c))
     96		return i2c_smbus_read_word_swapped(client, reg);
     97	else
     98		return i2c_smbus_read_byte_data(client, reg);
     99}
    100
    101static int gl520_write_value(struct i2c_client *client, u8 reg, u16 value)
    102{
    103	if ((reg >= 0x07) && (reg <= 0x0c))
    104		return i2c_smbus_write_word_swapped(client, reg, value);
    105	else
    106		return i2c_smbus_write_byte_data(client, reg, value);
    107}
    108
    109static struct gl520_data *gl520_update_device(struct device *dev)
    110{
    111	struct gl520_data *data = dev_get_drvdata(dev);
    112	struct i2c_client *client = data->client;
    113	int val, i;
    114
    115	mutex_lock(&data->update_lock);
    116
    117	if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
    118
    119		dev_dbg(&client->dev, "Starting gl520sm update\n");
    120
    121		data->alarms = gl520_read_value(client, GL520_REG_ALARMS);
    122		data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
    123		data->vid = gl520_read_value(client,
    124					     GL520_REG_VID_INPUT) & 0x1f;
    125
    126		for (i = 0; i < 4; i++) {
    127			data->in_input[i] = gl520_read_value(client,
    128							GL520_REG_IN_INPUT[i]);
    129			val = gl520_read_value(client, GL520_REG_IN_LIMIT[i]);
    130			data->in_min[i] = val & 0xff;
    131			data->in_max[i] = (val >> 8) & 0xff;
    132		}
    133
    134		val = gl520_read_value(client, GL520_REG_FAN_INPUT);
    135		data->fan_input[0] = (val >> 8) & 0xff;
    136		data->fan_input[1] = val & 0xff;
    137
    138		val = gl520_read_value(client, GL520_REG_FAN_MIN);
    139		data->fan_min[0] = (val >> 8) & 0xff;
    140		data->fan_min[1] = val & 0xff;
    141
    142		data->temp_input[0] = gl520_read_value(client,
    143						GL520_REG_TEMP_INPUT[0]);
    144		data->temp_max[0] = gl520_read_value(client,
    145						GL520_REG_TEMP_MAX[0]);
    146		data->temp_max_hyst[0] = gl520_read_value(client,
    147						GL520_REG_TEMP_MAX_HYST[0]);
    148
    149		val = gl520_read_value(client, GL520_REG_FAN_DIV);
    150		data->fan_div[0] = (val >> 6) & 0x03;
    151		data->fan_div[1] = (val >> 4) & 0x03;
    152		data->fan_off = (val >> 2) & 0x01;
    153
    154		data->alarms &= data->alarm_mask;
    155
    156		val = gl520_read_value(client, GL520_REG_CONF);
    157		data->beep_enable = !((val >> 2) & 1);
    158
    159		/* Temp1 and Vin4 are the same input */
    160		if (data->two_temps) {
    161			data->temp_input[1] = gl520_read_value(client,
    162						GL520_REG_TEMP_INPUT[1]);
    163			data->temp_max[1] = gl520_read_value(client,
    164						GL520_REG_TEMP_MAX[1]);
    165			data->temp_max_hyst[1] = gl520_read_value(client,
    166						GL520_REG_TEMP_MAX_HYST[1]);
    167		} else {
    168			data->in_input[4] = gl520_read_value(client,
    169						GL520_REG_IN_INPUT[4]);
    170			data->in_min[4] = gl520_read_value(client,
    171						GL520_REG_IN_MIN[4]);
    172			data->in_max[4] = gl520_read_value(client,
    173						GL520_REG_IN_MAX[4]);
    174		}
    175
    176		data->last_updated = jiffies;
    177		data->valid = true;
    178	}
    179
    180	mutex_unlock(&data->update_lock);
    181
    182	return data;
    183}
    184
    185/*
    186 * Sysfs stuff
    187 */
    188
    189static ssize_t cpu0_vid_show(struct device *dev,
    190			     struct device_attribute *attr, char *buf)
    191{
    192	struct gl520_data *data = gl520_update_device(dev);
    193	return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
    194}
    195static DEVICE_ATTR_RO(cpu0_vid);
    196
    197#define VDD_FROM_REG(val)	DIV_ROUND_CLOSEST((val) * 95, 4)
    198#define VDD_CLAMP(val)		clamp_val(val, 0, 255 * 95 / 4)
    199#define VDD_TO_REG(val)		DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95)
    200
    201#define IN_FROM_REG(val)	((val) * 19)
    202#define IN_CLAMP(val)		clamp_val(val, 0, 255 * 19)
    203#define IN_TO_REG(val)		DIV_ROUND_CLOSEST(IN_CLAMP(val), 19)
    204
    205static ssize_t in_input_show(struct device *dev,
    206			     struct device_attribute *attr, char *buf)
    207{
    208	int n = to_sensor_dev_attr(attr)->index;
    209	struct gl520_data *data = gl520_update_device(dev);
    210	u8 r = data->in_input[n];
    211
    212	if (n == 0)
    213		return sprintf(buf, "%d\n", VDD_FROM_REG(r));
    214	else
    215		return sprintf(buf, "%d\n", IN_FROM_REG(r));
    216}
    217
    218static ssize_t in_min_show(struct device *dev, struct device_attribute *attr,
    219			   char *buf)
    220{
    221	int n = to_sensor_dev_attr(attr)->index;
    222	struct gl520_data *data = gl520_update_device(dev);
    223	u8 r = data->in_min[n];
    224
    225	if (n == 0)
    226		return sprintf(buf, "%d\n", VDD_FROM_REG(r));
    227	else
    228		return sprintf(buf, "%d\n", IN_FROM_REG(r));
    229}
    230
    231static ssize_t in_max_show(struct device *dev, struct device_attribute *attr,
    232			   char *buf)
    233{
    234	int n = to_sensor_dev_attr(attr)->index;
    235	struct gl520_data *data = gl520_update_device(dev);
    236	u8 r = data->in_max[n];
    237
    238	if (n == 0)
    239		return sprintf(buf, "%d\n", VDD_FROM_REG(r));
    240	else
    241		return sprintf(buf, "%d\n", IN_FROM_REG(r));
    242}
    243
    244static ssize_t in_min_store(struct device *dev, struct device_attribute *attr,
    245			    const char *buf, size_t count)
    246{
    247	struct gl520_data *data = dev_get_drvdata(dev);
    248	struct i2c_client *client = data->client;
    249	int n = to_sensor_dev_attr(attr)->index;
    250	u8 r;
    251	long v;
    252	int err;
    253
    254	err = kstrtol(buf, 10, &v);
    255	if (err)
    256		return err;
    257
    258	mutex_lock(&data->update_lock);
    259
    260	if (n == 0)
    261		r = VDD_TO_REG(v);
    262	else
    263		r = IN_TO_REG(v);
    264
    265	data->in_min[n] = r;
    266
    267	if (n < 4)
    268		gl520_write_value(client, GL520_REG_IN_MIN[n],
    269				  (gl520_read_value(client, GL520_REG_IN_MIN[n])
    270				   & ~0xff) | r);
    271	else
    272		gl520_write_value(client, GL520_REG_IN_MIN[n], r);
    273
    274	mutex_unlock(&data->update_lock);
    275	return count;
    276}
    277
    278static ssize_t in_max_store(struct device *dev, struct device_attribute *attr,
    279			    const char *buf, size_t count)
    280{
    281	struct gl520_data *data = dev_get_drvdata(dev);
    282	struct i2c_client *client = data->client;
    283	int n = to_sensor_dev_attr(attr)->index;
    284	u8 r;
    285	long v;
    286	int err;
    287
    288	err = kstrtol(buf, 10, &v);
    289	if (err)
    290		return err;
    291
    292	if (n == 0)
    293		r = VDD_TO_REG(v);
    294	else
    295		r = IN_TO_REG(v);
    296
    297	mutex_lock(&data->update_lock);
    298
    299	data->in_max[n] = r;
    300
    301	if (n < 4)
    302		gl520_write_value(client, GL520_REG_IN_MAX[n],
    303				  (gl520_read_value(client, GL520_REG_IN_MAX[n])
    304				   & ~0xff00) | (r << 8));
    305	else
    306		gl520_write_value(client, GL520_REG_IN_MAX[n], r);
    307
    308	mutex_unlock(&data->update_lock);
    309	return count;
    310}
    311
    312static SENSOR_DEVICE_ATTR_RO(in0_input, in_input, 0);
    313static SENSOR_DEVICE_ATTR_RO(in1_input, in_input, 1);
    314static SENSOR_DEVICE_ATTR_RO(in2_input, in_input, 2);
    315static SENSOR_DEVICE_ATTR_RO(in3_input, in_input, 3);
    316static SENSOR_DEVICE_ATTR_RO(in4_input, in_input, 4);
    317static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
    318static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
    319static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
    320static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
    321static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
    322static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
    323static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
    324static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
    325static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
    326static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
    327
    328#define DIV_FROM_REG(val) (1 << (val))
    329#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) << (div))))
    330
    331#define FAN_BASE(div)		(480000 >> (div))
    332#define FAN_CLAMP(val, div)	clamp_val(val, FAN_BASE(div) / 255, \
    333					  FAN_BASE(div))
    334#define FAN_TO_REG(val, div)	((val) == 0 ? 0 : \
    335				 DIV_ROUND_CLOSEST(480000, \
    336						FAN_CLAMP(val, div) << (div)))
    337
    338static ssize_t fan_input_show(struct device *dev,
    339			      struct device_attribute *attr, char *buf)
    340{
    341	int n = to_sensor_dev_attr(attr)->index;
    342	struct gl520_data *data = gl520_update_device(dev);
    343
    344	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_input[n],
    345						 data->fan_div[n]));
    346}
    347
    348static ssize_t fan_min_show(struct device *dev, struct device_attribute *attr,
    349			    char *buf)
    350{
    351	int n = to_sensor_dev_attr(attr)->index;
    352	struct gl520_data *data = gl520_update_device(dev);
    353
    354	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[n],
    355						 data->fan_div[n]));
    356}
    357
    358static ssize_t fan_div_show(struct device *dev, struct device_attribute *attr,
    359			    char *buf)
    360{
    361	int n = to_sensor_dev_attr(attr)->index;
    362	struct gl520_data *data = gl520_update_device(dev);
    363
    364	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[n]));
    365}
    366
    367static ssize_t fan1_off_show(struct device *dev,
    368			     struct device_attribute *attr, char *buf)
    369{
    370	struct gl520_data *data = gl520_update_device(dev);
    371	return sprintf(buf, "%d\n", data->fan_off);
    372}
    373
    374static ssize_t fan_min_store(struct device *dev,
    375			     struct device_attribute *attr, const char *buf,
    376			     size_t count)
    377{
    378	struct gl520_data *data = dev_get_drvdata(dev);
    379	struct i2c_client *client = data->client;
    380	int n = to_sensor_dev_attr(attr)->index;
    381	u8 r;
    382	unsigned long v;
    383	int err;
    384
    385	err = kstrtoul(buf, 10, &v);
    386	if (err)
    387		return err;
    388
    389	mutex_lock(&data->update_lock);
    390	r = FAN_TO_REG(v, data->fan_div[n]);
    391	data->fan_min[n] = r;
    392
    393	if (n == 0)
    394		gl520_write_value(client, GL520_REG_FAN_MIN,
    395				  (gl520_read_value(client, GL520_REG_FAN_MIN)
    396				   & ~0xff00) | (r << 8));
    397	else
    398		gl520_write_value(client, GL520_REG_FAN_MIN,
    399				  (gl520_read_value(client, GL520_REG_FAN_MIN)
    400				   & ~0xff) | r);
    401
    402	data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
    403	if (data->fan_min[n] == 0)
    404		data->alarm_mask &= (n == 0) ? ~0x20 : ~0x40;
    405	else
    406		data->alarm_mask |= (n == 0) ? 0x20 : 0x40;
    407	data->beep_mask &= data->alarm_mask;
    408	gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
    409
    410	mutex_unlock(&data->update_lock);
    411	return count;
    412}
    413
    414static ssize_t fan_div_store(struct device *dev,
    415			     struct device_attribute *attr, const char *buf,
    416			     size_t count)
    417{
    418	struct gl520_data *data = dev_get_drvdata(dev);
    419	struct i2c_client *client = data->client;
    420	int n = to_sensor_dev_attr(attr)->index;
    421	u8 r;
    422	unsigned long v;
    423	int err;
    424
    425	err = kstrtoul(buf, 10, &v);
    426	if (err)
    427		return err;
    428
    429	switch (v) {
    430	case 1:
    431		r = 0;
    432		break;
    433	case 2:
    434		r = 1;
    435		break;
    436	case 4:
    437		r = 2;
    438		break;
    439	case 8:
    440		r = 3;
    441		break;
    442	default:
    443		dev_err(&client->dev,
    444	"fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n", v);
    445		return -EINVAL;
    446	}
    447
    448	mutex_lock(&data->update_lock);
    449	data->fan_div[n] = r;
    450
    451	if (n == 0)
    452		gl520_write_value(client, GL520_REG_FAN_DIV,
    453				  (gl520_read_value(client, GL520_REG_FAN_DIV)
    454				   & ~0xc0) | (r << 6));
    455	else
    456		gl520_write_value(client, GL520_REG_FAN_DIV,
    457				  (gl520_read_value(client, GL520_REG_FAN_DIV)
    458				   & ~0x30) | (r << 4));
    459
    460	mutex_unlock(&data->update_lock);
    461	return count;
    462}
    463
    464static ssize_t fan1_off_store(struct device *dev,
    465			      struct device_attribute *attr, const char *buf,
    466			      size_t count)
    467{
    468	struct gl520_data *data = dev_get_drvdata(dev);
    469	struct i2c_client *client = data->client;
    470	u8 r;
    471	unsigned long v;
    472	int err;
    473
    474	err = kstrtoul(buf, 10, &v);
    475	if (err)
    476		return err;
    477
    478	r = (v ? 1 : 0);
    479
    480	mutex_lock(&data->update_lock);
    481	data->fan_off = r;
    482	gl520_write_value(client, GL520_REG_FAN_OFF,
    483			  (gl520_read_value(client, GL520_REG_FAN_OFF)
    484			   & ~0x0c) | (r << 2));
    485	mutex_unlock(&data->update_lock);
    486	return count;
    487}
    488
    489static SENSOR_DEVICE_ATTR_RO(fan1_input, fan_input, 0);
    490static SENSOR_DEVICE_ATTR_RO(fan2_input, fan_input, 1);
    491static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
    492static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
    493static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
    494static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
    495static DEVICE_ATTR_RW(fan1_off);
    496
    497#define TEMP_FROM_REG(val)	(((val) - 130) * 1000)
    498#define TEMP_CLAMP(val)		clamp_val(val, -130000, 125000)
    499#define TEMP_TO_REG(val)	(DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 130)
    500
    501static ssize_t temp_input_show(struct device *dev,
    502			       struct device_attribute *attr, char *buf)
    503{
    504	int n = to_sensor_dev_attr(attr)->index;
    505	struct gl520_data *data = gl520_update_device(dev);
    506
    507	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_input[n]));
    508}
    509
    510static ssize_t temp_max_show(struct device *dev,
    511			     struct device_attribute *attr, char *buf)
    512{
    513	int n = to_sensor_dev_attr(attr)->index;
    514	struct gl520_data *data = gl520_update_device(dev);
    515
    516	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[n]));
    517}
    518
    519static ssize_t temp_max_hyst_show(struct device *dev,
    520				  struct device_attribute *attr, char *buf)
    521{
    522	int n = to_sensor_dev_attr(attr)->index;
    523	struct gl520_data *data = gl520_update_device(dev);
    524
    525	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max_hyst[n]));
    526}
    527
    528static ssize_t temp_max_store(struct device *dev,
    529			      struct device_attribute *attr, const char *buf,
    530			      size_t count)
    531{
    532	struct gl520_data *data = dev_get_drvdata(dev);
    533	struct i2c_client *client = data->client;
    534	int n = to_sensor_dev_attr(attr)->index;
    535	long v;
    536	int err;
    537
    538	err = kstrtol(buf, 10, &v);
    539	if (err)
    540		return err;
    541
    542	mutex_lock(&data->update_lock);
    543	data->temp_max[n] = TEMP_TO_REG(v);
    544	gl520_write_value(client, GL520_REG_TEMP_MAX[n], data->temp_max[n]);
    545	mutex_unlock(&data->update_lock);
    546	return count;
    547}
    548
    549static ssize_t temp_max_hyst_store(struct device *dev,
    550				   struct device_attribute *attr,
    551				   const char *buf, size_t count)
    552{
    553	struct gl520_data *data = dev_get_drvdata(dev);
    554	struct i2c_client *client = data->client;
    555	int n = to_sensor_dev_attr(attr)->index;
    556	long v;
    557	int err;
    558
    559	err = kstrtol(buf, 10, &v);
    560	if (err)
    561		return err;
    562
    563	mutex_lock(&data->update_lock);
    564	data->temp_max_hyst[n] = TEMP_TO_REG(v);
    565	gl520_write_value(client, GL520_REG_TEMP_MAX_HYST[n],
    566			  data->temp_max_hyst[n]);
    567	mutex_unlock(&data->update_lock);
    568	return count;
    569}
    570
    571static SENSOR_DEVICE_ATTR_RO(temp1_input, temp_input, 0);
    572static SENSOR_DEVICE_ATTR_RO(temp2_input, temp_input, 1);
    573static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_max, 0);
    574static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1);
    575static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, temp_max_hyst, 0);
    576static SENSOR_DEVICE_ATTR_RW(temp2_max_hyst, temp_max_hyst, 1);
    577
    578static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
    579			   char *buf)
    580{
    581	struct gl520_data *data = gl520_update_device(dev);
    582	return sprintf(buf, "%d\n", data->alarms);
    583}
    584
    585static ssize_t beep_enable_show(struct device *dev,
    586				struct device_attribute *attr, char *buf)
    587{
    588	struct gl520_data *data = gl520_update_device(dev);
    589	return sprintf(buf, "%d\n", data->beep_enable);
    590}
    591
    592static ssize_t beep_mask_show(struct device *dev,
    593			      struct device_attribute *attr, char *buf)
    594{
    595	struct gl520_data *data = gl520_update_device(dev);
    596	return sprintf(buf, "%d\n", data->beep_mask);
    597}
    598
    599static ssize_t beep_enable_store(struct device *dev,
    600				 struct device_attribute *attr,
    601				 const char *buf, size_t count)
    602{
    603	struct gl520_data *data = dev_get_drvdata(dev);
    604	struct i2c_client *client = data->client;
    605	u8 r;
    606	unsigned long v;
    607	int err;
    608
    609	err = kstrtoul(buf, 10, &v);
    610	if (err)
    611		return err;
    612
    613	r = (v ? 0 : 1);
    614
    615	mutex_lock(&data->update_lock);
    616	data->beep_enable = !r;
    617	gl520_write_value(client, GL520_REG_BEEP_ENABLE,
    618			  (gl520_read_value(client, GL520_REG_BEEP_ENABLE)
    619			   & ~0x04) | (r << 2));
    620	mutex_unlock(&data->update_lock);
    621	return count;
    622}
    623
    624static ssize_t beep_mask_store(struct device *dev,
    625			       struct device_attribute *attr, const char *buf,
    626			       size_t count)
    627{
    628	struct gl520_data *data = dev_get_drvdata(dev);
    629	struct i2c_client *client = data->client;
    630	unsigned long r;
    631	int err;
    632
    633	err = kstrtoul(buf, 10, &r);
    634	if (err)
    635		return err;
    636
    637	mutex_lock(&data->update_lock);
    638	r &= data->alarm_mask;
    639	data->beep_mask = r;
    640	gl520_write_value(client, GL520_REG_BEEP_MASK, r);
    641	mutex_unlock(&data->update_lock);
    642	return count;
    643}
    644
    645static DEVICE_ATTR_RO(alarms);
    646static DEVICE_ATTR_RW(beep_enable);
    647static DEVICE_ATTR_RW(beep_mask);
    648
    649static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
    650			  char *buf)
    651{
    652	int bit_nr = to_sensor_dev_attr(attr)->index;
    653	struct gl520_data *data = gl520_update_device(dev);
    654
    655	return sprintf(buf, "%d\n", (data->alarms >> bit_nr) & 1);
    656}
    657
    658static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
    659static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
    660static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
    661static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
    662static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4);
    663static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 5);
    664static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 6);
    665static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 7);
    666static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 7);
    667
    668static ssize_t beep_show(struct device *dev, struct device_attribute *attr,
    669			 char *buf)
    670{
    671	int bitnr = to_sensor_dev_attr(attr)->index;
    672	struct gl520_data *data = gl520_update_device(dev);
    673
    674	return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);
    675}
    676
    677static ssize_t beep_store(struct device *dev, struct device_attribute *attr,
    678			  const char *buf, size_t count)
    679{
    680	struct gl520_data *data = dev_get_drvdata(dev);
    681	struct i2c_client *client = data->client;
    682	int bitnr = to_sensor_dev_attr(attr)->index;
    683	unsigned long bit;
    684
    685	int err;
    686
    687	err = kstrtoul(buf, 10, &bit);
    688	if (err)
    689		return err;
    690	if (bit & ~1)
    691		return -EINVAL;
    692
    693	mutex_lock(&data->update_lock);
    694	data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK);
    695	if (bit)
    696		data->beep_mask |= (1 << bitnr);
    697	else
    698		data->beep_mask &= ~(1 << bitnr);
    699	gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
    700	mutex_unlock(&data->update_lock);
    701	return count;
    702}
    703
    704static SENSOR_DEVICE_ATTR_RW(in0_beep, beep, 0);
    705static SENSOR_DEVICE_ATTR_RW(in1_beep, beep, 1);
    706static SENSOR_DEVICE_ATTR_RW(in2_beep, beep, 2);
    707static SENSOR_DEVICE_ATTR_RW(in3_beep, beep, 3);
    708static SENSOR_DEVICE_ATTR_RW(temp1_beep, beep, 4);
    709static SENSOR_DEVICE_ATTR_RW(fan1_beep, beep, 5);
    710static SENSOR_DEVICE_ATTR_RW(fan2_beep, beep, 6);
    711static SENSOR_DEVICE_ATTR_RW(temp2_beep, beep, 7);
    712static SENSOR_DEVICE_ATTR_RW(in4_beep, beep, 7);
    713
    714static struct attribute *gl520_attributes[] = {
    715	&dev_attr_cpu0_vid.attr,
    716
    717	&sensor_dev_attr_in0_input.dev_attr.attr,
    718	&sensor_dev_attr_in0_min.dev_attr.attr,
    719	&sensor_dev_attr_in0_max.dev_attr.attr,
    720	&sensor_dev_attr_in0_alarm.dev_attr.attr,
    721	&sensor_dev_attr_in0_beep.dev_attr.attr,
    722	&sensor_dev_attr_in1_input.dev_attr.attr,
    723	&sensor_dev_attr_in1_min.dev_attr.attr,
    724	&sensor_dev_attr_in1_max.dev_attr.attr,
    725	&sensor_dev_attr_in1_alarm.dev_attr.attr,
    726	&sensor_dev_attr_in1_beep.dev_attr.attr,
    727	&sensor_dev_attr_in2_input.dev_attr.attr,
    728	&sensor_dev_attr_in2_min.dev_attr.attr,
    729	&sensor_dev_attr_in2_max.dev_attr.attr,
    730	&sensor_dev_attr_in2_alarm.dev_attr.attr,
    731	&sensor_dev_attr_in2_beep.dev_attr.attr,
    732	&sensor_dev_attr_in3_input.dev_attr.attr,
    733	&sensor_dev_attr_in3_min.dev_attr.attr,
    734	&sensor_dev_attr_in3_max.dev_attr.attr,
    735	&sensor_dev_attr_in3_alarm.dev_attr.attr,
    736	&sensor_dev_attr_in3_beep.dev_attr.attr,
    737
    738	&sensor_dev_attr_fan1_input.dev_attr.attr,
    739	&sensor_dev_attr_fan1_min.dev_attr.attr,
    740	&sensor_dev_attr_fan1_div.dev_attr.attr,
    741	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
    742	&sensor_dev_attr_fan1_beep.dev_attr.attr,
    743	&dev_attr_fan1_off.attr,
    744	&sensor_dev_attr_fan2_input.dev_attr.attr,
    745	&sensor_dev_attr_fan2_min.dev_attr.attr,
    746	&sensor_dev_attr_fan2_div.dev_attr.attr,
    747	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
    748	&sensor_dev_attr_fan2_beep.dev_attr.attr,
    749
    750	&sensor_dev_attr_temp1_input.dev_attr.attr,
    751	&sensor_dev_attr_temp1_max.dev_attr.attr,
    752	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
    753	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
    754	&sensor_dev_attr_temp1_beep.dev_attr.attr,
    755
    756	&dev_attr_alarms.attr,
    757	&dev_attr_beep_enable.attr,
    758	&dev_attr_beep_mask.attr,
    759	NULL
    760};
    761
    762static const struct attribute_group gl520_group = {
    763	.attrs = gl520_attributes,
    764};
    765
    766static struct attribute *gl520_attributes_in4[] = {
    767	&sensor_dev_attr_in4_input.dev_attr.attr,
    768	&sensor_dev_attr_in4_min.dev_attr.attr,
    769	&sensor_dev_attr_in4_max.dev_attr.attr,
    770	&sensor_dev_attr_in4_alarm.dev_attr.attr,
    771	&sensor_dev_attr_in4_beep.dev_attr.attr,
    772	NULL
    773};
    774
    775static struct attribute *gl520_attributes_temp2[] = {
    776	&sensor_dev_attr_temp2_input.dev_attr.attr,
    777	&sensor_dev_attr_temp2_max.dev_attr.attr,
    778	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
    779	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
    780	&sensor_dev_attr_temp2_beep.dev_attr.attr,
    781	NULL
    782};
    783
    784static const struct attribute_group gl520_group_in4 = {
    785	.attrs = gl520_attributes_in4,
    786};
    787
    788static const struct attribute_group gl520_group_temp2 = {
    789	.attrs = gl520_attributes_temp2,
    790};
    791
    792
    793/*
    794 * Real code
    795 */
    796
    797/* Return 0 if detection is successful, -ENODEV otherwise */
    798static int gl520_detect(struct i2c_client *client, struct i2c_board_info *info)
    799{
    800	struct i2c_adapter *adapter = client->adapter;
    801
    802	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
    803				     I2C_FUNC_SMBUS_WORD_DATA))
    804		return -ENODEV;
    805
    806	/* Determine the chip type. */
    807	if ((gl520_read_value(client, GL520_REG_CHIP_ID) != 0x20) ||
    808	    ((gl520_read_value(client, GL520_REG_REVISION) & 0x7f) != 0x00) ||
    809	    ((gl520_read_value(client, GL520_REG_CONF) & 0x80) != 0x00)) {
    810		dev_dbg(&client->dev, "Unknown chip type, skipping\n");
    811		return -ENODEV;
    812	}
    813
    814	strlcpy(info->type, "gl520sm", I2C_NAME_SIZE);
    815
    816	return 0;
    817}
    818
    819/* Called when we have found a new GL520SM. */
    820static void gl520_init_client(struct i2c_client *client)
    821{
    822	struct gl520_data *data = i2c_get_clientdata(client);
    823	u8 oldconf, conf;
    824
    825	conf = oldconf = gl520_read_value(client, GL520_REG_CONF);
    826
    827	data->alarm_mask = 0xff;
    828	data->vrm = vid_which_vrm();
    829
    830	if (extra_sensor_type == 1)
    831		conf &= ~0x10;
    832	else if (extra_sensor_type == 2)
    833		conf |= 0x10;
    834	data->two_temps = !(conf & 0x10);
    835
    836	/* If IRQ# is disabled, we can safely force comparator mode */
    837	if (!(conf & 0x20))
    838		conf &= 0xf7;
    839
    840	/* Enable monitoring if needed */
    841	conf |= 0x40;
    842
    843	if (conf != oldconf)
    844		gl520_write_value(client, GL520_REG_CONF, conf);
    845
    846	gl520_update_device(&(client->dev));
    847
    848	if (data->fan_min[0] == 0)
    849		data->alarm_mask &= ~0x20;
    850	if (data->fan_min[1] == 0)
    851		data->alarm_mask &= ~0x40;
    852
    853	data->beep_mask &= data->alarm_mask;
    854	gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask);
    855}
    856
    857static int gl520_probe(struct i2c_client *client)
    858{
    859	struct device *dev = &client->dev;
    860	struct device *hwmon_dev;
    861	struct gl520_data *data;
    862
    863	data = devm_kzalloc(dev, sizeof(struct gl520_data), GFP_KERNEL);
    864	if (!data)
    865		return -ENOMEM;
    866
    867	i2c_set_clientdata(client, data);
    868	mutex_init(&data->update_lock);
    869	data->client = client;
    870
    871	/* Initialize the GL520SM chip */
    872	gl520_init_client(client);
    873
    874	/* sysfs hooks */
    875	data->groups[0] = &gl520_group;
    876
    877	if (data->two_temps)
    878		data->groups[1] = &gl520_group_temp2;
    879	else
    880		data->groups[1] = &gl520_group_in4;
    881
    882	hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
    883							   data, data->groups);
    884	return PTR_ERR_OR_ZERO(hwmon_dev);
    885}
    886
    887static const struct i2c_device_id gl520_id[] = {
    888	{ "gl520sm", 0 },
    889	{ }
    890};
    891MODULE_DEVICE_TABLE(i2c, gl520_id);
    892
    893static struct i2c_driver gl520_driver = {
    894	.class		= I2C_CLASS_HWMON,
    895	.driver = {
    896		.name	= "gl520sm",
    897	},
    898	.probe_new	= gl520_probe,
    899	.id_table	= gl520_id,
    900	.detect		= gl520_detect,
    901	.address_list	= normal_i2c,
    902};
    903
    904module_i2c_driver(gl520_driver);
    905
    906MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
    907	"Kyösti Mälkki <kmalkki@cc.hut.fi>, "
    908	"Maarten Deprez <maartendeprez@users.sourceforge.net>");
    909MODULE_DESCRIPTION("GL520SM driver");
    910MODULE_LICENSE("GPL");