Linux Audio

Check our new training course

Loading...
v3.1
 
   1/*
   2 * vt1211.c - driver for the VIA VT1211 Super-I/O chip integrated hardware
   3 *            monitoring features
   4 * Copyright (C) 2006 Juerg Haefliger <juergh@gmail.com>
   5 *
   6 * This driver is based on the driver for kernel 2.4 by Mark D. Studebaker
   7 * and its port to kernel 2.6 by Lars Ekman.
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22 */
  23
  24#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  25
  26#include <linux/module.h>
  27#include <linux/init.h>
  28#include <linux/slab.h>
  29#include <linux/jiffies.h>
  30#include <linux/platform_device.h>
  31#include <linux/hwmon.h>
  32#include <linux/hwmon-sysfs.h>
  33#include <linux/hwmon-vid.h>
  34#include <linux/err.h>
  35#include <linux/mutex.h>
  36#include <linux/ioport.h>
  37#include <linux/acpi.h>
  38#include <linux/io.h>
  39
  40static int uch_config = -1;
  41module_param(uch_config, int, 0);
  42MODULE_PARM_DESC(uch_config, "Initialize the universal channel configuration");
  43
  44static int int_mode = -1;
  45module_param(int_mode, int, 0);
  46MODULE_PARM_DESC(int_mode, "Force the temperature interrupt mode");
  47
  48static unsigned short force_id;
  49module_param(force_id, ushort, 0);
  50MODULE_PARM_DESC(force_id, "Override the detected device ID");
  51
  52static struct platform_device *pdev;
  53
  54#define DRVNAME "vt1211"
  55
  56/* ---------------------------------------------------------------------
  57 * Registers
  58 *
  59 * The sensors are defined as follows.
  60 *
  61 * Sensor          Voltage Mode   Temp Mode   Notes (from the datasheet)
  62 * --------        ------------   ---------   --------------------------
  63 * Reading 1                      temp1       Intel thermal diode
  64 * Reading 3                      temp2       Internal thermal diode
  65 * UCH1/Reading2   in0            temp3       NTC type thermistor
  66 * UCH2            in1            temp4       +2.5V
  67 * UCH3            in2            temp5       VccP
  68 * UCH4            in3            temp6       +5V
  69 * UCH5            in4            temp7       +12V
  70 * 3.3V            in5                        Internal VDD (+3.3V)
  71 *
  72 * --------------------------------------------------------------------- */
  73
  74/* Voltages (in) numbered 0-5 (ix) */
  75#define VT1211_REG_IN(ix)		(0x21 + (ix))
  76#define VT1211_REG_IN_MIN(ix)		((ix) == 0 ? 0x3e : 0x2a + 2 * (ix))
  77#define VT1211_REG_IN_MAX(ix)		((ix) == 0 ? 0x3d : 0x29 + 2 * (ix))
  78
  79/* Temperatures (temp) numbered 0-6 (ix) */
  80static u8 regtemp[]	= {0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25};
  81static u8 regtempmax[]	= {0x39, 0x1d, 0x3d, 0x2b, 0x2d, 0x2f, 0x31};
  82static u8 regtemphyst[]	= {0x3a, 0x1e, 0x3e, 0x2c, 0x2e, 0x30, 0x32};
  83
  84/* Fans numbered 0-1 (ix) */
  85#define VT1211_REG_FAN(ix)		(0x29 + (ix))
  86#define VT1211_REG_FAN_MIN(ix)		(0x3b + (ix))
  87#define VT1211_REG_FAN_DIV		 0x47
  88
  89/* PWMs numbered 0-1 (ix) */
  90/* Auto points numbered 0-3 (ap) */
  91#define VT1211_REG_PWM(ix)		(0x60 + (ix))
  92#define VT1211_REG_PWM_CLK		 0x50
  93#define VT1211_REG_PWM_CTL		 0x51
  94#define VT1211_REG_PWM_AUTO_TEMP(ap)	(0x55 - (ap))
  95#define VT1211_REG_PWM_AUTO_PWM(ix, ap)	(0x58 + 2 * (ix) - (ap))
  96
  97/* Miscellaneous registers */
  98#define VT1211_REG_CONFIG		0x40
  99#define VT1211_REG_ALARM1		0x41
 100#define VT1211_REG_ALARM2		0x42
 101#define VT1211_REG_VID			0x45
 102#define VT1211_REG_UCH_CONFIG		0x4a
 103#define VT1211_REG_TEMP1_CONFIG		0x4b
 104#define VT1211_REG_TEMP2_CONFIG		0x4c
 105
 106/* In, temp & fan alarm bits */
 107static const u8 bitalarmin[]	= {11, 0, 1, 3, 8, 2, 9};
 108static const u8 bitalarmtemp[]	= {4, 15, 11, 0, 1, 3, 8};
 109static const u8 bitalarmfan[]	= {6, 7};
 110
 111/* ---------------------------------------------------------------------
 112 * Data structures and manipulation thereof
 113 * --------------------------------------------------------------------- */
 114
 115struct vt1211_data {
 116	unsigned short addr;
 117	const char *name;
 118	struct device *hwmon_dev;
 119
 120	struct mutex update_lock;
 121	char valid;			/* !=0 if following fields are valid */
 122	unsigned long last_updated;	/* In jiffies */
 123
 124	/* Register values */
 125	u8  in[6];
 126	u8  in_max[6];
 127	u8  in_min[6];
 128	u8  temp[7];
 129	u8  temp_max[7];
 130	u8  temp_hyst[7];
 131	u8  fan[2];
 132	u8  fan_min[2];
 133	u8  fan_div[2];
 134	u8  fan_ctl;
 135	u8  pwm[2];
 136	u8  pwm_ctl[2];
 137	u8  pwm_clk;
 138	u8  pwm_auto_temp[4];
 139	u8  pwm_auto_pwm[2][4];
 140	u8  vid;		/* Read once at init time */
 141	u8  vrm;
 142	u8  uch_config;		/* Read once at init time */
 143	u16 alarms;
 144};
 145
 146/* ix = [0-5] */
 147#define ISVOLT(ix, uch_config)	((ix) > 4 ? 1 : \
 148				 !(((uch_config) >> ((ix) + 2)) & 1))
 149
 150/* ix = [0-6] */
 151#define ISTEMP(ix, uch_config)	((ix) < 2 ? 1 : \
 152				 ((uch_config) >> (ix)) & 1)
 153
 154/* in5 (ix = 5) is special. It's the internal 3.3V so it's scaled in the
 155   driver according to the VT1211 BIOS porting guide */
 
 
 156#define IN_FROM_REG(ix, reg)	((reg) < 3 ? 0 : (ix) == 5 ? \
 157				 (((reg) - 3) * 15882 + 479) / 958 : \
 158				 (((reg) - 3) * 10000 + 479) / 958)
 159#define IN_TO_REG(ix, val)	(SENSORS_LIMIT((ix) == 5 ? \
 160				 ((val) * 958 + 7941) / 15882 + 3 : \
 161				 ((val) * 958 + 5000) / 10000 + 3, 0, 255))
 162
 163/* temp1 (ix = 0) is an intel thermal diode which is scaled in user space.
 164   temp2 (ix = 1) is the internal temp diode so it's scaled in the driver
 165   according to some measurements that I took on an EPIA M10000.
 166   temp3-7 are thermistor based so the driver returns the voltage measured at
 167   the pin (range 0V - 2.2V). */
 
 
 168#define TEMP_FROM_REG(ix, reg)	((ix) == 0 ? (reg) * 1000 : \
 169				 (ix) == 1 ? (reg) < 51 ? 0 : \
 170				 ((reg) - 51) * 1000 : \
 171				 ((253 - (reg)) * 2200 + 105) / 210)
 172#define TEMP_TO_REG(ix, val)	SENSORS_LIMIT( \
 173				 ((ix) == 0 ? ((val) + 500) / 1000 : \
 174				  (ix) == 1 ? ((val) + 500) / 1000 + 51 : \
 175				  253 - ((val) * 210 + 1100) / 2200), 0, 255)
 176
 177#define DIV_FROM_REG(reg)	(1 << (reg))
 178
 179#define RPM_FROM_REG(reg, div)	(((reg) == 0) || ((reg) == 255) ? 0 : \
 180				 1310720 / (reg) / DIV_FROM_REG(div))
 181#define RPM_TO_REG(val, div)	((val) == 0 ? 255 : \
 182				 SENSORS_LIMIT((1310720 / (val) / \
 183				 DIV_FROM_REG(div)), 1, 254))
 184
 185/* ---------------------------------------------------------------------
 186 * Super-I/O constants and functions
 187 * --------------------------------------------------------------------- */
 188
 189/* Configuration index port registers
 190 * The vt1211 can live at 2 different addresses so we need to probe both */
 
 
 191#define SIO_REG_CIP1		0x2e
 192#define SIO_REG_CIP2		0x4e
 193
 194/* Configuration registers */
 195#define SIO_VT1211_LDN		0x07	/* logical device number */
 196#define SIO_VT1211_DEVID	0x20	/* device ID */
 197#define SIO_VT1211_DEVREV	0x21	/* device revision */
 198#define SIO_VT1211_ACTIVE	0x30	/* HW monitor active */
 199#define SIO_VT1211_BADDR	0x60	/* base I/O address */
 200#define SIO_VT1211_ID		0x3c	/* VT1211 device ID */
 201
 202/* VT1211 logical device numbers */
 203#define SIO_VT1211_LDN_HWMON	0x0b	/* HW monitor */
 204
 205static inline void superio_outb(int sio_cip, int reg, int val)
 206{
 207	outb(reg, sio_cip);
 208	outb(val, sio_cip + 1);
 209}
 210
 211static inline int superio_inb(int sio_cip, int reg)
 212{
 213	outb(reg, sio_cip);
 214	return inb(sio_cip + 1);
 215}
 216
 217static inline void superio_select(int sio_cip, int ldn)
 218{
 219	outb(SIO_VT1211_LDN, sio_cip);
 220	outb(ldn, sio_cip + 1);
 221}
 222
 223static inline void superio_enter(int sio_cip)
 224{
 
 
 
 225	outb(0x87, sio_cip);
 226	outb(0x87, sio_cip);
 
 
 227}
 228
 229static inline void superio_exit(int sio_cip)
 230{
 231	outb(0xaa, sio_cip);
 
 232}
 233
 234/* ---------------------------------------------------------------------
 235 * Device I/O access
 236 * --------------------------------------------------------------------- */
 237
 238static inline u8 vt1211_read8(struct vt1211_data *data, u8 reg)
 239{
 240	return inb(data->addr + reg);
 241}
 242
 243static inline void vt1211_write8(struct vt1211_data *data, u8 reg, u8 val)
 244{
 245	outb(val, data->addr + reg);
 246}
 247
 248static struct vt1211_data *vt1211_update_device(struct device *dev)
 249{
 250	struct vt1211_data *data = dev_get_drvdata(dev);
 251	int ix, val;
 252
 253	mutex_lock(&data->update_lock);
 254
 255	/* registers cache is refreshed after 1 second */
 256	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
 257		/* read VID */
 258		data->vid = vt1211_read8(data, VT1211_REG_VID) & 0x1f;
 259
 260		/* voltage (in) registers */
 261		for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) {
 262			if (ISVOLT(ix, data->uch_config)) {
 263				data->in[ix] = vt1211_read8(data,
 264						VT1211_REG_IN(ix));
 265				data->in_min[ix] = vt1211_read8(data,
 266						VT1211_REG_IN_MIN(ix));
 267				data->in_max[ix] = vt1211_read8(data,
 268						VT1211_REG_IN_MAX(ix));
 269			}
 270		}
 271
 272		/* temp registers */
 273		for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) {
 274			if (ISTEMP(ix, data->uch_config)) {
 275				data->temp[ix] = vt1211_read8(data,
 276						regtemp[ix]);
 277				data->temp_max[ix] = vt1211_read8(data,
 278						regtempmax[ix]);
 279				data->temp_hyst[ix] = vt1211_read8(data,
 280						regtemphyst[ix]);
 281			}
 282		}
 283
 284		/* fan & pwm registers */
 285		for (ix = 0; ix < ARRAY_SIZE(data->fan); ix++) {
 286			data->fan[ix] = vt1211_read8(data,
 287						VT1211_REG_FAN(ix));
 288			data->fan_min[ix] = vt1211_read8(data,
 289						VT1211_REG_FAN_MIN(ix));
 290			data->pwm[ix] = vt1211_read8(data,
 291						VT1211_REG_PWM(ix));
 292		}
 293		val = vt1211_read8(data, VT1211_REG_FAN_DIV);
 294		data->fan_div[0] = (val >> 4) & 3;
 295		data->fan_div[1] = (val >> 6) & 3;
 296		data->fan_ctl = val & 0xf;
 297
 298		val = vt1211_read8(data, VT1211_REG_PWM_CTL);
 299		data->pwm_ctl[0] = val & 0xf;
 300		data->pwm_ctl[1] = (val >> 4) & 0xf;
 301
 302		data->pwm_clk = vt1211_read8(data, VT1211_REG_PWM_CLK);
 303
 304		/* pwm & temp auto point registers */
 305		data->pwm_auto_pwm[0][1] = vt1211_read8(data,
 306						VT1211_REG_PWM_AUTO_PWM(0, 1));
 307		data->pwm_auto_pwm[0][2] = vt1211_read8(data,
 308						VT1211_REG_PWM_AUTO_PWM(0, 2));
 309		data->pwm_auto_pwm[1][1] = vt1211_read8(data,
 310						VT1211_REG_PWM_AUTO_PWM(1, 1));
 311		data->pwm_auto_pwm[1][2] = vt1211_read8(data,
 312						VT1211_REG_PWM_AUTO_PWM(1, 2));
 313		for (ix = 0; ix < ARRAY_SIZE(data->pwm_auto_temp); ix++) {
 314			data->pwm_auto_temp[ix] = vt1211_read8(data,
 315						VT1211_REG_PWM_AUTO_TEMP(ix));
 316		}
 317
 318		/* alarm registers */
 319		data->alarms = (vt1211_read8(data, VT1211_REG_ALARM2) << 8) |
 320				vt1211_read8(data, VT1211_REG_ALARM1);
 321
 322		data->last_updated = jiffies;
 323		data->valid = 1;
 324	}
 325
 326	mutex_unlock(&data->update_lock);
 327
 328	return data;
 329}
 330
 331/* ---------------------------------------------------------------------
 332 * Voltage sysfs interfaces
 333 * ix = [0-5]
 334 * --------------------------------------------------------------------- */
 335
 336#define SHOW_IN_INPUT	0
 337#define SHOW_SET_IN_MIN	1
 338#define SHOW_SET_IN_MAX	2
 339#define SHOW_IN_ALARM	3
 340
 341static ssize_t show_in(struct device *dev, struct device_attribute *attr,
 342		       char *buf)
 343{
 344	struct vt1211_data *data = vt1211_update_device(dev);
 345	struct sensor_device_attribute_2 *sensor_attr_2 =
 346						to_sensor_dev_attr_2(attr);
 347	int ix = sensor_attr_2->index;
 348	int fn = sensor_attr_2->nr;
 349	int res;
 350
 351	switch (fn) {
 352	case SHOW_IN_INPUT:
 353		res = IN_FROM_REG(ix, data->in[ix]);
 354		break;
 355	case SHOW_SET_IN_MIN:
 356		res = IN_FROM_REG(ix, data->in_min[ix]);
 357		break;
 358	case SHOW_SET_IN_MAX:
 359		res = IN_FROM_REG(ix, data->in_max[ix]);
 360		break;
 361	case SHOW_IN_ALARM:
 362		res = (data->alarms >> bitalarmin[ix]) & 1;
 363		break;
 364	default:
 365		res = 0;
 366		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 367	}
 368
 369	return sprintf(buf, "%d\n", res);
 370}
 371
 372static ssize_t set_in(struct device *dev, struct device_attribute *attr,
 373		      const char *buf, size_t count)
 374{
 375	struct vt1211_data *data = dev_get_drvdata(dev);
 376	struct sensor_device_attribute_2 *sensor_attr_2 =
 377						to_sensor_dev_attr_2(attr);
 378	int ix = sensor_attr_2->index;
 379	int fn = sensor_attr_2->nr;
 380	long val = simple_strtol(buf, NULL, 10);
 
 
 
 
 
 381
 382	mutex_lock(&data->update_lock);
 383	switch (fn) {
 384	case SHOW_SET_IN_MIN:
 385		data->in_min[ix] = IN_TO_REG(ix, val);
 386		vt1211_write8(data, VT1211_REG_IN_MIN(ix), data->in_min[ix]);
 387		break;
 388	case SHOW_SET_IN_MAX:
 389		data->in_max[ix] = IN_TO_REG(ix, val);
 390		vt1211_write8(data, VT1211_REG_IN_MAX(ix), data->in_max[ix]);
 391		break;
 392	default:
 393		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 394	}
 395	mutex_unlock(&data->update_lock);
 396
 397	return count;
 398}
 399
 400/* ---------------------------------------------------------------------
 401 * Temperature sysfs interfaces
 402 * ix = [0-6]
 403 * --------------------------------------------------------------------- */
 404
 405#define SHOW_TEMP_INPUT		0
 406#define SHOW_SET_TEMP_MAX	1
 407#define SHOW_SET_TEMP_MAX_HYST	2
 408#define SHOW_TEMP_ALARM		3
 409
 410static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
 411			 char *buf)
 412{
 413	struct vt1211_data *data = vt1211_update_device(dev);
 414	struct sensor_device_attribute_2 *sensor_attr_2 =
 415						to_sensor_dev_attr_2(attr);
 416	int ix = sensor_attr_2->index;
 417	int fn = sensor_attr_2->nr;
 418	int res;
 419
 420	switch (fn) {
 421	case SHOW_TEMP_INPUT:
 422		res = TEMP_FROM_REG(ix, data->temp[ix]);
 423		break;
 424	case SHOW_SET_TEMP_MAX:
 425		res = TEMP_FROM_REG(ix, data->temp_max[ix]);
 426		break;
 427	case SHOW_SET_TEMP_MAX_HYST:
 428		res = TEMP_FROM_REG(ix, data->temp_hyst[ix]);
 429		break;
 430	case SHOW_TEMP_ALARM:
 431		res = (data->alarms >> bitalarmtemp[ix]) & 1;
 432		break;
 433	default:
 434		res = 0;
 435		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 436	}
 437
 438	return sprintf(buf, "%d\n", res);
 439}
 440
 441static ssize_t set_temp(struct device *dev, struct device_attribute *attr,
 442			const char *buf, size_t count)
 443{
 444	struct vt1211_data *data = dev_get_drvdata(dev);
 445	struct sensor_device_attribute_2 *sensor_attr_2 =
 446						to_sensor_dev_attr_2(attr);
 447	int ix = sensor_attr_2->index;
 448	int fn = sensor_attr_2->nr;
 449	long val = simple_strtol(buf, NULL, 10);
 
 
 
 
 
 450
 451	mutex_lock(&data->update_lock);
 452	switch (fn) {
 453	case SHOW_SET_TEMP_MAX:
 454		data->temp_max[ix] = TEMP_TO_REG(ix, val);
 455		vt1211_write8(data, regtempmax[ix],
 456			      data->temp_max[ix]);
 457		break;
 458	case SHOW_SET_TEMP_MAX_HYST:
 459		data->temp_hyst[ix] = TEMP_TO_REG(ix, val);
 460		vt1211_write8(data, regtemphyst[ix],
 461			      data->temp_hyst[ix]);
 462		break;
 463	default:
 464		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 465	}
 466	mutex_unlock(&data->update_lock);
 467
 468	return count;
 469}
 470
 471/* ---------------------------------------------------------------------
 472 * Fan sysfs interfaces
 473 * ix = [0-1]
 474 * --------------------------------------------------------------------- */
 475
 476#define SHOW_FAN_INPUT		0
 477#define SHOW_SET_FAN_MIN	1
 478#define SHOW_SET_FAN_DIV	2
 479#define SHOW_FAN_ALARM		3
 480
 481static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
 482			char *buf)
 483{
 484	struct vt1211_data *data = vt1211_update_device(dev);
 485	struct sensor_device_attribute_2 *sensor_attr_2 =
 486						to_sensor_dev_attr_2(attr);
 487	int ix = sensor_attr_2->index;
 488	int fn = sensor_attr_2->nr;
 489	int res;
 490
 491	switch (fn) {
 492	case SHOW_FAN_INPUT:
 493		res = RPM_FROM_REG(data->fan[ix], data->fan_div[ix]);
 494		break;
 495	case SHOW_SET_FAN_MIN:
 496		res = RPM_FROM_REG(data->fan_min[ix], data->fan_div[ix]);
 497		break;
 498	case SHOW_SET_FAN_DIV:
 499		res = DIV_FROM_REG(data->fan_div[ix]);
 500		break;
 501	case SHOW_FAN_ALARM:
 502		res = (data->alarms >> bitalarmfan[ix]) & 1;
 503		break;
 504	default:
 505		res = 0;
 506		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 507	}
 508
 509	return sprintf(buf, "%d\n", res);
 510}
 511
 512static ssize_t set_fan(struct device *dev, struct device_attribute *attr,
 513		       const char *buf, size_t count)
 514{
 515	struct vt1211_data *data = dev_get_drvdata(dev);
 516	struct sensor_device_attribute_2 *sensor_attr_2 =
 517						to_sensor_dev_attr_2(attr);
 518	int ix = sensor_attr_2->index;
 519	int fn = sensor_attr_2->nr;
 520	long val = simple_strtol(buf, NULL, 10);
 521	int reg;
 
 
 
 
 
 
 522
 523	mutex_lock(&data->update_lock);
 524
 525	/* sync the data cache */
 526	reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 527	data->fan_div[0] = (reg >> 4) & 3;
 528	data->fan_div[1] = (reg >> 6) & 3;
 529	data->fan_ctl = reg & 0xf;
 530
 531	switch (fn) {
 532	case SHOW_SET_FAN_MIN:
 533		data->fan_min[ix] = RPM_TO_REG(val, data->fan_div[ix]);
 534		vt1211_write8(data, VT1211_REG_FAN_MIN(ix),
 535			      data->fan_min[ix]);
 536		break;
 537	case SHOW_SET_FAN_DIV:
 538		switch (val) {
 539			case 1: data->fan_div[ix] = 0; break;
 540			case 2: data->fan_div[ix] = 1; break;
 541			case 4: data->fan_div[ix] = 2; break;
 542			case 8: data->fan_div[ix] = 3; break;
 543			default:
 544				count = -EINVAL;
 545				dev_warn(dev, "fan div value %ld not "
 546					 "supported. Choose one of 1, 2, "
 547					 "4, or 8.\n", val);
 548				goto EXIT;
 
 
 
 
 
 
 
 
 549		}
 550		vt1211_write8(data, VT1211_REG_FAN_DIV,
 551			      ((data->fan_div[1] << 6) |
 552			       (data->fan_div[0] << 4) |
 553				data->fan_ctl));
 554		break;
 555	default:
 556		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 557	}
 558
 559EXIT:
 560	mutex_unlock(&data->update_lock);
 561	return count;
 562}
 563
 564/* ---------------------------------------------------------------------
 565 * PWM sysfs interfaces
 566 * ix = [0-1]
 567 * --------------------------------------------------------------------- */
 568
 569#define SHOW_PWM			0
 570#define SHOW_SET_PWM_ENABLE		1
 571#define SHOW_SET_PWM_FREQ		2
 572#define SHOW_SET_PWM_AUTO_CHANNELS_TEMP	3
 573
 574static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
 575			char *buf)
 576{
 577	struct vt1211_data *data = vt1211_update_device(dev);
 578	struct sensor_device_attribute_2 *sensor_attr_2 =
 579						to_sensor_dev_attr_2(attr);
 580	int ix = sensor_attr_2->index;
 581	int fn = sensor_attr_2->nr;
 582	int res;
 583
 584	switch (fn) {
 585	case SHOW_PWM:
 586		res = data->pwm[ix];
 587		break;
 588	case SHOW_SET_PWM_ENABLE:
 589		res = ((data->pwm_ctl[ix] >> 3) & 1) ? 2 : 0;
 590		break;
 591	case SHOW_SET_PWM_FREQ:
 592		res = 90000 >> (data->pwm_clk & 7);
 593		break;
 594	case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 595		res = (data->pwm_ctl[ix] & 7) + 1;
 596		break;
 597	default:
 598		res = 0;
 599		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 600	}
 601
 602	return sprintf(buf, "%d\n", res);
 603}
 604
 605static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
 606		       const char *buf, size_t count)
 607{
 608	struct vt1211_data *data = dev_get_drvdata(dev);
 609	struct sensor_device_attribute_2 *sensor_attr_2 =
 610						to_sensor_dev_attr_2(attr);
 611	int ix = sensor_attr_2->index;
 612	int fn = sensor_attr_2->nr;
 613	long val = simple_strtol(buf, NULL, 10);
 614	int tmp, reg;
 
 
 
 
 
 
 615
 616	mutex_lock(&data->update_lock);
 617
 618	switch (fn) {
 619	case SHOW_SET_PWM_ENABLE:
 620		/* sync the data cache */
 621		reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 622		data->fan_div[0] = (reg >> 4) & 3;
 623		data->fan_div[1] = (reg >> 6) & 3;
 624		data->fan_ctl = reg & 0xf;
 625		reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 626		data->pwm_ctl[0] = reg & 0xf;
 627		data->pwm_ctl[1] = (reg >> 4) & 0xf;
 628		switch (val) {
 629		case 0:
 630			data->pwm_ctl[ix] &= 7;
 631			/* disable SmartGuardian if both PWM outputs are
 632			 * disabled */
 633			if ((data->pwm_ctl[ix ^ 1] & 1) == 0) {
 
 
 634				data->fan_ctl &= 0xe;
 635			}
 636			break;
 637		case 2:
 638			data->pwm_ctl[ix] |= 8;
 639			data->fan_ctl |= 1;
 640			break;
 641		default:
 642			count = -EINVAL;
 643			dev_warn(dev, "pwm mode %ld not supported. "
 644				 "Choose one of 0 or 2.\n", val);
 
 645			goto EXIT;
 646		}
 647		vt1211_write8(data, VT1211_REG_PWM_CTL,
 648			      ((data->pwm_ctl[1] << 4) |
 649				data->pwm_ctl[0]));
 650		vt1211_write8(data, VT1211_REG_FAN_DIV,
 651			      ((data->fan_div[1] << 6) |
 652			       (data->fan_div[0] << 4) |
 653				data->fan_ctl));
 654		break;
 655	case SHOW_SET_PWM_FREQ:
 656		val = 135000 / SENSORS_LIMIT(val, 135000 >> 7, 135000);
 657		/* calculate tmp = log2(val) */
 658		tmp = 0;
 659		for (val >>= 1; val > 0; val >>= 1) {
 660			tmp++;
 661		}
 662		/* sync the data cache */
 663		reg = vt1211_read8(data, VT1211_REG_PWM_CLK);
 664		data->pwm_clk = (reg & 0xf8) | tmp;
 665		vt1211_write8(data, VT1211_REG_PWM_CLK, data->pwm_clk);
 666		break;
 667	case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 668		if ((val < 1) || (val > 7)) {
 669			count = -EINVAL;
 670			dev_warn(dev, "temp channel %ld not supported. "
 671				 "Choose a value between 1 and 7.\n", val);
 
 672			goto EXIT;
 673		}
 674		if (!ISTEMP(val - 1, data->uch_config)) {
 675			count = -EINVAL;
 676			dev_warn(dev, "temp channel %ld is not available.\n",
 677				 val);
 678			goto EXIT;
 679		}
 680		/* sync the data cache */
 681		reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 682		data->pwm_ctl[0] = reg & 0xf;
 683		data->pwm_ctl[1] = (reg >> 4) & 0xf;
 684		data->pwm_ctl[ix] = (data->pwm_ctl[ix] & 8) | (val - 1);
 685		vt1211_write8(data, VT1211_REG_PWM_CTL,
 686			      ((data->pwm_ctl[1] << 4) | data->pwm_ctl[0]));
 687		break;
 688	default:
 689		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 690	}
 691
 692EXIT:
 693	mutex_unlock(&data->update_lock);
 694	return count;
 695}
 696
 697/* ---------------------------------------------------------------------
 698 * PWM auto point definitions
 699 * ix = [0-1]
 700 * ap = [0-3]
 701 * --------------------------------------------------------------------- */
 702
 703/*
 704 * pwm[ix+1]_auto_point[ap+1]_temp mapping table:
 705 * Note that there is only a single set of temp auto points that controls both
 706 * PWM controllers. We still create 2 sets of sysfs files to make it look
 707 * more consistent even though they map to the same registers.
 708 *
 709 * ix ap : description
 710 * -------------------
 711 * 0  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 712 * 0  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 713 * 0  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 714 * 0  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 715 * 1  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 716 * 1  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 717 * 1  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 718 * 1  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 719 */
 720
 721static ssize_t show_pwm_auto_point_temp(struct device *dev,
 722					struct device_attribute *attr,
 723					char *buf)
 724{
 725	struct vt1211_data *data = vt1211_update_device(dev);
 726	struct sensor_device_attribute_2 *sensor_attr_2 =
 727						to_sensor_dev_attr_2(attr);
 728	int ix = sensor_attr_2->index;
 729	int ap = sensor_attr_2->nr;
 730
 731	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->pwm_ctl[ix] & 7,
 732		       data->pwm_auto_temp[ap]));
 733}
 734
 735static ssize_t set_pwm_auto_point_temp(struct device *dev,
 736				       struct device_attribute *attr,
 737				       const char *buf, size_t count)
 738{
 739	struct vt1211_data *data = dev_get_drvdata(dev);
 740	struct sensor_device_attribute_2 *sensor_attr_2 =
 741						to_sensor_dev_attr_2(attr);
 742	int ix = sensor_attr_2->index;
 743	int ap = sensor_attr_2->nr;
 744	long val = simple_strtol(buf, NULL, 10);
 745	int reg;
 
 
 
 
 
 
 
 746
 747	mutex_lock(&data->update_lock);
 748
 749	/* sync the data cache */
 750	reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 751	data->pwm_ctl[0] = reg & 0xf;
 752	data->pwm_ctl[1] = (reg >> 4) & 0xf;
 753
 754	data->pwm_auto_temp[ap] = TEMP_TO_REG(data->pwm_ctl[ix] & 7, val);
 755	vt1211_write8(data, VT1211_REG_PWM_AUTO_TEMP(ap),
 756		      data->pwm_auto_temp[ap]);
 757	mutex_unlock(&data->update_lock);
 758
 759	return count;
 760}
 761
 762/*
 763 * pwm[ix+1]_auto_point[ap+1]_pwm mapping table:
 764 * Note that the PWM auto points 0 & 3 are hard-wired in the VT1211 and can't
 765 * be changed.
 766 *
 767 * ix ap : description
 768 * -------------------
 769 * 0  0  : pwm1 off                   (pwm_auto_pwm[0][0], hard-wired to 0)
 770 * 0  1  : pwm1 low speed duty cycle  (pwm_auto_pwm[0][1])
 771 * 0  2  : pwm1 high speed duty cycle (pwm_auto_pwm[0][2])
 772 * 0  3  : pwm1 full speed            (pwm_auto_pwm[0][3], hard-wired to 255)
 773 * 1  0  : pwm2 off                   (pwm_auto_pwm[1][0], hard-wired to 0)
 774 * 1  1  : pwm2 low speed duty cycle  (pwm_auto_pwm[1][1])
 775 * 1  2  : pwm2 high speed duty cycle (pwm_auto_pwm[1][2])
 776 * 1  3  : pwm2 full speed            (pwm_auto_pwm[1][3], hard-wired to 255)
 777*/
 778
 779static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 780				       struct device_attribute *attr,
 781				       char *buf)
 782{
 783	struct vt1211_data *data = vt1211_update_device(dev);
 784	struct sensor_device_attribute_2 *sensor_attr_2 =
 785						to_sensor_dev_attr_2(attr);
 786	int ix = sensor_attr_2->index;
 787	int ap = sensor_attr_2->nr;
 788
 789	return sprintf(buf, "%d\n", data->pwm_auto_pwm[ix][ap]);
 790}
 791
 792static ssize_t set_pwm_auto_point_pwm(struct device *dev,
 793				      struct device_attribute *attr,
 794				      const char *buf, size_t count)
 795{
 796	struct vt1211_data *data = dev_get_drvdata(dev);
 797	struct sensor_device_attribute_2 *sensor_attr_2 =
 798						to_sensor_dev_attr_2(attr);
 799	int ix = sensor_attr_2->index;
 800	int ap = sensor_attr_2->nr;
 801	long val = simple_strtol(buf, NULL, 10);
 
 802
 803	if ((val < 0) || (val > 255)) {
 804		dev_err(dev, "pwm value %ld is out of range. "
 805			"Choose a value between 0 and 255.\n" , val);
 806		return -EINVAL;
 807	}
 808
 809	mutex_lock(&data->update_lock);
 810	data->pwm_auto_pwm[ix][ap] = val;
 811	vt1211_write8(data, VT1211_REG_PWM_AUTO_PWM(ix, ap),
 812		      data->pwm_auto_pwm[ix][ap]);
 813	mutex_unlock(&data->update_lock);
 814
 815	return count;
 816}
 817
 818/* ---------------------------------------------------------------------
 819 * Miscellaneous sysfs interfaces (VRM, VID, name, and (legacy) alarms)
 820 * --------------------------------------------------------------------- */
 821
 822static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
 823			char *buf)
 824{
 825	struct vt1211_data *data = dev_get_drvdata(dev);
 826
 827	return sprintf(buf, "%d\n", data->vrm);
 828}
 829
 830static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
 831		       const char *buf, size_t count)
 832{
 833	struct vt1211_data *data = dev_get_drvdata(dev);
 834	long val = simple_strtol(buf, NULL, 10);
 
 
 
 
 
 
 
 
 835
 836	data->vrm = val;
 837
 838	return count;
 839}
 840
 841static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
 842			char *buf)
 843{
 844	struct vt1211_data *data = dev_get_drvdata(dev);
 845
 846	return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 847}
 848
 849static ssize_t show_name(struct device *dev,
 850			 struct device_attribute *attr, char *buf)
 851{
 852	struct vt1211_data *data = dev_get_drvdata(dev);
 853
 854	return sprintf(buf, "%s\n", data->name);
 855}
 856
 857static ssize_t show_alarms(struct device *dev,
 858			   struct device_attribute *attr, char *buf)
 859{
 860	struct vt1211_data *data = vt1211_update_device(dev);
 861
 862	return sprintf(buf, "%d\n", data->alarms);
 863}
 864
 865/* ---------------------------------------------------------------------
 866 * Device attribute structs
 867 * --------------------------------------------------------------------- */
 868
 869#define SENSOR_ATTR_IN_INPUT(ix) \
 870	SENSOR_ATTR_2(in##ix##_input, S_IRUGO, \
 871		show_in, NULL, SHOW_IN_INPUT, ix)
 872
 873static struct sensor_device_attribute_2 vt1211_sysfs_in_input[] = {
 874	SENSOR_ATTR_IN_INPUT(0),
 875	SENSOR_ATTR_IN_INPUT(1),
 876	SENSOR_ATTR_IN_INPUT(2),
 877	SENSOR_ATTR_IN_INPUT(3),
 878	SENSOR_ATTR_IN_INPUT(4),
 879	SENSOR_ATTR_IN_INPUT(5),
 880};
 881
 882#define SENSOR_ATTR_IN_MIN(ix) \
 883	SENSOR_ATTR_2(in##ix##_min, S_IRUGO | S_IWUSR, \
 884		show_in, set_in, SHOW_SET_IN_MIN, ix)
 885
 886static struct sensor_device_attribute_2 vt1211_sysfs_in_min[] = {
 887	SENSOR_ATTR_IN_MIN(0),
 888	SENSOR_ATTR_IN_MIN(1),
 889	SENSOR_ATTR_IN_MIN(2),
 890	SENSOR_ATTR_IN_MIN(3),
 891	SENSOR_ATTR_IN_MIN(4),
 892	SENSOR_ATTR_IN_MIN(5),
 893};
 894
 895#define SENSOR_ATTR_IN_MAX(ix) \
 896	SENSOR_ATTR_2(in##ix##_max, S_IRUGO | S_IWUSR, \
 897		show_in, set_in, SHOW_SET_IN_MAX, ix)
 
 
 
 898
 899static struct sensor_device_attribute_2 vt1211_sysfs_in_max[] = {
 900	SENSOR_ATTR_IN_MAX(0),
 901	SENSOR_ATTR_IN_MAX(1),
 902	SENSOR_ATTR_IN_MAX(2),
 903	SENSOR_ATTR_IN_MAX(3),
 904	SENSOR_ATTR_IN_MAX(4),
 905	SENSOR_ATTR_IN_MAX(5),
 906};
 907
 908#define SENSOR_ATTR_IN_ALARM(ix) \
 909	SENSOR_ATTR_2(in##ix##_alarm, S_IRUGO, \
 910		show_in, NULL, SHOW_IN_ALARM, ix)
 
 
 
 
 911
 912static struct sensor_device_attribute_2 vt1211_sysfs_in_alarm[] = {
 913	SENSOR_ATTR_IN_ALARM(0),
 914	SENSOR_ATTR_IN_ALARM(1),
 915	SENSOR_ATTR_IN_ALARM(2),
 916	SENSOR_ATTR_IN_ALARM(3),
 917	SENSOR_ATTR_IN_ALARM(4),
 918	SENSOR_ATTR_IN_ALARM(5),
 919};
 920
 921#define SENSOR_ATTR_TEMP_INPUT(ix) \
 922	SENSOR_ATTR_2(temp##ix##_input, S_IRUGO, \
 923		show_temp, NULL, SHOW_TEMP_INPUT, ix-1)
 924
 925static struct sensor_device_attribute_2 vt1211_sysfs_temp_input[] = {
 926	SENSOR_ATTR_TEMP_INPUT(1),
 927	SENSOR_ATTR_TEMP_INPUT(2),
 928	SENSOR_ATTR_TEMP_INPUT(3),
 929	SENSOR_ATTR_TEMP_INPUT(4),
 930	SENSOR_ATTR_TEMP_INPUT(5),
 931	SENSOR_ATTR_TEMP_INPUT(6),
 932	SENSOR_ATTR_TEMP_INPUT(7),
 933};
 934
 935#define SENSOR_ATTR_TEMP_MAX(ix) \
 
 
 936	SENSOR_ATTR_2(temp##ix##_max, S_IRUGO | S_IWUSR, \
 937		show_temp, set_temp, SHOW_SET_TEMP_MAX, ix-1)
 938
 939static struct sensor_device_attribute_2 vt1211_sysfs_temp_max[] = {
 940	SENSOR_ATTR_TEMP_MAX(1),
 941	SENSOR_ATTR_TEMP_MAX(2),
 942	SENSOR_ATTR_TEMP_MAX(3),
 943	SENSOR_ATTR_TEMP_MAX(4),
 944	SENSOR_ATTR_TEMP_MAX(5),
 945	SENSOR_ATTR_TEMP_MAX(6),
 946	SENSOR_ATTR_TEMP_MAX(7),
 947};
 948
 949#define SENSOR_ATTR_TEMP_MAX_HYST(ix) \
 950	SENSOR_ATTR_2(temp##ix##_max_hyst, S_IRUGO | S_IWUSR, \
 951		show_temp, set_temp, SHOW_SET_TEMP_MAX_HYST, ix-1)
 
 
 
 952
 953static struct sensor_device_attribute_2 vt1211_sysfs_temp_max_hyst[] = {
 954	SENSOR_ATTR_TEMP_MAX_HYST(1),
 955	SENSOR_ATTR_TEMP_MAX_HYST(2),
 956	SENSOR_ATTR_TEMP_MAX_HYST(3),
 957	SENSOR_ATTR_TEMP_MAX_HYST(4),
 958	SENSOR_ATTR_TEMP_MAX_HYST(5),
 959	SENSOR_ATTR_TEMP_MAX_HYST(6),
 960	SENSOR_ATTR_TEMP_MAX_HYST(7),
 961};
 962
 963#define SENSOR_ATTR_TEMP_ALARM(ix) \
 964	SENSOR_ATTR_2(temp##ix##_alarm, S_IRUGO, \
 965		show_temp, NULL, SHOW_TEMP_ALARM, ix-1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 966
 967static struct sensor_device_attribute_2 vt1211_sysfs_temp_alarm[] = {
 968	SENSOR_ATTR_TEMP_ALARM(1),
 969	SENSOR_ATTR_TEMP_ALARM(2),
 970	SENSOR_ATTR_TEMP_ALARM(3),
 971	SENSOR_ATTR_TEMP_ALARM(4),
 972	SENSOR_ATTR_TEMP_ALARM(5),
 973	SENSOR_ATTR_TEMP_ALARM(6),
 974	SENSOR_ATTR_TEMP_ALARM(7),
 975};
 976
 977#define SENSOR_ATTR_FAN(ix) \
 978	SENSOR_ATTR_2(fan##ix##_input, S_IRUGO, \
 979		show_fan, NULL, SHOW_FAN_INPUT, ix-1), \
 980	SENSOR_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \
 981		show_fan, set_fan, SHOW_SET_FAN_MIN, ix-1), \
 982	SENSOR_ATTR_2(fan##ix##_div, S_IRUGO | S_IWUSR, \
 983		show_fan, set_fan, SHOW_SET_FAN_DIV, ix-1), \
 984	SENSOR_ATTR_2(fan##ix##_alarm, S_IRUGO, \
 985		show_fan, NULL, SHOW_FAN_ALARM, ix-1)
 986
 987#define SENSOR_ATTR_PWM(ix) \
 988	SENSOR_ATTR_2(pwm##ix, S_IRUGO, \
 989		show_pwm, NULL, SHOW_PWM, ix-1), \
 990	SENSOR_ATTR_2(pwm##ix##_enable, S_IRUGO | S_IWUSR, \
 991		show_pwm, set_pwm, SHOW_SET_PWM_ENABLE, ix-1), \
 992	SENSOR_ATTR_2(pwm##ix##_auto_channels_temp, S_IRUGO | S_IWUSR, \
 993		show_pwm, set_pwm, SHOW_SET_PWM_AUTO_CHANNELS_TEMP, ix-1)
 994
 995#define SENSOR_ATTR_PWM_FREQ(ix) \
 996	SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO | S_IWUSR, \
 997		show_pwm, set_pwm, SHOW_SET_PWM_FREQ, ix-1)
 998
 999#define SENSOR_ATTR_PWM_FREQ_RO(ix) \
