hwmon: Add power meter spec to Documentation/hwmon/sysfs-interface
[deliverable/linux.git] / drivers / hwmon / w83627hf.c
CommitLineData
1da177e4
LT
1/*
2 w83627hf.c - Part of lm_sensors, Linux kernel modules for hardware
3 monitoring
4 Copyright (c) 1998 - 2003 Frodo Looijaard <frodol@dds.nl>,
5 Philip Edelbrock <phil@netroedge.com>,
6 and Mark Studebaker <mdsxyz123@yahoo.com>
7 Ported to 2.6 by Bernhard C. Schrenk <clemy@clemy.org>
787c72b1 8 Copyright (c) 2007 Jean Delvare <khali@linux-fr.org>
1da177e4
LT
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23*/
24
25/*
26 Supports following chips:
27
28 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
29 w83627hf 9 3 2 3 0x20 0x5ca3 no yes(LPC)
30 w83627thf 7 3 3 3 0x90 0x5ca3 no yes(LPC)
31 w83637hf 7 3 3 3 0x80 0x5ca3 no yes(LPC)
c2db6ce1 32 w83687thf 7 3 3 3 0x90 0x5ca3 no yes(LPC)
1da177e4
LT
33 w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC)
34
35 For other winbond chips, and for i2c support in the above chips,
36 use w83781d.c.
37
38 Note: automatic ("cruise") fan control for 697, 637 & 627thf not
39 supported yet.
40*/
41
42#include <linux/module.h>
43#include <linux/init.h>
44#include <linux/slab.h>
45#include <linux/jiffies.h>
787c72b1 46#include <linux/platform_device.h>
943b0830 47#include <linux/hwmon.h>
07584c76 48#include <linux/hwmon-sysfs.h>
303760b4 49#include <linux/hwmon-vid.h>
943b0830 50#include <linux/err.h>
9a61bf63 51#include <linux/mutex.h>
d27c37c0 52#include <linux/ioport.h>
1da177e4
LT
53#include <asm/io.h>
54#include "lm75.h"
55
787c72b1 56static struct platform_device *pdev;
d27c37c0
JD
57
58#define DRVNAME "w83627hf"
59enum chips { w83627hf, w83627thf, w83697hf, w83637hf, w83687thf };
60
1da177e4
LT
61static u16 force_addr;
62module_param(force_addr, ushort, 0);
63MODULE_PARM_DESC(force_addr,
64 "Initialize the base address of the sensors");
65static u8 force_i2c = 0x1f;
66module_param(force_i2c, byte, 0);
67MODULE_PARM_DESC(force_i2c,
68 "Initialize the i2c address of the sensors");
69
2251cf1a
JD
70static int reset;
71module_param(reset, bool, 0);
72MODULE_PARM_DESC(reset, "Set to one to reset chip on load");
73
1da177e4
LT
74static int init = 1;
75module_param(init, bool, 0);
76MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
77
78/* modified from kernel/include/traps.c */
79static int REG; /* The register to read/write */
80#define DEV 0x07 /* Register: Logical device select */
81static int VAL; /* The value to read/write */
82
83/* logical device numbers for superio_select (below) */
84#define W83627HF_LD_FDC 0x00
85#define W83627HF_LD_PRT 0x01
86#define W83627HF_LD_UART1 0x02
87#define W83627HF_LD_UART2 0x03
88#define W83627HF_LD_KBC 0x05
89#define W83627HF_LD_CIR 0x06 /* w83627hf only */
90#define W83627HF_LD_GAME 0x07
91#define W83627HF_LD_MIDI 0x07
92#define W83627HF_LD_GPIO1 0x07
93#define W83627HF_LD_GPIO5 0x07 /* w83627thf only */
94#define W83627HF_LD_GPIO2 0x08
95#define W83627HF_LD_GPIO3 0x09
96#define W83627HF_LD_GPIO4 0x09 /* w83627thf only */
97#define W83627HF_LD_ACPI 0x0a
98#define W83627HF_LD_HWM 0x0b
99
100#define DEVID 0x20 /* Register: Device ID */
101
102#define W83627THF_GPIO5_EN 0x30 /* w83627thf only */
103#define W83627THF_GPIO5_IOSR 0xf3 /* w83627thf only */
104#define W83627THF_GPIO5_DR 0xf4 /* w83627thf only */
105
c2db6ce1
JD
106#define W83687THF_VID_EN 0x29 /* w83687thf only */
107#define W83687THF_VID_CFG 0xF0 /* w83687thf only */
108#define W83687THF_VID_DATA 0xF1 /* w83687thf only */
109
1da177e4
LT
110static inline void
111superio_outb(int reg, int val)
112{
113 outb(reg, REG);
114 outb(val, VAL);
115}
116
117static inline int
118superio_inb(int reg)
119{
120 outb(reg, REG);
121 return inb(VAL);
122}
123
124static inline void
125superio_select(int ld)
126{
127 outb(DEV, REG);
128 outb(ld, VAL);
129}
130
131static inline void
132superio_enter(void)
133{
134 outb(0x87, REG);
135 outb(0x87, REG);
136}
137
138static inline void
139superio_exit(void)
140{
141 outb(0xAA, REG);
142}
143
144#define W627_DEVID 0x52
145#define W627THF_DEVID 0x82
146#define W697_DEVID 0x60
147#define W637_DEVID 0x70
c2db6ce1 148#define W687THF_DEVID 0x85
1da177e4
LT
149#define WINB_ACT_REG 0x30
150#define WINB_BASE_REG 0x60
151/* Constants specified below */
152
ada0c2f8
PV
153/* Alignment of the base address */
154#define WINB_ALIGNMENT ~7
1da177e4 155
ada0c2f8
PV
156/* Offset & size of I/O region we are interested in */
157#define WINB_REGION_OFFSET 5
158#define WINB_REGION_SIZE 2
159
787c72b1
JD
160/* Where are the sensors address/data registers relative to the region offset */
161#define W83781D_ADDR_REG_OFFSET 0
162#define W83781D_DATA_REG_OFFSET 1
1da177e4
LT
163
164/* The W83781D registers */
165/* The W83782D registers for nr=7,8 are in bank 5 */
166#define W83781D_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
167 (0x554 + (((nr) - 7) * 2)))
168#define W83781D_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
169 (0x555 + (((nr) - 7) * 2)))
170#define W83781D_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
171 (0x550 + (nr) - 7))
172
173#define W83781D_REG_FAN_MIN(nr) (0x3a + (nr))
174#define W83781D_REG_FAN(nr) (0x27 + (nr))
175
176#define W83781D_REG_TEMP2_CONFIG 0x152
177#define W83781D_REG_TEMP3_CONFIG 0x252
178#define W83781D_REG_TEMP(nr) ((nr == 3) ? (0x0250) : \
179 ((nr == 2) ? (0x0150) : \
180 (0x27)))
181#define W83781D_REG_TEMP_HYST(nr) ((nr == 3) ? (0x253) : \
182 ((nr == 2) ? (0x153) : \
183 (0x3A)))
184#define W83781D_REG_TEMP_OVER(nr) ((nr == 3) ? (0x255) : \
185 ((nr == 2) ? (0x155) : \
186 (0x39)))
187
188#define W83781D_REG_BANK 0x4E
189
190#define W83781D_REG_CONFIG 0x40
4a1c4447
YM
191#define W83781D_REG_ALARM1 0x459
192#define W83781D_REG_ALARM2 0x45A
193#define W83781D_REG_ALARM3 0x45B
1da177e4 194
1da177e4
LT
195#define W83781D_REG_BEEP_CONFIG 0x4D
196#define W83781D_REG_BEEP_INTS1 0x56
197#define W83781D_REG_BEEP_INTS2 0x57
198#define W83781D_REG_BEEP_INTS3 0x453
199
200#define W83781D_REG_VID_FANDIV 0x47
201
202#define W83781D_REG_CHIPID 0x49
203#define W83781D_REG_WCHIPID 0x58
204#define W83781D_REG_CHIPMAN 0x4F
205#define W83781D_REG_PIN 0x4B
206
207#define W83781D_REG_VBAT 0x5D
208
209#define W83627HF_REG_PWM1 0x5A
210#define W83627HF_REG_PWM2 0x5B
1da177e4 211
c2db6ce1
JD
212#define W83627THF_REG_PWM1 0x01 /* 697HF/637HF/687THF too */
213#define W83627THF_REG_PWM2 0x03 /* 697HF/637HF/687THF too */
214#define W83627THF_REG_PWM3 0x11 /* 637HF/687THF too */
1da177e4 215
c2db6ce1 216#define W83627THF_REG_VRM_OVT_CFG 0x18 /* 637HF/687THF too */
1da177e4
LT
217
218static const u8 regpwm_627hf[] = { W83627HF_REG_PWM1, W83627HF_REG_PWM2 };
219static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2,
220 W83627THF_REG_PWM3 };
221#define W836X7HF_REG_PWM(type, nr) (((type) == w83627hf) ? \
07584c76 222 regpwm_627hf[nr] : regpwm[nr])
1da177e4 223
1550cb6d
COM
224#define W83627HF_REG_PWM_FREQ 0x5C /* Only for the 627HF */
225
226#define W83637HF_REG_PWM_FREQ1 0x00 /* 697HF/687THF too */
227#define W83637HF_REG_PWM_FREQ2 0x02 /* 697HF/687THF too */
228#define W83637HF_REG_PWM_FREQ3 0x10 /* 687THF too */
229
230static const u8 W83637HF_REG_PWM_FREQ[] = { W83637HF_REG_PWM_FREQ1,
231 W83637HF_REG_PWM_FREQ2,
232 W83637HF_REG_PWM_FREQ3 };
233
234#define W83627HF_BASE_PWM_FREQ 46870
235
1da177e4
LT
236#define W83781D_REG_I2C_ADDR 0x48
237#define W83781D_REG_I2C_SUBADDR 0x4A
238
239/* Sensor selection */
240#define W83781D_REG_SCFG1 0x5D
241static const u8 BIT_SCFG1[] = { 0x02, 0x04, 0x08 };
242#define W83781D_REG_SCFG2 0x59
243static const u8 BIT_SCFG2[] = { 0x10, 0x20, 0x40 };
244#define W83781D_DEFAULT_BETA 3435
245
246/* Conversions. Limit checking is only done on the TO_REG
247 variants. Note that you should be a bit careful with which arguments
248 these macros are called: arguments may be evaluated more than once.
249 Fixing this is just not worth it. */
250#define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8)/16),0,255))
251#define IN_FROM_REG(val) ((val) * 16)
252
253static inline u8 FAN_TO_REG(long rpm, int div)
254{
255 if (rpm == 0)
256 return 255;
257 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
258 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1,
259 254);
260}
261
262#define TEMP_MIN (-128000)
263#define TEMP_MAX ( 127000)
264
265/* TEMP: 0.001C/bit (-128C to +127C)
266 REG: 1C/bit, two's complement */
5bfedac0 267static u8 TEMP_TO_REG(long temp)
1da177e4
LT
268{
269 int ntemp = SENSORS_LIMIT(temp, TEMP_MIN, TEMP_MAX);
270 ntemp += (ntemp<0 ? -500 : 500);
271 return (u8)(ntemp / 1000);
272}
273
274static int TEMP_FROM_REG(u8 reg)
275{
276 return (s8)reg * 1000;
277}
278
279#define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*(div)))
280
281#define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255))
282
1550cb6d
COM
283static inline unsigned long pwm_freq_from_reg_627hf(u8 reg)
284{
285 unsigned long freq;
286 freq = W83627HF_BASE_PWM_FREQ >> reg;
287 return freq;
288}
289static inline u8 pwm_freq_to_reg_627hf(unsigned long val)
290{
291 u8 i;
292 /* Only 5 dividers (1 2 4 8 16)
293 Search for the nearest available frequency */
294 for (i = 0; i < 4; i++) {
295 if (val > (((W83627HF_BASE_PWM_FREQ >> i) +
296 (W83627HF_BASE_PWM_FREQ >> (i+1))) / 2))
297 break;
298 }
299 return i;
300}
301
302static inline unsigned long pwm_freq_from_reg(u8 reg)
303{
304 /* Clock bit 8 -> 180 kHz or 24 MHz */
305 unsigned long clock = (reg & 0x80) ? 180000UL : 24000000UL;
306
307 reg &= 0x7f;
308 /* This should not happen but anyway... */
309 if (reg == 0)
310 reg++;
311 return (clock / (reg << 8));
312}
313static inline u8 pwm_freq_to_reg(unsigned long val)
314{
315 /* Minimum divider value is 0x01 and maximum is 0x7F */
316 if (val >= 93750) /* The highest we can do */
317 return 0x01;
318 if (val >= 720) /* Use 24 MHz clock */
319 return (24000000UL / (val << 8));
320 if (val < 6) /* The lowest we can do */
321 return 0xFF;
322 else /* Use 180 kHz clock */
323 return (0x80 | (180000UL / (val << 8)));
324}
325
1da177e4
LT
326#define BEEP_MASK_FROM_REG(val) (val)
327#define BEEP_MASK_TO_REG(val) ((val) & 0xffffff)
328#define BEEP_ENABLE_TO_REG(val) ((val)?1:0)
329#define BEEP_ENABLE_FROM_REG(val) ((val)?1:0)
330
331#define DIV_FROM_REG(val) (1 << (val))
332
333static inline u8 DIV_TO_REG(long val)
334{
335 int i;
336 val = SENSORS_LIMIT(val, 1, 128) >> 1;
abc01922 337 for (i = 0; i < 7; i++) {
1da177e4
LT
338 if (val == 0)
339 break;
340 val >>= 1;
341 }
342 return ((u8) i);
343}
344
ed6bafbf
JD
345/* For each registered chip, we need to keep some data in memory.
346 The structure is dynamically allocated. */
1da177e4 347struct w83627hf_data {
787c72b1
JD
348 unsigned short addr;
349 const char *name;
1beeffe4 350 struct device *hwmon_dev;
9a61bf63 351 struct mutex lock;
1da177e4
LT
352 enum chips type;
353
9a61bf63 354 struct mutex update_lock;
1da177e4
LT
355 char valid; /* !=0 if following fields are valid */
356 unsigned long last_updated; /* In jiffies */
357
1da177e4
LT
358 u8 in[9]; /* Register value */
359 u8 in_max[9]; /* Register value */
360 u8 in_min[9]; /* Register value */
361 u8 fan[3]; /* Register value */
362 u8 fan_min[3]; /* Register value */
363 u8 temp;
364 u8 temp_max; /* Register value */
365 u8 temp_max_hyst; /* Register value */
366 u16 temp_add[2]; /* Register value */
367 u16 temp_max_add[2]; /* Register value */
368 u16 temp_max_hyst_add[2]; /* Register value */
369 u8 fan_div[3]; /* Register encoding, shifted right */
370 u8 vid; /* Register encoding, combined */
371 u32 alarms; /* Register encoding, combined */
372 u32 beep_mask; /* Register encoding, combined */
373 u8 beep_enable; /* Boolean */
374 u8 pwm[3]; /* Register value */
1550cb6d 375 u8 pwm_freq[3]; /* Register value */
b26f9330
JD
376 u16 sens[3]; /* 1 = pentium diode; 2 = 3904 diode;
377 4 = thermistor */
1da177e4 378 u8 vrm;
c2db6ce1 379 u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */
1da177e4
LT
380};
381
787c72b1
JD
382struct w83627hf_sio_data {
383 enum chips type;
384};
1da177e4 385
1da177e4 386
787c72b1 387static int w83627hf_probe(struct platform_device *pdev);
d0546128 388static int __devexit w83627hf_remove(struct platform_device *pdev);
787c72b1
JD
389
390static int w83627hf_read_value(struct w83627hf_data *data, u16 reg);
391static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value);
c09c5184 392static void w83627hf_update_fan_div(struct w83627hf_data *data);
1da177e4 393static struct w83627hf_data *w83627hf_update_device(struct device *dev);
787c72b1 394static void w83627hf_init_device(struct platform_device *pdev);
1da177e4 395
787c72b1 396static struct platform_driver w83627hf_driver = {
cdaf7934 397 .driver = {
87218842 398 .owner = THIS_MODULE,
d27c37c0 399 .name = DRVNAME,
cdaf7934 400 },
787c72b1
JD
401 .probe = w83627hf_probe,
402 .remove = __devexit_p(w83627hf_remove),
1da177e4
LT
403};
404
07584c76
JC
405static ssize_t
406show_in_input(struct device *dev, struct device_attribute *devattr, char *buf)
407{
408 int nr = to_sensor_dev_attr(devattr)->index;
409 struct w83627hf_data *data = w83627hf_update_device(dev);
410 return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in[nr]));
1da177e4 411}
07584c76
JC
412static ssize_t
413show_in_min(struct device *dev, struct device_attribute *devattr, char *buf)
414{
415 int nr = to_sensor_dev_attr(devattr)->index;
416 struct w83627hf_data *data = w83627hf_update_device(dev);
417 return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_min[nr]));
418}
419static ssize_t
420show_in_max(struct device *dev, struct device_attribute *devattr, char *buf)
421{
422 int nr = to_sensor_dev_attr(devattr)->index;
423 struct w83627hf_data *data = w83627hf_update_device(dev);
424 return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_max[nr]));
1da177e4 425}
07584c76
JC
426static ssize_t
427store_in_min(struct device *dev, struct device_attribute *devattr,
428 const char *buf, size_t count)
429{
430 int nr = to_sensor_dev_attr(devattr)->index;
431 struct w83627hf_data *data = dev_get_drvdata(dev);
432 long val = simple_strtol(buf, NULL, 10);
1da177e4 433
07584c76
JC
434 mutex_lock(&data->update_lock);
435 data->in_min[nr] = IN_TO_REG(val);
436 w83627hf_write_value(data, W83781D_REG_IN_MIN(nr), data->in_min[nr]);
437 mutex_unlock(&data->update_lock);
438 return count;
439}
440static ssize_t
441store_in_max(struct device *dev, struct device_attribute *devattr,
442 const char *buf, size_t count)
443{
444 int nr = to_sensor_dev_attr(devattr)->index;
445 struct w83627hf_data *data = dev_get_drvdata(dev);
446 long val = simple_strtol(buf, NULL, 10);
1da177e4 447
07584c76
JC
448 mutex_lock(&data->update_lock);
449 data->in_max[nr] = IN_TO_REG(val);
450 w83627hf_write_value(data, W83781D_REG_IN_MAX(nr), data->in_max[nr]);
451 mutex_unlock(&data->update_lock);
452 return count;
453}
454#define sysfs_vin_decl(offset) \
455static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
456 show_in_input, NULL, offset); \
457static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO|S_IWUSR, \
458 show_in_min, store_in_min, offset); \
459static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO|S_IWUSR, \
460 show_in_max, store_in_max, offset);
461
462sysfs_vin_decl(1);
463sysfs_vin_decl(2);
464sysfs_vin_decl(3);
465sysfs_vin_decl(4);
466sysfs_vin_decl(5);
467sysfs_vin_decl(6);
468sysfs_vin_decl(7);
469sysfs_vin_decl(8);
1da177e4
LT
470
471/* use a different set of functions for in0 */
472static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg)
473{
474 long in0;
475
476 if ((data->vrm_ovt & 0x01) &&
c2db6ce1
JD
477 (w83627thf == data->type || w83637hf == data->type
478 || w83687thf == data->type))
1da177e4
LT
479
480 /* use VRM9 calculation */
481 in0 = (long)((reg * 488 + 70000 + 50) / 100);
482 else
483 /* use VRM8 (standard) calculation */
484 in0 = (long)IN_FROM_REG(reg);
485
486 return sprintf(buf,"%ld\n", in0);
487}
488
a5099cfc 489static ssize_t show_regs_in_0(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4
LT
490{
491 struct w83627hf_data *data = w83627hf_update_device(dev);
492 return show_in_0(data, buf, data->in[0]);
493}
494
a5099cfc 495static ssize_t show_regs_in_min0(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4
LT
496{
497 struct w83627hf_data *data = w83627hf_update_device(dev);
498 return show_in_0(data, buf, data->in_min[0]);
499}
500
a5099cfc 501static ssize_t show_regs_in_max0(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4
LT
502{
503 struct w83627hf_data *data = w83627hf_update_device(dev);
504 return show_in_0(data, buf, data->in_max[0]);
505}
506
a5099cfc 507static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *attr,
1da177e4
LT
508 const char *buf, size_t count)
509{
787c72b1 510 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
511 u32 val;
512
513 val = simple_strtoul(buf, NULL, 10);
514
9a61bf63 515 mutex_lock(&data->update_lock);
1da177e4
LT
516
517 if ((data->vrm_ovt & 0x01) &&
c2db6ce1
JD
518 (w83627thf == data->type || w83637hf == data->type
519 || w83687thf == data->type))
1da177e4
LT
520
521 /* use VRM9 calculation */
2723ab91
YM
522 data->in_min[0] =
523 SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
524 255);
1da177e4
LT
525 else
526 /* use VRM8 (standard) calculation */
527 data->in_min[0] = IN_TO_REG(val);
528
787c72b1 529 w83627hf_write_value(data, W83781D_REG_IN_MIN(0), data->in_min[0]);
9a61bf63 530 mutex_unlock(&data->update_lock);
1da177e4
LT
531 return count;
532}
533
a5099cfc 534static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *attr,
1da177e4
LT
535 const char *buf, size_t count)
536{
787c72b1 537 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
538 u32 val;
539
540 val = simple_strtoul(buf, NULL, 10);
541
9a61bf63 542 mutex_lock(&data->update_lock);
1da177e4
LT
543
544 if ((data->vrm_ovt & 0x01) &&
c2db6ce1
JD
545 (w83627thf == data->type || w83637hf == data->type
546 || w83687thf == data->type))
1da177e4
LT
547
548 /* use VRM9 calculation */
2723ab91
YM
549 data->in_max[0] =
550 SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
551 255);
1da177e4
LT
552 else
553 /* use VRM8 (standard) calculation */
554 data->in_max[0] = IN_TO_REG(val);
555
787c72b1 556 w83627hf_write_value(data, W83781D_REG_IN_MAX(0), data->in_max[0]);
9a61bf63 557 mutex_unlock(&data->update_lock);
1da177e4
LT
558 return count;
559}
560
561static DEVICE_ATTR(in0_input, S_IRUGO, show_regs_in_0, NULL);
562static DEVICE_ATTR(in0_min, S_IRUGO | S_IWUSR,
563 show_regs_in_min0, store_regs_in_min0);
564static DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR,
565 show_regs_in_max0, store_regs_in_max0);
566
07584c76
JC
567static ssize_t
568show_fan_input(struct device *dev, struct device_attribute *devattr, char *buf)
569{
570 int nr = to_sensor_dev_attr(devattr)->index;
571 struct w83627hf_data *data = w83627hf_update_device(dev);
572 return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan[nr],
573 (long)DIV_FROM_REG(data->fan_div[nr])));
574}
575static ssize_t
576show_fan_min(struct device *dev, struct device_attribute *devattr, char *buf)
577{
578 int nr = to_sensor_dev_attr(devattr)->index;
579 struct w83627hf_data *data = w83627hf_update_device(dev);
580 return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan_min[nr],
581 (long)DIV_FROM_REG(data->fan_div[nr])));
1da177e4 582}
1da177e4 583static ssize_t
07584c76
JC
584store_fan_min(struct device *dev, struct device_attribute *devattr,
585 const char *buf, size_t count)
1da177e4 586{
07584c76 587 int nr = to_sensor_dev_attr(devattr)->index;
787c72b1 588 struct w83627hf_data *data = dev_get_drvdata(dev);
07584c76 589 u32 val = simple_strtoul(buf, NULL, 10);
1da177e4 590
9a61bf63 591 mutex_lock(&data->update_lock);
07584c76
JC
592 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
593 w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr+1),
594 data->fan_min[nr]);
1da177e4 595
9a61bf63 596 mutex_unlock(&data->update_lock);
1da177e4
LT
597 return count;
598}
07584c76
JC
599#define sysfs_fan_decl(offset) \
600static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
601 show_fan_input, NULL, offset - 1); \
602static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
603 show_fan_min, store_fan_min, offset - 1);
1da177e4 604
07584c76
JC
605sysfs_fan_decl(1);
606sysfs_fan_decl(2);
607sysfs_fan_decl(3);
1da177e4 608
07584c76
JC
609static ssize_t
610show_temp(struct device *dev, struct device_attribute *devattr, char *buf)
611{
612 int nr = to_sensor_dev_attr(devattr)->index;
613 struct w83627hf_data *data = w83627hf_update_device(dev);
614 if (nr >= 2) { /* TEMP2 and TEMP3 */
615 return sprintf(buf, "%ld\n",
616 (long)LM75_TEMP_FROM_REG(data->temp_add[nr-2]));
617 } else { /* TEMP1 */
618 return sprintf(buf, "%ld\n", (long)TEMP_FROM_REG(data->temp));
619 }
1da177e4 620}
1da177e4 621
07584c76
JC
622static ssize_t
623show_temp_max(struct device *dev, struct device_attribute *devattr,
624 char *buf)
625{
626 int nr = to_sensor_dev_attr(devattr)->index;
627 struct w83627hf_data *data = w83627hf_update_device(dev);
628 if (nr >= 2) { /* TEMP2 and TEMP3 */
629 return sprintf(buf, "%ld\n",
630 (long)LM75_TEMP_FROM_REG(data->temp_max_add[nr-2]));
631 } else { /* TEMP1 */
632 return sprintf(buf, "%ld\n",
633 (long)TEMP_FROM_REG(data->temp_max));
634 }
1da177e4 635}
1da177e4 636
07584c76
JC
637static ssize_t
638show_temp_max_hyst(struct device *dev, struct device_attribute *devattr,
639 char *buf)
640{
641 int nr = to_sensor_dev_attr(devattr)->index;
642 struct w83627hf_data *data = w83627hf_update_device(dev);
643 if (nr >= 2) { /* TEMP2 and TEMP3 */
644 return sprintf(buf, "%ld\n",
645 (long)LM75_TEMP_FROM_REG(data->temp_max_hyst_add[nr-2]));
646 } else { /* TEMP1 */
647 return sprintf(buf, "%ld\n",
648 (long)TEMP_FROM_REG(data->temp_max_hyst));
649 }
650}
1da177e4 651
07584c76
JC
652static ssize_t
653store_temp_max(struct device *dev, struct device_attribute *devattr,
654 const char *buf, size_t count)
655{
656 int nr = to_sensor_dev_attr(devattr)->index;
657 struct w83627hf_data *data = dev_get_drvdata(dev);
658 long val = simple_strtol(buf, NULL, 10);
1da177e4 659
07584c76 660 mutex_lock(&data->update_lock);
1da177e4 661
07584c76
JC
662 if (nr >= 2) { /* TEMP2 and TEMP3 */
663 data->temp_max_add[nr-2] = LM75_TEMP_TO_REG(val);
664 w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr),
665 data->temp_max_add[nr-2]);
666 } else { /* TEMP1 */
667 data->temp_max = TEMP_TO_REG(val);
668 w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr),
669 data->temp_max);
670 }
671 mutex_unlock(&data->update_lock);
672 return count;
673}
674
675static ssize_t
676store_temp_max_hyst(struct device *dev, struct device_attribute *devattr,
677 const char *buf, size_t count)
678{
679 int nr = to_sensor_dev_attr(devattr)->index;
680 struct w83627hf_data *data = dev_get_drvdata(dev);
681 long val = simple_strtol(buf, NULL, 10);
682
683 mutex_lock(&data->update_lock);
684
685 if (nr >= 2) { /* TEMP2 and TEMP3 */
686 data->temp_max_hyst_add[nr-2] = LM75_TEMP_TO_REG(val);
687 w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr),
688 data->temp_max_hyst_add[nr-2]);
689 } else { /* TEMP1 */
690 data->temp_max_hyst = TEMP_TO_REG(val);
691 w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr),
692 data->temp_max_hyst);
693 }
694 mutex_unlock(&data->update_lock);
695 return count;
696}
697
698#define sysfs_temp_decl(offset) \
699static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
700 show_temp, NULL, offset); \
701static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO|S_IWUSR, \
702 show_temp_max, store_temp_max, offset); \
703static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO|S_IWUSR, \
704 show_temp_max_hyst, store_temp_max_hyst, offset);
705
706sysfs_temp_decl(1);
707sysfs_temp_decl(2);
708sysfs_temp_decl(3);
1da177e4 709
1da177e4 710static ssize_t
a5099cfc 711show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4
LT
712{
713 struct w83627hf_data *data = w83627hf_update_device(dev);
714 return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
715}
716static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
1da177e4
LT
717
718static ssize_t
a5099cfc 719show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4 720{
90d6619a 721 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
722 return sprintf(buf, "%ld\n", (long) data->vrm);
723}
724static ssize_t
a5099cfc 725store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1da177e4 726{
787c72b1 727 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
728 u32 val;
729
730 val = simple_strtoul(buf, NULL, 10);
731 data->vrm = val;
732
733 return count;
734}
735static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
1da177e4
LT
736
737static ssize_t
a5099cfc 738show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
1da177e4
LT
739{
740 struct w83627hf_data *data = w83627hf_update_device(dev);
741 return sprintf(buf, "%ld\n", (long) data->alarms);
742}
743static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
1da177e4
LT
744
745#define show_beep_reg(REG, reg) \
a5099cfc 746static ssize_t show_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \
1da177e4
LT
747{ \
748 struct w83627hf_data *data = w83627hf_update_device(dev); \
749 return sprintf(buf,"%ld\n", \
750 (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \
751}
752show_beep_reg(ENABLE, enable)
753show_beep_reg(MASK, mask)
754
755#define BEEP_ENABLE 0 /* Store beep_enable */
756#define BEEP_MASK 1 /* Store beep_mask */
757
758static ssize_t
759store_beep_reg(struct device *dev, const char *buf, size_t count,
760 int update_mask)
761{
787c72b1 762 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
763 u32 val, val2;
764
765 val = simple_strtoul(buf, NULL, 10);
766
9a61bf63 767 mutex_lock(&data->update_lock);
1da177e4
LT
768
769 if (update_mask == BEEP_MASK) { /* We are storing beep_mask */
770 data->beep_mask = BEEP_MASK_TO_REG(val);
787c72b1 771 w83627hf_write_value(data, W83781D_REG_BEEP_INTS1,
1da177e4 772 data->beep_mask & 0xff);
787c72b1 773 w83627hf_write_value(data, W83781D_REG_BEEP_INTS3,
1da177e4
LT
774 ((data->beep_mask) >> 16) & 0xff);
775 val2 = (data->beep_mask >> 8) & 0x7f;
776 } else { /* We are storing beep_enable */
777 val2 =
787c72b1 778 w83627hf_read_value(data, W83781D_REG_BEEP_INTS2) & 0x7f;
1da177e4
LT
779 data->beep_enable = BEEP_ENABLE_TO_REG(val);
780 }
781
787c72b1 782 w83627hf_write_value(data, W83781D_REG_BEEP_INTS2,
1da177e4
LT
783 val2 | data->beep_enable << 7);
784
9a61bf63 785 mutex_unlock(&data->update_lock);
1da177e4
LT
786 return count;
787}
788
789#define sysfs_beep(REG, reg) \
a5099cfc 790static ssize_t show_regs_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \
1da177e4 791{ \
a5099cfc 792 return show_beep_##reg(dev, attr, buf); \
1da177e4
LT
793} \
794static ssize_t \
a5099cfc 795store_regs_beep_##reg (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
1da177e4
LT
796{ \
797 return store_beep_reg(dev, buf, count, BEEP_##REG); \
798} \
799static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, \
800 show_regs_beep_##reg, store_regs_beep_##reg);
801
802sysfs_beep(ENABLE, enable);
803sysfs_beep(MASK, mask);
804
1da177e4 805static ssize_t
07584c76 806show_fan_div(struct device *dev, struct device_attribute *devattr, char *buf)
1da177e4 807{
07584c76 808 int nr = to_sensor_dev_attr(devattr)->index;
1da177e4
LT
809 struct w83627hf_data *data = w83627hf_update_device(dev);
810 return sprintf(buf, "%ld\n",
07584c76 811 (long) DIV_FROM_REG(data->fan_div[nr]));
1da177e4 812}
1da177e4
LT
813/* Note: we save and restore the fan minimum here, because its value is
814 determined in part by the fan divisor. This follows the principle of
d6e05edc 815 least surprise; the user doesn't expect the fan minimum to change just
1da177e4
LT
816 because the divisor changed. */
817static ssize_t
07584c76
JC
818store_fan_div(struct device *dev, struct device_attribute *devattr,
819 const char *buf, size_t count)
1da177e4 820{
07584c76 821 int nr = to_sensor_dev_attr(devattr)->index;
787c72b1 822 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
823 unsigned long min;
824 u8 reg;
825 unsigned long val = simple_strtoul(buf, NULL, 10);
826
9a61bf63 827 mutex_lock(&data->update_lock);
1da177e4
LT
828
829 /* Save fan_min */
830 min = FAN_FROM_REG(data->fan_min[nr],
831 DIV_FROM_REG(data->fan_div[nr]));
832
833 data->fan_div[nr] = DIV_TO_REG(val);
834
787c72b1 835 reg = (w83627hf_read_value(data, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
1da177e4
LT
836 & (nr==0 ? 0xcf : 0x3f))
837 | ((data->fan_div[nr] & 0x03) << (nr==0 ? 4 : 6));
787c72b1 838 w83627hf_write_value(data, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
1da177e4 839
787c72b1 840 reg = (w83627hf_read_value(data, W83781D_REG_VBAT)
1da177e4
LT
841 & ~(1 << (5 + nr)))
842 | ((data->fan_div[nr] & 0x04) << (3 + nr));
787c72b1 843 w83627hf_write_value(data, W83781D_REG_VBAT, reg);
1da177e4
LT
844
845 /* Restore fan_min */
846 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
787c72b1 847 w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]);
1da177e4 848
9a61bf63 849 mutex_unlock(&data->update_lock);
1da177e4
LT
850 return count;
851}
852
07584c76
JC
853static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO|S_IWUSR,
854 show_fan_div, store_fan_div, 0);
855static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO|S_IWUSR,
856 show_fan_div, store_fan_div, 1);
857static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO|S_IWUSR,
858 show_fan_div, store_fan_div, 2);
1da177e4 859
1da177e4 860static ssize_t
07584c76 861show_pwm(struct device *dev, struct device_attribute *devattr, char *buf)
1da177e4 862{
07584c76 863 int nr = to_sensor_dev_attr(devattr)->index;
1da177e4 864 struct w83627hf_data *data = w83627hf_update_device(dev);
07584c76 865 return sprintf(buf, "%ld\n", (long) data->pwm[nr]);
1da177e4
LT
866}
867
868static ssize_t
07584c76
JC
869store_pwm(struct device *dev, struct device_attribute *devattr,
870 const char *buf, size_t count)
1da177e4 871{
07584c76 872 int nr = to_sensor_dev_attr(devattr)->index;
787c72b1 873 struct w83627hf_data *data = dev_get_drvdata(dev);
07584c76 874 u32 val = simple_strtoul(buf, NULL, 10);
1da177e4 875
9a61bf63 876 mutex_lock(&data->update_lock);
1da177e4
LT
877
878 if (data->type == w83627thf) {
879 /* bits 0-3 are reserved in 627THF */
07584c76 880 data->pwm[nr] = PWM_TO_REG(val) & 0xf0;
787c72b1 881 w83627hf_write_value(data,
1da177e4 882 W836X7HF_REG_PWM(data->type, nr),
07584c76 883 data->pwm[nr] |
787c72b1 884 (w83627hf_read_value(data,
1da177e4
LT
885 W836X7HF_REG_PWM(data->type, nr)) & 0x0f));
886 } else {
07584c76 887 data->pwm[nr] = PWM_TO_REG(val);
787c72b1 888 w83627hf_write_value(data,
1da177e4 889 W836X7HF_REG_PWM(data->type, nr),
07584c76 890 data->pwm[nr]);
1da177e4
LT
891 }
892
9a61bf63 893 mutex_unlock(&data->update_lock);
1da177e4
LT
894 return count;
895}
896
07584c76
JC
897static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0);
898static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 1);
899static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 2);
1da177e4 900
1550cb6d 901static ssize_t
07584c76 902show_pwm_freq(struct device *dev, struct device_attribute *devattr, char *buf)
1550cb6d 903{
07584c76 904 int nr = to_sensor_dev_attr(devattr)->index;
1550cb6d
COM
905 struct w83627hf_data *data = w83627hf_update_device(dev);
906 if (data->type == w83627hf)
907 return sprintf(buf, "%ld\n",
07584c76 908 pwm_freq_from_reg_627hf(data->pwm_freq[nr]));
1550cb6d
COM
909 else
910 return sprintf(buf, "%ld\n",
07584c76 911 pwm_freq_from_reg(data->pwm_freq[nr]));
1550cb6d
COM
912}
913
914static ssize_t
07584c76
JC
915store_pwm_freq(struct device *dev, struct device_attribute *devattr,
916 const char *buf, size_t count)
1550cb6d 917{
07584c76 918 int nr = to_sensor_dev_attr(devattr)->index;
1550cb6d
COM
919 struct w83627hf_data *data = dev_get_drvdata(dev);
920 static const u8 mask[]={0xF8, 0x8F};
921 u32 val;
922
923 val = simple_strtoul(buf, NULL, 10);
924
925 mutex_lock(&data->update_lock);
926
927 if (data->type == w83627hf) {
07584c76 928 data->pwm_freq[nr] = pwm_freq_to_reg_627hf(val);
1550cb6d 929 w83627hf_write_value(data, W83627HF_REG_PWM_FREQ,
07584c76 930 (data->pwm_freq[nr] << (nr*4)) |
1550cb6d 931 (w83627hf_read_value(data,
07584c76 932 W83627HF_REG_PWM_FREQ) & mask[nr]));
1550cb6d 933 } else {
07584c76
JC
934 data->pwm_freq[nr] = pwm_freq_to_reg(val);
935 w83627hf_write_value(data, W83637HF_REG_PWM_FREQ[nr],
936 data->pwm_freq[nr]);
1550cb6d
COM
937 }
938
939 mutex_unlock(&data->update_lock);
940 return count;
941}
942
07584c76
JC
943static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO|S_IWUSR,
944 show_pwm_freq, store_pwm_freq, 0);
945static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO|S_IWUSR,
946 show_pwm_freq, store_pwm_freq, 1);
947static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO|S_IWUSR,
948 show_pwm_freq, store_pwm_freq, 2);
1550cb6d 949
1da177e4 950static ssize_t
07584c76
JC
951show_temp_type(struct device *dev, struct device_attribute *devattr,
952 char *buf)
1da177e4 953{
07584c76 954 int nr = to_sensor_dev_attr(devattr)->index;
1da177e4 955 struct w83627hf_data *data = w83627hf_update_device(dev);
07584c76 956 return sprintf(buf, "%ld\n", (long) data->sens[nr]);
1da177e4
LT
957}
958
959static ssize_t
07584c76
JC
960store_temp_type(struct device *dev, struct device_attribute *devattr,
961 const char *buf, size_t count)
1da177e4 962{
07584c76 963 int nr = to_sensor_dev_attr(devattr)->index;
787c72b1 964 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
965 u32 val, tmp;
966
967 val = simple_strtoul(buf, NULL, 10);
968
9a61bf63 969 mutex_lock(&data->update_lock);
1da177e4
LT
970
971 switch (val) {
972 case 1: /* PII/Celeron diode */
787c72b1
JD
973 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1);
974 w83627hf_write_value(data, W83781D_REG_SCFG1,
07584c76 975 tmp | BIT_SCFG1[nr]);
787c72b1
JD
976 tmp = w83627hf_read_value(data, W83781D_REG_SCFG2);
977 w83627hf_write_value(data, W83781D_REG_SCFG2,
07584c76
JC
978 tmp | BIT_SCFG2[nr]);
979 data->sens[nr] = val;
1da177e4
LT
980 break;
981 case 2: /* 3904 */
787c72b1
JD
982 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1);
983 w83627hf_write_value(data, W83781D_REG_SCFG1,
07584c76 984 tmp | BIT_SCFG1[nr]);
787c72b1
JD
985 tmp = w83627hf_read_value(data, W83781D_REG_SCFG2);
986 w83627hf_write_value(data, W83781D_REG_SCFG2,
07584c76
JC
987 tmp & ~BIT_SCFG2[nr]);
988 data->sens[nr] = val;
1da177e4 989 break;
b26f9330
JD
990 case W83781D_DEFAULT_BETA:
991 dev_warn(dev, "Sensor type %d is deprecated, please use 4 "
992 "instead\n", W83781D_DEFAULT_BETA);
993 /* fall through */
994 case 4: /* thermistor */
787c72b1
JD
995 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1);
996 w83627hf_write_value(data, W83781D_REG_SCFG1,
07584c76
JC
997 tmp & ~BIT_SCFG1[nr]);
998 data->sens[nr] = val;
1da177e4
LT
999 break;
1000 default:
787c72b1 1001 dev_err(dev,
b26f9330
JD
1002 "Invalid sensor type %ld; must be 1, 2, or 4\n",
1003 (long) val);
1da177e4
LT
1004 break;
1005 }
1006
9a61bf63 1007 mutex_unlock(&data->update_lock);
1da177e4
LT
1008 return count;
1009}
1010
07584c76
JC
1011#define sysfs_temp_type(offset) \
1012static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \
1013 show_temp_type, store_temp_type, offset - 1);
1da177e4 1014
07584c76
JC
1015sysfs_temp_type(1);
1016sysfs_temp_type(2);
1017sysfs_temp_type(3);
1da177e4 1018
07584c76
JC
1019static ssize_t
1020show_name(struct device *dev, struct device_attribute *devattr, char *buf)
787c72b1
JD
1021{
1022 struct w83627hf_data *data = dev_get_drvdata(dev);
1023
1024 return sprintf(buf, "%s\n", data->name);
1025}
1026static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
1027
1028static int __init w83627hf_find(int sioaddr, unsigned short *addr,
1029 struct w83627hf_sio_data *sio_data)
1da177e4 1030{
d27c37c0 1031 int err = -ENODEV;
1da177e4
LT
1032 u16 val;
1033
787c72b1
JD
1034 static const __initdata char *names[] = {
1035 "W83627HF",
1036 "W83627THF",
1037 "W83697HF",
1038 "W83637HF",
1039 "W83687THF",
1040 };
1041
1da177e4
LT
1042 REG = sioaddr;
1043 VAL = sioaddr + 1;
1044
1045 superio_enter();
1046 val= superio_inb(DEVID);
787c72b1
JD
1047 switch (val) {
1048 case W627_DEVID:
1049 sio_data->type = w83627hf;
1050 break;
1051 case W627THF_DEVID:
1052 sio_data->type = w83627thf;
1053 break;
1054 case W697_DEVID:
1055 sio_data->type = w83697hf;
1056 break;
1057 case W637_DEVID:
1058 sio_data->type = w83637hf;
1059 break;
1060 case W687THF_DEVID:
1061 sio_data->type = w83687thf;
1062 break;
e142e2a3
JD
1063 case 0xff: /* No device at all */
1064 goto exit;
787c72b1 1065 default:
e142e2a3 1066 pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%02x)\n", val);
d27c37c0 1067 goto exit;
1da177e4
LT
1068 }
1069
1070 superio_select(W83627HF_LD_HWM);
d27c37c0
JD
1071 force_addr &= WINB_ALIGNMENT;
1072 if (force_addr) {
1073 printk(KERN_WARNING DRVNAME ": Forcing address 0x%x\n",
1074 force_addr);
1075 superio_outb(WINB_BASE_REG, force_addr >> 8);
1076 superio_outb(WINB_BASE_REG + 1, force_addr & 0xff);
1077 }
1da177e4
LT
1078 val = (superio_inb(WINB_BASE_REG) << 8) |
1079 superio_inb(WINB_BASE_REG + 1);
ada0c2f8 1080 *addr = val & WINB_ALIGNMENT;
d27c37c0
JD
1081 if (*addr == 0) {
1082 printk(KERN_WARNING DRVNAME ": Base address not set, "
1083 "skipping\n");
1084 goto exit;
1da177e4 1085 }
1da177e4 1086
d27c37c0
JD
1087 val = superio_inb(WINB_ACT_REG);
1088 if (!(val & 0x01)) {
1089 printk(KERN_WARNING DRVNAME ": Enabling HWM logical device\n");
1090 superio_outb(WINB_ACT_REG, val | 0x01);
1091 }
1092
1093 err = 0;
787c72b1
JD
1094 pr_info(DRVNAME ": Found %s chip at %#x\n",
1095 names[sio_data->type], *addr);
d27c37c0
JD
1096
1097 exit:
1da177e4 1098 superio_exit();
d27c37c0 1099 return err;
1da177e4
LT
1100}
1101
07584c76
JC
1102#define VIN_UNIT_ATTRS(_X_) \
1103 &sensor_dev_attr_in##_X_##_input.dev_attr.attr, \
1104 &sensor_dev_attr_in##_X_##_min.dev_attr.attr, \
1105 &sensor_dev_attr_in##_X_##_max.dev_attr.attr
1106
1107#define FAN_UNIT_ATTRS(_X_) \
1108 &sensor_dev_attr_fan##_X_##_input.dev_attr.attr, \
1109 &sensor_dev_attr_fan##_X_##_min.dev_attr.attr, \
1110 &sensor_dev_attr_fan##_X_##_div.dev_attr.attr
1111
1112#define TEMP_UNIT_ATTRS(_X_) \
1113 &sensor_dev_attr_temp##_X_##_input.dev_attr.attr, \
1114 &sensor_dev_attr_temp##_X_##_max.dev_attr.attr, \
1115 &sensor_dev_attr_temp##_X_##_max_hyst.dev_attr.attr, \
1116 &sensor_dev_attr_temp##_X_##_type.dev_attr.attr
1117
c1685f61
MH
1118static struct attribute *w83627hf_attributes[] = {
1119 &dev_attr_in0_input.attr,
1120 &dev_attr_in0_min.attr,
1121 &dev_attr_in0_max.attr,
07584c76
JC
1122 VIN_UNIT_ATTRS(2),
1123 VIN_UNIT_ATTRS(3),
1124 VIN_UNIT_ATTRS(4),
1125 VIN_UNIT_ATTRS(7),
1126 VIN_UNIT_ATTRS(8),
1127
1128 FAN_UNIT_ATTRS(1),
1129 FAN_UNIT_ATTRS(2),
1130
1131 TEMP_UNIT_ATTRS(1),
1132 TEMP_UNIT_ATTRS(2),
c1685f61
MH
1133
1134 &dev_attr_alarms.attr,
1135 &dev_attr_beep_enable.attr,
1136 &dev_attr_beep_mask.attr,
1137
07584c76
JC
1138 &sensor_dev_attr_pwm1.dev_attr.attr,
1139 &sensor_dev_attr_pwm2.dev_attr.attr,
787c72b1 1140 &dev_attr_name.attr,
c1685f61
MH
1141 NULL
1142};
1143
1144static const struct attribute_group w83627hf_group = {
1145 .attrs = w83627hf_attributes,
1146};
1147
1148static struct attribute *w83627hf_attributes_opt[] = {
07584c76
JC
1149 VIN_UNIT_ATTRS(1),
1150 VIN_UNIT_ATTRS(5),
1151 VIN_UNIT_ATTRS(6),
1152
1153 FAN_UNIT_ATTRS(3),
1154 TEMP_UNIT_ATTRS(3),
1155 &sensor_dev_attr_pwm3.dev_attr.attr,
1156
1157 &sensor_dev_attr_pwm1_freq.dev_attr.attr,
1158 &sensor_dev_attr_pwm2_freq.dev_attr.attr,
1159 &sensor_dev_attr_pwm3_freq.dev_attr.attr,
c1685f61
MH
1160 NULL
1161};
1162
1163static const struct attribute_group w83627hf_group_opt = {
1164 .attrs = w83627hf_attributes_opt,
1165};
1166
787c72b1 1167static int __devinit w83627hf_probe(struct platform_device *pdev)
1da177e4 1168{
787c72b1
JD
1169 struct device *dev = &pdev->dev;
1170 struct w83627hf_sio_data *sio_data = dev->platform_data;
1da177e4 1171 struct w83627hf_data *data;
787c72b1
JD
1172 struct resource *res;
1173 int err;
1da177e4 1174
787c72b1
JD
1175 static const char *names[] = {
1176 "w83627hf",
1177 "w83627thf",
1178 "w83697hf",
1179 "w83637hf",
1180 "w83687thf",
1181 };
1182
1183 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1184 if (!request_region(res->start, WINB_REGION_SIZE, DRVNAME)) {
1185 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1186 (unsigned long)res->start,
1187 (unsigned long)(res->start + WINB_REGION_SIZE - 1));
1da177e4
LT
1188 err = -EBUSY;
1189 goto ERROR0;
1190 }
1191
ba9c2e8d 1192 if (!(data = kzalloc(sizeof(struct w83627hf_data), GFP_KERNEL))) {
1da177e4
LT
1193 err = -ENOMEM;
1194 goto ERROR1;
1195 }
787c72b1
JD
1196 data->addr = res->start;
1197 data->type = sio_data->type;
1198 data->name = names[sio_data->type];
9a61bf63 1199 mutex_init(&data->lock);
9a61bf63 1200 mutex_init(&data->update_lock);
787c72b1 1201 platform_set_drvdata(pdev, data);
1da177e4 1202
1da177e4 1203 /* Initialize the chip */
787c72b1 1204 w83627hf_init_device(pdev);
1da177e4
LT
1205
1206 /* A few vars need to be filled upon startup */
787c72b1
JD
1207 data->fan_min[0] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(1));
1208 data->fan_min[1] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(2));
1209 data->fan_min[2] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(3));
c09c5184 1210 w83627hf_update_fan_div(data);
1da177e4 1211
c1685f61 1212 /* Register common device attributes */
787c72b1 1213 if ((err = sysfs_create_group(&dev->kobj, &w83627hf_group)))
943b0830 1214 goto ERROR3;
1da177e4 1215
c1685f61 1216 /* Register chip-specific device attributes */
787c72b1 1217 if (data->type == w83627hf || data->type == w83697hf)
07584c76
JC
1218 if ((err = device_create_file(dev,
1219 &sensor_dev_attr_in5_input.dev_attr))
1220 || (err = device_create_file(dev,
1221 &sensor_dev_attr_in5_min.dev_attr))
1222 || (err = device_create_file(dev,
1223 &sensor_dev_attr_in5_max.dev_attr))
1224 || (err = device_create_file(dev,
1225 &sensor_dev_attr_in6_input.dev_attr))
1226 || (err = device_create_file(dev,
1227 &sensor_dev_attr_in6_min.dev_attr))
1228 || (err = device_create_file(dev,
1229 &sensor_dev_attr_in6_max.dev_attr))
1230 || (err = device_create_file(dev,
1231 &sensor_dev_attr_pwm1_freq.dev_attr))
1232 || (err = device_create_file(dev,
1233 &sensor_dev_attr_pwm2_freq.dev_attr)))
c1685f61 1234 goto ERROR4;
1da177e4 1235
787c72b1 1236 if (data->type != w83697hf)
07584c76
JC
1237 if ((err = device_create_file(dev,
1238 &sensor_dev_attr_in1_input.dev_attr))
1239 || (err = device_create_file(dev,
1240 &sensor_dev_attr_in1_min.dev_attr))
1241 || (err = device_create_file(dev,
1242 &sensor_dev_attr_in1_max.dev_attr))
1243 || (err = device_create_file(dev,
1244 &sensor_dev_attr_fan3_input.dev_attr))
1245 || (err = device_create_file(dev,
1246 &sensor_dev_attr_fan3_min.dev_attr))
1247 || (err = device_create_file(dev,
1248 &sensor_dev_attr_fan3_div.dev_attr))
1249 || (err = device_create_file(dev,
1250 &sensor_dev_attr_temp3_input.dev_attr))
1251 || (err = device_create_file(dev,
1252 &sensor_dev_attr_temp3_max.dev_attr))
1253 || (err = device_create_file(dev,
1254 &sensor_dev_attr_temp3_max_hyst.dev_attr))
1255 || (err = device_create_file(dev,
1256 &sensor_dev_attr_temp3_type.dev_attr)))
c1685f61
MH
1257 goto ERROR4;
1258
787c72b1 1259 if (data->type != w83697hf && data->vid != 0xff) {
8a665a05
JD
1260 /* Convert VID to voltage based on VRM */
1261 data->vrm = vid_which_vrm();
1262
787c72b1
JD
1263 if ((err = device_create_file(dev, &dev_attr_cpu0_vid))
1264 || (err = device_create_file(dev, &dev_attr_vrm)))
c1685f61 1265 goto ERROR4;
8a665a05 1266 }
1da177e4 1267
787c72b1
JD
1268 if (data->type == w83627thf || data->type == w83637hf
1269 || data->type == w83687thf)
07584c76
JC
1270 if ((err = device_create_file(dev,
1271 &sensor_dev_attr_pwm3.dev_attr)))
c1685f61 1272 goto ERROR4;
1da177e4 1273
1550cb6d 1274 if (data->type == w83637hf || data->type == w83687thf)
07584c76
JC
1275 if ((err = device_create_file(dev,
1276 &sensor_dev_attr_pwm1_freq.dev_attr))
1277 || (err = device_create_file(dev,
1278 &sensor_dev_attr_pwm2_freq.dev_attr))
1279 || (err = device_create_file(dev,
1280 &sensor_dev_attr_pwm3_freq.dev_attr)))
1550cb6d
COM
1281 goto ERROR4;
1282
1beeffe4
TJ
1283 data->hwmon_dev = hwmon_device_register(dev);
1284 if (IS_ERR(data->hwmon_dev)) {
1285 err = PTR_ERR(data->hwmon_dev);
c1685f61
MH
1286 goto ERROR4;
1287 }
1da177e4
LT
1288
1289 return 0;
1290
c1685f61 1291 ERROR4:
787c72b1
JD
1292 sysfs_remove_group(&dev->kobj, &w83627hf_group);
1293 sysfs_remove_group(&dev->kobj, &w83627hf_group_opt);
943b0830 1294 ERROR3:
04a6217d 1295 platform_set_drvdata(pdev, NULL);
1da177e4
LT
1296 kfree(data);
1297 ERROR1:
787c72b1 1298 release_region(res->start, WINB_REGION_SIZE);
1da177e4
LT
1299 ERROR0:
1300 return err;
1301}
1302
787c72b1 1303static int __devexit w83627hf_remove(struct platform_device *pdev)
1da177e4 1304{
787c72b1
JD
1305 struct w83627hf_data *data = platform_get_drvdata(pdev);
1306 struct resource *res;
1da177e4 1307
1beeffe4 1308 hwmon_device_unregister(data->hwmon_dev);
943b0830 1309
787c72b1
JD
1310 sysfs_remove_group(&pdev->dev.kobj, &w83627hf_group);
1311 sysfs_remove_group(&pdev->dev.kobj, &w83627hf_group_opt);
04a6217d 1312 platform_set_drvdata(pdev, NULL);
943b0830 1313 kfree(data);
1da177e4 1314
787c72b1
JD
1315 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1316 release_region(res->start, WINB_REGION_SIZE);
1317
1da177e4
LT
1318 return 0;
1319}
1320
1321
d58df9cd
JD
1322/* Registers 0x50-0x5f are banked */
1323static inline void w83627hf_set_bank(struct w83627hf_data *data, u16 reg)
1324{
1325 if ((reg & 0x00f0) == 0x50) {
1326 outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET);
1327 outb_p(reg >> 8, data->addr + W83781D_DATA_REG_OFFSET);
1328 }
1329}
1330
1331/* Not strictly necessary, but play it safe for now */
1332static inline void w83627hf_reset_bank(struct w83627hf_data *data, u16 reg)
1333{
1334 if (reg & 0xff00) {
1335 outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET);
1336 outb_p(0, data->addr + W83781D_DATA_REG_OFFSET);
1337 }
1338}
1339
787c72b1 1340static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
1da177e4 1341{
1da177e4
LT
1342 int res, word_sized;
1343
9a61bf63 1344 mutex_lock(&data->lock);
1da177e4
LT
1345 word_sized = (((reg & 0xff00) == 0x100)
1346 || ((reg & 0xff00) == 0x200))
1347 && (((reg & 0x00ff) == 0x50)
1348 || ((reg & 0x00ff) == 0x53)
1349 || ((reg & 0x00ff) == 0x55));
d58df9cd 1350 w83627hf_set_bank(data, reg);
787c72b1
JD
1351 outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET);
1352 res = inb_p(data->addr + W83781D_DATA_REG_OFFSET);
1da177e4
LT
1353 if (word_sized) {
1354 outb_p((reg & 0xff) + 1,
787c72b1 1355 data->addr + W83781D_ADDR_REG_OFFSET);
1da177e4 1356 res =
787c72b1 1357 (res << 8) + inb_p(data->addr +
1da177e4
LT
1358 W83781D_DATA_REG_OFFSET);
1359 }
d58df9cd 1360 w83627hf_reset_bank(data, reg);
9a61bf63 1361 mutex_unlock(&data->lock);
1da177e4
LT
1362 return res;
1363}
1364
787c72b1 1365static int __devinit w83627thf_read_gpio5(struct platform_device *pdev)
1da177e4
LT
1366{
1367 int res = 0xff, sel;
1368
1369 superio_enter();
1370 superio_select(W83627HF_LD_GPIO5);
1371
1372 /* Make sure these GPIO pins are enabled */
1373 if (!(superio_inb(W83627THF_GPIO5_EN) & (1<<3))) {
787c72b1 1374 dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n");
1da177e4
LT
1375 goto exit;
1376 }
1377
1378 /* Make sure the pins are configured for input
1379 There must be at least five (VRM 9), and possibly 6 (VRM 10) */
dd149c52 1380 sel = superio_inb(W83627THF_GPIO5_IOSR) & 0x3f;
1da177e4 1381 if ((sel & 0x1f) != 0x1f) {
787c72b1 1382 dev_dbg(&pdev->dev, "GPIO5 not configured for VID "
1da177e4
LT
1383 "function\n");
1384 goto exit;
1385 }
1386
787c72b1 1387 dev_info(&pdev->dev, "Reading VID from GPIO5\n");
1da177e4
LT
1388 res = superio_inb(W83627THF_GPIO5_DR) & sel;
1389
1390exit:
1391 superio_exit();
1392 return res;
1393}
1394
787c72b1 1395static int __devinit w83687thf_read_vid(struct platform_device *pdev)
c2db6ce1
JD
1396{
1397 int res = 0xff;
1398
1399 superio_enter();
1400 superio_select(W83627HF_LD_HWM);
1401
1402 /* Make sure these GPIO pins are enabled */
1403 if (!(superio_inb(W83687THF_VID_EN) & (1 << 2))) {
787c72b1 1404 dev_dbg(&pdev->dev, "VID disabled, no VID function\n");
c2db6ce1
JD
1405 goto exit;
1406 }
1407
1408 /* Make sure the pins are configured for input */
1409 if (!(superio_inb(W83687THF_VID_CFG) & (1 << 4))) {
787c72b1 1410 dev_dbg(&pdev->dev, "VID configured as output, "
c2db6ce1
JD
1411 "no VID function\n");
1412 goto exit;
1413 }
1414
1415 res = superio_inb(W83687THF_VID_DATA) & 0x3f;
1416
1417exit:
1418 superio_exit();
1419 return res;
1420}
1421
787c72b1 1422static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value)
1da177e4 1423{
1da177e4
LT
1424 int word_sized;
1425
9a61bf63 1426 mutex_lock(&data->lock);
1da177e4
LT
1427 word_sized = (((reg & 0xff00) == 0x100)
1428 || ((reg & 0xff00) == 0x200))
1429 && (((reg & 0x00ff) == 0x53)
1430 || ((reg & 0x00ff) == 0x55));
d58df9cd 1431 w83627hf_set_bank(data, reg);
787c72b1 1432 outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET);
1da177e4
LT
1433 if (word_sized) {
1434 outb_p(value >> 8,
787c72b1 1435 data->addr + W83781D_DATA_REG_OFFSET);
1da177e4 1436 outb_p((reg & 0xff) + 1,
787c72b1 1437 data->addr + W83781D_ADDR_REG_OFFSET);
1da177e4
LT
1438 }
1439 outb_p(value & 0xff,
787c72b1 1440 data->addr + W83781D_DATA_REG_OFFSET);
d58df9cd 1441 w83627hf_reset_bank(data, reg);
9a61bf63 1442 mutex_unlock(&data->lock);
1da177e4
LT
1443 return 0;
1444}
1445
787c72b1 1446static void __devinit w83627hf_init_device(struct platform_device *pdev)
1da177e4 1447{
787c72b1 1448 struct w83627hf_data *data = platform_get_drvdata(pdev);
1da177e4 1449 int i;
d27c37c0 1450 enum chips type = data->type;
1da177e4
LT
1451 u8 tmp;
1452
2251cf1a
JD
1453 if (reset) {
1454 /* Resetting the chip has been the default for a long time,
1455 but repeatedly caused problems (fans going to full
1456 speed...) so it is now optional. It might even go away if
1457 nobody reports it as being useful, as I see very little
1458 reason why this would be needed at all. */
787c72b1 1459 dev_info(&pdev->dev, "If reset=1 solved a problem you were "
2251cf1a
JD
1460 "having, please report!\n");
1461
1da177e4 1462 /* save this register */
787c72b1 1463 i = w83627hf_read_value(data, W83781D_REG_BEEP_CONFIG);
1da177e4
LT
1464 /* Reset all except Watchdog values and last conversion values
1465 This sets fan-divs to 2, among others */
787c72b1 1466 w83627hf_write_value(data, W83781D_REG_CONFIG, 0x80);
1da177e4
LT
1467 /* Restore the register and disable power-on abnormal beep.
1468 This saves FAN 1/2/3 input/output values set by BIOS. */
787c72b1 1469 w83627hf_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80);
1da177e4
LT
1470 /* Disable master beep-enable (reset turns it on).
1471 Individual beeps should be reset to off but for some reason
1472 disabling this bit helps some people not get beeped */
787c72b1 1473 w83627hf_write_value(data, W83781D_REG_BEEP_INTS2, 0);
1da177e4
LT
1474 }
1475
1476 /* Minimize conflicts with other winbond i2c-only clients... */
1477 /* disable i2c subclients... how to disable main i2c client?? */
1478 /* force i2c address to relatively uncommon address */
787c72b1
JD
1479 w83627hf_write_value(data, W83781D_REG_I2C_SUBADDR, 0x89);
1480 w83627hf_write_value(data, W83781D_REG_I2C_ADDR, force_i2c);
1da177e4
LT
1481
1482 /* Read VID only once */
d27c37c0 1483 if (type == w83627hf || type == w83637hf) {
787c72b1
JD
1484 int lo = w83627hf_read_value(data, W83781D_REG_VID_FANDIV);
1485 int hi = w83627hf_read_value(data, W83781D_REG_CHIPID);
1da177e4 1486 data->vid = (lo & 0x0f) | ((hi & 0x01) << 4);
d27c37c0 1487 } else if (type == w83627thf) {
787c72b1 1488 data->vid = w83627thf_read_gpio5(pdev);
d27c37c0 1489 } else if (type == w83687thf) {
787c72b1 1490 data->vid = w83687thf_read_vid(pdev);
1da177e4
LT
1491 }
1492
1493 /* Read VRM & OVT Config only once */
d27c37c0 1494 if (type == w83627thf || type == w83637hf || type == w83687thf) {
1da177e4 1495 data->vrm_ovt =
787c72b1 1496 w83627hf_read_value(data, W83627THF_REG_VRM_OVT_CFG);
1da177e4
LT
1497 }
1498
787c72b1 1499 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1);
1da177e4
LT
1500 for (i = 1; i <= 3; i++) {
1501 if (!(tmp & BIT_SCFG1[i - 1])) {
b26f9330 1502 data->sens[i - 1] = 4;
1da177e4
LT
1503 } else {
1504 if (w83627hf_read_value
787c72b1 1505 (data,
1da177e4
LT
1506 W83781D_REG_SCFG2) & BIT_SCFG2[i - 1])
1507 data->sens[i - 1] = 1;
1508 else
1509 data->sens[i - 1] = 2;
1510 }
1511 if ((type == w83697hf) && (i == 2))
1512 break;
1513 }
1514
1515 if(init) {
1516 /* Enable temp2 */
787c72b1 1517 tmp = w83627hf_read_value(data, W83781D_REG_TEMP2_CONFIG);
1da177e4 1518 if (tmp & 0x01) {
787c72b1 1519 dev_warn(&pdev->dev, "Enabling temp2, readings "
1da177e4 1520 "might not make sense\n");
787c72b1 1521 w83627hf_write_value(data, W83781D_REG_TEMP2_CONFIG,
1da177e4
LT
1522 tmp & 0xfe);
1523 }
1524
1525 /* Enable temp3 */
1526 if (type != w83697hf) {
787c72b1 1527 tmp = w83627hf_read_value(data,
1da177e4
LT
1528 W83781D_REG_TEMP3_CONFIG);
1529 if (tmp & 0x01) {
787c72b1 1530 dev_warn(&pdev->dev, "Enabling temp3, "
1da177e4 1531 "readings might not make sense\n");
787c72b1 1532 w83627hf_write_value(data,
1da177e4
LT
1533 W83781D_REG_TEMP3_CONFIG, tmp & 0xfe);
1534 }
1535 }
1da177e4
LT
1536 }
1537
1538 /* Start monitoring */
787c72b1
JD
1539 w83627hf_write_value(data, W83781D_REG_CONFIG,
1540 (w83627hf_read_value(data,
1da177e4
LT
1541 W83781D_REG_CONFIG) & 0xf7)
1542 | 0x01);
1543}
1544
c09c5184
JD
1545static void w83627hf_update_fan_div(struct w83627hf_data *data)
1546{
1547 int reg;
1548
1549 reg = w83627hf_read_value(data, W83781D_REG_VID_FANDIV);
1550 data->fan_div[0] = (reg >> 4) & 0x03;
1551 data->fan_div[1] = (reg >> 6) & 0x03;
1552 if (data->type != w83697hf) {
1553 data->fan_div[2] = (w83627hf_read_value(data,
1554 W83781D_REG_PIN) >> 6) & 0x03;
1555 }
1556 reg = w83627hf_read_value(data, W83781D_REG_VBAT);
1557 data->fan_div[0] |= (reg >> 3) & 0x04;
1558 data->fan_div[1] |= (reg >> 4) & 0x04;
1559 if (data->type != w83697hf)
1560 data->fan_div[2] |= (reg >> 5) & 0x04;
1561}
1562
1da177e4
LT
1563static struct w83627hf_data *w83627hf_update_device(struct device *dev)
1564{
787c72b1 1565 struct w83627hf_data *data = dev_get_drvdata(dev);
1da177e4
LT
1566 int i;
1567
9a61bf63 1568 mutex_lock(&data->update_lock);
1da177e4
LT
1569
1570 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1571 || !data->valid) {
1572 for (i = 0; i <= 8; i++) {
1573 /* skip missing sensors */
1574 if (((data->type == w83697hf) && (i == 1)) ||
c2db6ce1 1575 ((data->type != w83627hf && data->type != w83697hf)
4a1c4447 1576 && (i == 5 || i == 6)))
1da177e4
LT
1577 continue;
1578 data->in[i] =
787c72b1 1579 w83627hf_read_value(data, W83781D_REG_IN(i));
1da177e4 1580 data->in_min[i] =
787c72b1 1581 w83627hf_read_value(data,
1da177e4
LT
1582 W83781D_REG_IN_MIN(i));
1583 data->in_max[i] =
787c72b1 1584 w83627hf_read_value(data,
1da177e4
LT
1585 W83781D_REG_IN_MAX(i));
1586 }
1587 for (i = 1; i <= 3; i++) {
1588 data->fan[i - 1] =
787c72b1 1589 w83627hf_read_value(data, W83781D_REG_FAN(i));
1da177e4 1590 data->fan_min[i - 1] =
787c72b1 1591 w83627hf_read_value(data,
1da177e4
LT
1592 W83781D_REG_FAN_MIN(i));
1593 }
07584c76 1594 for (i = 0; i <= 2; i++) {
787c72b1 1595 u8 tmp = w83627hf_read_value(data,
1da177e4
LT
1596 W836X7HF_REG_PWM(data->type, i));
1597 /* bits 0-3 are reserved in 627THF */
1598 if (data->type == w83627thf)
1599 tmp &= 0xf0;
07584c76
JC
1600 data->pwm[i] = tmp;
1601 if (i == 1 &&
1602 (data->type == w83627hf || data->type == w83697hf))
1da177e4
LT
1603 break;
1604 }
1550cb6d
COM
1605 if (data->type == w83627hf) {
1606 u8 tmp = w83627hf_read_value(data,
1607 W83627HF_REG_PWM_FREQ);
1608 data->pwm_freq[0] = tmp & 0x07;
1609 data->pwm_freq[1] = (tmp >> 4) & 0x07;
1610 } else if (data->type != w83627thf) {
1611 for (i = 1; i <= 3; i++) {
1612 data->pwm_freq[i - 1] =
1613 w83627hf_read_value(data,
1614 W83637HF_REG_PWM_FREQ[i - 1]);
1615 if (i == 2 && (data->type == w83697hf))
1616 break;
1617 }
1618 }
1da177e4 1619
787c72b1 1620 data->temp = w83627hf_read_value(data, W83781D_REG_TEMP(1));
1da177e4 1621 data->temp_max =
787c72b1 1622 w83627hf_read_value(data, W83781D_REG_TEMP_OVER(1));
1da177e4 1623 data->temp_max_hyst =
787c72b1 1624 w83627hf_read_value(data, W83781D_REG_TEMP_HYST(1));
1da177e4 1625 data->temp_add[0] =
787c72b1 1626 w83627hf_read_value(data, W83781D_REG_TEMP(2));
1da177e4 1627 data->temp_max_add[0] =
787c72b1 1628 w83627hf_read_value(data, W83781D_REG_TEMP_OVER(2));
1da177e4 1629 data->temp_max_hyst_add[0] =
787c72b1 1630 w83627hf_read_value(data, W83781D_REG_TEMP_HYST(2));
1da177e4
LT
1631 if (data->type != w83697hf) {
1632 data->temp_add[1] =
787c72b1 1633 w83627hf_read_value(data, W83781D_REG_TEMP(3));
1da177e4 1634 data->temp_max_add[1] =
787c72b1 1635 w83627hf_read_value(data, W83781D_REG_TEMP_OVER(3));
1da177e4 1636 data->temp_max_hyst_add[1] =
787c72b1 1637 w83627hf_read_value(data, W83781D_REG_TEMP_HYST(3));
1da177e4
LT
1638 }
1639
c09c5184
JD
1640 w83627hf_update_fan_div(data);
1641
1da177e4 1642 data->alarms =
787c72b1
JD
1643 w83627hf_read_value(data, W83781D_REG_ALARM1) |
1644 (w83627hf_read_value(data, W83781D_REG_ALARM2) << 8) |
1645 (w83627hf_read_value(data, W83781D_REG_ALARM3) << 16);
1646 i = w83627hf_read_value(data, W83781D_REG_BEEP_INTS2);
1da177e4
LT
1647 data->beep_enable = i >> 7;
1648 data->beep_mask = ((i & 0x7f) << 8) |
787c72b1
JD
1649 w83627hf_read_value(data, W83781D_REG_BEEP_INTS1) |
1650 w83627hf_read_value(data, W83781D_REG_BEEP_INTS3) << 16;
1da177e4
LT
1651 data->last_updated = jiffies;
1652 data->valid = 1;
1653 }
1654
9a61bf63 1655 mutex_unlock(&data->update_lock);
1da177e4
LT
1656
1657 return data;
1658}
1659
787c72b1
JD
1660static int __init w83627hf_device_add(unsigned short address,
1661 const struct w83627hf_sio_data *sio_data)
1662{
1663 struct resource res = {
1664 .start = address + WINB_REGION_OFFSET,
1665 .end = address + WINB_REGION_OFFSET + WINB_REGION_SIZE - 1,
1666 .name = DRVNAME,
1667 .flags = IORESOURCE_IO,
1668 };
1669 int err;
1670
1671 pdev = platform_device_alloc(DRVNAME, address);
1672 if (!pdev) {
1673 err = -ENOMEM;
1674 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1675 goto exit;
1676 }
1677
1678 err = platform_device_add_resources(pdev, &res, 1);
1679 if (err) {
1680 printk(KERN_ERR DRVNAME ": Device resource addition failed "
1681 "(%d)\n", err);
1682 goto exit_device_put;
1683 }
1684
2df6d811
JD
1685 err = platform_device_add_data(pdev, sio_data,
1686 sizeof(struct w83627hf_sio_data));
1687 if (err) {
787c72b1
JD
1688 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1689 goto exit_device_put;
1690 }
787c72b1
JD
1691
1692 err = platform_device_add(pdev);
1693 if (err) {
1694 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1695 err);
1696 goto exit_device_put;
1697 }
1698
1699 return 0;
1700
1701exit_device_put:
1702 platform_device_put(pdev);
1703exit:
1704 return err;
1705}
1706
1da177e4
LT
1707static int __init sensors_w83627hf_init(void)
1708{
787c72b1
JD
1709 int err;
1710 unsigned short address;
1711 struct w83627hf_sio_data sio_data;
1712
1713 if (w83627hf_find(0x2e, &address, &sio_data)
1714 && w83627hf_find(0x4e, &address, &sio_data))
1da177e4 1715 return -ENODEV;
1da177e4 1716
787c72b1
JD
1717 err = platform_driver_register(&w83627hf_driver);
1718 if (err)
1719 goto exit;
1720
1721 /* Sets global pdev as a side effect */
1722 err = w83627hf_device_add(address, &sio_data);
1723 if (err)
1724 goto exit_driver;
1725
1726 return 0;
1727
1728exit_driver:
1729 platform_driver_unregister(&w83627hf_driver);
1730exit:
1731 return err;
1da177e4
LT
1732}
1733
1734static void __exit sensors_w83627hf_exit(void)
1735{
787c72b1
JD
1736 platform_device_unregister(pdev);
1737 platform_driver_unregister(&w83627hf_driver);
1da177e4
LT
1738}
1739
1740MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
1741 "Philip Edelbrock <phil@netroedge.com>, "
1742 "and Mark Studebaker <mdsxyz123@yahoo.com>");
1743MODULE_DESCRIPTION("W83627HF driver");
1744MODULE_LICENSE("GPL");
1745
1746module_init(sensors_w83627hf_init);
1747module_exit(sensors_w83627hf_exit);
This page took 0.518091 seconds and 5 git commands to generate.