hwmon: (hdaps) Fix Thinkpad X41 axis inversion
[linux-2.6-block.git] / drivers / hwmon / w83627ehf.c
CommitLineData
08e7e278
JD
1/*
2 w83627ehf - Driver for the hardware monitoring functionality of
3 the Winbond W83627EHF Super-I/O chip
4 Copyright (C) 2005 Jean Delvare <khali@linux-fr.org>
3379ceee 5 Copyright (C) 2006 Yuan Mu (Winbond),
7188cc66 6 Rudolf Marek <r.marek@assembler.cz>
c18beb5b 7 David Hubbard <david.c.hubbard@gmail.com>
08e7e278
JD
8
9 Shamelessly ripped from the w83627hf driver
10 Copyright (C) 2003 Mark Studebaker
11
12 Thanks to Leon Moonen, Steve Cliffe and Grant Coady for their help
13 in testing and debugging this driver.
14
8dd2d2ca
JD
15 This driver also supports the W83627EHG, which is the lead-free
16 version of the W83627EHF.
17
08e7e278
JD
18 This program is free software; you can redistribute it and/or modify
19 it under the terms of the GNU General Public License as published by
20 the Free Software Foundation; either version 2 of the License, or
21 (at your option) any later version.
22
23 This program is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 GNU General Public License for more details.
27
28 You should have received a copy of the GNU General Public License
29 along with this program; if not, write to the Free Software
30 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31
32
33 Supports the following chips:
34
657c93b1
DH
35 Chip #vin #fan #pwm #temp chip IDs man ID
36 w83627ehf 10 5 4 3 0x8850 0x88 0x5ca3
37 0x8860 0xa1
38 w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3
08e7e278
JD
39*/
40
41#include <linux/module.h>
42#include <linux/init.h>
43#include <linux/slab.h>
1ea6dd38
DH
44#include <linux/jiffies.h>
45#include <linux/platform_device.h>
943b0830 46#include <linux/hwmon.h>
412fec82 47#include <linux/hwmon-sysfs.h>
fc18d6c0 48#include <linux/hwmon-vid.h>
943b0830 49#include <linux/err.h>
9a61bf63 50#include <linux/mutex.h>
b9acb64a 51#include <linux/acpi.h>
08e7e278
JD
52#include <asm/io.h>
53#include "lm75.h"
54
1ea6dd38 55enum kinds { w83627ehf, w83627dhg };
08e7e278 56
1ea6dd38
DH
57/* used to set data->name = w83627ehf_device_names[data->sio_kind] */
58static const char * w83627ehf_device_names[] = {
59 "w83627ehf",
60 "w83627dhg",
61};
62
67b671bc
JD
63static unsigned short force_id;
64module_param(force_id, ushort, 0);
65MODULE_PARM_DESC(force_id, "Override the detected device ID");
66
1ea6dd38 67#define DRVNAME "w83627ehf"
08e7e278 68
657c93b1 69/*
1ea6dd38 70 * Super-I/O constants and functions
657c93b1 71 */
08e7e278
JD
72
73#define W83627EHF_LD_HWM 0x0b
74
75#define SIO_REG_LDSEL 0x07 /* Logical device select */
76#define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
fc18d6c0 77#define SIO_REG_EN_VRM10 0x2C /* GPIO3, GPIO4 selection */
08e7e278
JD
78#define SIO_REG_ENABLE 0x30 /* Logical device enable */
79#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
fc18d6c0
JD
80#define SIO_REG_VID_CTRL 0xF0 /* VID control */
81#define SIO_REG_VID_DATA 0xF1 /* VID data */
08e7e278 82
657c93b1
DH
83#define SIO_W83627EHF_ID 0x8850
84#define SIO_W83627EHG_ID 0x8860
85#define SIO_W83627DHG_ID 0xa020
86#define SIO_ID_MASK 0xFFF0
08e7e278
JD
87
88static inline void
1ea6dd38 89superio_outb(int ioreg, int reg, int val)
08e7e278 90{
1ea6dd38
DH
91 outb(reg, ioreg);
92 outb(val, ioreg + 1);
08e7e278
JD
93}
94
95static inline int
1ea6dd38 96superio_inb(int ioreg, int reg)
08e7e278 97{
1ea6dd38
DH
98 outb(reg, ioreg);
99 return inb(ioreg + 1);
08e7e278
JD
100}
101
102static inline void
1ea6dd38 103superio_select(int ioreg, int ld)
08e7e278 104{
1ea6dd38
DH
105 outb(SIO_REG_LDSEL, ioreg);
106 outb(ld, ioreg + 1);
08e7e278
JD
107}
108
109static inline void
1ea6dd38 110superio_enter(int ioreg)
08e7e278 111{
1ea6dd38
DH
112 outb(0x87, ioreg);
113 outb(0x87, ioreg);
08e7e278
JD
114}
115
116static inline void
1ea6dd38 117superio_exit(int ioreg)
08e7e278 118{
1ea6dd38
DH
119 outb(0x02, ioreg);
120 outb(0x02, ioreg + 1);
08e7e278
JD
121}
122
123/*
124 * ISA constants
125 */
126
1a641fce
JD
127#define IOREGION_ALIGNMENT ~7
128#define IOREGION_OFFSET 5
129#define IOREGION_LENGTH 2
1ea6dd38
DH
130#define ADDR_REG_OFFSET 0
131#define DATA_REG_OFFSET 1
08e7e278
JD
132
133#define W83627EHF_REG_BANK 0x4E
134#define W83627EHF_REG_CONFIG 0x40
657c93b1
DH
135
136/* Not currently used:
137 * REG_MAN_ID has the value 0x5ca3 for all supported chips.
138 * REG_CHIP_ID == 0x88/0xa1/0xc1 depending on chip model.
139 * REG_MAN_ID is at port 0x4f
140 * REG_CHIP_ID is at port 0x58 */
08e7e278
JD
141
142static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
143static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
144
cf0676fe
RM
145/* The W83627EHF registers for nr=7,8,9 are in bank 5 */
146#define W83627EHF_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
147 (0x554 + (((nr) - 7) * 2)))
148#define W83627EHF_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
149 (0x555 + (((nr) - 7) * 2)))
150#define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
151 (0x550 + (nr) - 7))
152
08e7e278
JD
153#define W83627EHF_REG_TEMP1 0x27
154#define W83627EHF_REG_TEMP1_HYST 0x3a
155#define W83627EHF_REG_TEMP1_OVER 0x39
156static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 };
157static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
158static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
159static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
160
161/* Fan clock dividers are spread over the following five registers */
162#define W83627EHF_REG_FANDIV1 0x47
163#define W83627EHF_REG_FANDIV2 0x4B
164#define W83627EHF_REG_VBAT 0x5D
165#define W83627EHF_REG_DIODE 0x59
166#define W83627EHF_REG_SMI_OVT 0x4C
167
a4589dbb
JD
168#define W83627EHF_REG_ALARM1 0x459
169#define W83627EHF_REG_ALARM2 0x45A
170#define W83627EHF_REG_ALARM3 0x45B
171
08c79950
RM
172/* SmartFan registers */
173/* DC or PWM output fan configuration */
174static const u8 W83627EHF_REG_PWM_ENABLE[] = {
175 0x04, /* SYS FAN0 output mode and PWM mode */
176 0x04, /* CPU FAN0 output mode and PWM mode */
177 0x12, /* AUX FAN mode */
178 0x62, /* CPU fan1 mode */
179};
180
181static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
182static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
183
184/* FAN Duty Cycle, be used to control */
185static const u8 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
186static const u8 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
187static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };
188
189
190/* Advanced Fan control, some values are common for all fans */
191static const u8 W83627EHF_REG_FAN_MIN_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
192static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0C, 0x0D, 0x17, 0x66 };
193
08e7e278
JD
194/*
195 * Conversions
196 */
197
08c79950
RM
198/* 1 is PWM mode, output in ms */
199static inline unsigned int step_time_from_reg(u8 reg, u8 mode)
200{
201 return mode ? 100 * reg : 400 * reg;
202}
203
204static inline u8 step_time_to_reg(unsigned int msec, u8 mode)
205{
206 return SENSORS_LIMIT((mode ? (msec + 50) / 100 :
207 (msec + 200) / 400), 1, 255);
208}
209
08e7e278
JD
210static inline unsigned int
211fan_from_reg(u8 reg, unsigned int div)
212{
213 if (reg == 0 || reg == 255)
214 return 0;
215 return 1350000U / (reg * div);
216}
217
218static inline unsigned int
219div_from_reg(u8 reg)
220{
221 return 1 << reg;
222}
223
224static inline int
225temp1_from_reg(s8 reg)
226{
227 return reg * 1000;
228}
229
230static inline s8
5bfedac0 231temp1_to_reg(long temp, int min, int max)
08e7e278 232{
08c79950
RM
233 if (temp <= min)
234 return min / 1000;
235 if (temp >= max)
236 return max / 1000;
08e7e278
JD
237 if (temp < 0)
238 return (temp - 500) / 1000;
239 return (temp + 500) / 1000;
240}
241
cf0676fe
RM
242/* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */
243
244static u8 scale_in[10] = { 8, 8, 16, 16, 8, 8, 8, 16, 16, 8 };
245
246static inline long in_from_reg(u8 reg, u8 nr)
247{
248 return reg * scale_in[nr];
249}
250
251static inline u8 in_to_reg(u32 val, u8 nr)
252{
253 return SENSORS_LIMIT(((val + (scale_in[nr] / 2)) / scale_in[nr]), 0, 255);
254}
255
08e7e278
JD
256/*
257 * Data structures and manipulation thereof
258 */
259
260struct w83627ehf_data {
1ea6dd38
DH
261 int addr; /* IO base of hw monitor block */
262 const char *name;
263
1beeffe4 264 struct device *hwmon_dev;
9a61bf63 265 struct mutex lock;
08e7e278 266
9a61bf63 267 struct mutex update_lock;
08e7e278
JD
268 char valid; /* !=0 if following fields are valid */
269 unsigned long last_updated; /* In jiffies */
270
271 /* Register values */
1ea6dd38 272 u8 in_num; /* number of in inputs we have */
cf0676fe
RM
273 u8 in[10]; /* Register value */
274 u8 in_max[10]; /* Register value */
275 u8 in_min[10]; /* Register value */
08e7e278
JD
276 u8 fan[5];
277 u8 fan_min[5];
278 u8 fan_div[5];
279 u8 has_fan; /* some fan inputs can be disabled */
da667365 280 u8 temp_type[3];
08e7e278
JD
281 s8 temp1;
282 s8 temp1_max;
283 s8 temp1_max_hyst;
284 s16 temp[2];
285 s16 temp_max[2];
286 s16 temp_max_hyst[2];
a4589dbb 287 u32 alarms;
08c79950
RM
288
289 u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle */
290 u8 pwm_enable[4]; /* 1->manual
291 2->thermal cruise (also called SmartFan I) */
292 u8 pwm[4];
293 u8 target_temp[4];
294 u8 tolerance[4];
295
296 u8 fan_min_output[4]; /* minimum fan speed */
297 u8 fan_stop_time[4];
fc18d6c0
JD
298
299 u8 vid;
300 u8 vrm;
08e7e278
JD
301};
302
1ea6dd38
DH
303struct w83627ehf_sio_data {
304 int sioreg;
305 enum kinds kind;
306};
307
08e7e278
JD
308static inline int is_word_sized(u16 reg)
309{
310 return (((reg & 0xff00) == 0x100
311 || (reg & 0xff00) == 0x200)
312 && ((reg & 0x00ff) == 0x50
313 || (reg & 0x00ff) == 0x53
314 || (reg & 0x00ff) == 0x55));
315}
316
0956895a 317/* Registers 0x50-0x5f are banked */
1ea6dd38 318static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
08e7e278 319{
0956895a 320 if ((reg & 0x00f0) == 0x50) {
1ea6dd38
DH
321 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
322 outb_p(reg >> 8, data->addr + DATA_REG_OFFSET);
08e7e278
JD
323 }
324}
325
0956895a 326/* Not strictly necessary, but play it safe for now */
1ea6dd38 327static inline void w83627ehf_reset_bank(struct w83627ehf_data *data, u16 reg)
08e7e278
JD
328{
329 if (reg & 0xff00) {
1ea6dd38
DH
330 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
331 outb_p(0, data->addr + DATA_REG_OFFSET);
08e7e278
JD
332 }
333}
334
1ea6dd38 335static u16 w83627ehf_read_value(struct w83627ehf_data *data, u16 reg)
08e7e278 336{
08e7e278
JD
337 int res, word_sized = is_word_sized(reg);
338
9a61bf63 339 mutex_lock(&data->lock);
08e7e278 340
1ea6dd38
DH
341 w83627ehf_set_bank(data, reg);
342 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
343 res = inb_p(data->addr + DATA_REG_OFFSET);
08e7e278
JD
344 if (word_sized) {
345 outb_p((reg & 0xff) + 1,
1ea6dd38
DH
346 data->addr + ADDR_REG_OFFSET);
347 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET);
08e7e278 348 }
1ea6dd38 349 w83627ehf_reset_bank(data, reg);
08e7e278 350
9a61bf63 351 mutex_unlock(&data->lock);
08e7e278
JD
352
353 return res;
354}
355
1ea6dd38 356static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg, u16 value)
08e7e278 357{
08e7e278
JD
358 int word_sized = is_word_sized(reg);
359
9a61bf63 360 mutex_lock(&data->lock);
08e7e278 361
1ea6dd38
DH
362 w83627ehf_set_bank(data, reg);
363 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
08e7e278 364 if (word_sized) {
1ea6dd38 365 outb_p(value >> 8, data->addr + DATA_REG_OFFSET);
08e7e278 366 outb_p((reg & 0xff) + 1,
1ea6dd38 367 data->addr + ADDR_REG_OFFSET);
08e7e278 368 }
1ea6dd38
DH
369 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
370 w83627ehf_reset_bank(data, reg);
08e7e278 371
9a61bf63 372 mutex_unlock(&data->lock);
08e7e278
JD
373 return 0;
374}
375
376/* This function assumes that the caller holds data->update_lock */
1ea6dd38 377static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
08e7e278 378{
08e7e278
JD
379 u8 reg;
380
381 switch (nr) {
382 case 0:
1ea6dd38 383 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0xcf)
08e7e278 384 | ((data->fan_div[0] & 0x03) << 4);
14992c7e
RM
385 /* fan5 input control bit is write only, compute the value */
386 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
1ea6dd38
DH
387 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
388 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xdf)
08e7e278 389 | ((data->fan_div[0] & 0x04) << 3);
1ea6dd38 390 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
08e7e278
JD
391 break;
392 case 1:
1ea6dd38 393 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0x3f)
08e7e278 394 | ((data->fan_div[1] & 0x03) << 6);
14992c7e
RM
395 /* fan5 input control bit is write only, compute the value */
396 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
1ea6dd38
DH
397 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
398 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xbf)
08e7e278 399 | ((data->fan_div[1] & 0x04) << 4);
1ea6dd38 400 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
08e7e278
JD
401 break;
402 case 2:
1ea6dd38 403 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV2) & 0x3f)
08e7e278 404 | ((data->fan_div[2] & 0x03) << 6);
1ea6dd38
DH
405 w83627ehf_write_value(data, W83627EHF_REG_FANDIV2, reg);
406 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0x7f)
08e7e278 407 | ((data->fan_div[2] & 0x04) << 5);
1ea6dd38 408 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
08e7e278
JD
409 break;
410 case 3:
1ea6dd38 411 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0xfc)
08e7e278 412 | (data->fan_div[3] & 0x03);
1ea6dd38
DH
413 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
414 reg = (w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT) & 0x7f)
08e7e278 415 | ((data->fan_div[3] & 0x04) << 5);
1ea6dd38 416 w83627ehf_write_value(data, W83627EHF_REG_SMI_OVT, reg);
08e7e278
JD
417 break;
418 case 4:
1ea6dd38 419 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0x73)
33725ad3 420 | ((data->fan_div[4] & 0x03) << 2)
08e7e278 421 | ((data->fan_div[4] & 0x04) << 5);
1ea6dd38 422 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
08e7e278
JD
423 break;
424 }
425}
426
ea7be66c
MH
427static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
428{
429 int i;
430
431 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
432 data->fan_div[0] = (i >> 4) & 0x03;
433 data->fan_div[1] = (i >> 6) & 0x03;
434 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
435 data->fan_div[2] = (i >> 6) & 0x03;
436 i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
437 data->fan_div[0] |= (i >> 3) & 0x04;
438 data->fan_div[1] |= (i >> 4) & 0x04;
439 data->fan_div[2] |= (i >> 5) & 0x04;
440 if (data->has_fan & ((1 << 3) | (1 << 4))) {
441 i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
442 data->fan_div[3] = i & 0x03;
443 data->fan_div[4] = ((i >> 2) & 0x03)
444 | ((i >> 5) & 0x04);
445 }
446 if (data->has_fan & (1 << 3)) {
447 i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
448 data->fan_div[3] |= (i >> 5) & 0x04;
449 }
450}
451
08e7e278
JD
452static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
453{
1ea6dd38 454 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950 455 int pwmcfg = 0, tolerance = 0; /* shut up the compiler */
08e7e278
JD
456 int i;
457
9a61bf63 458 mutex_lock(&data->update_lock);
08e7e278 459
6b3e4645 460 if (time_after(jiffies, data->last_updated + HZ + HZ/2)
08e7e278
JD
461 || !data->valid) {
462 /* Fan clock dividers */
ea7be66c 463 w83627ehf_update_fan_div(data);
08e7e278 464
cf0676fe 465 /* Measured voltages and limits */
1ea6dd38
DH
466 for (i = 0; i < data->in_num; i++) {
467 data->in[i] = w83627ehf_read_value(data,
cf0676fe 468 W83627EHF_REG_IN(i));
1ea6dd38 469 data->in_min[i] = w83627ehf_read_value(data,
cf0676fe 470 W83627EHF_REG_IN_MIN(i));
1ea6dd38 471 data->in_max[i] = w83627ehf_read_value(data,
cf0676fe
RM
472 W83627EHF_REG_IN_MAX(i));
473 }
474
08e7e278
JD
475 /* Measured fan speeds and limits */
476 for (i = 0; i < 5; i++) {
477 if (!(data->has_fan & (1 << i)))
478 continue;
479
1ea6dd38 480 data->fan[i] = w83627ehf_read_value(data,
08e7e278 481 W83627EHF_REG_FAN[i]);
1ea6dd38 482 data->fan_min[i] = w83627ehf_read_value(data,
08e7e278
JD
483 W83627EHF_REG_FAN_MIN[i]);
484
485 /* If we failed to measure the fan speed and clock
486 divider can be increased, let's try that for next
487 time */
488 if (data->fan[i] == 0xff
489 && data->fan_div[i] < 0x07) {
1ea6dd38 490 dev_dbg(dev, "Increasing fan%d "
08e7e278 491 "clock divider from %u to %u\n",
33725ad3 492 i + 1, div_from_reg(data->fan_div[i]),
08e7e278
JD
493 div_from_reg(data->fan_div[i] + 1));
494 data->fan_div[i]++;
1ea6dd38 495 w83627ehf_write_fan_div(data, i);
08e7e278
JD
496 /* Preserve min limit if possible */
497 if (data->fan_min[i] >= 2
498 && data->fan_min[i] != 255)
1ea6dd38 499 w83627ehf_write_value(data,
08e7e278
JD
500 W83627EHF_REG_FAN_MIN[i],
501 (data->fan_min[i] /= 2));
502 }
503 }
504
08c79950 505 for (i = 0; i < 4; i++) {
77fa49d9 506 /* pwmcfg, tolerance mapped for i=0, i=1 to same reg */
08c79950 507 if (i != 1) {
1ea6dd38 508 pwmcfg = w83627ehf_read_value(data,
08c79950 509 W83627EHF_REG_PWM_ENABLE[i]);
1ea6dd38 510 tolerance = w83627ehf_read_value(data,
08c79950
RM
511 W83627EHF_REG_TOLERANCE[i]);
512 }
513 data->pwm_mode[i] =
514 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1)
515 ? 0 : 1;
516 data->pwm_enable[i] =
517 ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
518 & 3) + 1;
1ea6dd38 519 data->pwm[i] = w83627ehf_read_value(data,
08c79950 520 W83627EHF_REG_PWM[i]);
1ea6dd38 521 data->fan_min_output[i] = w83627ehf_read_value(data,
08c79950 522 W83627EHF_REG_FAN_MIN_OUTPUT[i]);
1ea6dd38 523 data->fan_stop_time[i] = w83627ehf_read_value(data,
08c79950
RM
524 W83627EHF_REG_FAN_STOP_TIME[i]);
525 data->target_temp[i] =
1ea6dd38 526 w83627ehf_read_value(data,
08c79950
RM
527 W83627EHF_REG_TARGET[i]) &
528 (data->pwm_mode[i] == 1 ? 0x7f : 0xff);
529 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0))
530 & 0x0f;
531 }
532
08e7e278 533 /* Measured temperatures and limits */
1ea6dd38 534 data->temp1 = w83627ehf_read_value(data,
08e7e278 535 W83627EHF_REG_TEMP1);
1ea6dd38 536 data->temp1_max = w83627ehf_read_value(data,
08e7e278 537 W83627EHF_REG_TEMP1_OVER);
1ea6dd38 538 data->temp1_max_hyst = w83627ehf_read_value(data,
08e7e278
JD
539 W83627EHF_REG_TEMP1_HYST);
540 for (i = 0; i < 2; i++) {
1ea6dd38 541 data->temp[i] = w83627ehf_read_value(data,
08e7e278 542 W83627EHF_REG_TEMP[i]);
1ea6dd38 543 data->temp_max[i] = w83627ehf_read_value(data,
08e7e278 544 W83627EHF_REG_TEMP_OVER[i]);
1ea6dd38 545 data->temp_max_hyst[i] = w83627ehf_read_value(data,
08e7e278
JD
546 W83627EHF_REG_TEMP_HYST[i]);
547 }
548
1ea6dd38 549 data->alarms = w83627ehf_read_value(data,
a4589dbb 550 W83627EHF_REG_ALARM1) |
1ea6dd38 551 (w83627ehf_read_value(data,
a4589dbb 552 W83627EHF_REG_ALARM2) << 8) |
1ea6dd38 553 (w83627ehf_read_value(data,
a4589dbb
JD
554 W83627EHF_REG_ALARM3) << 16);
555
08e7e278
JD
556 data->last_updated = jiffies;
557 data->valid = 1;
558 }
559
9a61bf63 560 mutex_unlock(&data->update_lock);
08e7e278
JD
561 return data;
562}
563
564/*
565 * Sysfs callback functions
566 */
cf0676fe
RM
567#define show_in_reg(reg) \
568static ssize_t \
569show_##reg(struct device *dev, struct device_attribute *attr, \
570 char *buf) \
571{ \
572 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
573 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
574 int nr = sensor_attr->index; \
575 return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr)); \
576}
577show_in_reg(in)
578show_in_reg(in_min)
579show_in_reg(in_max)
580
581#define store_in_reg(REG, reg) \
582static ssize_t \
583store_in_##reg (struct device *dev, struct device_attribute *attr, \
584 const char *buf, size_t count) \
585{ \
1ea6dd38 586 struct w83627ehf_data *data = dev_get_drvdata(dev); \
cf0676fe
RM
587 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
588 int nr = sensor_attr->index; \
589 u32 val = simple_strtoul(buf, NULL, 10); \
590 \
591 mutex_lock(&data->update_lock); \
592 data->in_##reg[nr] = in_to_reg(val, nr); \
1ea6dd38 593 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(nr), \
cf0676fe
RM
594 data->in_##reg[nr]); \
595 mutex_unlock(&data->update_lock); \
596 return count; \
597}
598
599store_in_reg(MIN, min)
600store_in_reg(MAX, max)
601
a4589dbb
JD
602static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
603{
604 struct w83627ehf_data *data = w83627ehf_update_device(dev);
605 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
606 int nr = sensor_attr->index;
607 return sprintf(buf, "%u\n", (data->alarms >> nr) & 0x01);
608}
609
cf0676fe
RM
610static struct sensor_device_attribute sda_in_input[] = {
611 SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
612 SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
613 SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
614 SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
615 SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
616 SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
617 SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
618 SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
619 SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
620 SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
621};
622
a4589dbb
JD
623static struct sensor_device_attribute sda_in_alarm[] = {
624 SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
625 SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
626 SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
627 SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
628 SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
629 SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 21),
630 SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 20),
631 SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16),
632 SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17),
633 SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 19),
634};
635
cf0676fe
RM
636static struct sensor_device_attribute sda_in_min[] = {
637 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
638 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
639 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
640 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
641 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
642 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
643 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
644 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
645 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
646 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
647};
648
649static struct sensor_device_attribute sda_in_max[] = {
650 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
651 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
652 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
653 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
654 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
655 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
656 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
657 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
658 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
659 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
660};
661
08e7e278
JD
662#define show_fan_reg(reg) \
663static ssize_t \
412fec82
YM
664show_##reg(struct device *dev, struct device_attribute *attr, \
665 char *buf) \
08e7e278
JD
666{ \
667 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
412fec82
YM
668 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
669 int nr = sensor_attr->index; \
08e7e278
JD
670 return sprintf(buf, "%d\n", \
671 fan_from_reg(data->reg[nr], \
672 div_from_reg(data->fan_div[nr]))); \
673}
674show_fan_reg(fan);
675show_fan_reg(fan_min);
676
677static ssize_t
412fec82
YM
678show_fan_div(struct device *dev, struct device_attribute *attr,
679 char *buf)
08e7e278
JD
680{
681 struct w83627ehf_data *data = w83627ehf_update_device(dev);
412fec82
YM
682 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
683 int nr = sensor_attr->index;
684 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
08e7e278
JD
685}
686
687static ssize_t
412fec82
YM
688store_fan_min(struct device *dev, struct device_attribute *attr,
689 const char *buf, size_t count)
08e7e278 690{
1ea6dd38 691 struct w83627ehf_data *data = dev_get_drvdata(dev);
412fec82
YM
692 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
693 int nr = sensor_attr->index;
08e7e278
JD
694 unsigned int val = simple_strtoul(buf, NULL, 10);
695 unsigned int reg;
696 u8 new_div;
697
9a61bf63 698 mutex_lock(&data->update_lock);
08e7e278
JD
699 if (!val) {
700 /* No min limit, alarm disabled */
701 data->fan_min[nr] = 255;
702 new_div = data->fan_div[nr]; /* No change */
703 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
704 } else if ((reg = 1350000U / val) >= 128 * 255) {
705 /* Speed below this value cannot possibly be represented,
706 even with the highest divider (128) */
707 data->fan_min[nr] = 254;
708 new_div = 7; /* 128 == (1 << 7) */
709 dev_warn(dev, "fan%u low limit %u below minimum %u, set to "
710 "minimum\n", nr + 1, val, fan_from_reg(254, 128));
711 } else if (!reg) {
712 /* Speed above this value cannot possibly be represented,
713 even with the lowest divider (1) */
714 data->fan_min[nr] = 1;
715 new_div = 0; /* 1 == (1 << 0) */
716 dev_warn(dev, "fan%u low limit %u above maximum %u, set to "
b9110b1c 717 "maximum\n", nr + 1, val, fan_from_reg(1, 1));
08e7e278
JD
718 } else {
719 /* Automatically pick the best divider, i.e. the one such
720 that the min limit will correspond to a register value
721 in the 96..192 range */
722 new_div = 0;
723 while (reg > 192 && new_div < 7) {
724 reg >>= 1;
725 new_div++;
726 }
727 data->fan_min[nr] = reg;
728 }
729
730 /* Write both the fan clock divider (if it changed) and the new
731 fan min (unconditionally) */
732 if (new_div != data->fan_div[nr]) {
158ce075
JD
733 /* Preserve the fan speed reading */
734 if (data->fan[nr] != 0xff) {
735 if (new_div > data->fan_div[nr])
736 data->fan[nr] >>= new_div - data->fan_div[nr];
737 else if (data->fan[nr] & 0x80)
738 data->fan[nr] = 0xff;
739 else
740 data->fan[nr] <<= data->fan_div[nr] - new_div;
741 }
08e7e278
JD
742
743 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
744 nr + 1, div_from_reg(data->fan_div[nr]),
745 div_from_reg(new_div));
746 data->fan_div[nr] = new_div;
1ea6dd38 747 w83627ehf_write_fan_div(data, nr);
6b3e4645
JD
748 /* Give the chip time to sample a new speed value */
749 data->last_updated = jiffies;
08e7e278 750 }
1ea6dd38 751 w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[nr],
08e7e278 752 data->fan_min[nr]);
9a61bf63 753 mutex_unlock(&data->update_lock);
08e7e278
JD
754
755 return count;
756}
757
412fec82
YM
758static struct sensor_device_attribute sda_fan_input[] = {
759 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
760 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
761 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
762 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
763 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
764};
08e7e278 765
a4589dbb
JD
766static struct sensor_device_attribute sda_fan_alarm[] = {
767 SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
768 SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
769 SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
770 SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 10),
771 SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 23),
772};
773
412fec82
YM
774static struct sensor_device_attribute sda_fan_min[] = {
775 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
776 store_fan_min, 0),
777 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
778 store_fan_min, 1),
779 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
780 store_fan_min, 2),
781 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
782 store_fan_min, 3),
783 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
784 store_fan_min, 4),
785};
08e7e278 786
412fec82
YM
787static struct sensor_device_attribute sda_fan_div[] = {
788 SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0),
789 SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1),
790 SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2),
791 SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3),
792 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
793};
794
08e7e278
JD
795#define show_temp1_reg(reg) \
796static ssize_t \
6f637a64
GKH
797show_##reg(struct device *dev, struct device_attribute *attr, \
798 char *buf) \
08e7e278
JD
799{ \
800 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
801 return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \
802}
803show_temp1_reg(temp1);
804show_temp1_reg(temp1_max);
805show_temp1_reg(temp1_max_hyst);
806
807#define store_temp1_reg(REG, reg) \
808static ssize_t \
6f637a64
GKH
809store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
810 const char *buf, size_t count) \
08e7e278 811{ \
1ea6dd38 812 struct w83627ehf_data *data = dev_get_drvdata(dev); \
5bfedac0 813 long val = simple_strtol(buf, NULL, 10); \
08e7e278 814 \
9a61bf63 815 mutex_lock(&data->update_lock); \
08c79950 816 data->temp1_##reg = temp1_to_reg(val, -128000, 127000); \
1ea6dd38 817 w83627ehf_write_value(data, W83627EHF_REG_TEMP1_##REG, \
08e7e278 818 data->temp1_##reg); \
9a61bf63 819 mutex_unlock(&data->update_lock); \
08e7e278
JD
820 return count; \
821}
822store_temp1_reg(OVER, max);
823store_temp1_reg(HYST, max_hyst);
824
08e7e278
JD
825#define show_temp_reg(reg) \
826static ssize_t \
412fec82
YM
827show_##reg(struct device *dev, struct device_attribute *attr, \
828 char *buf) \
08e7e278
JD
829{ \
830 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
412fec82
YM
831 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
832 int nr = sensor_attr->index; \
08e7e278
JD
833 return sprintf(buf, "%d\n", \
834 LM75_TEMP_FROM_REG(data->reg[nr])); \
835}
836show_temp_reg(temp);
837show_temp_reg(temp_max);
838show_temp_reg(temp_max_hyst);
839
840#define store_temp_reg(REG, reg) \
841static ssize_t \
412fec82
YM
842store_##reg(struct device *dev, struct device_attribute *attr, \
843 const char *buf, size_t count) \
08e7e278 844{ \
1ea6dd38 845 struct w83627ehf_data *data = dev_get_drvdata(dev); \
412fec82
YM
846 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
847 int nr = sensor_attr->index; \
5bfedac0 848 long val = simple_strtol(buf, NULL, 10); \
08e7e278 849 \
9a61bf63 850 mutex_lock(&data->update_lock); \
08e7e278 851 data->reg[nr] = LM75_TEMP_TO_REG(val); \
1ea6dd38 852 w83627ehf_write_value(data, W83627EHF_REG_TEMP_##REG[nr], \
08e7e278 853 data->reg[nr]); \
9a61bf63 854 mutex_unlock(&data->update_lock); \
08e7e278
JD
855 return count; \
856}
857store_temp_reg(OVER, temp_max);
858store_temp_reg(HYST, temp_max_hyst);
859
da667365
JD
860static ssize_t
861show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
862{
863 struct w83627ehf_data *data = w83627ehf_update_device(dev);
864 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
865 int nr = sensor_attr->index;
866 return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
867}
868
412fec82
YM
869static struct sensor_device_attribute sda_temp[] = {
870 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0),
871 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0),
872 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1),
873 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max,
874 store_temp1_max, 0),
875 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
876 store_temp_max, 0),
877 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
878 store_temp_max, 1),
879 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst,
880 store_temp1_max_hyst, 0),
881 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
882 store_temp_max_hyst, 0),
883 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
884 store_temp_max_hyst, 1),
a4589dbb
JD
885 SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
886 SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
887 SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
da667365
JD
888 SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0),
889 SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1),
890 SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2),
412fec82 891};
08e7e278 892
08c79950
RM
893#define show_pwm_reg(reg) \
894static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
895 char *buf) \
896{ \
897 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
898 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
899 int nr = sensor_attr->index; \
900 return sprintf(buf, "%d\n", data->reg[nr]); \
901}
902
903show_pwm_reg(pwm_mode)
904show_pwm_reg(pwm_enable)
905show_pwm_reg(pwm)
906
907static ssize_t
908store_pwm_mode(struct device *dev, struct device_attribute *attr,
909 const char *buf, size_t count)
910{
1ea6dd38 911 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950
RM
912 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
913 int nr = sensor_attr->index;
914 u32 val = simple_strtoul(buf, NULL, 10);
915 u16 reg;
916
917 if (val > 1)
918 return -EINVAL;
919 mutex_lock(&data->update_lock);
1ea6dd38 920 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
08c79950
RM
921 data->pwm_mode[nr] = val;
922 reg &= ~(1 << W83627EHF_PWM_MODE_SHIFT[nr]);
923 if (!val)
924 reg |= 1 << W83627EHF_PWM_MODE_SHIFT[nr];
1ea6dd38 925 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
08c79950
RM
926 mutex_unlock(&data->update_lock);
927 return count;
928}
929
930static ssize_t
931store_pwm(struct device *dev, struct device_attribute *attr,
932 const char *buf, size_t count)
933{
1ea6dd38 934 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950
RM
935 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
936 int nr = sensor_attr->index;
937 u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255);
938
939 mutex_lock(&data->update_lock);
940 data->pwm[nr] = val;
1ea6dd38 941 w83627ehf_write_value(data, W83627EHF_REG_PWM[nr], val);
08c79950
RM
942 mutex_unlock(&data->update_lock);
943 return count;
944}
945
946static ssize_t
947store_pwm_enable(struct device *dev, struct device_attribute *attr,
948 const char *buf, size_t count)
949{
1ea6dd38 950 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950
RM
951 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
952 int nr = sensor_attr->index;
953 u32 val = simple_strtoul(buf, NULL, 10);
954 u16 reg;
955
956 if (!val || (val > 2)) /* only modes 1 and 2 are supported */
957 return -EINVAL;
958 mutex_lock(&data->update_lock);
1ea6dd38 959 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
08c79950
RM
960 data->pwm_enable[nr] = val;
961 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[nr]);
962 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[nr];
1ea6dd38 963 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
08c79950
RM
964 mutex_unlock(&data->update_lock);
965 return count;
966}
967
968
969#define show_tol_temp(reg) \
970static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
971 char *buf) \
972{ \
973 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
974 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
975 int nr = sensor_attr->index; \
976 return sprintf(buf, "%d\n", temp1_from_reg(data->reg[nr])); \
977}
978
979show_tol_temp(tolerance)
980show_tol_temp(target_temp)
981
982static ssize_t
983store_target_temp(struct device *dev, struct device_attribute *attr,
984 const char *buf, size_t count)
985{
1ea6dd38 986 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950
RM
987 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
988 int nr = sensor_attr->index;
989 u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 127000);
990
991 mutex_lock(&data->update_lock);
992 data->target_temp[nr] = val;
1ea6dd38 993 w83627ehf_write_value(data, W83627EHF_REG_TARGET[nr], val);
08c79950
RM
994 mutex_unlock(&data->update_lock);
995 return count;
996}
997
998static ssize_t
999store_tolerance(struct device *dev, struct device_attribute *attr,
1000 const char *buf, size_t count)
1001{
1ea6dd38 1002 struct w83627ehf_data *data = dev_get_drvdata(dev);
08c79950
RM
1003 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1004 int nr = sensor_attr->index;
1005 u16 reg;
1006 /* Limit the temp to 0C - 15C */
1007 u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 15000);
1008
1009 mutex_lock(&data->update_lock);
1ea6dd38 1010 reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
08c79950
RM
1011 data->tolerance[nr] = val;
1012 if (nr == 1)
1013 reg = (reg & 0x0f) | (val << 4);
1014 else
1015 reg = (reg & 0xf0) | val;
1ea6dd38 1016 w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg);
08c79950
RM
1017 mutex_unlock(&data->update_lock);
1018 return count;
1019}
1020
1021static struct sensor_device_attribute sda_pwm[] = {
1022 SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0),
1023 SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1),
1024 SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2),
1025 SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3),
1026};
1027
1028static struct sensor_device_attribute sda_pwm_mode[] = {
1029 SENSOR_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1030 store_pwm_mode, 0),
1031 SENSOR_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1032 store_pwm_mode, 1),
1033 SENSOR_ATTR(pwm3_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1034 store_pwm_mode, 2),
1035 SENSOR_ATTR(pwm4_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1036 store_pwm_mode, 3),
1037};
1038
1039static struct sensor_device_attribute sda_pwm_enable[] = {
1040 SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1041 store_pwm_enable, 0),
1042 SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1043 store_pwm_enable, 1),
1044 SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1045 store_pwm_enable, 2),
1046 SENSOR_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1047 store_pwm_enable, 3),
1048};
1049
1050static struct sensor_device_attribute sda_target_temp[] = {
1051 SENSOR_ATTR(pwm1_target, S_IWUSR | S_IRUGO, show_target_temp,
1052 store_target_temp, 0),
1053 SENSOR_ATTR(pwm2_target, S_IWUSR | S_IRUGO, show_target_temp,
1054 store_target_temp, 1),
1055 SENSOR_ATTR(pwm3_target, S_IWUSR | S_IRUGO, show_target_temp,
1056 store_target_temp, 2),
1057 SENSOR_ATTR(pwm4_target, S_IWUSR | S_IRUGO, show_target_temp,
1058 store_target_temp, 3),
1059};
1060
1061static struct sensor_device_attribute sda_tolerance[] = {
1062 SENSOR_ATTR(pwm1_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1063 store_tolerance, 0),
1064 SENSOR_ATTR(pwm2_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1065 store_tolerance, 1),
1066 SENSOR_ATTR(pwm3_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1067 store_tolerance, 2),
1068 SENSOR_ATTR(pwm4_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1069 store_tolerance, 3),
1070};
1071
08c79950
RM
1072/* Smart Fan registers */
1073
1074#define fan_functions(reg, REG) \
1075static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1076 char *buf) \
1077{ \
1078 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1079 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1080 int nr = sensor_attr->index; \
1081 return sprintf(buf, "%d\n", data->reg[nr]); \
1082}\
1083static ssize_t \
1084store_##reg(struct device *dev, struct device_attribute *attr, \
1085 const char *buf, size_t count) \
1086{\
1ea6dd38 1087 struct w83627ehf_data *data = dev_get_drvdata(dev); \
08c79950
RM
1088 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1089 int nr = sensor_attr->index; \
1090 u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 1, 255); \
1091 mutex_lock(&data->update_lock); \
1092 data->reg[nr] = val; \
1ea6dd38 1093 w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
08c79950
RM
1094 mutex_unlock(&data->update_lock); \
1095 return count; \
1096}
1097
1098fan_functions(fan_min_output, FAN_MIN_OUTPUT)
1099
1100#define fan_time_functions(reg, REG) \
1101static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1102 char *buf) \
1103{ \
1104 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1105 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1106 int nr = sensor_attr->index; \
1107 return sprintf(buf, "%d\n", \
1108 step_time_from_reg(data->reg[nr], data->pwm_mode[nr])); \
1109} \
1110\
1111static ssize_t \
1112store_##reg(struct device *dev, struct device_attribute *attr, \
1113 const char *buf, size_t count) \
1114{ \
1ea6dd38 1115 struct w83627ehf_data *data = dev_get_drvdata(dev); \
08c79950
RM
1116 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1117 int nr = sensor_attr->index; \
1118 u8 val = step_time_to_reg(simple_strtoul(buf, NULL, 10), \
1119 data->pwm_mode[nr]); \
1120 mutex_lock(&data->update_lock); \
1121 data->reg[nr] = val; \
1ea6dd38 1122 w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
08c79950
RM
1123 mutex_unlock(&data->update_lock); \
1124 return count; \
1125} \
1126
1127fan_time_functions(fan_stop_time, FAN_STOP_TIME)
1128
1ea6dd38
DH
1129static ssize_t show_name(struct device *dev, struct device_attribute *attr,
1130 char *buf)
1131{
1132 struct w83627ehf_data *data = dev_get_drvdata(dev);
1133
1134 return sprintf(buf, "%s\n", data->name);
1135}
1136static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
08c79950
RM
1137
1138static struct sensor_device_attribute sda_sf3_arrays_fan4[] = {
1139 SENSOR_ATTR(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1140 store_fan_stop_time, 3),
1141 SENSOR_ATTR(pwm4_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1142 store_fan_min_output, 3),
1143};
1144
1145static struct sensor_device_attribute sda_sf3_arrays[] = {
1146 SENSOR_ATTR(pwm1_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1147 store_fan_stop_time, 0),
1148 SENSOR_ATTR(pwm2_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1149 store_fan_stop_time, 1),
1150 SENSOR_ATTR(pwm3_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1151 store_fan_stop_time, 2),
1152 SENSOR_ATTR(pwm1_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1153 store_fan_min_output, 0),
1154 SENSOR_ATTR(pwm2_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1155 store_fan_min_output, 1),
1156 SENSOR_ATTR(pwm3_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1157 store_fan_min_output, 2),
1158};
1159
fc18d6c0
JD
1160static ssize_t
1161show_vid(struct device *dev, struct device_attribute *attr, char *buf)
1162{
1163 struct w83627ehf_data *data = dev_get_drvdata(dev);
1164 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1165}
1166static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
1167
08e7e278 1168/*
1ea6dd38 1169 * Driver and device management
08e7e278
JD
1170 */
1171
c18beb5b
DH
1172static void w83627ehf_device_remove_files(struct device *dev)
1173{
1174 /* some entries in the following arrays may not have been used in
1175 * device_create_file(), but device_remove_file() will ignore them */
1176 int i;
1ea6dd38 1177 struct w83627ehf_data *data = dev_get_drvdata(dev);
c18beb5b
DH
1178
1179 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
1180 device_remove_file(dev, &sda_sf3_arrays[i].dev_attr);
1181 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++)
1182 device_remove_file(dev, &sda_sf3_arrays_fan4[i].dev_attr);
1ea6dd38 1183 for (i = 0; i < data->in_num; i++) {
c18beb5b
DH
1184 device_remove_file(dev, &sda_in_input[i].dev_attr);
1185 device_remove_file(dev, &sda_in_alarm[i].dev_attr);
1186 device_remove_file(dev, &sda_in_min[i].dev_attr);
1187 device_remove_file(dev, &sda_in_max[i].dev_attr);
1188 }
1189 for (i = 0; i < 5; i++) {
1190 device_remove_file(dev, &sda_fan_input[i].dev_attr);
1191 device_remove_file(dev, &sda_fan_alarm[i].dev_attr);
1192 device_remove_file(dev, &sda_fan_div[i].dev_attr);
1193 device_remove_file(dev, &sda_fan_min[i].dev_attr);
1194 }
1195 for (i = 0; i < 4; i++) {
1196 device_remove_file(dev, &sda_pwm[i].dev_attr);
1197 device_remove_file(dev, &sda_pwm_mode[i].dev_attr);
1198 device_remove_file(dev, &sda_pwm_enable[i].dev_attr);
1199 device_remove_file(dev, &sda_target_temp[i].dev_attr);
1200 device_remove_file(dev, &sda_tolerance[i].dev_attr);
1201 }
1202 for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
1203 device_remove_file(dev, &sda_temp[i].dev_attr);
c18beb5b 1204
1ea6dd38 1205 device_remove_file(dev, &dev_attr_name);
cbe311f2 1206 device_remove_file(dev, &dev_attr_cpu0_vid);
1ea6dd38 1207}
08e7e278 1208
1ea6dd38
DH
1209/* Get the monitoring functions started */
1210static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)
08e7e278
JD
1211{
1212 int i;
da667365 1213 u8 tmp, diode;
08e7e278
JD
1214
1215 /* Start monitoring is needed */
1ea6dd38 1216 tmp = w83627ehf_read_value(data, W83627EHF_REG_CONFIG);
08e7e278 1217 if (!(tmp & 0x01))
1ea6dd38 1218 w83627ehf_write_value(data, W83627EHF_REG_CONFIG,
08e7e278
JD
1219 tmp | 0x01);
1220
1221 /* Enable temp2 and temp3 if needed */
1222 for (i = 0; i < 2; i++) {
1ea6dd38 1223 tmp = w83627ehf_read_value(data,
08e7e278
JD
1224 W83627EHF_REG_TEMP_CONFIG[i]);
1225 if (tmp & 0x01)
1ea6dd38 1226 w83627ehf_write_value(data,
08e7e278
JD
1227 W83627EHF_REG_TEMP_CONFIG[i],
1228 tmp & 0xfe);
1229 }
d3130f0e
JD
1230
1231 /* Enable VBAT monitoring if needed */
1232 tmp = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
1233 if (!(tmp & 0x01))
1234 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01);
da667365
JD
1235
1236 /* Get thermal sensor types */
1237 diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
1238 for (i = 0; i < 3; i++) {
1239 if ((tmp & (0x02 << i)))
1240 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 2;
1241 else
1242 data->temp_type[i] = 4; /* thermistor */
1243 }
08e7e278
JD
1244}
1245
1ea6dd38 1246static int __devinit w83627ehf_probe(struct platform_device *pdev)
08e7e278 1247{
1ea6dd38
DH
1248 struct device *dev = &pdev->dev;
1249 struct w83627ehf_sio_data *sio_data = dev->platform_data;
08e7e278 1250 struct w83627ehf_data *data;
1ea6dd38 1251 struct resource *res;
fc18d6c0 1252 u8 fan4pin, fan5pin, en_vrm10;
08e7e278
JD
1253 int i, err = 0;
1254
1ea6dd38
DH
1255 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1256 if (!request_region(res->start, IOREGION_LENGTH, DRVNAME)) {
08e7e278 1257 err = -EBUSY;
1ea6dd38
DH
1258 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1259 (unsigned long)res->start,
1260 (unsigned long)res->start + IOREGION_LENGTH - 1);
08e7e278
JD
1261 goto exit;
1262 }
1263
ba9c2e8d 1264 if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
08e7e278
JD
1265 err = -ENOMEM;
1266 goto exit_release;
1267 }
08e7e278 1268
1ea6dd38 1269 data->addr = res->start;
9a61bf63 1270 mutex_init(&data->lock);
9a61bf63 1271 mutex_init(&data->update_lock);
1ea6dd38
DH
1272 data->name = w83627ehf_device_names[sio_data->kind];
1273 platform_set_drvdata(pdev, data);
08e7e278 1274
1ea6dd38
DH
1275 /* 627EHG and 627EHF have 10 voltage inputs; DHG has 9 */
1276 data->in_num = (sio_data->kind == w83627dhg) ? 9 : 10;
08e7e278
JD
1277
1278 /* Initialize the chip */
1ea6dd38 1279 w83627ehf_init_device(data);
08e7e278 1280
fc18d6c0
JD
1281 data->vrm = vid_which_vrm();
1282 superio_enter(sio_data->sioreg);
fc18d6c0
JD
1283 /* Read VID value */
1284 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
58e6e781
JD
1285 if (superio_inb(sio_data->sioreg, SIO_REG_VID_CTRL) & 0x80) {
1286 /* Set VID input sensibility if needed. In theory the BIOS
1287 should have set it, but in practice it's not always the
1288 case. We only do it for the W83627EHF/EHG because the
1289 W83627DHG is more complex in this respect. */
1290 if (sio_data->kind == w83627ehf) {
1291 en_vrm10 = superio_inb(sio_data->sioreg,
1292 SIO_REG_EN_VRM10);
1293 if ((en_vrm10 & 0x08) && data->vrm == 90) {
1294 dev_warn(dev, "Setting VID input voltage to "
1295 "TTL\n");
1296 superio_outb(sio_data->sioreg, SIO_REG_EN_VRM10,
1297 en_vrm10 & ~0x08);
1298 } else if (!(en_vrm10 & 0x08) && data->vrm == 100) {
1299 dev_warn(dev, "Setting VID input voltage to "
1300 "VRM10\n");
1301 superio_outb(sio_data->sioreg, SIO_REG_EN_VRM10,
1302 en_vrm10 | 0x08);
1303 }
1304 }
1305
cbe311f2
JD
1306 data->vid = superio_inb(sio_data->sioreg, SIO_REG_VID_DATA);
1307 if (sio_data->kind == w83627ehf) /* 6 VID pins only */
1308 data->vid &= 0x3f;
1309
1310 err = device_create_file(dev, &dev_attr_cpu0_vid);
1311 if (err)
1312 goto exit_release;
58e6e781 1313 } else {
fc18d6c0
JD
1314 dev_info(dev, "VID pins in output mode, CPU VID not "
1315 "available\n");
fc18d6c0
JD
1316 }
1317
08c79950
RM
1318 /* fan4 and fan5 share some pins with the GPIO and serial flash */
1319
1ea6dd38
DH
1320 fan5pin = superio_inb(sio_data->sioreg, 0x24) & 0x2;
1321 fan4pin = superio_inb(sio_data->sioreg, 0x29) & 0x6;
1322 superio_exit(sio_data->sioreg);
08c79950 1323
08e7e278 1324 /* It looks like fan4 and fan5 pins can be alternatively used
14992c7e
RM
1325 as fan on/off switches, but fan5 control is write only :/
1326 We assume that if the serial interface is disabled, designers
1327 connected fan5 as input unless they are emitting log 1, which
1328 is not the default. */
08c79950 1329
08e7e278 1330 data->has_fan = 0x07; /* fan1, fan2 and fan3 */
1ea6dd38 1331 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
08c79950 1332 if ((i & (1 << 2)) && (!fan4pin))
08e7e278 1333 data->has_fan |= (1 << 3);
14992c7e 1334 if (!(i & (1 << 1)) && (!fan5pin))
08e7e278
JD
1335 data->has_fan |= (1 << 4);
1336
ea7be66c
MH
1337 /* Read fan clock dividers immediately */
1338 w83627ehf_update_fan_div(data);
1339
08e7e278 1340 /* Register sysfs hooks */
08c79950 1341 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
c18beb5b
DH
1342 if ((err = device_create_file(dev,
1343 &sda_sf3_arrays[i].dev_attr)))
1344 goto exit_remove;
08c79950
RM
1345
1346 /* if fan4 is enabled create the sf3 files for it */
1347 if (data->has_fan & (1 << 3))
c18beb5b
DH
1348 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) {
1349 if ((err = device_create_file(dev,
1350 &sda_sf3_arrays_fan4[i].dev_attr)))
1351 goto exit_remove;
1352 }
08c79950 1353
1ea6dd38 1354 for (i = 0; i < data->in_num; i++)
c18beb5b
DH
1355 if ((err = device_create_file(dev, &sda_in_input[i].dev_attr))
1356 || (err = device_create_file(dev,
1357 &sda_in_alarm[i].dev_attr))
1358 || (err = device_create_file(dev,
1359 &sda_in_min[i].dev_attr))
1360 || (err = device_create_file(dev,
1361 &sda_in_max[i].dev_attr)))
1362 goto exit_remove;
cf0676fe 1363
412fec82 1364 for (i = 0; i < 5; i++) {
08c79950 1365 if (data->has_fan & (1 << i)) {
c18beb5b
DH
1366 if ((err = device_create_file(dev,
1367 &sda_fan_input[i].dev_attr))
1368 || (err = device_create_file(dev,
1369 &sda_fan_alarm[i].dev_attr))
1370 || (err = device_create_file(dev,
1371 &sda_fan_div[i].dev_attr))
1372 || (err = device_create_file(dev,
1373 &sda_fan_min[i].dev_attr)))
1374 goto exit_remove;
1375 if (i < 4 && /* w83627ehf only has 4 pwm */
1376 ((err = device_create_file(dev,
1377 &sda_pwm[i].dev_attr))
1378 || (err = device_create_file(dev,
1379 &sda_pwm_mode[i].dev_attr))
1380 || (err = device_create_file(dev,
1381 &sda_pwm_enable[i].dev_attr))
1382 || (err = device_create_file(dev,
1383 &sda_target_temp[i].dev_attr))
1384 || (err = device_create_file(dev,
1385 &sda_tolerance[i].dev_attr))))
1386 goto exit_remove;
08c79950 1387 }
08e7e278 1388 }
08c79950 1389
412fec82 1390 for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
c18beb5b
DH
1391 if ((err = device_create_file(dev, &sda_temp[i].dev_attr)))
1392 goto exit_remove;
1393
1ea6dd38
DH
1394 err = device_create_file(dev, &dev_attr_name);
1395 if (err)
1396 goto exit_remove;
1397
1beeffe4
TJ
1398 data->hwmon_dev = hwmon_device_register(dev);
1399 if (IS_ERR(data->hwmon_dev)) {
1400 err = PTR_ERR(data->hwmon_dev);
c18beb5b
DH
1401 goto exit_remove;
1402 }
08e7e278
JD
1403
1404 return 0;
1405
c18beb5b
DH
1406exit_remove:
1407 w83627ehf_device_remove_files(dev);
08e7e278 1408 kfree(data);
1ea6dd38 1409 platform_set_drvdata(pdev, NULL);
08e7e278 1410exit_release:
1ea6dd38 1411 release_region(res->start, IOREGION_LENGTH);
08e7e278
JD
1412exit:
1413 return err;
1414}
1415
1ea6dd38 1416static int __devexit w83627ehf_remove(struct platform_device *pdev)
08e7e278 1417{
1ea6dd38 1418 struct w83627ehf_data *data = platform_get_drvdata(pdev);
08e7e278 1419
1beeffe4 1420 hwmon_device_unregister(data->hwmon_dev);
1ea6dd38
DH
1421 w83627ehf_device_remove_files(&pdev->dev);
1422 release_region(data->addr, IOREGION_LENGTH);
1423 platform_set_drvdata(pdev, NULL);
943b0830 1424 kfree(data);
08e7e278
JD
1425
1426 return 0;
1427}
1428
1ea6dd38 1429static struct platform_driver w83627ehf_driver = {
cdaf7934 1430 .driver = {
87218842 1431 .owner = THIS_MODULE,
1ea6dd38 1432 .name = DRVNAME,
cdaf7934 1433 },
1ea6dd38
DH
1434 .probe = w83627ehf_probe,
1435 .remove = __devexit_p(w83627ehf_remove),
08e7e278
JD
1436};
1437
1ea6dd38
DH
1438/* w83627ehf_find() looks for a '627 in the Super-I/O config space */
1439static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
1440 struct w83627ehf_sio_data *sio_data)
08e7e278 1441{
1ea6dd38
DH
1442 static const char __initdata sio_name_W83627EHF[] = "W83627EHF";
1443 static const char __initdata sio_name_W83627EHG[] = "W83627EHG";
1444 static const char __initdata sio_name_W83627DHG[] = "W83627DHG";
1445
08e7e278 1446 u16 val;
1ea6dd38 1447 const char *sio_name;
08e7e278 1448
1ea6dd38 1449 superio_enter(sioaddr);
08e7e278 1450
67b671bc
JD
1451 if (force_id)
1452 val = force_id;
1453 else
1454 val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
1455 | superio_inb(sioaddr, SIO_REG_DEVID + 1);
657c93b1 1456 switch (val & SIO_ID_MASK) {
657c93b1 1457 case SIO_W83627EHF_ID:
1ea6dd38
DH
1458 sio_data->kind = w83627ehf;
1459 sio_name = sio_name_W83627EHF;
1460 break;
657c93b1 1461 case SIO_W83627EHG_ID:
1ea6dd38
DH
1462 sio_data->kind = w83627ehf;
1463 sio_name = sio_name_W83627EHG;
1464 break;
1465 case SIO_W83627DHG_ID:
1466 sio_data->kind = w83627dhg;
1467 sio_name = sio_name_W83627DHG;
657c93b1
DH
1468 break;
1469 default:
9f66036b
JD
1470 if (val != 0xffff)
1471 pr_debug(DRVNAME ": unsupported chip ID: 0x%04x\n",
1472 val);
1ea6dd38 1473 superio_exit(sioaddr);
08e7e278
JD
1474 return -ENODEV;
1475 }
1476
1ea6dd38
DH
1477 /* We have a known chip, find the HWM I/O address */
1478 superio_select(sioaddr, W83627EHF_LD_HWM);
1479 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
1480 | superio_inb(sioaddr, SIO_REG_ADDR + 1);
1a641fce 1481 *addr = val & IOREGION_ALIGNMENT;
2d8672c5 1482 if (*addr == 0) {
475ef855
DH
1483 printk(KERN_ERR DRVNAME ": Refusing to enable a Super-I/O "
1484 "device with a base I/O port 0.\n");
1ea6dd38 1485 superio_exit(sioaddr);
08e7e278
JD
1486 return -ENODEV;
1487 }
1488
1489 /* Activate logical device if needed */
1ea6dd38 1490 val = superio_inb(sioaddr, SIO_REG_ENABLE);
475ef855
DH
1491 if (!(val & 0x01)) {
1492 printk(KERN_WARNING DRVNAME ": Forcibly enabling Super-I/O. "
1493 "Sensor is probably unusable.\n");
1ea6dd38 1494 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
475ef855 1495 }
1ea6dd38
DH
1496
1497 superio_exit(sioaddr);
1498 pr_info(DRVNAME ": Found %s chip at %#x\n", sio_name, *addr);
1499 sio_data->sioreg = sioaddr;
08e7e278 1500
08e7e278
JD
1501 return 0;
1502}
1503
1ea6dd38
DH
1504/* when Super-I/O functions move to a separate file, the Super-I/O
1505 * bus will manage the lifetime of the device and this module will only keep
1506 * track of the w83627ehf driver. But since we platform_device_alloc(), we
1507 * must keep track of the device */
1508static struct platform_device *pdev;
1509
08e7e278
JD
1510static int __init sensors_w83627ehf_init(void)
1511{
1ea6dd38
DH
1512 int err;
1513 unsigned short address;
1514 struct resource res;
1515 struct w83627ehf_sio_data sio_data;
1516
1517 /* initialize sio_data->kind and sio_data->sioreg.
1518 *
1519 * when Super-I/O functions move to a separate file, the Super-I/O
1520 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1521 * w83627ehf hardware monitor, and call probe() */
1522 if (w83627ehf_find(0x2e, &address, &sio_data) &&
1523 w83627ehf_find(0x4e, &address, &sio_data))
08e7e278
JD
1524 return -ENODEV;
1525
1ea6dd38
DH
1526 err = platform_driver_register(&w83627ehf_driver);
1527 if (err)
1528 goto exit;
1529
1530 if (!(pdev = platform_device_alloc(DRVNAME, address))) {
1531 err = -ENOMEM;
1532 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1533 goto exit_unregister;
1534 }
1535
1536 err = platform_device_add_data(pdev, &sio_data,
1537 sizeof(struct w83627ehf_sio_data));
1538 if (err) {
1539 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1540 goto exit_device_put;
1541 }
1542
1543 memset(&res, 0, sizeof(res));
1544 res.name = DRVNAME;
1545 res.start = address + IOREGION_OFFSET;
1546 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1547 res.flags = IORESOURCE_IO;
b9acb64a
JD
1548
1549 err = acpi_check_resource_conflict(&res);
1550 if (err)
18632f84 1551 goto exit_device_put;
b9acb64a 1552
1ea6dd38
DH
1553 err = platform_device_add_resources(pdev, &res, 1);
1554 if (err) {
1555 printk(KERN_ERR DRVNAME ": Device resource addition failed "
1556 "(%d)\n", err);
1557 goto exit_device_put;
1558 }
1559
1560 /* platform_device_add calls probe() */
1561 err = platform_device_add(pdev);
1562 if (err) {
1563 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1564 err);
1565 goto exit_device_put;
1566 }
1567
1568 return 0;
1569
1570exit_device_put:
1571 platform_device_put(pdev);
1572exit_unregister:
1573 platform_driver_unregister(&w83627ehf_driver);
1574exit:
1575 return err;
08e7e278
JD
1576}
1577
1578static void __exit sensors_w83627ehf_exit(void)
1579{
1ea6dd38
DH
1580 platform_device_unregister(pdev);
1581 platform_driver_unregister(&w83627ehf_driver);
08e7e278
JD
1582}
1583
1584MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
1585MODULE_DESCRIPTION("W83627EHF driver");
1586MODULE_LICENSE("GPL");
1587
1588module_init(sensors_w83627ehf_init);
1589module_exit(sensors_w83627ehf_exit);