1000	SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO, \
1001		show_pwm, NULL, SHOW_SET_PWM_FREQ, ix-1)
1002
1003#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP(ix, ap) \
1004	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO | S_IWUSR, \
1005		show_pwm_auto_point_temp, set_pwm_auto_point_temp, \
1006		ap-1, ix-1)
1007
1008#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(ix, ap) \
1009	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO, \
1010		show_pwm_auto_point_temp, NULL, \
1011		ap-1, ix-1)
1012
1013#define SENSOR_ATTR_PWM_AUTO_POINT_PWM(ix, ap) \
1014	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO | S_IWUSR, \
1015		show_pwm_auto_point_pwm, set_pwm_auto_point_pwm, \
1016		ap-1, ix-1)
1017
1018#define SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(ix, ap) \
1019	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO, \
1020		show_pwm_auto_point_pwm, NULL, \
1021		ap-1, ix-1)
1022
1023static struct sensor_device_attribute_2 vt1211_sysfs_fan_pwm[] = {
1024	SENSOR_ATTR_FAN(1),
1025	SENSOR_ATTR_FAN(2),
1026	SENSOR_ATTR_PWM(1),
1027	SENSOR_ATTR_PWM(2),
1028	SENSOR_ATTR_PWM_FREQ(1),
1029	SENSOR_ATTR_PWM_FREQ_RO(2),
1030	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 1),
1031	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 2),
1032	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 3),
1033	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 4),
1034	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 1),
1035	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 2),
1036	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 3),
1037	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 4),
1038	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 1),
1039	SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 2),
1040	SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 3),
1041	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 4),
1042	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 1),
1043	SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 2),
1044	SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 3),
1045	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 4),
1046};
1047
1048static struct device_attribute vt1211_sysfs_misc[] = {
1049	__ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm),
1050	__ATTR(cpu0_vid, S_IRUGO, show_vid, NULL),
1051	__ATTR(name, S_IRUGO, show_name, NULL),
1052	__ATTR(alarms, S_IRUGO, show_alarms, NULL),
1053};
1054
1055/* ---------------------------------------------------------------------
1056 * Device registration and initialization
1057 * --------------------------------------------------------------------- */
1058
1059static void __devinit vt1211_init_device(struct vt1211_data *data)
1060{
1061	/* set VRM */
1062	data->vrm = vid_which_vrm();
1063
1064	/* Read (and initialize) UCH config */
1065	data->uch_config = vt1211_read8(data, VT1211_REG_UCH_CONFIG);
1066	if (uch_config > -1) {
1067		data->uch_config = (data->uch_config & 0x83) |
1068				   (uch_config << 2);
1069		vt1211_write8(data, VT1211_REG_UCH_CONFIG, data->uch_config);
1070	}
1071
1072	/* Initialize the interrupt mode (if request at module load time).
 
1073	 * The VT1211 implements 3 different modes for clearing interrupts:
1074	 * 0: Clear INT when status register is read. Regenerate INT as long
1075	 *    as temp stays above hysteresis limit.
1076	 * 1: Clear INT when status register is read. DON'T regenerate INT
1077	 *    until temp falls below hysteresis limit and exceeds hot limit
1078	 *    again.
1079	 * 2: Clear INT when temp falls below max limit.
1080	 *
1081	 * The driver only allows to force mode 0 since that's the only one
1082	 * that makes sense for 'sensors' */
 
1083	if (int_mode == 0) {
1084		vt1211_write8(data, VT1211_REG_TEMP1_CONFIG, 0);
1085		vt1211_write8(data, VT1211_REG_TEMP2_CONFIG, 0);
1086	}
1087
1088	/* Fill in some hard wired values into our data struct */
1089	data->pwm_auto_pwm[0][3] = 255;
1090	data->pwm_auto_pwm[1][3] = 255;
1091}
1092
1093static void vt1211_remove_sysfs(struct platform_device *pdev)
1094{
1095	struct device *dev = &pdev->dev;
1096	int i;
1097
1098	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_in_input); i++) {
1099		device_remove_file(dev,
1100			&vt1211_sysfs_in_input[i].dev_attr);
1101		device_remove_file(dev,
1102			&vt1211_sysfs_in_min[i].dev_attr);
1103		device_remove_file(dev,
1104			&vt1211_sysfs_in_max[i].dev_attr);
1105		device_remove_file(dev,
1106			&vt1211_sysfs_in_alarm[i].dev_attr);
1107	}
1108	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_temp_input); i++) {
1109		device_remove_file(dev,
1110			&vt1211_sysfs_temp_input[i].dev_attr);
1111		device_remove_file(dev,
1112			&vt1211_sysfs_temp_max[i].dev_attr);
1113		device_remove_file(dev,
1114			&vt1211_sysfs_temp_max_hyst[i].dev_attr);
1115		device_remove_file(dev,
1116			&vt1211_sysfs_temp_alarm[i].dev_attr);
1117	}
1118	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1119		device_remove_file(dev,
1120			&vt1211_sysfs_fan_pwm[i].dev_attr);
1121	}
1122	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) {
1123		device_remove_file(dev, &vt1211_sysfs_misc[i]);
1124	}
1125}
1126
1127static int __devinit vt1211_probe(struct platform_device *pdev)
1128{
1129	struct device *dev = &pdev->dev;
1130	struct vt1211_data *data;
1131	struct resource *res;
1132	int i, err;
1133
1134	if (!(data = kzalloc(sizeof(struct vt1211_data), GFP_KERNEL))) {
1135		err = -ENOMEM;
1136		dev_err(dev, "Out of memory\n");
1137		goto EXIT;
1138	}
1139
1140	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1141	if (!request_region(res->start, resource_size(res), DRVNAME)) {
1142		err = -EBUSY;
1143		dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1144			(unsigned long)res->start, (unsigned long)res->end);
1145		goto EXIT_KFREE;
1146	}
1147	data->addr = res->start;
1148	data->name = DRVNAME;
1149	mutex_init(&data->update_lock);
1150
1151	platform_set_drvdata(pdev, data);
1152
1153	/* Initialize the VT1211 chip */
1154	vt1211_init_device(data);
1155
1156	/* Create sysfs interface files */
1157	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_in_input); i++) {
1158		if (ISVOLT(i, data->uch_config)) {
1159			if ((err = device_create_file(dev,
1160				&vt1211_sysfs_in_input[i].dev_attr)) ||
1161			    (err = device_create_file(dev,
1162				&vt1211_sysfs_in_min[i].dev_attr)) ||
1163			    (err = device_create_file(dev,
1164				&vt1211_sysfs_in_max[i].dev_attr)) ||
1165			    (err = device_create_file(dev,
1166				&vt1211_sysfs_in_alarm[i].dev_attr))) {
1167				goto EXIT_DEV_REMOVE;
1168			}
1169		}
1170	}
1171	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_temp_input); i++) {
1172		if (ISTEMP(i, data->uch_config)) {
1173			if ((err = device_create_file(dev,
1174				&vt1211_sysfs_temp_input[i].dev_attr)) ||
1175			    (err = device_create_file(dev,
1176				&vt1211_sysfs_temp_max[i].dev_attr)) ||
1177			    (err = device_create_file(dev,
1178				&vt1211_sysfs_temp_max_hyst[i].dev_attr)) ||
1179			    (err = device_create_file(dev,
1180				&vt1211_sysfs_temp_alarm[i].dev_attr))) {
1181				goto EXIT_DEV_REMOVE;
1182			}
1183		}
1184	}
1185	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1186		err = device_create_file(dev,
1187			&vt1211_sysfs_fan_pwm[i].dev_attr);
1188		if (err) {
1189			goto EXIT_DEV_REMOVE;
1190		}
1191	}
1192	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) {
1193		err = device_create_file(dev,
1194		       &vt1211_sysfs_misc[i]);
1195		if (err) {
1196			goto EXIT_DEV_REMOVE;
1197		}
1198	}
1199
1200	/* Register device */
1201	data->hwmon_dev = hwmon_device_register(dev);
1202	if (IS_ERR(data->hwmon_dev)) {
1203		err = PTR_ERR(data->hwmon_dev);
1204		dev_err(dev, "Class registration failed (%d)\n", err);
1205		goto EXIT_DEV_REMOVE_SILENT;
1206	}
1207
1208	return 0;
1209
1210EXIT_DEV_REMOVE:
1211	dev_err(dev, "Sysfs interface creation failed (%d)\n", err);
1212EXIT_DEV_REMOVE_SILENT:
1213	vt1211_remove_sysfs(pdev);
1214	release_region(res->start, resource_size(res));
1215EXIT_KFREE:
1216	platform_set_drvdata(pdev, NULL);
1217	kfree(data);
1218EXIT:
1219	return err;
1220}
1221
1222static int __devexit vt1211_remove(struct platform_device *pdev)
1223{
1224	struct vt1211_data *data = platform_get_drvdata(pdev);
1225	struct resource *res;
1226
1227	hwmon_device_unregister(data->hwmon_dev);
1228	vt1211_remove_sysfs(pdev);
1229	platform_set_drvdata(pdev, NULL);
1230	kfree(data);
1231
1232	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1233	release_region(res->start, resource_size(res));
1234
1235	return 0;
1236}
1237
1238static struct platform_driver vt1211_driver = {
1239	.driver = {
1240		.owner = THIS_MODULE,
1241		.name  = DRVNAME,
1242	},
1243	.probe  = vt1211_probe,
1244	.remove = __devexit_p(vt1211_remove),
1245};
1246
1247static int __init vt1211_device_add(unsigned short address)
1248{
1249	struct resource res = {
1250		.start	= address,
1251		.end	= address + 0x7f,
1252		.flags	= IORESOURCE_IO,
1253	};
1254	int err;
1255
1256	pdev = platform_device_alloc(DRVNAME, address);
1257	if (!pdev) {
1258		err = -ENOMEM;
1259		pr_err("Device allocation failed (%d)\n", err);
1260		goto EXIT;
1261	}
1262
1263	res.name = pdev->name;
1264	err = acpi_check_resource_conflict(&res);
1265	if (err)
1266		goto EXIT_DEV_PUT;
1267
1268	err = platform_device_add_resources(pdev, &res, 1);
1269	if (err) {
1270		pr_err("Device resource addition failed (%d)\n", err);
1271		goto EXIT_DEV_PUT;
1272	}
1273
1274	err = platform_device_add(pdev);
1275	if (err) {
1276		pr_err("Device addition failed (%d)\n", err);
1277		goto EXIT_DEV_PUT;
1278	}
1279
1280	return 0;
1281
1282EXIT_DEV_PUT:
1283	platform_device_put(pdev);
1284EXIT:
1285	return err;
1286}
1287
1288static int __init vt1211_find(int sio_cip, unsigned short *address)
1289{
1290	int err = -ENODEV;
1291	int devid;
1292
1293	superio_enter(sio_cip);
 
 
1294
 
1295	devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
1296	if (devid != SIO_VT1211_ID) {
1297		goto EXIT;
1298	}
1299
1300	superio_select(sio_cip, SIO_VT1211_LDN_HWMON);
1301
1302	if ((superio_inb(sio_cip, SIO_VT1211_ACTIVE) & 1) == 0) {
1303		pr_warn("HW monitor is disabled, skipping\n");
1304		goto EXIT;
1305	}
1306
1307	*address = ((superio_inb(sio_cip, SIO_VT1211_BADDR) << 8) |
1308		    (superio_inb(sio_cip, SIO_VT1211_BADDR + 1))) & 0xff00;
1309	if (*address == 0) {
1310		pr_warn("Base address is not set, skipping\n");
1311		goto EXIT;
1312	}
1313
1314	err = 0;
1315	pr_info("Found VT1211 chip at 0x%04x, revision %u\n",
1316		*address, superio_inb(sio_cip, SIO_VT1211_DEVREV));
1317
1318EXIT:
1319	superio_exit(sio_cip);
1320	return err;
1321}
1322
1323static int __init vt1211_init(void)
1324{
1325	int err;
1326	unsigned short address = 0;
1327
1328	if ((err = vt1211_find(SIO_REG_CIP1, &address)) &&
1329	    (err = vt1211_find(SIO_REG_CIP2, &address))) {
1330		goto EXIT;
 
 
1331	}
1332
1333	if ((uch_config < -1) || (uch_config > 31)) {
1334		err = -EINVAL;
1335		pr_warn("Invalid UCH configuration %d. "
1336			"Choose a value between 0 and 31.\n", uch_config);
1337	  goto EXIT;
1338	}
1339
1340	if ((int_mode < -1) || (int_mode > 0)) {
1341		err = -EINVAL;
1342		pr_warn("Invalid interrupt mode %d. "
1343			"Only mode 0 is supported.\n", int_mode);
1344	  goto EXIT;
1345	}
1346
1347	err = platform_driver_register(&vt1211_driver);
1348	if (err) {
1349		goto EXIT;
1350	}
1351
1352	/* Sets global pdev as a side effect */
1353	err = vt1211_device_add(address);
1354	if (err) {
1355		goto EXIT_DRV_UNREGISTER;
1356	}
1357
1358	return 0;
1359
1360EXIT_DRV_UNREGISTER:
1361	platform_driver_unregister(&vt1211_driver);
1362EXIT:
1363	return err;
1364}
1365
1366static void __exit vt1211_exit(void)
1367{
1368	platform_device_unregister(pdev);
1369	platform_driver_unregister(&vt1211_driver);
1370}
1371
1372MODULE_AUTHOR("Juerg Haefliger <juergh@gmail.com>");
1373MODULE_DESCRIPTION("VT1211 sensors");
1374MODULE_LICENSE("GPL");
1375
1376module_init(vt1211_init);
1377module_exit(vt1211_exit);
v6.2
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * vt1211.c - driver for the VIA VT1211 Super-I/O chip integrated hardware
   4 *            monitoring features
   5 * Copyright (C) 2006 Juerg Haefliger <juergh@gmail.com>
   6 *
   7 * This driver is based on the driver for kernel 2.4 by Mark D. Studebaker
   8 * and its port to kernel 2.6 by Lars Ekman.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   9 */
  10
  11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/slab.h>
  16#include <linux/jiffies.h>
  17#include <linux/platform_device.h>
  18#include <linux/hwmon.h>
  19#include <linux/hwmon-sysfs.h>
  20#include <linux/hwmon-vid.h>
  21#include <linux/err.h>
  22#include <linux/mutex.h>
  23#include <linux/ioport.h>
  24#include <linux/acpi.h>
  25#include <linux/io.h>
  26
  27static int uch_config = -1;
  28module_param(uch_config, int, 0);
  29MODULE_PARM_DESC(uch_config, "Initialize the universal channel configuration");
  30
  31static int int_mode = -1;
  32module_param(int_mode, int, 0);
  33MODULE_PARM_DESC(int_mode, "Force the temperature interrupt mode");
  34
  35static unsigned short force_id;
  36module_param(force_id, ushort, 0);
  37MODULE_PARM_DESC(force_id, "Override the detected device ID");
  38
  39static struct platform_device *pdev;
  40
  41#define DRVNAME "vt1211"
  42
  43/* ---------------------------------------------------------------------
  44 * Registers
  45 *
  46 * The sensors are defined as follows.
  47 *
  48 * Sensor          Voltage Mode   Temp Mode   Notes (from the datasheet)
  49 * --------        ------------   ---------   --------------------------
  50 * Reading 1                      temp1       Intel thermal diode
  51 * Reading 3                      temp2       Internal thermal diode
  52 * UCH1/Reading2   in0            temp3       NTC type thermistor
  53 * UCH2            in1            temp4       +2.5V
  54 * UCH3            in2            temp5       VccP
  55 * UCH4            in3            temp6       +5V
  56 * UCH5            in4            temp7       +12V
  57 * 3.3V            in5                        Internal VDD (+3.3V)
  58 *
  59 * --------------------------------------------------------------------- */
  60
  61/* Voltages (in) numbered 0-5 (ix) */
  62#define VT1211_REG_IN(ix)		(0x21 + (ix))
  63#define VT1211_REG_IN_MIN(ix)		((ix) == 0 ? 0x3e : 0x2a + 2 * (ix))
  64#define VT1211_REG_IN_MAX(ix)		((ix) == 0 ? 0x3d : 0x29 + 2 * (ix))
  65
  66/* Temperatures (temp) numbered 0-6 (ix) */
  67static u8 regtemp[]	= {0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25};
  68static u8 regtempmax[]	= {0x39, 0x1d, 0x3d, 0x2b, 0x2d, 0x2f, 0x31};
  69static u8 regtemphyst[]	= {0x3a, 0x1e, 0x3e, 0x2c, 0x2e, 0x30, 0x32};
  70
  71/* Fans numbered 0-1 (ix) */
  72#define VT1211_REG_FAN(ix)		(0x29 + (ix))
  73#define VT1211_REG_FAN_MIN(ix)		(0x3b + (ix))
  74#define VT1211_REG_FAN_DIV		 0x47
  75
  76/* PWMs numbered 0-1 (ix) */
  77/* Auto points numbered 0-3 (ap) */
  78#define VT1211_REG_PWM(ix)		(0x60 + (ix))
  79#define VT1211_REG_PWM_CLK		 0x50
  80#define VT1211_REG_PWM_CTL		 0x51
  81#define VT1211_REG_PWM_AUTO_TEMP(ap)	(0x55 - (ap))
  82#define VT1211_REG_PWM_AUTO_PWM(ix, ap)	(0x58 + 2 * (ix) - (ap))
  83
  84/* Miscellaneous registers */
  85#define VT1211_REG_CONFIG		0x40
  86#define VT1211_REG_ALARM1		0x41
  87#define VT1211_REG_ALARM2		0x42
  88#define VT1211_REG_VID			0x45
  89#define VT1211_REG_UCH_CONFIG		0x4a
  90#define VT1211_REG_TEMP1_CONFIG		0x4b
  91#define VT1211_REG_TEMP2_CONFIG		0x4c
  92
  93/* In, temp & fan alarm bits */
  94static const u8 bitalarmin[]	= {11, 0, 1, 3, 8, 2, 9};
  95static const u8 bitalarmtemp[]	= {4, 15, 11, 0, 1, 3, 8};
  96static const u8 bitalarmfan[]	= {6, 7};
  97
  98/* ---------------------------------------------------------------------
  99 * Data structures and manipulation thereof
 100 * --------------------------------------------------------------------- */
 101
 102struct vt1211_data {
 103	unsigned short addr;
 104	const char *name;
 105	struct device *hwmon_dev;
 106
 107	struct mutex update_lock;
 108	bool valid;			/* true if following fields are valid */
 109	unsigned long last_updated;	/* In jiffies */
 110
 111	/* Register values */
 112	u8  in[6];
 113	u8  in_max[6];
 114	u8  in_min[6];
 115	u8  temp[7];
 116	u8  temp_max[7];
 117	u8  temp_hyst[7];
 118	u8  fan[2];
 119	u8  fan_min[2];
 120	u8  fan_div[2];
 121	u8  fan_ctl;
 122	u8  pwm[2];
 123	u8  pwm_ctl[2];
 124	u8  pwm_clk;
 125	u8  pwm_auto_temp[4];
 126	u8  pwm_auto_pwm[2][4];
 127	u8  vid;		/* Read once at init time */
 128	u8  vrm;
 129	u8  uch_config;		/* Read once at init time */
 130	u16 alarms;
 131};
 132
 133/* ix = [0-5] */
 134#define ISVOLT(ix, uch_config)	((ix) > 4 ? 1 : \
 135				 !(((uch_config) >> ((ix) + 2)) & 1))
 136
 137/* ix = [0-6] */
 138#define ISTEMP(ix, uch_config)	((ix) < 2 ? 1 : \
 139				 ((uch_config) >> (ix)) & 1)
 140
 141/*
 142 * in5 (ix = 5) is special. It's the internal 3.3V so it's scaled in the
 143 * driver according to the VT1211 BIOS porting guide
 144 */
 145#define IN_FROM_REG(ix, reg)	((reg) < 3 ? 0 : (ix) == 5 ? \
 146				 (((reg) - 3) * 15882 + 479) / 958 : \
 147				 (((reg) - 3) * 10000 + 479) / 958)
 148#define IN_TO_REG(ix, val)	(clamp_val((ix) == 5 ? \
 149				 ((val) * 958 + 7941) / 15882 + 3 : \
 150				 ((val) * 958 + 5000) / 10000 + 3, 0, 255))
 151
 152/*
 153 * temp1 (ix = 0) is an intel thermal diode which is scaled in user space.
 154 * temp2 (ix = 1) is the internal temp diode so it's scaled in the driver
 155 * according to some measurements that I took on an EPIA M10000.
 156 * temp3-7 are thermistor based so the driver returns the voltage measured at
 157 * the pin (range 0V - 2.2V).
 158 */
 159#define TEMP_FROM_REG(ix, reg)	((ix) == 0 ? (reg) * 1000 : \
 160				 (ix) == 1 ? (reg) < 51 ? 0 : \
 161				 ((reg) - 51) * 1000 : \
 162				 ((253 - (reg)) * 2200 + 105) / 210)
 163#define TEMP_TO_REG(ix, val)	clamp_val( \
 164				 ((ix) == 0 ? ((val) + 500) / 1000 : \
 165				  (ix) == 1 ? ((val) + 500) / 1000 + 51 : \
 166				  253 - ((val) * 210 + 1100) / 2200), 0, 255)
 167
 168#define DIV_FROM_REG(reg)	(1 << (reg))
 169
 170#define RPM_FROM_REG(reg, div)	(((reg) == 0) || ((reg) == 255) ? 0 : \
 171				 1310720 / (reg) / DIV_FROM_REG(div))
 172#define RPM_TO_REG(val, div)	((val) == 0 ? 255 : \
 173				 clamp_val((1310720 / (val) / \
 174				 DIV_FROM_REG(div)), 1, 254))
 175
 176/* ---------------------------------------------------------------------
 177 * Super-I/O constants and functions
 178 * --------------------------------------------------------------------- */
 179
 180/*
 181 * Configuration index port registers
 182 * The vt1211 can live at 2 different addresses so we need to probe both
 183 */
 184#define SIO_REG_CIP1		0x2e
 185#define SIO_REG_CIP2		0x4e
 186
 187/* Configuration registers */
 188#define SIO_VT1211_LDN		0x07	/* logical device number */
 189#define SIO_VT1211_DEVID	0x20	/* device ID */
 190#define SIO_VT1211_DEVREV	0x21	/* device revision */
 191#define SIO_VT1211_ACTIVE	0x30	/* HW monitor active */
 192#define SIO_VT1211_BADDR	0x60	/* base I/O address */
 193#define SIO_VT1211_ID		0x3c	/* VT1211 device ID */
 194
 195/* VT1211 logical device numbers */
 196#define SIO_VT1211_LDN_HWMON	0x0b	/* HW monitor */
 197
 198static inline void superio_outb(int sio_cip, int reg, int val)
 199{
 200	outb(reg, sio_cip);
 201	outb(val, sio_cip + 1);
 202}
 203
 204static inline int superio_inb(int sio_cip, int reg)
 205{
 206	outb(reg, sio_cip);
 207	return inb(sio_cip + 1);
 208}
 209
 210static inline void superio_select(int sio_cip, int ldn)
 211{
 212	outb(SIO_VT1211_LDN, sio_cip);
 213	outb(ldn, sio_cip + 1);
 214}
 215
 216static inline int superio_enter(int sio_cip)
 217{
 218	if (!request_muxed_region(sio_cip, 2, DRVNAME))
 219		return -EBUSY;
 220
 221	outb(0x87, sio_cip);
 222	outb(0x87, sio_cip);
 223
 224	return 0;
 225}
 226
 227static inline void superio_exit(int sio_cip)
 228{
 229	outb(0xaa, sio_cip);
 230	release_region(sio_cip, 2);
 231}
 232
 233/* ---------------------------------------------------------------------
 234 * Device I/O access
 235 * --------------------------------------------------------------------- */
 236
 237static inline u8 vt1211_read8(struct vt1211_data *data, u8 reg)
 238{
 239	return inb(data->addr + reg);
 240}
 241
 242static inline void vt1211_write8(struct vt1211_data *data, u8 reg, u8 val)
 243{
 244	outb(val, data->addr + reg);
 245}
 246
 247static struct vt1211_data *vt1211_update_device(struct device *dev)
 248{
 249	struct vt1211_data *data = dev_get_drvdata(dev);
 250	int ix, val;
 251
 252	mutex_lock(&data->update_lock);
 253
 254	/* registers cache is refreshed after 1 second */
 255	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
 256		/* read VID */
 257		data->vid = vt1211_read8(data, VT1211_REG_VID) & 0x1f;
 258
 259		/* voltage (in) registers */
 260		for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) {
 261			if (ISVOLT(ix, data->uch_config)) {
 262				data->in[ix] = vt1211_read8(data,
 263						VT1211_REG_IN(ix));
 264				data->in_min[ix] = vt1211_read8(data,
 265						VT1211_REG_IN_MIN(ix));
 266				data->in_max[ix] = vt1211_read8(data,
 267						VT1211_REG_IN_MAX(ix));
 268			}
 269		}
 270
 271		/* temp registers */
 272		for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) {
 273			if (ISTEMP(ix, data->uch_config)) {
 274				data->temp[ix] = vt1211_read8(data,
 275						regtemp[ix]);
 276				data->temp_max[ix] = vt1211_read8(data,
 277						regtempmax[ix]);
 278				data->temp_hyst[ix] = vt1211_read8(data,
 279						regtemphyst[ix]);
 280			}
 281		}
 282
 283		/* fan & pwm registers */
 284		for (ix = 0; ix < ARRAY_SIZE(data->fan); ix++) {
 285			data->fan[ix] = vt1211_read8(data,
 286						VT1211_REG_FAN(ix));
 287			data->fan_min[ix] = vt1211_read8(data,
 288						VT1211_REG_FAN_MIN(ix));
 289			data->pwm[ix] = vt1211_read8(data,
 290						VT1211_REG_PWM(ix));
 291		}
 292		val = vt1211_read8(data, VT1211_REG_FAN_DIV);
 293		data->fan_div[0] = (val >> 4) & 3;
 294		data->fan_div[1] = (val >> 6) & 3;
 295		data->fan_ctl = val & 0xf;
 296
 297		val = vt1211_read8(data, VT1211_REG_PWM_CTL);
 298		data->pwm_ctl[0] = val & 0xf;
 299		data->pwm_ctl[1] = (val >> 4) & 0xf;
 300
 301		data->pwm_clk = vt1211_read8(data, VT1211_REG_PWM_CLK);
 302
 303		/* pwm & temp auto point registers */
 304		data->pwm_auto_pwm[0][1] = vt1211_read8(data,
 305						VT1211_REG_PWM_AUTO_PWM(0, 1));
 306		data->pwm_auto_pwm[0][2] = vt1211_read8(data,
 307						VT1211_REG_PWM_AUTO_PWM(0, 2));
 308		data->pwm_auto_pwm[1][1] = vt1211_read8(data,
 309						VT1211_REG_PWM_AUTO_PWM(1, 1));
 310		data->pwm_auto_pwm[1][2] = vt1211_read8(data,
 311						VT1211_REG_PWM_AUTO_PWM(1, 2));
 312		for (ix = 0; ix < ARRAY_SIZE(data->pwm_auto_temp); ix++) {
 313			data->pwm_auto_temp[ix] = vt1211_read8(data,
 314						VT1211_REG_PWM_AUTO_TEMP(ix));
 315		}
 316
 317		/* alarm registers */
 318		data->alarms = (vt1211_read8(data, VT1211_REG_ALARM2) << 8) |
 319				vt1211_read8(data, VT1211_REG_ALARM1);
 320
 321		data->last_updated = jiffies;
 322		data->valid = true;
 323	}
 324
 325	mutex_unlock(&data->update_lock);
 326
 327	return data;
 328}
 329
 330/* ---------------------------------------------------------------------
 331 * Voltage sysfs interfaces
 332 * ix = [0-5]
 333 * --------------------------------------------------------------------- */
 334
 335#define SHOW_IN_INPUT	0
 336#define SHOW_SET_IN_MIN	1
 337#define SHOW_SET_IN_MAX	2
 338#define SHOW_IN_ALARM	3
 339
 340static ssize_t show_in(struct device *dev, struct device_attribute *attr,
 341		       char *buf)
 342{
 343	struct vt1211_data *data = vt1211_update_device(dev);
 344	struct sensor_device_attribute_2 *sensor_attr_2 =
 345						to_sensor_dev_attr_2(attr);
 346	int ix = sensor_attr_2->index;
 347	int fn = sensor_attr_2->nr;
 348	int res;
 349
 350	switch (fn) {
 351	case SHOW_IN_INPUT:
 352		res = IN_FROM_REG(ix, data->in[ix]);
 353		break;
 354	case SHOW_SET_IN_MIN:
 355		res = IN_FROM_REG(ix, data->in_min[ix]);
 356		break;
 357	case SHOW_SET_IN_MAX:
 358		res = IN_FROM_REG(ix, data->in_max[ix]);
 359		break;
 360	case SHOW_IN_ALARM:
 361		res = (data->alarms >> bitalarmin[ix]) & 1;
 362		break;
 363	default:
 364		res = 0;
 365		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 366	}
 367
 368	return sprintf(buf, "%d\n", res);
 369}
 370
 371static ssize_t set_in(struct device *dev, struct device_attribute *attr,
 372		      const char *buf, size_t count)
 373{
 374	struct vt1211_data *data = dev_get_drvdata(dev);
 375	struct sensor_device_attribute_2 *sensor_attr_2 =
 376						to_sensor_dev_attr_2(attr);
 377	int ix = sensor_attr_2->index;
 378	int fn = sensor_attr_2->nr;
 379	long val;
 380	int err;
 381
 382	err = kstrtol(buf, 10, &val);
 383	if (err)
 384		return err;
 385
 386	mutex_lock(&data->update_lock);
 387	switch (fn) {
 388	case SHOW_SET_IN_MIN:
 389		data->in_min[ix] = IN_TO_REG(ix, val);
 390		vt1211_write8(data, VT1211_REG_IN_MIN(ix), data->in_min[ix]);
 391		break;
 392	case SHOW_SET_IN_MAX:
 393		data->in_max[ix] = IN_TO_REG(ix, val);
 394		vt1211_write8(data, VT1211_REG_IN_MAX(ix), data->in_max[ix]);
 395		break;
 396	default:
 397		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 398	}
 399	mutex_unlock(&data->update_lock);
 400
 401	return count;
 402}
 403
 404/* ---------------------------------------------------------------------
 405 * Temperature sysfs interfaces
 406 * ix = [0-6]
 407 * --------------------------------------------------------------------- */
 408
 409#define SHOW_TEMP_INPUT		0
 410#define SHOW_SET_TEMP_MAX	1
 411#define SHOW_SET_TEMP_MAX_HYST	2
 412#define SHOW_TEMP_ALARM		3
 413
 414static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
 415			 char *buf)
 416{
 417	struct vt1211_data *data = vt1211_update_device(dev);
 418	struct sensor_device_attribute_2 *sensor_attr_2 =
 419						to_sensor_dev_attr_2(attr);
 420	int ix = sensor_attr_2->index;
 421	int fn = sensor_attr_2->nr;
 422	int res;
 423
 424	switch (fn) {
 425	case SHOW_TEMP_INPUT:
 426		res = TEMP_FROM_REG(ix, data->temp[ix]);
 427		break;
 428	case SHOW_SET_TEMP_MAX:
 429		res = TEMP_FROM_REG(ix, data->temp_max[ix]);
 430		break;
 431	case SHOW_SET_TEMP_MAX_HYST:
 432		res = TEMP_FROM_REG(ix, data->temp_hyst[ix]);
 433		break;
 434	case SHOW_TEMP_ALARM:
 435		res = (data->alarms >> bitalarmtemp[ix]) & 1;
 436		break;
 437	default:
 438		res = 0;
 439		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 440	}
 441
 442	return sprintf(buf, "%d\n", res);
 443}
 444
 445static ssize_t set_temp(struct device *dev, struct device_attribute *attr,
 446			const char *buf, size_t count)
 447{
 448	struct vt1211_data *data = dev_get_drvdata(dev);
 449	struct sensor_device_attribute_2 *sensor_attr_2 =
 450						to_sensor_dev_attr_2(attr);
 451	int ix = sensor_attr_2->index;
 452	int fn = sensor_attr_2->nr;
 453	long val;
 454	int err;
 455
 456	err = kstrtol(buf, 10, &val);
 457	if (err)
 458		return err;
 459
 460	mutex_lock(&data->update_lock);
 461	switch (fn) {
 462	case SHOW_SET_TEMP_MAX:
 463		data->temp_max[ix] = TEMP_TO_REG(ix, val);
 464		vt1211_write8(data, regtempmax[ix],
 465			      data->temp_max[ix]);
 466		break;
 467	case SHOW_SET_TEMP_MAX_HYST:
 468		data->temp_hyst[ix] = TEMP_TO_REG(ix, val);
 469		vt1211_write8(data, regtemphyst[ix],
 470			      data->temp_hyst[ix]);
 471		break;
 472	default:
 473		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 474	}
 475	mutex_unlock(&data->update_lock);
 476
 477	return count;
 478}
 479
 480/* ---------------------------------------------------------------------
 481 * Fan sysfs interfaces
 482 * ix = [0-1]
 483 * --------------------------------------------------------------------- */
 484
 485#define SHOW_FAN_INPUT		0
 486#define SHOW_SET_FAN_MIN	1
 487#define SHOW_SET_FAN_DIV	2
 488#define SHOW_FAN_ALARM		3
 489
 490static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
 491			char *buf)
 492{
 493	struct vt1211_data *data = vt1211_update_device(dev);
 494	struct sensor_device_attribute_2 *sensor_attr_2 =
 495						to_sensor_dev_attr_2(attr);
 496	int ix = sensor_attr_2->index;
 497	int fn = sensor_attr_2->nr;
 498	int res;
 499
 500	switch (fn) {
 501	case SHOW_FAN_INPUT:
 502		res = RPM_FROM_REG(data->fan[ix], data->fan_div[ix]);
 503		break;
 504	case SHOW_SET_FAN_MIN:
 505		res = RPM_FROM_REG(data->fan_min[ix], data->fan_div[ix]);
 506		break;
 507	case SHOW_SET_FAN_DIV:
 508		res = DIV_FROM_REG(data->fan_div[ix]);
 509		break;
 510	case SHOW_FAN_ALARM:
 511		res = (data->alarms >> bitalarmfan[ix]) & 1;
 512		break;
 513	default:
 514		res = 0;
 515		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 516	}
 517
 518	return sprintf(buf, "%d\n", res);
 519}
 520
 521static ssize_t set_fan(struct device *dev, struct device_attribute *attr,
 522		       const char *buf, size_t count)
 523{
 524	struct vt1211_data *data = dev_get_drvdata(dev);
 525	struct sensor_device_attribute_2 *sensor_attr_2 =
 526						to_sensor_dev_attr_2(attr);
 527	int ix = sensor_attr_2->index;
 528	int fn = sensor_attr_2->nr;
 
 529	int reg;
 530	unsigned long val;
 531	int err;
 532
 533	err = kstrtoul(buf, 10, &val);
 534	if (err)
 535		return err;
 536
 537	mutex_lock(&data->update_lock);
 538
 539	/* sync the data cache */
 540	reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 541	data->fan_div[0] = (reg >> 4) & 3;
 542	data->fan_div[1] = (reg >> 6) & 3;
 543	data->fan_ctl = reg & 0xf;
 544
 545	switch (fn) {
 546	case SHOW_SET_FAN_MIN:
 547		data->fan_min[ix] = RPM_TO_REG(val, data->fan_div[ix]);
 548		vt1211_write8(data, VT1211_REG_FAN_MIN(ix),
 549			      data->fan_min[ix]);
 550		break;
 551	case SHOW_SET_FAN_DIV:
 552		switch (val) {
 553		case 1:
 554			data->fan_div[ix] = 0;
 555			break;
 556		case 2:
 557			data->fan_div[ix] = 1;
 558			break;
 559		case 4:
 560			data->fan_div[ix] = 2;
 561			break;
 562		case 8:
 563			data->fan_div[ix] = 3;
 564			break;
 565		default:
 566			count = -EINVAL;
 567			dev_warn(dev,
 568				 "fan div value %ld not supported. Choose one of 1, 2, 4, or 8.\n",
 569				 val);
 570			goto EXIT;
 571		}
 572		vt1211_write8(data, VT1211_REG_FAN_DIV,
 573			      ((data->fan_div[1] << 6) |
 574			       (data->fan_div[0] << 4) |
 575				data->fan_ctl));
 576		break;
 577	default:
 578		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 579	}
 580
 581EXIT:
 582	mutex_unlock(&data->update_lock);
 583	return count;
 584}
 585
 586/* ---------------------------------------------------------------------
 587 * PWM sysfs interfaces
 588 * ix = [0-1]
 589 * --------------------------------------------------------------------- */
 590
 591#define SHOW_PWM			0
 592#define SHOW_SET_PWM_ENABLE		1
 593#define SHOW_SET_PWM_FREQ		2
 594#define SHOW_SET_PWM_AUTO_CHANNELS_TEMP	3
 595
 596static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
 597			char *buf)
 598{
 599	struct vt1211_data *data = vt1211_update_device(dev);
 600	struct sensor_device_attribute_2 *sensor_attr_2 =
 601						to_sensor_dev_attr_2(attr);
 602	int ix = sensor_attr_2->index;
 603	int fn = sensor_attr_2->nr;
 604	int res;
 605
 606	switch (fn) {
 607	case SHOW_PWM:
 608		res = data->pwm[ix];
 609		break;
 610	case SHOW_SET_PWM_ENABLE:
 611		res = ((data->pwm_ctl[ix] >> 3) & 1) ? 2 : 0;
 612		break;
 613	case SHOW_SET_PWM_FREQ:
 614		res = 90000 >> (data->pwm_clk & 7);
 615		break;
 616	case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 617		res = (data->pwm_ctl[ix] & 7) + 1;
 618		break;
 619	default:
 620		res = 0;
 621		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 622	}
 623
 624	return sprintf(buf, "%d\n", res);
 625}
 626
 627static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
 628		       const char *buf, size_t count)
 629{
 630	struct vt1211_data *data = dev_get_drvdata(dev);
 631	struct sensor_device_attribute_2 *sensor_attr_2 =
 632						to_sensor_dev_attr_2(attr);
 633	int ix = sensor_attr_2->index;
 634	int fn = sensor_attr_2->nr;
 
 635	int tmp, reg;
 636	unsigned long val;
 637	int err;
 638
 639	err = kstrtoul(buf, 10, &val);
 640	if (err)
 641		return err;
 642
 643	mutex_lock(&data->update_lock);
 644
 645	switch (fn) {
 646	case SHOW_SET_PWM_ENABLE:
 647		/* sync the data cache */
 648		reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 649		data->fan_div[0] = (reg >> 4) & 3;
 650		data->fan_div[1] = (reg >> 6) & 3;
 651		data->fan_ctl = reg & 0xf;
 652		reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 653		data->pwm_ctl[0] = reg & 0xf;
 654		data->pwm_ctl[1] = (reg >> 4) & 0xf;
 655		switch (val) {
 656		case 0:
 657			data->pwm_ctl[ix] &= 7;
 658			/*
 659			 * disable SmartGuardian if both PWM outputs are
 660			 * disabled
 661			 */
 662			if ((data->pwm_ctl[ix ^ 1] & 1) == 0)
 663				data->fan_ctl &= 0xe;
 
 664			break;
 665		case 2:
 666			data->pwm_ctl[ix] |= 8;
 667			data->fan_ctl |= 1;
 668			break;
 669		default:
 670			count = -EINVAL;
 671			dev_warn(dev,
 672				 "pwm mode %ld not supported. Choose one of 0 or 2.\n",
 673				 val);
 674			goto EXIT;
 675		}
 676		vt1211_write8(data, VT1211_REG_PWM_CTL,
 677			      ((data->pwm_ctl[1] << 4) |
 678				data->pwm_ctl[0]));
 679		vt1211_write8(data, VT1211_REG_FAN_DIV,
 680			      ((data->fan_div[1] << 6) |
 681			       (data->fan_div[0] << 4) |
 682				data->fan_ctl));
 683		break;
 684	case SHOW_SET_PWM_FREQ:
 685		val = 135000 / clamp_val(val, 135000 >> 7, 135000);
 686		/* calculate tmp = log2(val) */
 687		tmp = 0;
 688		for (val >>= 1; val > 0; val >>= 1)
 689			tmp++;
 
 690		/* sync the data cache */
 691		reg = vt1211_read8(data, VT1211_REG_PWM_CLK);
 692		data->pwm_clk = (reg & 0xf8) | tmp;
 693		vt1211_write8(data, VT1211_REG_PWM_CLK, data->pwm_clk);
 694		break;
 695	case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 696		if (val < 1 || val > 7) {
 697			count = -EINVAL;
 698			dev_warn(dev,
 699				 "temp channel %ld not supported. Choose a value between 1 and 7.\n",
 700				 val);
 701			goto EXIT;
 702		}
 703		if (!ISTEMP(val - 1, data->uch_config)) {
 704			count = -EINVAL;
 705			dev_warn(dev, "temp channel %ld is not available.\n",
 706				 val);
 707			goto EXIT;
 708		}
 709		/* sync the data cache */
 710		reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 711		data->pwm_ctl[0] = reg & 0xf;
 712		data->pwm_ctl[1] = (reg >> 4) & 0xf;
 713		data->pwm_ctl[ix] = (data->pwm_ctl[ix] & 8) | (val - 1);
 714		vt1211_write8(data, VT1211_REG_PWM_CTL,
 715			      ((data->pwm_ctl[1] << 4) | data->pwm_ctl[0]));
 716		break;
 717	default:
 718		dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 719	}
 720
 721EXIT:
 722	mutex_unlock(&data->update_lock);
 723	return count;
 724}
 725
 726/* ---------------------------------------------------------------------
 727 * PWM auto point definitions
 728 * ix = [0-1]
 729 * ap = [0-3]
 730 * --------------------------------------------------------------------- */
 731
 732/*
 733 * pwm[ix+1]_auto_point[ap+1]_temp mapping table:
 734 * Note that there is only a single set of temp auto points that controls both
 735 * PWM controllers. We still create 2 sets of sysfs files to make it look
 736 * more consistent even though they map to the same registers.
 737 *
 738 * ix ap : description
 739 * -------------------
 740 * 0  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 741 * 0  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 742 * 0  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 743 * 0  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 744 * 1  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 745 * 1  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 746 * 1  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 747 * 1  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 748 */
 749
 750static ssize_t show_pwm_auto_point_temp(struct device *dev,
 751					struct device_attribute *attr,
 752					char *buf)
 753{
 754	struct vt1211_data *data = vt1211_update_device(dev);
 755	struct sensor_device_attribute_2 *sensor_attr_2 =
 756						to_sensor_dev_attr_2(attr);
 757	int ix = sensor_attr_2->index;
 758	int ap = sensor_attr_2->nr;
 759
 760	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->pwm_ctl[ix] & 7,
 761		       data->pwm_auto_temp[ap]));
 762}
 763
 764static ssize_t set_pwm_auto_point_temp(struct device *dev,
 765				       struct device_attribute *attr,
 766				       const char *buf, size_t count)
 767{
 768	struct vt1211_data *data = dev_get_drvdata(dev);
 769	struct sensor_device_attribute_2 *sensor_attr_2 =
 770						to_sensor_dev_attr_2(attr);
 771	int ix = sensor_attr_2->index;
 772	int ap = sensor_attr_2->nr;
 
 773	int reg;
 774	long val;
 775	int err;
 776
 777	err = kstrtol(buf, 10, &val);
 778	if (err)
 779		return err;
 780
 781
 782	mutex_lock(&data->update_lock);
 783
 784	/* sync the data cache */
 785	reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 786	data->pwm_ctl[0] = reg & 0xf;
 787	data->pwm_ctl[1] = (reg >> 4) & 0xf;
 788
 789	data->pwm_auto_temp[ap] = TEMP_TO_REG(data->pwm_ctl[ix] & 7, val);
 790	vt1211_write8(data, VT1211_REG_PWM_AUTO_TEMP(ap),
 791		      data->pwm_auto_temp[ap]);
 792	mutex_unlock(&data->update_lock);
 793
 794	return count;
 795}
 796
 797/*
 798 * pwm[ix+1]_auto_point[ap+1]_pwm mapping table:
 799 * Note that the PWM auto points 0 & 3 are hard-wired in the VT1211 and can't
 800 * be changed.
 801 *
 802 * ix ap : description
 803 * -------------------
 804 * 0  0  : pwm1 off                   (pwm_auto_pwm[0][0], hard-wired to 0)
 805 * 0  1  : pwm1 low speed duty cycle  (pwm_auto_pwm[0][1])
 806 * 0  2  : pwm1 high speed duty cycle (pwm_auto_pwm[0][2])
 807 * 0  3  : pwm1 full speed            (pwm_auto_pwm[0][3], hard-wired to 255)
 808 * 1  0  : pwm2 off                   (pwm_auto_pwm[1][0], hard-wired to 0)
 809 * 1  1  : pwm2 low speed duty cycle  (pwm_auto_pwm[1][1])
 810 * 1  2  : pwm2 high speed duty cycle (pwm_auto_pwm[1][2])
 811 * 1  3  : pwm2 full speed            (pwm_auto_pwm[1][3], hard-wired to 255)
 812 */
 813
 814static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 815				       struct device_attribute *attr,
 816				       char *buf)
 817{
 818	struct vt1211_data *data = vt1211_update_device(dev);
 819	struct sensor_device_attribute_2 *sensor_attr_2 =
 820						to_sensor_dev_attr_2(attr);
 821	int ix = sensor_attr_2->index;
 822	int ap = sensor_attr_2->nr;
 823
 824	return sprintf(buf, "%d\n", data->pwm_auto_pwm[ix][ap]);
 825}
 826
 827static ssize_t set_pwm_auto_point_pwm(struct device *dev,
 828				      struct device_attribute *attr,
 829				      const char *buf, size_t count)
 830{
 831	struct vt1211_data *data = dev_get_drvdata(dev);
 832	struct sensor_device_attribute_2 *sensor_attr_2 =
 833						to_sensor_dev_attr_2(attr);
 834	int ix = sensor_attr_2->index;
 835	int ap = sensor_attr_2->nr;
 836	unsigned long val;
 837	int err;
 838
 839	err = kstrtoul(buf, 10, &val);
 840	if (err)
 841		return err;
 
 
 842
 843	mutex_lock(&data->update_lock);
 844	data->pwm_auto_pwm[ix][ap] = clamp_val(val, 0, 255);
 845	vt1211_write8(data, VT1211_REG_PWM_AUTO_PWM(ix, ap),
 846		      data->pwm_auto_pwm[ix][ap]);
 847	mutex_unlock(&data->update_lock);
 848
 849	return count;
 850}
 851
 852/* ---------------------------------------------------------------------
 853 * Miscellaneous sysfs interfaces (VRM, VID, name, and (legacy) alarms)
 854 * --------------------------------------------------------------------- */
 855
 856static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
 857			char *buf)
 858{
 859	struct vt1211_data *data = dev_get_drvdata(dev);
 860
 861	return sprintf(buf, "%d\n", data->vrm);
 862}
 863
 864static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
 865		       const char *buf, size_t count)
 866{
 867	struct vt1211_data *data = dev_get_drvdata(dev);
 868	unsigned long val;
 869	int err;
 870
 871	err = kstrtoul(buf, 10, &val);
 872	if (err)
 873		return err;
 874
 875	if (val > 255)
 876		return -EINVAL;
 877
 878	data->vrm = val;
 879
 880	return count;
 881}
 882
 883static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
 884			char *buf)
 885{
 886	struct vt1211_data *data = dev_get_drvdata(dev);
 887
 888	return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 889}
 890
 891static ssize_t show_name(struct device *dev,
 892			 struct device_attribute *attr, char *buf)
 893{
 894	struct vt1211_data *data = dev_get_drvdata(dev);
 895
 896	return sprintf(buf, "%s\n", data->name);
 897}
 898
 899static ssize_t show_alarms(struct device *dev,
 900			   struct device_attribute *attr, char *buf)
 901{
 902	struct vt1211_data *data = vt1211_update_device(dev);
 903
 904	return sprintf(buf, "%d\n", data->alarms);
 905}
 906
 907/* ---------------------------------------------------------------------
 908 * Device attribute structs
 909 * --------------------------------------------------------------------- */
 910
 911#define SENSOR_ATTR_IN(ix) \
 912{	SENSOR_ATTR_2(in##ix##_input, S_IRUGO, \
 913		show_in, NULL, SHOW_IN_INPUT, ix), \
 
 
 
 
 
 
 
 
 
 
 
 914	SENSOR_ATTR_2(in##ix##_min, S_IRUGO | S_IWUSR, \
 915		show_in, set_in, SHOW_SET_IN_MIN, ix), \
 
 
 
 
 
 
 
 
 
 
 
 916	SENSOR_ATTR_2(in##ix##_max, S_IRUGO | S_IWUSR, \
 917		show_in, set_in, SHOW_SET_IN_MAX, ix), \
 918	SENSOR_ATTR_2(in##ix##_alarm, S_IRUGO, \
 919		show_in, NULL, SHOW_IN_ALARM, ix) \
 920}
 921
 922static struct sensor_device_attribute_2 vt1211_sysfs_in[][4] = {
 923	SENSOR_ATTR_IN(0),
 924	SENSOR_ATTR_IN(1),
 925	SENSOR_ATTR_IN(2),
 926	SENSOR_ATTR_IN(3),
 927	SENSOR_ATTR_IN(4),
 928	SENSOR_ATTR_IN(5)
 929};
 930
 931#define IN_UNIT_ATTRS(X)			\
 932{	&vt1211_sysfs_in[X][0].dev_attr.attr,	\
 933	&vt1211_sysfs_in[X][1].dev_attr.attr,	\
 934	&vt1211_sysfs_in[X][2].dev_attr.attr,	\
 935	&vt1211_sysfs_in[X][3].dev_attr.attr,	\
 936	NULL					\
 937}
 938
 939static struct attribute *vt1211_in_attr[][5] = {
 940	IN_UNIT_ATTRS(0),
 941	IN_UNIT_ATTRS(1),
 942	IN_UNIT_ATTRS(2),
 943	IN_UNIT_ATTRS(3),
 944	IN_UNIT_ATTRS(4),
 945	IN_UNIT_ATTRS(5)
 946};
 947
 948static const struct attribute_group vt1211_in_attr_group[] = {
 949	{ .attrs = vt1211_in_attr[0] },
 950	{ .attrs = vt1211_in_attr[1] },
 951	{ .attrs = vt1211_in_attr[2] },
 952	{ .attrs = vt1211_in_attr[3] },
 953	{ .attrs = vt1211_in_attr[4] },
 954	{ .attrs = vt1211_in_attr[5] }
 
 
 
 
 
 955};
 956
 957#define SENSOR_ATTR_TEMP(ix) \
 958{	SENSOR_ATTR_2(temp##ix##_input, S_IRUGO, \
 959		show_temp, NULL, SHOW_TEMP_INPUT, ix-1), \
 960	SENSOR_ATTR_2(temp##ix##_max, S_IRUGO | S_IWUSR, \
 961		show_temp, set_temp, SHOW_SET_TEMP_MAX, ix-1), \
 
 
 
 
 
 
 
 
 
 
 
 
 962	SENSOR_ATTR_2(temp##ix##_max_hyst, S_IRUGO | S_IWUSR, \
 963		show_temp, set_temp, SHOW_SET_TEMP_MAX_HYST, ix-1), \
 964	SENSOR_ATTR_2(temp##ix##_alarm, S_IRUGO, \
 965		show_temp, NULL, SHOW_TEMP_ALARM, ix-1) \
 966}
 967
 968static struct sensor_device_attribute_2 vt1211_sysfs_temp[][4] = {
 969	SENSOR_ATTR_TEMP(1),
 970	SENSOR_ATTR_TEMP(2),
 971	SENSOR_ATTR_TEMP(3),
 972	SENSOR_ATTR_TEMP(4),
 973	SENSOR_ATTR_TEMP(5),
 974	SENSOR_ATTR_TEMP(6),
 975	SENSOR_ATTR_TEMP(7),
 976};
 977
 978#define TEMP_UNIT_ATTRS(X)			\
 979{	&vt1211_sysfs_temp[X][0].dev_attr.attr,	\
 980	&vt1211_sysfs_temp[X][1].dev_attr.attr,	\
 981	&vt1211_sysfs_temp[X][2].dev_attr.attr,	\
 982	&vt1211_sysfs_temp[X][3].dev_attr.attr,	\
 983	NULL					\
 984}
 985
 986static struct attribute *vt1211_temp_attr[][5] = {
 987	TEMP_UNIT_ATTRS(0),
 988	TEMP_UNIT_ATTRS(1),
 989	TEMP_UNIT_ATTRS(2),
 990	TEMP_UNIT_ATTRS(3),
 991	TEMP_UNIT_ATTRS(4),
 992	TEMP_UNIT_ATTRS(5),
 993	TEMP_UNIT_ATTRS(6)
 994};
 995
 996static const struct attribute_group vt1211_temp_attr_group[] = {
 997	{ .attrs = vt1211_temp_attr[0] },
 998	{ .attrs = vt1211_temp_attr[1] },
 999	{ .attrs = vt1211_temp_attr[2] },
1000	{ .attrs = vt1211_temp_attr[3] },
1001	{ .attrs = vt1211_temp_attr[4] },
1002	{ .attrs = vt1211_temp_attr[5] },
1003	{ .attrs = vt1211_temp_attr[6] }
1004};
1005
1006#define SENSOR_ATTR_FAN(ix) \
1007	SENSOR_ATTR_2(fan##ix##_input, S_IRUGO, \
1008		show_fan, NULL, SHOW_FAN_INPUT, ix-1), \
1009	SENSOR_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \
1010		show_fan, set_fan, SHOW_SET_FAN_MIN, ix-1), \
1011	SENSOR_ATTR_2(fan##ix##_div, S_IRUGO | S_IWUSR, \
1012		show_fan, set_fan, SHOW_SET_FAN_DIV, ix-1), \
1013	SENSOR_ATTR_2(fan##ix##_alarm, S_IRUGO, \
1014		show_fan, NULL, SHOW_FAN_ALARM, ix-1)
1015
1016#define SENSOR_ATTR_PWM(ix) \
1017	SENSOR_ATTR_2(pwm##ix, S_IRUGO, \
1018		show_pwm, NULL, SHOW_PWM, ix-1), \
1019	SENSOR_ATTR_2(pwm##ix##_enable, S_IRUGO | S_IWUSR, \
1020		show_pwm, set_pwm, SHOW_SET_PWM_ENABLE, ix-1), \
1021	SENSOR_ATTR_2(pwm##ix##_auto_channels_temp, S_IRUGO | S_IWUSR, \
1022		show_pwm, set_pwm, SHOW_SET_PWM_AUTO_CHANNELS_TEMP, ix-1)
1023
1024#define SENSOR_ATTR_PWM_FREQ(ix) \
1025	SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO | S_IWUSR, \
1026		show_pwm, set_pwm, SHOW_SET_PWM_FREQ, ix-1)
1027
1028#define SENSOR_ATTR_PWM_FREQ_RO(ix) \
1029	SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO, \
1030		show_pwm, NULL, SHOW_SET_PWM_FREQ, ix-1)
1031
1032#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP(ix, ap) \
1033	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO | S_IWUSR, \
1034		show_pwm_auto_point_temp, set_pwm_auto_point_temp, \
1035		ap-1, ix-1)
1036
1037#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(ix, ap) \
1038	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO, \
1039		show_pwm_auto_point_temp, NULL, \
1040		ap-1, ix-1)
1041
1042#define SENSOR_ATTR_PWM_AUTO_POINT_PWM(ix, ap) \
1043	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO | S_IWUSR, \
1044		show_pwm_auto_point_pwm, set_pwm_auto_point_pwm, \
1045		ap-1, ix-1)
1046
1047#define SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(ix, ap) \
1048	SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO, \
1049		show_pwm_auto_point_pwm, NULL, \
1050		ap-1, ix-1)
1051
1052static struct sensor_device_attribute_2 vt1211_sysfs_fan_pwm[] = {
1053	SENSOR_ATTR_FAN(1),
1054	SENSOR_ATTR_FAN(2),
1055	SENSOR_ATTR_PWM(1),
1056	SENSOR_ATTR_PWM(2),
1057	SENSOR_ATTR_PWM_FREQ(1),
1058	SENSOR_ATTR_PWM_FREQ_RO(2),
1059	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 1),
1060	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 2),
1061	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 3),
1062	SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 4),
1063	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 1),
1064	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 2),
1065	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 3),
1066	SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 4),
1067	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 1),
1068	SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 2),
1069	SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 3),
1070	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 4),
1071	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 1),
1072	SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 2),
1073	SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 3),
1074	SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 4),
1075};
1076
1077static struct device_attribute vt1211_sysfs_misc[] = {
1078	__ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm),
1079	__ATTR(cpu0_vid, S_IRUGO, show_vid, NULL),
1080	__ATTR(name, S_IRUGO, show_name, NULL),
1081	__ATTR(alarms, S_IRUGO, show_alarms, NULL),
1082};
1083
1084/* ---------------------------------------------------------------------
1085 * Device registration and initialization
1086 * --------------------------------------------------------------------- */
1087
1088static void vt1211_init_device(struct vt1211_data *data)
1089{
1090	/* set VRM */
1091	data->vrm = vid_which_vrm();
1092
1093	/* Read (and initialize) UCH config */
1094	data->uch_config = vt1211_read8(data, VT1211_REG_UCH_CONFIG);
1095	if (uch_config > -1) {
1096		data->uch_config = (data->uch_config & 0x83) |
1097				   (uch_config << 2);
1098		vt1211_write8(data, VT1211_REG_UCH_CONFIG, data->uch_config);
1099	}
1100
1101	/*
1102	 * Initialize the interrupt mode (if request at module load time).
1103	 * The VT1211 implements 3 different modes for clearing interrupts:
1104	 * 0: Clear INT when status register is read. Regenerate INT as long
1105	 *    as temp stays above hysteresis limit.
1106	 * 1: Clear INT when status register is read. DON'T regenerate INT
1107	 *    until temp falls below hysteresis limit and exceeds hot limit
1108	 *    again.
1109	 * 2: Clear INT when temp falls below max limit.
1110	 *
1111	 * The driver only allows to force mode 0 since that's the only one
1112	 * that makes sense for 'sensors'
1113	 */
1114	if (int_mode == 0) {
1115		vt1211_write8(data, VT1211_REG_TEMP1_CONFIG, 0);
1116		vt1211_write8(data, VT1211_REG_TEMP2_CONFIG, 0);
1117	}
1118
1119	/* Fill in some hard wired values into our data struct */
1120	data->pwm_auto_pwm[0][3] = 255;
1121	data->pwm_auto_pwm[1][3] = 255;
1122}
1123
1124static void vt1211_remove_sysfs(struct platform_device *pdev)
1125{
1126	struct device *dev = &pdev->dev;
1127	int i;
1128
1129	for (i = 0; i < ARRAY_SIZE(vt1211_in_attr_group); i++)
1130		sysfs_remove_group(&dev->kobj, &vt1211_in_attr_group[i]);
1131
1132	for (i = 0; i < ARRAY_SIZE(vt1211_temp_attr_group); i++)
1133		sysfs_remove_group(&dev->kobj, &vt1211_temp_attr_group[i]);
1134
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1135	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1136		device_remove_file(dev,
1137			&vt1211_sysfs_fan_pwm[i].dev_attr);
1138	}
1139	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++)
1140		device_remove_file(dev, &vt1211_sysfs_misc[i]);
 
