File Index
Files and directories
Sign in
FILE

vt8231.c

File preview with syntax highlighting.

linux-6.19.14/drivers/hwmon/vt8231.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * vt8231.c - Part of lm_sensors, Linux kernel modules
   4 *	      for hardware monitoring
   5 *
   6 * Copyright (c) 2005 Roger Lucas <vt8231@hiddenengine.co.uk>
   7 * Copyright (c) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
   8 *		      Aaron M. Marsh <amarsh@sdf.lonestar.org>
   9 */
  10
  11/*
  12 * Supports VIA VT8231 South Bridge embedded sensors
  13 */
  14
  15#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  16
  17#include <linux/module.h>
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/pci.h>
  21#include <linux/jiffies.h>
  22#include <linux/platform_device.h>
  23#include <linux/hwmon.h>
  24#include <linux/hwmon-sysfs.h>
  25#include <linux/err.h>
  26#include <linux/mutex.h>
  27#include <linux/acpi.h>
  28#include <linux/io.h>
  29
  30static int force_addr;
  31module_param(force_addr, int, 0);
  32MODULE_PARM_DESC(force_addr, "Initialize the base address of the sensors");
  33
  34static struct platform_device *pdev;
  35
  36#define VT8231_EXTENT 0x80
  37#define VT8231_BASE_REG 0x70
  38#define VT8231_ENABLE_REG 0x74
  39
  40#define DRIVER_NAME "vt8231"
  41
  42/*
  43 * The VT8231 registers
  44 *
  45 * The reset value for the input channel configuration is used (Reg 0x4A=0x07)
  46 * which sets the selected inputs marked with '*' below if multiple options are
  47 * possible:
  48 *
  49 *		    Voltage Mode	  Temperature Mode
  50 *	Sensor	      Linux Id	      Linux Id	      VIA Id
  51 *	--------      --------	      --------	      ------
  52 *	CPU Diode	N/A		temp1		0
  53 *	UIC1		in0		temp2 *		1
  54 *	UIC2		in1 *		temp3		2
  55 *	UIC3		in2 *		temp4		3
  56 *	UIC4		in3 *		temp5		4
  57 *	UIC5		in4 *		temp6		5
  58 *	3.3V		in5		N/A
  59 *
  60 * Note that the BIOS may set the configuration register to a different value
  61 * to match the motherboard configuration.
  62 */
  63
  64/* fans numbered 0-1 */
  65#define VT8231_REG_FAN_MIN(nr)	(0x3b + (nr))
  66#define VT8231_REG_FAN(nr)	(0x29 + (nr))
  67
  68/* Voltage inputs numbered 0-5 */
  69
  70static const u8 regvolt[]    = { 0x21, 0x22, 0x23, 0x24, 0x25, 0x26 };
  71static const u8 regvoltmax[] = { 0x3d, 0x2b, 0x2d, 0x2f, 0x31, 0x33 };
  72static const u8 regvoltmin[] = { 0x3e, 0x2c, 0x2e, 0x30, 0x32, 0x34 };
  73
  74/*
  75 * Temperatures are numbered 1-6 according to the Linux kernel specification.
  76 *
  77 * In the VIA datasheet, however, the temperatures are numbered from zero.
  78 * Since it is important that this driver can easily be compared to the VIA
  79 * datasheet, we will use the VIA numbering within this driver and map the
  80 * kernel sysfs device name to the VIA number in the sysfs callback.
  81 */
  82
  83#define VT8231_REG_TEMP_LOW01	0x49
  84#define VT8231_REG_TEMP_LOW25	0x4d
  85
  86static const u8 regtemp[]    = { 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25 };
  87static const u8 regtempmax[] = { 0x39, 0x3d, 0x2b, 0x2d, 0x2f, 0x31 };
  88static const u8 regtempmin[] = { 0x3a, 0x3e, 0x2c, 0x2e, 0x30, 0x32 };
  89
  90#define TEMP_FROM_REG(reg)		(((253 * 4 - (reg)) * 550 + 105) / 210)
  91#define TEMP_MAXMIN_FROM_REG(reg)	(((253 - (reg)) * 2200 + 105) / 210)
  92#define TEMP_MAXMIN_TO_REG(val)		(253 - ((val) * 210 + 1100) / 2200)
  93
  94#define VT8231_REG_CONFIG 0x40
  95#define VT8231_REG_ALARM1 0x41
  96#define VT8231_REG_ALARM2 0x42
  97#define VT8231_REG_FANDIV 0x47
  98#define VT8231_REG_UCH_CONFIG 0x4a
  99#define VT8231_REG_TEMP1_CONFIG 0x4b
 100#define VT8231_REG_TEMP2_CONFIG 0x4c
 101
 102/*
 103 * temps 0-5 as numbered in VIA datasheet - see later for mapping to Linux
 104 * numbering
 105 */
 106#define ISTEMP(i, ch_config) ((i) == 0 ? 1 : \
 107			      ((ch_config) >> ((i)+1)) & 0x01)
 108/* voltages 0-5 */
 109#define ISVOLT(i, ch_config) ((i) == 5 ? 1 : \
 110			      !(((ch_config) >> ((i)+2)) & 0x01))
 111
 112#define DIV_FROM_REG(val) (1 << (val))
 113
 114/*
 115 * NB  The values returned here are NOT temperatures.  The calibration curves
 116 *     for the thermistor curves are board-specific and must go in the
 117 *     sensors.conf file.  Temperature sensors are actually ten bits, but the
 118 *     VIA datasheet only considers the 8 MSBs obtained from the regtemp[]
 119 *     register.  The temperature value returned should have a magnitude of 3,
 120 *     so we use the VIA scaling as the "true" scaling and use the remaining 2
 121 *     LSBs as fractional precision.
 122 *
 123 *     All the on-chip hardware temperature comparisons for the alarms are only
 124 *     8-bits wide, and compare against the 8 MSBs of the temperature.  The bits
 125 *     in the registers VT8231_REG_TEMP_LOW01 and VT8231_REG_TEMP_LOW25 are
 126 *     ignored.
 127 */
 128
 129/*
 130 ****** FAN RPM CONVERSIONS ********
 131 * This chip saturates back at 0, not at 255 like many the other chips.
 132 * So, 0 means 0 RPM
 133 */
 134static inline u8 FAN_TO_REG(long rpm, int div)
 135{
 136	if (rpm <= 0 || rpm > 1310720)
 137		return 0;
 138	return clamp_val(1310720 / (rpm * div), 1, 255);
 139}
 140
 141static int fan_from_reg(int val, int div)
 142{
 143	if (val == 0)
 144		return 0;
 145	return 1310720 / (val * div);
 146}
 147
 148struct vt8231_data {
 149	unsigned short addr;
 150	const char *name;
 151
 152	struct mutex update_lock;
 153	struct device *hwmon_dev;
 154	bool valid;		/* true if following fields are valid */
 155	unsigned long last_updated;	/* In jiffies */
 156
 157	u8 in[6];		/* Register value */
 158	u8 in_max[6];		/* Register value */
 159	u8 in_min[6];		/* Register value */
 160	u16 temp[6];		/* Register value 10 bit, right aligned */
 161	u8 temp_max[6];		/* Register value */
 162	u8 temp_min[6];		/* Register value */
 163	u8 fan[2];		/* Register value */
 164	u8 fan_min[2];		/* Register value */
 165	u8 fan_div[2];		/* Register encoding, shifted right */
 166	u16 alarms;		/* Register encoding */
 167	u8 uch_config;
 168};
 169
 170static struct pci_dev *s_bridge;
 171
 172static inline int vt8231_read_value(struct vt8231_data *data, u8 reg)
 173{
 174	return inb_p(data->addr + reg);
 175}
 176
 177static inline void vt8231_write_value(struct vt8231_data *data, u8 reg,
 178					u8 value)
 179{
 180	outb_p(value, data->addr + reg);
 181}
 182
 183static struct vt8231_data *vt8231_update_device(struct device *dev)
 184{
 185	struct vt8231_data *data = dev_get_drvdata(dev);
 186	int i;
 187	u16 low;
 188
 189	mutex_lock(&data->update_lock);
 190
 191	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
 192	    || !data->valid) {
 193		for (i = 0; i < 6; i++) {
 194			if (ISVOLT(i, data->uch_config)) {
 195				data->in[i] = vt8231_read_value(data,
 196						regvolt[i]);
 197				data->in_min[i] = vt8231_read_value(data,
 198						regvoltmin[i]);
 199				data->in_max[i] = vt8231_read_value(data,
 200						regvoltmax[i]);
 201			}
 202		}
 203		for (i = 0; i < 2; i++) {
 204			data->fan[i] = vt8231_read_value(data,
 205						VT8231_REG_FAN(i));
 206			data->fan_min[i] = vt8231_read_value(data,
 207						VT8231_REG_FAN_MIN(i));
 208		}
 209
 210		low = vt8231_read_value(data, VT8231_REG_TEMP_LOW01);
 211		low = (low >> 6) | ((low & 0x30) >> 2)
 212		    | (vt8231_read_value(data, VT8231_REG_TEMP_LOW25) << 4);
 213		for (i = 0; i < 6; i++) {
 214			if (ISTEMP(i, data->uch_config)) {
 215				data->temp[i] = (vt8231_read_value(data,
 216						       regtemp[i]) << 2)
 217						| ((low >> (2 * i)) & 0x03);
 218				data->temp_max[i] = vt8231_read_value(data,
 219						      regtempmax[i]);
 220				data->temp_min[i] = vt8231_read_value(data,
 221						      regtempmin[i]);
 222			}
 223		}
 224
 225		i = vt8231_read_value(data, VT8231_REG_FANDIV);
 226		data->fan_div[0] = (i >> 4) & 0x03;
 227		data->fan_div[1] = i >> 6;
 228		data->alarms = vt8231_read_value(data, VT8231_REG_ALARM1) |
 229			(vt8231_read_value(data, VT8231_REG_ALARM2) << 8);
 230
 231		/* Set alarm flags correctly */
 232		if (!data->fan[0] && data->fan_min[0])
 233			data->alarms |= 0x40;
 234		else if (data->fan[0] && !data->fan_min[0])
 235			data->alarms &= ~0x40;
 236
 237		if (!data->fan[1] && data->fan_min[1])
 238			data->alarms |= 0x80;
 239		else if (data->fan[1] && !data->fan_min[1])
 240			data->alarms &= ~0x80;
 241
 242		data->last_updated = jiffies;
 243		data->valid = true;
 244	}
 245
 246	mutex_unlock(&data->update_lock);
 247
 248	return data;
 249}
 250
 251/* following are the sysfs callback functions */
 252static ssize_t in_show(struct device *dev, struct device_attribute *attr,
 253		       char *buf)
 254{
 255	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 256	int nr = sensor_attr->index;
 257	struct vt8231_data *data = vt8231_update_device(dev);
 258
 259	return sprintf(buf, "%d\n", ((data->in[nr] - 3) * 10000) / 958);
 260}
 261
 262static ssize_t in_min_show(struct device *dev, struct device_attribute *attr,
 263			   char *buf)
 264{
 265	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 266	int nr = sensor_attr->index;
 267	struct vt8231_data *data = vt8231_update_device(dev);
 268
 269	return sprintf(buf, "%d\n", ((data->in_min[nr] - 3) * 10000) / 958);
 270}
 271
 272static ssize_t in_max_show(struct device *dev, struct device_attribute *attr,
 273			   char *buf)
 274{
 275	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 276	int nr = sensor_attr->index;
 277	struct vt8231_data *data = vt8231_update_device(dev);
 278
 279	return sprintf(buf, "%d\n", (((data->in_max[nr] - 3) * 10000) / 958));
 280}
 281
 282static ssize_t in_min_store(struct device *dev, struct device_attribute *attr,
 283			    const char *buf, size_t count)
 284{
 285	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 286	int nr = sensor_attr->index;
 287	struct vt8231_data *data = dev_get_drvdata(dev);
 288	unsigned long val;
 289	int err;
 290
 291	err = kstrtoul(buf, 10, &val);
 292	if (err)
 293		return err;
 294
 295	mutex_lock(&data->update_lock);
 296	data->in_min[nr] = clamp_val(((val * 958) / 10000) + 3, 0, 255);
 297	vt8231_write_value(data, regvoltmin[nr], data->in_min[nr]);
 298	mutex_unlock(&data->update_lock);
 299	return count;
 300}
 301
 302static ssize_t in_max_store(struct device *dev, struct device_attribute *attr,
 303			    const char *buf, size_t count)
 304{
 305	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 306	int nr = sensor_attr->index;
 307	struct vt8231_data *data = dev_get_drvdata(dev);
 308	unsigned long val;
 309	int err;
 310
 311	err = kstrtoul(buf, 10, &val);
 312	if (err)
 313		return err;
 314
 315	mutex_lock(&data->update_lock);
 316	data->in_max[nr] = clamp_val(((val * 958) / 10000) + 3, 0, 255);
 317	vt8231_write_value(data, regvoltmax[nr], data->in_max[nr]);
 318	mutex_unlock(&data->update_lock);
 319	return count;
 320}
 321
 322/* Special case for input 5 as this has 3.3V scaling built into the chip */
 323static ssize_t in5_input_show(struct device *dev,
 324			      struct device_attribute *attr, char *buf)
 325{
 326	struct vt8231_data *data = vt8231_update_device(dev);
 327
 328	return sprintf(buf, "%d\n",
 329		(((data->in[5] - 3) * 10000 * 54) / (958 * 34)));
 330}
 331
 332static ssize_t in5_min_show(struct device *dev, struct device_attribute *attr,
 333		char *buf)
 334{
 335	struct vt8231_data *data = vt8231_update_device(dev);
 336
 337	return sprintf(buf, "%d\n",
 338		(((data->in_min[5] - 3) * 10000 * 54) / (958 * 34)));
 339}
 340
 341static ssize_t in5_max_show(struct device *dev, struct device_attribute *attr,
 342		char *buf)
 343{
 344	struct vt8231_data *data = vt8231_update_device(dev);
 345
 346	return sprintf(buf, "%d\n",
 347		(((data->in_max[5] - 3) * 10000 * 54) / (958 * 34)));
 348}
 349
 350static ssize_t in5_min_store(struct device *dev,
 351			     struct device_attribute *attr, const char *buf,
 352			     size_t count)
 353{
 354	struct vt8231_data *data = dev_get_drvdata(dev);
 355	unsigned long val;
 356	int err;
 357
 358	err = kstrtoul(buf, 10, &val);
 359	if (err)
 360		return err;
 361
 362	mutex_lock(&data->update_lock);
 363	data->in_min[5] = clamp_val(((val * 958 * 34) / (10000 * 54)) + 3,
 364				    0, 255);
 365	vt8231_write_value(data, regvoltmin[5], data->in_min[5]);
 366	mutex_unlock(&data->update_lock);
 367	return count;
 368}
 369
 370static ssize_t in5_max_store(struct device *dev,
 371			     struct device_attribute *attr, const char *buf,
 372			     size_t count)
 373{
 374	struct vt8231_data *data = dev_get_drvdata(dev);
 375	unsigned long val;
 376	int err;
 377
 378	err = kstrtoul(buf, 10, &val);
 379	if (err)
 380		return err;
 381
 382	mutex_lock(&data->update_lock);
 383	data->in_max[5] = clamp_val(((val * 958 * 34) / (10000 * 54)) + 3,
 384				    0, 255);
 385	vt8231_write_value(data, regvoltmax[5], data->in_max[5]);
 386	mutex_unlock(&data->update_lock);
 387	return count;
 388}
 389
 390static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
 391static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
 392static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
 393static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
 394static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
 395static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
 396static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
 397static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
 398static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
 399static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
 400static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
 401static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
 402static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
 403static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
 404static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
 405
 406static DEVICE_ATTR_RO(in5_input);
 407static DEVICE_ATTR_RW(in5_min);
 408static DEVICE_ATTR_RW(in5_max);
 409
 410/* Temperatures */
 411static ssize_t temp1_input_show(struct device *dev,
 412				struct device_attribute *attr, char *buf)
 413{
 414	struct vt8231_data *data = vt8231_update_device(dev);
 415	return sprintf(buf, "%d\n", data->temp[0] * 250);
 416}
 417
 418static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
 419		char *buf)
 420{
 421	struct vt8231_data *data = vt8231_update_device(dev);
 422	return sprintf(buf, "%d\n", data->temp_max[0] * 1000);
 423}
 424
 425static ssize_t temp1_max_hyst_show(struct device *dev,
 426				   struct device_attribute *attr, char *buf)
 427{
 428	struct vt8231_data *data = vt8231_update_device(dev);
 429	return sprintf(buf, "%d\n", data->temp_min[0] * 1000);
 430}
 431
 432static ssize_t temp1_max_store(struct device *dev,
 433			       struct device_attribute *attr, const char *buf,
 434			       size_t count)
 435{
 436	struct vt8231_data *data = dev_get_drvdata(dev);
 437	long val;
 438	int err;
 439
 440	err = kstrtol(buf, 10, &val);
 441	if (err)
 442		return err;
 443
 444	mutex_lock(&data->update_lock);
 445	data->temp_max[0] = clamp_val((val + 500) / 1000, 0, 255);
 446	vt8231_write_value(data, regtempmax[0], data->temp_max[0]);
 447	mutex_unlock(&data->update_lock);
 448	return count;
 449}
 450static ssize_t temp1_max_hyst_store(struct device *dev,
 451				    struct device_attribute *attr,
 452				    const char *buf, size_t count)
 453{
 454	struct vt8231_data *data = dev_get_drvdata(dev);
 455	long val;
 456	int err;
 457
 458	err = kstrtol(buf, 10, &val);
 459	if (err)
 460		return err;
 461
 462	mutex_lock(&data->update_lock);
 463	data->temp_min[0] = clamp_val((val + 500) / 1000, 0, 255);
 464	vt8231_write_value(data, regtempmin[0], data->temp_min[0]);
 465	mutex_unlock(&data->update_lock);
 466	return count;
 467}
 468
 469static ssize_t temp_show(struct device *dev, struct device_attribute *attr,
 470			 char *buf)
 471{
 472	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 473	int nr = sensor_attr->index;
 474	struct vt8231_data *data = vt8231_update_device(dev);
 475	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr]));
 476}
 477
 478static ssize_t temp_max_show(struct device *dev,
 479			     struct device_attribute *attr, char *buf)
 480{
 481	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 482	int nr = sensor_attr->index;
 483	struct vt8231_data *data = vt8231_update_device(dev);
 484	return sprintf(buf, "%d\n", TEMP_MAXMIN_FROM_REG(data->temp_max[nr]));
 485}
 486
 487static ssize_t temp_min_show(struct device *dev,
 488			     struct device_attribute *attr, char *buf)
 489{
 490	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 491	int nr = sensor_attr->index;
 492	struct vt8231_data *data = vt8231_update_device(dev);
 493	return sprintf(buf, "%d\n", TEMP_MAXMIN_FROM_REG(data->temp_min[nr]));
 494}
 495
 496static ssize_t temp_max_store(struct device *dev,
 497			      struct device_attribute *attr, const char *buf,
 498			      size_t count)
 499{
 500	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 501	int nr = sensor_attr->index;
 502	struct vt8231_data *data = dev_get_drvdata(dev);
 503	long val;
 504	int err;
 505
 506	err = kstrtol(buf, 10, &val);
 507	if (err)
 508		return err;
 509
 510	mutex_lock(&data->update_lock);
 511	data->temp_max[nr] = clamp_val(TEMP_MAXMIN_TO_REG(val), 0, 255);
 512	vt8231_write_value(data, regtempmax[nr], data->temp_max[nr]);
 513	mutex_unlock(&data->update_lock);
 514	return count;
 515}
 516static ssize_t temp_min_store(struct device *dev,
 517			      struct device_attribute *attr, const char *buf,
 518			      size_t count)
 519{
 520	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 521	int nr = sensor_attr->index;
 522	struct vt8231_data *data = dev_get_drvdata(dev);
 523	long val;
 524	int err;
 525
 526	err = kstrtol(buf, 10, &val);
 527	if (err)
 528		return err;
 529
 530	mutex_lock(&data->update_lock);
 531	data->temp_min[nr] = clamp_val(TEMP_MAXMIN_TO_REG(val), 0, 255);
 532	vt8231_write_value(data, regtempmin[nr], data->temp_min[nr]);
 533	mutex_unlock(&data->update_lock);
 534	return count;
 535}
 536
 537/*
 538 * Note that these map the Linux temperature sensor numbering (1-6) to the VIA
 539 * temperature sensor numbering (0-5)
 540 */
 541
 542static DEVICE_ATTR_RO(temp1_input);
 543static DEVICE_ATTR_RW(temp1_max);
 544static DEVICE_ATTR_RW(temp1_max_hyst);
 545
 546static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
 547static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1);
 548static SENSOR_DEVICE_ATTR_RW(temp2_max_hyst, temp_min, 1);
 549static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
 550static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_max, 2);
 551static SENSOR_DEVICE_ATTR_RW(temp3_max_hyst, temp_min, 2);
 552static SENSOR_DEVICE_ATTR_RO(temp4_input, temp, 3);
 553static SENSOR_DEVICE_ATTR_RW(temp4_max, temp_max, 3);
 554static SENSOR_DEVICE_ATTR_RW(temp4_max_hyst, temp_min, 3);
 555static SENSOR_DEVICE_ATTR_RO(temp5_input, temp, 4);
 556static SENSOR_DEVICE_ATTR_RW(temp5_max, temp_max, 4);
 557static SENSOR_DEVICE_ATTR_RW(temp5_max_hyst, temp_min, 4);
 558static SENSOR_DEVICE_ATTR_RO(temp6_input, temp, 5);
 559static SENSOR_DEVICE_ATTR_RW(temp6_max, temp_max, 5);
 560static SENSOR_DEVICE_ATTR_RW(temp6_max_hyst, temp_min, 5);
 561
 562/* Fans */
 563static ssize_t fan_show(struct device *dev, struct device_attribute *attr,
 564			char *buf)
 565{
 566	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 567	int nr = sensor_attr->index;
 568	struct vt8231_data *data = vt8231_update_device(dev);
 569	return sprintf(buf, "%d\n", fan_from_reg(data->fan[nr],
 570				DIV_FROM_REG(data->fan_div[nr])));
 571}
 572
 573static ssize_t fan_min_show(struct device *dev, struct device_attribute *attr,
 574			    char *buf)
 575{
 576	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 577	int nr = sensor_attr->index;
 578	struct vt8231_data *data = vt8231_update_device(dev);
 579	return sprintf(buf, "%d\n", fan_from_reg(data->fan_min[nr],
 580			DIV_FROM_REG(data->fan_div[nr])));
 581}
 582
 583static ssize_t fan_div_show(struct device *dev, struct device_attribute *attr,
 584			    char *buf)
 585{
 586	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 587	int nr = sensor_attr->index;
 588	struct vt8231_data *data = vt8231_update_device(dev);
 589	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
 590}
 591
 592static ssize_t fan_min_store(struct device *dev,
 593			     struct device_attribute *attr, const char *buf,
 594			     size_t count)
 595{
 596	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 597	int nr = sensor_attr->index;
 598	struct vt8231_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	mutex_lock(&data->update_lock);
 607	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 608	vt8231_write_value(data, VT8231_REG_FAN_MIN(nr), data->fan_min[nr]);
 609	mutex_unlock(&data->update_lock);
 610	return count;
 611}
 612
 613static ssize_t fan_div_store(struct device *dev,
 614			     struct device_attribute *attr, const char *buf,
 615			     size_t count)
 616{
 617	struct vt8231_data *data = dev_get_drvdata(dev);
 618	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 619	unsigned long val;
 620	int nr = sensor_attr->index;
 621	int old;
 622	long min;
 623	int err;
 624
 625	err = kstrtoul(buf, 10, &val);
 626	if (err)
 627		return err;
 628
 629	mutex_lock(&data->update_lock);
 630	old = vt8231_read_value(data, VT8231_REG_FANDIV);
 631	min = fan_from_reg(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
 632	switch (val) {
 633	case 1:
 634		data->fan_div[nr] = 0;
 635		break;
 636	case 2:
 637		data->fan_div[nr] = 1;
 638		break;
 639	case 4:
 640		data->fan_div[nr] = 2;
 641		break;
 642	case 8:
 643		data->fan_div[nr] = 3;
 644		break;
 645	default:
 646		dev_err(dev,
 647			"fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n",
 648			val);
 649		mutex_unlock(&data->update_lock);
 650		return -EINVAL;
 651	}
 652
 653	/* Correct the fan minimum speed */
 654	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 655	vt8231_write_value(data, VT8231_REG_FAN_MIN(nr), data->fan_min[nr]);
 656
 657	old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4);
 658	vt8231_write_value(data, VT8231_REG_FANDIV, old);
 659	mutex_unlock(&data->update_lock);
 660	return count;
 661}
 662
 663static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
 664static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
 665static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
 666static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
 667static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
 668static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
 669
 670/* Alarms */
 671static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
 672			   char *buf)
 673{
 674	struct vt8231_data *data = vt8231_update_device(dev);
 675	return sprintf(buf, "%d\n", data->alarms);
 676}
 677static DEVICE_ATTR_RO(alarms);
 678
 679static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
 680			  char *buf)
 681{
 682	int bitnr = to_sensor_dev_attr(attr)->index;
 683	struct vt8231_data *data = vt8231_update_device(dev);
 684	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
 685}
 686static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4);
 687static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 11);
 688static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm, 0);
 689static SENSOR_DEVICE_ATTR_RO(temp4_alarm, alarm, 1);
 690static SENSOR_DEVICE_ATTR_RO(temp5_alarm, alarm, 3);
 691static SENSOR_DEVICE_ATTR_RO(temp6_alarm, alarm, 8);
 692static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 11);
 693static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 0);
 694static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 1);
 695static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
 696static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 8);
 697static SENSOR_DEVICE_ATTR_RO(in5_alarm, alarm, 2);
 698static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
 699static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
 700
 701static ssize_t name_show(struct device *dev, struct device_attribute
 702			 *devattr, char *buf)
 703{
 704	struct vt8231_data *data = dev_get_drvdata(dev);
 705	return sprintf(buf, "%s\n", data->name);
 706}
 707static DEVICE_ATTR_RO(name);
 708
 709static struct attribute *vt8231_attributes_temps[6][5] = {
 710	{
 711		&dev_attr_temp1_input.attr,
 712		&dev_attr_temp1_max_hyst.attr,
 713		&dev_attr_temp1_max.attr,
 714		&sensor_dev_attr_temp1_alarm.dev_attr.attr,
 715		NULL
 716	}, {
 717		&sensor_dev_attr_temp2_input.dev_attr.attr,
 718		&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
 719		&sensor_dev_attr_temp2_max.dev_attr.attr,
 720		&sensor_dev_attr_temp2_alarm.dev_attr.attr,
 721		NULL
 722	}, {
 723		&sensor_dev_attr_temp3_input.dev_attr.attr,
 724		&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
 725		&sensor_dev_attr_temp3_max.dev_attr.attr,
 726		&sensor_dev_attr_temp3_alarm.dev_attr.attr,
 727		NULL
 728	}, {
 729		&sensor_dev_attr_temp4_input.dev_attr.attr,
 730		&sensor_dev_attr_temp4_max_hyst.dev_attr.attr,
 731		&sensor_dev_attr_temp4_max.dev_attr.attr,
 732		&sensor_dev_attr_temp4_alarm.dev_attr.attr,
 733		NULL
 734	}, {
 735		&sensor_dev_attr_temp5_input.dev_attr.attr,
 736		&sensor_dev_attr_temp5_max_hyst.dev_attr.attr,
 737		&sensor_dev_attr_temp5_max.dev_attr.attr,
 738		&sensor_dev_attr_temp5_alarm.dev_attr.attr,
 739		NULL
 740	}, {
 741		&sensor_dev_attr_temp6_input.dev_attr.attr,
 742		&sensor_dev_attr_temp6_max_hyst.dev_attr.attr,
 743		&sensor_dev_attr_temp6_max.dev_attr.attr,
 744		&sensor_dev_attr_temp6_alarm.dev_attr.attr,
 745		NULL
 746	}
 747};
 748
 749static const struct attribute_group vt8231_group_temps[6] = {
 750	{ .attrs = vt8231_attributes_temps[0] },
 751	{ .attrs = vt8231_attributes_temps[1] },
 752	{ .attrs = vt8231_attributes_temps[2] },
 753	{ .attrs = vt8231_attributes_temps[3] },
 754	{ .attrs = vt8231_attributes_temps[4] },
 755	{ .attrs = vt8231_attributes_temps[5] },
 756};
 757
 758static struct attribute *vt8231_attributes_volts[6][5] = {
 759	{
 760		&sensor_dev_attr_in0_input.dev_attr.attr,
 761		&sensor_dev_attr_in0_min.dev_attr.attr,
 762		&sensor_dev_attr_in0_max.dev_attr.attr,
 763		&sensor_dev_attr_in0_alarm.dev_attr.attr,
 764		NULL
 765	}, {
 766		&sensor_dev_attr_in1_input.dev_attr.attr,
 767		&sensor_dev_attr_in1_min.dev_attr.attr,
 768		&sensor_dev_attr_in1_max.dev_attr.attr,
 769		&sensor_dev_attr_in1_alarm.dev_attr.attr,
 770		NULL
 771	}, {
 772		&sensor_dev_attr_in2_input.dev_attr.attr,
 773		&sensor_dev_attr_in2_min.dev_attr.attr,
 774		&sensor_dev_attr_in2_max.dev_attr.attr,
 775		&sensor_dev_attr_in2_alarm.dev_attr.attr,
 776		NULL
 777	}, {
 778		&sensor_dev_attr_in3_input.dev_attr.attr,
 779		&sensor_dev_attr_in3_min.dev_attr.attr,
 780		&sensor_dev_attr_in3_max.dev_attr.attr,
 781		&sensor_dev_attr_in3_alarm.dev_attr.attr,
 782		NULL
 783	}, {
 784		&sensor_dev_attr_in4_input.dev_attr.attr,
 785		&sensor_dev_attr_in4_min.dev_attr.attr,
 786		&sensor_dev_attr_in4_max.dev_attr.attr,
 787		&sensor_dev_attr_in4_alarm.dev_attr.attr,
 788		NULL
 789	}, {
 790		&dev_attr_in5_input.attr,
 791		&dev_attr_in5_min.attr,
 792		&dev_attr_in5_max.attr,
 793		&sensor_dev_attr_in5_alarm.dev_attr.attr,
 794		NULL
 795	}
 796};
 797
 798static const struct attribute_group vt8231_group_volts[6] = {
 799	{ .attrs = vt8231_attributes_volts[0] },
 800	{ .attrs = vt8231_attributes_volts[1] },
 801	{ .attrs = vt8231_attributes_volts[2] },
 802	{ .attrs = vt8231_attributes_volts[3] },
 803	{ .attrs = vt8231_attributes_volts[4] },
 804	{ .attrs = vt8231_attributes_volts[5] },
 805};
 806
 807static struct attribute *vt8231_attributes[] = {
 808	&sensor_dev_attr_fan1_input.dev_attr.attr,
 809	&sensor_dev_attr_fan2_input.dev_attr.attr,
 810	&sensor_dev_attr_fan1_min.dev_attr.attr,
 811	&sensor_dev_attr_fan2_min.dev_attr.attr,
 812	&sensor_dev_attr_fan1_div.dev_attr.attr,
 813	&sensor_dev_attr_fan2_div.dev_attr.attr,
 814	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
 815	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
 816	&dev_attr_alarms.attr,
 817	&dev_attr_name.attr,
 818	NULL
 819};
 820
 821static const struct attribute_group vt8231_group = {
 822	.attrs = vt8231_attributes,
 823};
 824
 825static void vt8231_init_device(struct vt8231_data *data)
 826{
 827	vt8231_write_value(data, VT8231_REG_TEMP1_CONFIG, 0);
 828	vt8231_write_value(data, VT8231_REG_TEMP2_CONFIG, 0);
 829}
 830
 831static int vt8231_probe(struct platform_device *pdev)
 832{
 833	struct resource *res;
 834	struct vt8231_data *data;
 835	int err = 0, i;
 836
 837	/* Reserve the ISA region */
 838	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 839	if (!devm_request_region(&pdev->dev, res->start, VT8231_EXTENT,
 840				 DRIVER_NAME)) {
 841		dev_err(&pdev->dev, "Region 0x%lx-0x%lx already in use!\n",
 842			(unsigned long)res->start, (unsigned long)res->end);
 843		return -ENODEV;
 844	}
 845
 846	data = devm_kzalloc(&pdev->dev, sizeof(struct vt8231_data), GFP_KERNEL);
 847	if (!data)
 848		return -ENOMEM;
 849
 850	platform_set_drvdata(pdev, data);
 851	data->addr = res->start;
 852	data->name = DRIVER_NAME;
 853
 854	mutex_init(&data->update_lock);
 855	vt8231_init_device(data);
 856
 857	/* Register sysfs hooks */
 858	err = sysfs_create_group(&pdev->dev.kobj, &vt8231_group);
 859	if (err)
 860		return err;
 861
 862	/* Must update device information to find out the config field */
 863	data->uch_config = vt8231_read_value(data, VT8231_REG_UCH_CONFIG);
 864
 865	for (i = 0; i < ARRAY_SIZE(vt8231_group_temps); i++) {
 866		if (ISTEMP(i, data->uch_config)) {
 867			err = sysfs_create_group(&pdev->dev.kobj,
 868						 &vt8231_group_temps[i]);
 869			if (err)
 870				goto exit_remove_files;
 871		}
 872	}
 873
 874	for (i = 0; i < ARRAY_SIZE(vt8231_group_volts); i++) {
 875		if (ISVOLT(i, data->uch_config)) {
 876			err = sysfs_create_group(&pdev->dev.kobj,
 877						 &vt8231_group_volts[i]);
 878			if (err)
 879				goto exit_remove_files;
 880		}
 881	}
 882
 883	data->hwmon_dev = hwmon_device_register(&pdev->dev);
 884	if (IS_ERR(data->hwmon_dev)) {
 885		err = PTR_ERR(data->hwmon_dev);
 886		goto exit_remove_files;
 887	}
 888	return 0;
 889
 890exit_remove_files:
 891	for (i = 0; i < ARRAY_SIZE(vt8231_group_volts); i++)
 892		sysfs_remove_group(&pdev->dev.kobj, &vt8231_group_volts[i]);
 893
 894	for (i = 0; i < ARRAY_SIZE(vt8231_group_temps); i++)
 895		sysfs_remove_group(&pdev->dev.kobj, &vt8231_group_temps[i]);
 896
 897	sysfs_remove_group(&pdev->dev.kobj, &vt8231_group);
 898	return err;
 899}
 900
 901static void vt8231_remove(struct platform_device *pdev)
 902{
 903	struct vt8231_data *data = platform_get_drvdata(pdev);
 904	int i;
 905
 906	hwmon_device_unregister(data->hwmon_dev);
 907
 908	for (i = 0; i < ARRAY_SIZE(vt8231_group_volts); i++)
 909		sysfs_remove_group(&pdev->dev.kobj, &vt8231_group_volts[i]);
 910
 911	for (i = 0; i < ARRAY_SIZE(vt8231_group_temps); i++)
 912		sysfs_remove_group(&pdev->dev.kobj, &vt8231_group_temps[i]);
 913
 914	sysfs_remove_group(&pdev->dev.kobj, &vt8231_group);
 915}
 916
 917
 918static struct platform_driver vt8231_driver = {
 919	.driver	= {
 920		.name	= DRIVER_NAME,
 921	},
 922	.probe	= vt8231_probe,
 923	.remove	= vt8231_remove,
 924};
 925
 926static const struct pci_device_id vt8231_pci_ids[] = {
 927	{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231_4) },
 928	{ 0, }
 929};
 930
 931MODULE_DEVICE_TABLE(pci, vt8231_pci_ids);
 932
 933static int vt8231_device_add(unsigned short address)
 934{
 935	struct resource res = {
 936		.start	= address,
 937		.end	= address + VT8231_EXTENT - 1,
 938		.name	= DRIVER_NAME,
 939		.flags	= IORESOURCE_IO,
 940	};
 941	int err;
 942
 943	err = acpi_check_resource_conflict(&res);
 944	if (err)
 945		goto exit;
 946
 947	pdev = platform_device_alloc(DRIVER_NAME, address);
 948	if (!pdev) {
 949		err = -ENOMEM;
 950		pr_err("Device allocation failed\n");
 951		goto exit;
 952	}
 953
 954	err = platform_device_add_resources(pdev, &res, 1);
 955	if (err) {
 956		pr_err("Device resource addition failed (%d)\n", err);
 957		goto exit_device_put;
 958	}
 959
 960	err = platform_device_add(pdev);
 961	if (err) {
 962		pr_err("Device addition failed (%d)\n", err);
 963		goto exit_device_put;
 964	}
 965
 966	return 0;
 967
 968exit_device_put:
 969	platform_device_put(pdev);
 970exit:
 971	return err;
 972}
 973
 974static int vt8231_pci_probe(struct pci_dev *dev,
 975				const struct pci_device_id *id)
 976{
 977	u16 address, val;
 978	int ret;
 979
 980	if (force_addr) {
 981		address = force_addr & 0xff00;
 982		dev_warn(&dev->dev, "Forcing ISA address 0x%x\n",
 983			 address);
 984
 985		ret = pci_write_config_word(dev, VT8231_BASE_REG, address | 1);
 986		if (ret != PCIBIOS_SUCCESSFUL)
 987			return -ENODEV;
 988	}
 989
 990	pci_read_config_word(dev, VT8231_BASE_REG, &val);
 991	if (val == (u16)~0)
 992		return -ENODEV;
 993
 994	address = val & ~(VT8231_EXTENT - 1);
 995	if (address == 0) {
 996		dev_err(&dev->dev, "base address not set - upgrade BIOS or use force_addr=0xaddr\n");
 997		return -ENODEV;
 998	}
 999
1000	pci_read_config_word(dev, VT8231_ENABLE_REG, &val);
1001	if (val == (u16)~0)
1002		return -ENODEV;
1003
1004	if (!(val & 0x0001)) {
1005		dev_warn(&dev->dev, "enabling sensors\n");
1006		ret = pci_write_config_word(dev, VT8231_ENABLE_REG, val | 0x1);
1007		if (ret != PCIBIOS_SUCCESSFUL)
1008			return -ENODEV;
1009	}
1010
1011	if (platform_driver_register(&vt8231_driver))
1012		goto exit;
1013
1014	/* Sets global pdev as a side effect */
1015	if (vt8231_device_add(address))
1016		goto exit_unregister;
1017
1018	/*
1019	 * Always return failure here.  This is to allow other drivers to bind
1020	 * to this pci device.  We don't really want to have control over the
1021	 * pci device, we only wanted to read as few register values from it.
1022	 */
1023
1024	/*
1025	 * We do, however, mark ourselves as using the PCI device to stop it
1026	 * getting unloaded.
1027	 */
1028	s_bridge = pci_dev_get(dev);
1029	return -ENODEV;
1030
1031exit_unregister:
1032	platform_driver_unregister(&vt8231_driver);
1033exit:
1034	return -ENODEV;
1035}
1036
1037static struct pci_driver vt8231_pci_driver = {
1038	.name		= DRIVER_NAME,
1039	.id_table	= vt8231_pci_ids,
1040	.probe		= vt8231_pci_probe,
1041};
1042
1043static int __init sm_vt8231_init(void)
1044{
1045	return pci_register_driver(&vt8231_pci_driver);
1046}
1047
1048static void __exit sm_vt8231_exit(void)
1049{
1050	pci_unregister_driver(&vt8231_pci_driver);
1051	if (s_bridge != NULL) {
1052		platform_device_unregister(pdev);
1053		platform_driver_unregister(&vt8231_driver);
1054		pci_dev_put(s_bridge);
1055		s_bridge = NULL;
1056	}
1057}
1058
1059MODULE_AUTHOR("Roger Lucas <vt8231@hiddenengine.co.uk>");
1060MODULE_DESCRIPTION("VT8231 sensors");
1061MODULE_LICENSE("GPL");
1062
1063module_init(sm_vt8231_init);
1064module_exit(sm_vt8231_exit);
~/ Read-only file preview.