1141}
1142
1143static int vt1211_probe(struct platform_device *pdev)
1144{
1145	struct device *dev = &pdev->dev;
1146	struct vt1211_data *data;
1147	struct resource *res;
1148	int i, err;
1149
1150	data = devm_kzalloc(dev, sizeof(struct vt1211_data), GFP_KERNEL);
1151	if (!data)
1152		return -ENOMEM;
 
 
1153
1154	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1155	if (!devm_request_region(dev, res->start, resource_size(res),
1156				 DRVNAME)) {
1157		dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1158			(unsigned long)res->start, (unsigned long)res->end);
1159		return -EBUSY;
1160	}
1161	data->addr = res->start;
1162	data->name = DRVNAME;
1163	mutex_init(&data->update_lock);
1164
1165	platform_set_drvdata(pdev, data);
1166
1167	/* Initialize the VT1211 chip */
1168	vt1211_init_device(data);
1169
1170	/* Create sysfs interface files */
1171	for (i = 0; i < ARRAY_SIZE(vt1211_in_attr_group); i++) {
1172		if (ISVOLT(i, data->uch_config)) {
1173			err = sysfs_create_group(&dev->kobj,
1174						 &vt1211_in_attr_group[i]);
1175			if (err)
 
 
 
 
 
1176				goto EXIT_DEV_REMOVE;
 
1177		}
1178	}
1179	for (i = 0; i < ARRAY_SIZE(vt1211_temp_attr_group); i++) {
1180		if (ISTEMP(i, data->uch_config)) {
1181			err = sysfs_create_group(&dev->kobj,
1182						 &vt1211_temp_attr_group[i]);
1183			if (err)
 
 
 
 
 
1184				goto EXIT_DEV_REMOVE;
 
1185		}
1186	}
1187	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1188		err = device_create_file(dev,
1189			&vt1211_sysfs_fan_pwm[i].dev_attr);
1190		if (err)
1191			goto EXIT_DEV_REMOVE;
 
1192	}
1193	for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) {
1194		err = device_create_file(dev,
1195		       &vt1211_sysfs_misc[i]);
1196		if (err)
1197			goto EXIT_DEV_REMOVE;
 
1198	}
1199
1200	/* Register device */
1201	data->hwmon_dev = hwmon_device_register(dev);
1202	if (IS_ERR(data->hwmon_dev)) {
1203		err = PTR_ERR(data->hwmon_dev);
1204		dev_err(dev, "Class registration failed (%d)\n", err);
1205		goto EXIT_DEV_REMOVE_SILENT;
1206	}
1207
1208	return 0;
1209
1210EXIT_DEV_REMOVE:
1211	dev_err(dev, "Sysfs interface creation failed (%d)\n", err);
1212EXIT_DEV_REMOVE_SILENT:
1213	vt1211_remove_sysfs(pdev);
 
 
 
 
 
1214	return err;
1215}
1216
1217static int vt1211_remove(struct platform_device *pdev)
1218{
1219	struct vt1211_data *data = platform_get_drvdata(pdev);
 
1220
1221	hwmon_device_unregister(data->hwmon_dev);
1222	vt1211_remove_sysfs(pdev);
 
 
 
 
 
1223
1224	return 0;
1225}
1226
1227static struct platform_driver vt1211_driver = {
1228	.driver = {
 
1229		.name  = DRVNAME,
1230	},
1231	.probe  = vt1211_probe,
1232	.remove = vt1211_remove,
1233};
1234
1235static int __init vt1211_device_add(unsigned short address)
1236{
1237	struct resource res = {
1238		.start	= address,
1239		.end	= address + 0x7f,
1240		.flags	= IORESOURCE_IO,
1241	};
1242	int err;
1243
1244	pdev = platform_device_alloc(DRVNAME, address);
1245	if (!pdev) {
1246		err = -ENOMEM;
1247		pr_err("Device allocation failed (%d)\n", err);
1248		goto EXIT;
1249	}
1250
1251	res.name = pdev->name;
1252	err = acpi_check_resource_conflict(&res);
1253	if (err)
1254		goto EXIT_DEV_PUT;
1255
1256	err = platform_device_add_resources(pdev, &res, 1);
1257	if (err) {
1258		pr_err("Device resource addition failed (%d)\n", err);
1259		goto EXIT_DEV_PUT;
1260	}
1261
1262	err = platform_device_add(pdev);
1263	if (err) {
1264		pr_err("Device addition failed (%d)\n", err);
1265		goto EXIT_DEV_PUT;
1266	}
1267
1268	return 0;
1269
1270EXIT_DEV_PUT:
1271	platform_device_put(pdev);
1272EXIT:
1273	return err;
1274}
1275
1276static int __init vt1211_find(int sio_cip, unsigned short *address)
1277{
1278	int err;
1279	int devid;
1280
1281	err = superio_enter(sio_cip);
1282	if (err)
1283		return err;
1284
1285	err = -ENODEV;
1286	devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
1287	if (devid != SIO_VT1211_ID)
1288		goto EXIT;
 
1289
1290	superio_select(sio_cip, SIO_VT1211_LDN_HWMON);
1291
1292	if ((superio_inb(sio_cip, SIO_VT1211_ACTIVE) & 1) == 0) {
1293		pr_warn("HW monitor is disabled, skipping\n");
1294		goto EXIT;
1295	}
1296
1297	*address = ((superio_inb(sio_cip, SIO_VT1211_BADDR) << 8) |
1298		    (superio_inb(sio_cip, SIO_VT1211_BADDR + 1))) & 0xff00;
1299	if (*address == 0) {
1300		pr_warn("Base address is not set, skipping\n");
1301		goto EXIT;
1302	}
1303
1304	err = 0;
1305	pr_info("Found VT1211 chip at 0x%04x, revision %u\n",
1306		*address, superio_inb(sio_cip, SIO_VT1211_DEVREV));
1307
1308EXIT:
1309	superio_exit(sio_cip);
1310	return err;
1311}
1312
1313static int __init vt1211_init(void)
1314{
1315	int err;
1316	unsigned short address = 0;
1317
1318	err = vt1211_find(SIO_REG_CIP1, &address);
1319	if (err) {
1320		err = vt1211_find(SIO_REG_CIP2, &address);
1321		if (err)
1322			goto EXIT;
1323	}
1324
1325	if ((uch_config < -1) || (uch_config > 31)) {
1326		err = -EINVAL;
1327		pr_warn("Invalid UCH configuration %d. Choose a value between 0 and 31.\n",
1328			uch_config);
1329		goto EXIT;
1330	}
1331
1332	if ((int_mode < -1) || (int_mode > 0)) {
1333		err = -EINVAL;
1334		pr_warn("Invalid interrupt mode %d. Only mode 0 is supported.\n",
1335			int_mode);
1336		goto EXIT;
1337	}
1338
1339	err = platform_driver_register(&vt1211_driver);
1340	if (err)
1341		goto EXIT;
 
1342
1343	/* Sets global pdev as a side effect */
1344	err = vt1211_device_add(address);
1345	if (err)
1346		goto EXIT_DRV_UNREGISTER;
 
1347
1348	return 0;
1349
1350EXIT_DRV_UNREGISTER:
1351	platform_driver_unregister(&vt1211_driver);
1352EXIT:
1353	return err;
1354}
1355
1356static void __exit vt1211_exit(void)
1357{
1358	platform_device_unregister(pdev);
1359	platform_driver_unregister(&vt1211_driver);
1360}
1361
1362MODULE_AUTHOR("Juerg Haefliger <juergh@gmail.com>");
1363MODULE_DESCRIPTION("VT1211 sensors");
1364MODULE_LICENSE("GPL");
1365
1366module_init(vt1211_init);
1367module_exit(vt1211_exit);