OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [hwmon/] [f71805f.c] - Blame information for rev 78

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
3
 *             chips integrated hardware monitoring features
4
 * Copyright (C) 2005-2006  Jean Delvare <khali@linux-fr.org>
5
 *
6
 * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
7
 * complete hardware monitoring features: voltage, fan and temperature
8
 * sensors, and manual and automatic fan speed control.
9
 *
10
 * The F71872F/FG is almost the same, with two more voltages monitored,
11
 * and 6 VID inputs.
12
 *
13
 * The F71806F/FG is essentially the same as the F71872F/FG. It even has
14
 * the same chip ID, so the driver can't differentiate between.
15
 *
16
 * This program is free software; you can redistribute it and/or modify
17
 * it under the terms of the GNU General Public License as published by
18
 * the Free Software Foundation; either version 2 of the License, or
19
 * (at your option) any later version.
20
 *
21
 * This program is distributed in the hope that it will be useful,
22
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
 * GNU General Public License for more details.
25
 *
26
 * You should have received a copy of the GNU General Public License
27
 * along with this program; if not, write to the Free Software
28
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29
 */
30
 
31
#include <linux/module.h>
32
#include <linux/init.h>
33
#include <linux/slab.h>
34
#include <linux/jiffies.h>
35
#include <linux/platform_device.h>
36
#include <linux/hwmon.h>
37
#include <linux/hwmon-sysfs.h>
38
#include <linux/err.h>
39
#include <linux/mutex.h>
40
#include <linux/sysfs.h>
41
#include <linux/ioport.h>
42
#include <asm/io.h>
43
 
44
static struct platform_device *pdev;
45
 
46
#define DRVNAME "f71805f"
47
enum kinds { f71805f, f71872f };
48
 
49
/*
50
 * Super-I/O constants and functions
51
 */
52
 
53
#define F71805F_LD_HWM          0x04
54
 
55
#define SIO_REG_LDSEL           0x07    /* Logical device select */
56
#define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
57
#define SIO_REG_DEVREV          0x22    /* Device revision */
58
#define SIO_REG_MANID           0x23    /* Fintek ID (2 bytes) */
59
#define SIO_REG_FNSEL1          0x29    /* Multi Function Select 1 (F71872F) */
60
#define SIO_REG_ENABLE          0x30    /* Logical device enable */
61
#define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
62
 
63
#define SIO_FINTEK_ID           0x1934
64
#define SIO_F71805F_ID          0x0406
65
#define SIO_F71872F_ID          0x0341
66
 
67
static inline int
68
superio_inb(int base, int reg)
69
{
70
        outb(reg, base);
71
        return inb(base + 1);
72
}
73
 
74
static int
75
superio_inw(int base, int reg)
76
{
77
        int val;
78
        outb(reg++, base);
79
        val = inb(base + 1) << 8;
80
        outb(reg, base);
81
        val |= inb(base + 1);
82
        return val;
83
}
84
 
85
static inline void
86
superio_select(int base, int ld)
87
{
88
        outb(SIO_REG_LDSEL, base);
89
        outb(ld, base + 1);
90
}
91
 
92
static inline void
93
superio_enter(int base)
94
{
95
        outb(0x87, base);
96
        outb(0x87, base);
97
}
98
 
99
static inline void
100
superio_exit(int base)
101
{
102
        outb(0xaa, base);
103
}
104
 
105
/*
106
 * ISA constants
107
 */
108
 
109
#define REGION_LENGTH           8
110
#define ADDR_REG_OFFSET         5
111
#define DATA_REG_OFFSET         6
112
 
113
/*
114
 * Registers
115
 */
116
 
117
/* in nr from 0 to 10 (8-bit values) */
118
#define F71805F_REG_IN(nr)              (0x10 + (nr))
119
#define F71805F_REG_IN_HIGH(nr)         ((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
120
#define F71805F_REG_IN_LOW(nr)          ((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
121
/* fan nr from 0 to 2 (12-bit values, two registers) */
122
#define F71805F_REG_FAN(nr)             (0x20 + 2 * (nr))
123
#define F71805F_REG_FAN_LOW(nr)         (0x28 + 2 * (nr))
124
#define F71805F_REG_FAN_TARGET(nr)      (0x69 + 16 * (nr))
125
#define F71805F_REG_FAN_CTRL(nr)        (0x60 + 16 * (nr))
126
#define F71805F_REG_PWM_FREQ(nr)        (0x63 + 16 * (nr))
127
#define F71805F_REG_PWM_DUTY(nr)        (0x6B + 16 * (nr))
128
/* temp nr from 0 to 2 (8-bit values) */
129
#define F71805F_REG_TEMP(nr)            (0x1B + (nr))
130
#define F71805F_REG_TEMP_HIGH(nr)       (0x54 + 2 * (nr))
131
#define F71805F_REG_TEMP_HYST(nr)       (0x55 + 2 * (nr))
132
#define F71805F_REG_TEMP_MODE           0x01
133
/* pwm/fan pwmnr from 0 to 2, auto point apnr from 0 to 2 */
134
/* map Fintek numbers to our numbers as follows: 9->0, 5->1, 1->2 */
135
#define F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr) \
136
                                        (0xA0 + 0x10 * (pwmnr) + (2 - (apnr)))
137
#define F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr) \
138
                                        (0xA4 + 0x10 * (pwmnr) + \
139
                                                2 * (2 - (apnr)))
140
 
141
#define F71805F_REG_START               0x00
142
/* status nr from 0 to 2 */
143
#define F71805F_REG_STATUS(nr)          (0x36 + (nr))
144
 
145
/* individual register bits */
146
#define FAN_CTRL_DC_MODE                0x10
147
#define FAN_CTRL_LATCH_FULL             0x08
148
#define FAN_CTRL_MODE_MASK              0x03
149
#define FAN_CTRL_MODE_SPEED             0x00
150
#define FAN_CTRL_MODE_TEMPERATURE       0x01
151
#define FAN_CTRL_MODE_MANUAL            0x02
152
 
153
/*
154
 * Data structures and manipulation thereof
155
 */
156
 
157
struct f71805f_auto_point {
158
        u8 temp[3];
159
        u16 fan[3];
160
};
161
 
162
struct f71805f_data {
163
        unsigned short addr;
164
        const char *name;
165
        struct device *hwmon_dev;
166
 
167
        struct mutex update_lock;
168
        char valid;             /* !=0 if following fields are valid */
169
        unsigned long last_updated;     /* In jiffies */
170
        unsigned long last_limits;      /* In jiffies */
171
 
172
        /* Register values */
173
        u8 in[11];
174
        u8 in_high[11];
175
        u8 in_low[11];
176
        u16 has_in;
177
        u16 fan[3];
178
        u16 fan_low[3];
179
        u16 fan_target[3];
180
        u8 fan_ctrl[3];
181
        u8 pwm[3];
182
        u8 pwm_freq[3];
183
        u8 temp[3];
184
        u8 temp_high[3];
185
        u8 temp_hyst[3];
186
        u8 temp_mode;
187
        unsigned long alarms;
188
        struct f71805f_auto_point auto_points[3];
189
};
190
 
191
struct f71805f_sio_data {
192
        enum kinds kind;
193
        u8 fnsel1;
194
};
195
 
196
static inline long in_from_reg(u8 reg)
197
{
198
        return (reg * 8);
199
}
200
 
201
/* The 2 least significant bits are not used */
202
static inline u8 in_to_reg(long val)
203
{
204
        if (val <= 0)
205
                return 0;
206
        if (val >= 2016)
207
                return 0xfc;
208
        return (((val + 16) / 32) << 2);
209
}
210
 
211
/* in0 is downscaled by a factor 2 internally */
212
static inline long in0_from_reg(u8 reg)
213
{
214
        return (reg * 16);
215
}
216
 
217
static inline u8 in0_to_reg(long val)
218
{
219
        if (val <= 0)
220
                return 0;
221
        if (val >= 4032)
222
                return 0xfc;
223
        return (((val + 32) / 64) << 2);
224
}
225
 
226
/* The 4 most significant bits are not used */
227
static inline long fan_from_reg(u16 reg)
228
{
229
        reg &= 0xfff;
230
        if (!reg || reg == 0xfff)
231
                return 0;
232
        return (1500000 / reg);
233
}
234
 
235
static inline u16 fan_to_reg(long rpm)
236
{
237
        /* If the low limit is set below what the chip can measure,
238
           store the largest possible 12-bit value in the registers,
239
           so that no alarm will ever trigger. */
240
        if (rpm < 367)
241
                return 0xfff;
242
        return (1500000 / rpm);
243
}
244
 
245
static inline unsigned long pwm_freq_from_reg(u8 reg)
246
{
247
        unsigned long clock = (reg & 0x80) ? 48000000UL : 1000000UL;
248
 
249
        reg &= 0x7f;
250
        if (reg == 0)
251
                reg++;
252
        return clock / (reg << 8);
253
}
254
 
255
static inline u8 pwm_freq_to_reg(unsigned long val)
256
{
257
        if (val >= 187500)      /* The highest we can do */
258
                return 0x80;
259
        if (val >= 1475)        /* Use 48 MHz clock */
260
                return 0x80 | (48000000UL / (val << 8));
261
        if (val < 31)           /* The lowest we can do */
262
                return 0x7f;
263
        else                    /* Use 1 MHz clock */
264
                return 1000000UL / (val << 8);
265
}
266
 
267
static inline int pwm_mode_from_reg(u8 reg)
268
{
269
        return !(reg & FAN_CTRL_DC_MODE);
270
}
271
 
272
static inline long temp_from_reg(u8 reg)
273
{
274
        return (reg * 1000);
275
}
276
 
277
static inline u8 temp_to_reg(long val)
278
{
279
        if (val < 0)
280
                val = 0;
281
        else if (val > 1000 * 0xff)
282
                val = 0xff;
283
        return ((val + 500) / 1000);
284
}
285
 
286
/*
287
 * Device I/O access
288
 */
289
 
290
/* Must be called with data->update_lock held, except during initialization */
291
static u8 f71805f_read8(struct f71805f_data *data, u8 reg)
292
{
293
        outb(reg, data->addr + ADDR_REG_OFFSET);
294
        return inb(data->addr + DATA_REG_OFFSET);
295
}
296
 
297
/* Must be called with data->update_lock held, except during initialization */
298
static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val)
299
{
300
        outb(reg, data->addr + ADDR_REG_OFFSET);
301
        outb(val, data->addr + DATA_REG_OFFSET);
302
}
303
 
304
/* It is important to read the MSB first, because doing so latches the
305
   value of the LSB, so we are sure both bytes belong to the same value.
306
   Must be called with data->update_lock held, except during initialization */
307
static u16 f71805f_read16(struct f71805f_data *data, u8 reg)
308
{
309
        u16 val;
310
 
311
        outb(reg, data->addr + ADDR_REG_OFFSET);
312
        val = inb(data->addr + DATA_REG_OFFSET) << 8;
313
        outb(++reg, data->addr + ADDR_REG_OFFSET);
314
        val |= inb(data->addr + DATA_REG_OFFSET);
315
 
316
        return val;
317
}
318
 
319
/* Must be called with data->update_lock held, except during initialization */
320
static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val)
321
{
322
        outb(reg, data->addr + ADDR_REG_OFFSET);
323
        outb(val >> 8, data->addr + DATA_REG_OFFSET);
324
        outb(++reg, data->addr + ADDR_REG_OFFSET);
325
        outb(val & 0xff, data->addr + DATA_REG_OFFSET);
326
}
327
 
328
static struct f71805f_data *f71805f_update_device(struct device *dev)
329
{
330
        struct f71805f_data *data = dev_get_drvdata(dev);
331
        int nr, apnr;
332
 
333
        mutex_lock(&data->update_lock);
334
 
335
        /* Limit registers cache is refreshed after 60 seconds */
336
        if (time_after(jiffies, data->last_updated + 60 * HZ)
337
         || !data->valid) {
338
                for (nr = 0; nr < 11; nr++) {
339
                        if (!(data->has_in & (1 << nr)))
340
                                continue;
341
                        data->in_high[nr] = f71805f_read8(data,
342
                                            F71805F_REG_IN_HIGH(nr));
343
                        data->in_low[nr] = f71805f_read8(data,
344
                                           F71805F_REG_IN_LOW(nr));
345
                }
346
                for (nr = 0; nr < 3; nr++) {
347
                        data->fan_low[nr] = f71805f_read16(data,
348
                                            F71805F_REG_FAN_LOW(nr));
349
                        data->fan_target[nr] = f71805f_read16(data,
350
                                               F71805F_REG_FAN_TARGET(nr));
351
                        data->pwm_freq[nr] = f71805f_read8(data,
352
                                             F71805F_REG_PWM_FREQ(nr));
353
                }
354
                for (nr = 0; nr < 3; nr++) {
355
                        data->temp_high[nr] = f71805f_read8(data,
356
                                              F71805F_REG_TEMP_HIGH(nr));
357
                        data->temp_hyst[nr] = f71805f_read8(data,
358
                                              F71805F_REG_TEMP_HYST(nr));
359
                }
360
                data->temp_mode = f71805f_read8(data, F71805F_REG_TEMP_MODE);
361
                for (nr = 0; nr < 3; nr++) {
362
                        for (apnr = 0; apnr < 3; apnr++) {
363
                                data->auto_points[nr].temp[apnr] =
364
                                        f71805f_read8(data,
365
                                        F71805F_REG_PWM_AUTO_POINT_TEMP(nr,
366
                                                                        apnr));
367
                                data->auto_points[nr].fan[apnr] =
368
                                        f71805f_read16(data,
369
                                        F71805F_REG_PWM_AUTO_POINT_FAN(nr,
370
                                                                       apnr));
371
                        }
372
                }
373
 
374
                data->last_limits = jiffies;
375
        }
376
 
377
        /* Measurement registers cache is refreshed after 1 second */
378
        if (time_after(jiffies, data->last_updated + HZ)
379
         || !data->valid) {
380
                for (nr = 0; nr < 11; nr++) {
381
                        if (!(data->has_in & (1 << nr)))
382
                                continue;
383
                        data->in[nr] = f71805f_read8(data,
384
                                       F71805F_REG_IN(nr));
385
                }
386
                for (nr = 0; nr < 3; nr++) {
387
                        data->fan[nr] = f71805f_read16(data,
388
                                        F71805F_REG_FAN(nr));
389
                        data->fan_ctrl[nr] = f71805f_read8(data,
390
                                             F71805F_REG_FAN_CTRL(nr));
391
                        data->pwm[nr] = f71805f_read8(data,
392
                                        F71805F_REG_PWM_DUTY(nr));
393
                }
394
                for (nr = 0; nr < 3; nr++) {
395
                        data->temp[nr] = f71805f_read8(data,
396
                                         F71805F_REG_TEMP(nr));
397
                }
398
                data->alarms = f71805f_read8(data, F71805F_REG_STATUS(0))
399
                        + (f71805f_read8(data, F71805F_REG_STATUS(1)) << 8)
400
                        + (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16);
401
 
402
                data->last_updated = jiffies;
403
                data->valid = 1;
404
        }
405
 
406
        mutex_unlock(&data->update_lock);
407
 
408
        return data;
409
}
410
 
411
/*
412
 * Sysfs interface
413
 */
414
 
415
static ssize_t show_in0(struct device *dev, struct device_attribute *devattr,
416
                        char *buf)
417
{
418
        struct f71805f_data *data = f71805f_update_device(dev);
419
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
420
        int nr = attr->index;
421
 
422
        return sprintf(buf, "%ld\n", in0_from_reg(data->in[nr]));
423
}
424
 
425
static ssize_t show_in0_max(struct device *dev, struct device_attribute
426
                            *devattr, char *buf)
427
{
428
        struct f71805f_data *data = f71805f_update_device(dev);
429
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
430
        int nr = attr->index;
431
 
432
        return sprintf(buf, "%ld\n", in0_from_reg(data->in_high[nr]));
433
}
434
 
435
static ssize_t show_in0_min(struct device *dev, struct device_attribute
436
                            *devattr, char *buf)
437
{
438
        struct f71805f_data *data = f71805f_update_device(dev);
439
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
440
        int nr = attr->index;
441
 
442
        return sprintf(buf, "%ld\n", in0_from_reg(data->in_low[nr]));
443
}
444
 
445
static ssize_t set_in0_max(struct device *dev, struct device_attribute
446
                           *devattr, const char *buf, size_t count)
447
{
448
        struct f71805f_data *data = dev_get_drvdata(dev);
449
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
450
        int nr = attr->index;
451
        long val = simple_strtol(buf, NULL, 10);
452
 
453
        mutex_lock(&data->update_lock);
454
        data->in_high[nr] = in0_to_reg(val);
455
        f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
456
        mutex_unlock(&data->update_lock);
457
 
458
        return count;
459
}
460
 
461
static ssize_t set_in0_min(struct device *dev, struct device_attribute
462
                           *devattr, const char *buf, size_t count)
463
{
464
        struct f71805f_data *data = dev_get_drvdata(dev);
465
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
466
        int nr = attr->index;
467
        long val = simple_strtol(buf, NULL, 10);
468
 
469
        mutex_lock(&data->update_lock);
470
        data->in_low[nr] = in0_to_reg(val);
471
        f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
472
        mutex_unlock(&data->update_lock);
473
 
474
        return count;
475
}
476
 
477
static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
478
                       char *buf)
479
{
480
        struct f71805f_data *data = f71805f_update_device(dev);
481
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
482
        int nr = attr->index;
483
 
484
        return sprintf(buf, "%ld\n", in_from_reg(data->in[nr]));
485
}
486
 
487
static ssize_t show_in_max(struct device *dev, struct device_attribute
488
                           *devattr, char *buf)
489
{
490
        struct f71805f_data *data = f71805f_update_device(dev);
491
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
492
        int nr = attr->index;
493
 
494
        return sprintf(buf, "%ld\n", in_from_reg(data->in_high[nr]));
495
}
496
 
497
static ssize_t show_in_min(struct device *dev, struct device_attribute
498
                           *devattr, char *buf)
499
{
500
        struct f71805f_data *data = f71805f_update_device(dev);
501
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
502
        int nr = attr->index;
503
 
504
        return sprintf(buf, "%ld\n", in_from_reg(data->in_low[nr]));
505
}
506
 
507
static ssize_t set_in_max(struct device *dev, struct device_attribute
508
                          *devattr, const char *buf, size_t count)
509
{
510
        struct f71805f_data *data = dev_get_drvdata(dev);
511
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
512
        int nr = attr->index;
513
        long val = simple_strtol(buf, NULL, 10);
514
 
515
        mutex_lock(&data->update_lock);
516
        data->in_high[nr] = in_to_reg(val);
517
        f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
518
        mutex_unlock(&data->update_lock);
519
 
520
        return count;
521
}
522
 
523
static ssize_t set_in_min(struct device *dev, struct device_attribute
524
                          *devattr, const char *buf, size_t count)
525
{
526
        struct f71805f_data *data = dev_get_drvdata(dev);
527
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
528
        int nr = attr->index;
529
        long val = simple_strtol(buf, NULL, 10);
530
 
531
        mutex_lock(&data->update_lock);
532
        data->in_low[nr] = in_to_reg(val);
533
        f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
534
        mutex_unlock(&data->update_lock);
535
 
536
        return count;
537
}
538
 
539
static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
540
                        char *buf)
541
{
542
        struct f71805f_data *data = f71805f_update_device(dev);
543
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
544
        int nr = attr->index;
545
 
546
        return sprintf(buf, "%ld\n", fan_from_reg(data->fan[nr]));
547
}
548
 
549
static ssize_t show_fan_min(struct device *dev, struct device_attribute
550
                            *devattr, char *buf)
551
{
552
        struct f71805f_data *data = f71805f_update_device(dev);
553
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
554
        int nr = attr->index;
555
 
556
        return sprintf(buf, "%ld\n", fan_from_reg(data->fan_low[nr]));
557
}
558
 
559
static ssize_t show_fan_target(struct device *dev, struct device_attribute
560
                               *devattr, char *buf)
561
{
562
        struct f71805f_data *data = f71805f_update_device(dev);
563
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
564
        int nr = attr->index;
565
 
566
        return sprintf(buf, "%ld\n", fan_from_reg(data->fan_target[nr]));
567
}
568
 
569
static ssize_t set_fan_min(struct device *dev, struct device_attribute
570
                           *devattr, const char *buf, size_t count)
571
{
572
        struct f71805f_data *data = dev_get_drvdata(dev);
573
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
574
        int nr = attr->index;
575
        long val = simple_strtol(buf, NULL, 10);
576
 
577
        mutex_lock(&data->update_lock);
578
        data->fan_low[nr] = fan_to_reg(val);
579
        f71805f_write16(data, F71805F_REG_FAN_LOW(nr), data->fan_low[nr]);
580
        mutex_unlock(&data->update_lock);
581
 
582
        return count;
583
}
584
 
585
static ssize_t set_fan_target(struct device *dev, struct device_attribute
586
                              *devattr, const char *buf, size_t count)
587
{
588
        struct f71805f_data *data = dev_get_drvdata(dev);
589
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
590
        int nr = attr->index;
591
        long val = simple_strtol(buf, NULL, 10);
592
 
593
        mutex_lock(&data->update_lock);
594
        data->fan_target[nr] = fan_to_reg(val);
595
        f71805f_write16(data, F71805F_REG_FAN_TARGET(nr),
596
                        data->fan_target[nr]);
597
        mutex_unlock(&data->update_lock);
598
 
599
        return count;
600
}
601
 
602
static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
603
                        char *buf)
604
{
605
        struct f71805f_data *data = f71805f_update_device(dev);
606
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
607
        int nr = attr->index;
608
 
609
        return sprintf(buf, "%d\n", (int)data->pwm[nr]);
610
}
611
 
612
static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
613
                               *devattr, char *buf)
614
{
615
        struct f71805f_data *data = f71805f_update_device(dev);
616
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
617
        int nr = attr->index;
618
        int mode;
619
 
620
        switch (data->fan_ctrl[nr] & FAN_CTRL_MODE_MASK) {
621
        case FAN_CTRL_MODE_SPEED:
622
                mode = 3;
623
                break;
624
        case FAN_CTRL_MODE_TEMPERATURE:
625
                mode = 2;
626
                break;
627
        default: /* MANUAL */
628
                mode = 1;
629
        }
630
 
631
        return sprintf(buf, "%d\n", mode);
632
}
633
 
634
static ssize_t show_pwm_freq(struct device *dev, struct device_attribute
635
                             *devattr, char *buf)
636
{
637
        struct f71805f_data *data = f71805f_update_device(dev);
638
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
639
        int nr = attr->index;
640
 
641
        return sprintf(buf, "%lu\n", pwm_freq_from_reg(data->pwm_freq[nr]));
642
}
643
 
644
static ssize_t show_pwm_mode(struct device *dev, struct device_attribute
645
                             *devattr, char *buf)
646
{
647
        struct f71805f_data *data = f71805f_update_device(dev);
648
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
649
        int nr = attr->index;
650
 
651
        return sprintf(buf, "%d\n", pwm_mode_from_reg(data->fan_ctrl[nr]));
652
}
653
 
654
static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
655
                       const char *buf, size_t count)
656
{
657
        struct f71805f_data *data = dev_get_drvdata(dev);
658
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
659
        int nr = attr->index;
660
        unsigned long val = simple_strtoul(buf, NULL, 10);
661
 
662
        if (val > 255)
663
                return -EINVAL;
664
 
665
        mutex_lock(&data->update_lock);
666
        data->pwm[nr] = val;
667
        f71805f_write8(data, F71805F_REG_PWM_DUTY(nr), data->pwm[nr]);
668
        mutex_unlock(&data->update_lock);
669
 
670
        return count;
671
}
672
 
673
static struct attribute *f71805f_attr_pwm[];
674
 
675
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
676
                              *devattr, const char *buf, size_t count)
677
{
678
        struct f71805f_data *data = dev_get_drvdata(dev);
679
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
680
        int nr = attr->index;
681
        unsigned long val = simple_strtoul(buf, NULL, 10);
682
        u8 reg;
683
 
684
        if (val < 1 || val > 3)
685
                return -EINVAL;
686
 
687
        if (val > 1) { /* Automatic mode, user can't set PWM value */
688
                if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
689
                                     S_IRUGO))
690
                        dev_dbg(dev, "chmod -w pwm%d failed\n", nr + 1);
691
        }
692
 
693
        mutex_lock(&data->update_lock);
694
        reg = f71805f_read8(data, F71805F_REG_FAN_CTRL(nr))
695
            & ~FAN_CTRL_MODE_MASK;
696
        switch (val) {
697
        case 1:
698
                reg |= FAN_CTRL_MODE_MANUAL;
699
                break;
700
        case 2:
701
                reg |= FAN_CTRL_MODE_TEMPERATURE;
702
                break;
703
        case 3:
704
                reg |= FAN_CTRL_MODE_SPEED;
705
                break;
706
        }
707
        data->fan_ctrl[nr] = reg;
708
        f71805f_write8(data, F71805F_REG_FAN_CTRL(nr), reg);
709
        mutex_unlock(&data->update_lock);
710
 
711
        if (val == 1) { /* Manual mode, user can set PWM value */
712
                if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
713
                                     S_IRUGO | S_IWUSR))
714
                        dev_dbg(dev, "chmod +w pwm%d failed\n", nr + 1);
715
        }
716
 
717
        return count;
718
}
719
 
720
static ssize_t set_pwm_freq(struct device *dev, struct device_attribute
721
                            *devattr, const char *buf, size_t count)
722
{
723
        struct f71805f_data *data = dev_get_drvdata(dev);
724
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
725
        int nr = attr->index;
726
        unsigned long val = simple_strtoul(buf, NULL, 10);
727
 
728
        mutex_lock(&data->update_lock);
729
        data->pwm_freq[nr] = pwm_freq_to_reg(val);
730
        f71805f_write8(data, F71805F_REG_PWM_FREQ(nr), data->pwm_freq[nr]);
731
        mutex_unlock(&data->update_lock);
732
 
733
        return count;
734
}
735
 
736
static ssize_t show_pwm_auto_point_temp(struct device *dev,
737
                                        struct device_attribute *devattr,
738
                                        char* buf)
739
{
740
        struct f71805f_data *data = dev_get_drvdata(dev);
741
        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
742
        int pwmnr = attr->nr;
743
        int apnr = attr->index;
744
 
745
        return sprintf(buf, "%ld\n",
746
                       temp_from_reg(data->auto_points[pwmnr].temp[apnr]));
747
}
748
 
749
static ssize_t set_pwm_auto_point_temp(struct device *dev,
750
                                       struct device_attribute *devattr,
751
                                       const char* buf, size_t count)
752
{
753
        struct f71805f_data *data = dev_get_drvdata(dev);
754
        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
755
        int pwmnr = attr->nr;
756
        int apnr = attr->index;
757
        unsigned long val = simple_strtol(buf, NULL, 10);
758
 
759
        mutex_lock(&data->update_lock);
760
        data->auto_points[pwmnr].temp[apnr] = temp_to_reg(val);
761
        f71805f_write8(data, F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr),
762
                       data->auto_points[pwmnr].temp[apnr]);
763
        mutex_unlock(&data->update_lock);
764
 
765
        return count;
766
}
767
 
768
static ssize_t show_pwm_auto_point_fan(struct device *dev,
769
                                       struct device_attribute *devattr,
770
                                       char* buf)
771
{
772
        struct f71805f_data *data = dev_get_drvdata(dev);
773
        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
774
        int pwmnr = attr->nr;
775
        int apnr = attr->index;
776
 
777
        return sprintf(buf, "%ld\n",
778
                       fan_from_reg(data->auto_points[pwmnr].fan[apnr]));
779
}
780
 
781
static ssize_t set_pwm_auto_point_fan(struct device *dev,
782
                                      struct device_attribute *devattr,
783
                                      const char* buf, size_t count)
784
{
785
        struct f71805f_data *data = dev_get_drvdata(dev);
786
        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
787
        int pwmnr = attr->nr;
788
        int apnr = attr->index;
789
        unsigned long val = simple_strtoul(buf, NULL, 10);
790
 
791
        mutex_lock(&data->update_lock);
792
        data->auto_points[pwmnr].fan[apnr] = fan_to_reg(val);
793
        f71805f_write16(data, F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr),
794
                        data->auto_points[pwmnr].fan[apnr]);
795
        mutex_unlock(&data->update_lock);
796
 
797
        return count;
798
}
799
 
800
static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
801
                         char *buf)
802
{
803
        struct f71805f_data *data = f71805f_update_device(dev);
804
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
805
        int nr = attr->index;
806
 
807
        return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
808
}
809
 
810
static ssize_t show_temp_max(struct device *dev, struct device_attribute
811
                             *devattr, char *buf)
812
{
813
        struct f71805f_data *data = f71805f_update_device(dev);
814
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
815
        int nr = attr->index;
816
 
817
        return sprintf(buf, "%ld\n", temp_from_reg(data->temp_high[nr]));
818
}
819
 
820
static ssize_t show_temp_hyst(struct device *dev, struct device_attribute
821
                              *devattr, char *buf)
822
{
823
        struct f71805f_data *data = f71805f_update_device(dev);
824
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
825
        int nr = attr->index;
826
 
827
        return sprintf(buf, "%ld\n", temp_from_reg(data->temp_hyst[nr]));
828
}
829
 
830
static ssize_t show_temp_type(struct device *dev, struct device_attribute
831
                              *devattr, char *buf)
832
{
833
        struct f71805f_data *data = f71805f_update_device(dev);
834
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
835
        int nr = attr->index;
836
 
837
        /* 3 is diode, 4 is thermistor */
838
        return sprintf(buf, "%u\n", (data->temp_mode & (1 << nr)) ? 3 : 4);
839
}
840
 
841
static ssize_t set_temp_max(struct device *dev, struct device_attribute
842
                            *devattr, const char *buf, size_t count)
843
{
844
        struct f71805f_data *data = dev_get_drvdata(dev);
845
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
846
        int nr = attr->index;
847
        long val = simple_strtol(buf, NULL, 10);
848
 
849
        mutex_lock(&data->update_lock);
850
        data->temp_high[nr] = temp_to_reg(val);
851
        f71805f_write8(data, F71805F_REG_TEMP_HIGH(nr), data->temp_high[nr]);
852
        mutex_unlock(&data->update_lock);
853
 
854
        return count;
855
}
856
 
857
static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
858
                             *devattr, const char *buf, size_t count)
859
{
860
        struct f71805f_data *data = dev_get_drvdata(dev);
861
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
862
        int nr = attr->index;
863
        long val = simple_strtol(buf, NULL, 10);
864
 
865
        mutex_lock(&data->update_lock);
866
        data->temp_hyst[nr] = temp_to_reg(val);
867
        f71805f_write8(data, F71805F_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
868
        mutex_unlock(&data->update_lock);
869
 
870
        return count;
871
}
872
 
873
static ssize_t show_alarms_in(struct device *dev, struct device_attribute
874
                              *devattr, char *buf)
875
{
876
        struct f71805f_data *data = f71805f_update_device(dev);
877
 
878
        return sprintf(buf, "%lu\n", data->alarms & 0x7ff);
879
}
880
 
881
static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
882
                               *devattr, char *buf)
883
{
884
        struct f71805f_data *data = f71805f_update_device(dev);
885
 
886
        return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07);
887
}
888
 
889
static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
890
                                *devattr, char *buf)
891
{
892
        struct f71805f_data *data = f71805f_update_device(dev);
893
 
894
        return sprintf(buf, "%lu\n", (data->alarms >> 11) & 0x07);
895
}
896
 
897
static ssize_t show_alarm(struct device *dev, struct device_attribute
898
                          *devattr, char *buf)
899
{
900
        struct f71805f_data *data = f71805f_update_device(dev);
901
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
902
        int bitnr = attr->index;
903
 
904
        return sprintf(buf, "%lu\n", (data->alarms >> bitnr) & 1);
905
}
906
 
907
static ssize_t show_name(struct device *dev, struct device_attribute
908
                         *devattr, char *buf)
909
{
910
        struct f71805f_data *data = dev_get_drvdata(dev);
911
 
912
        return sprintf(buf, "%s\n", data->name);
913
}
914
 
915
static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL, 0);
916
static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR,
917
                          show_in0_max, set_in0_max, 0);
918
static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR,
919
                          show_in0_min, set_in0_min, 0);
920
static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
921
static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR,
922
                          show_in_max, set_in_max, 1);
923
static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR,
924
                          show_in_min, set_in_min, 1);
925
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
926
static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
927
                          show_in_max, set_in_max, 2);
928
static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
929
                          show_in_min, set_in_min, 2);
930
static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
931
static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
932
                          show_in_max, set_in_max, 3);
933
static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
934
                          show_in_min, set_in_min, 3);
935
static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
936
static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
937
                          show_in_max, set_in_max, 4);
938
static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
939
                          show_in_min, set_in_min, 4);
940
static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
941
static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR,
942
                          show_in_max, set_in_max, 5);
943
static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR,
944
                          show_in_min, set_in_min, 5);
945
static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
946
static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR,
947
                          show_in_max, set_in_max, 6);
948
static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR,
949
                          show_in_min, set_in_min, 6);
950
static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
951
static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR,
952
                          show_in_max, set_in_max, 7);
953
static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR,
954
                          show_in_min, set_in_min, 7);
955
static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
956
static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR,
957
                          show_in_max, set_in_max, 8);
958
static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR,
959
                          show_in_min, set_in_min, 8);
960
static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_in0, NULL, 9);
961
static SENSOR_DEVICE_ATTR(in9_max, S_IRUGO | S_IWUSR,
962
                          show_in0_max, set_in0_max, 9);
963
static SENSOR_DEVICE_ATTR(in9_min, S_IRUGO | S_IWUSR,
964
                          show_in0_min, set_in0_min, 9);
965
static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_in0, NULL, 10);
966
static SENSOR_DEVICE_ATTR(in10_max, S_IRUGO | S_IWUSR,
967
                          show_in0_max, set_in0_max, 10);
968
static SENSOR_DEVICE_ATTR(in10_min, S_IRUGO | S_IWUSR,
969
                          show_in0_min, set_in0_min, 10);
970
 
971
static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
972
static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
973
                          show_fan_min, set_fan_min, 0);
974
static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR,
975
                          show_fan_target, set_fan_target, 0);
976
static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
977
static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
978
                          show_fan_min, set_fan_min, 1);
979
static SENSOR_DEVICE_ATTR(fan2_target, S_IRUGO | S_IWUSR,
980
                          show_fan_target, set_fan_target, 1);
981
static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
982
static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
983
                          show_fan_min, set_fan_min, 2);
984
static SENSOR_DEVICE_ATTR(fan3_target, S_IRUGO | S_IWUSR,
985
                          show_fan_target, set_fan_target, 2);
986
 
987
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
988
static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
989
                    show_temp_max, set_temp_max, 0);
990
static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
991
                    show_temp_hyst, set_temp_hyst, 0);
992
static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
993
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
994
static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
995
                    show_temp_max, set_temp_max, 1);
996
static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
997
                    show_temp_hyst, set_temp_hyst, 1);
998
static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
999
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
1000
static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
1001
                    show_temp_max, set_temp_max, 2);
1002
static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
1003
                    show_temp_hyst, set_temp_hyst, 2);
1004
static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
1005
 
1006
/* pwm (value) files are created read-only, write permission is
1007
   then added or removed dynamically as needed */
1008
static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, show_pwm, set_pwm, 0);
1009
static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
1010
                          show_pwm_enable, set_pwm_enable, 0);
1011
static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR,
1012
                          show_pwm_freq, set_pwm_freq, 0);
1013
static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0);
1014
static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO, show_pwm, set_pwm, 1);
1015
static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
1016
                          show_pwm_enable, set_pwm_enable, 1);
1017
static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO | S_IWUSR,
1018
                          show_pwm_freq, set_pwm_freq, 1);
1019
static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO, show_pwm_mode, NULL, 1);
1020
static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO, show_pwm, set_pwm, 2);
1021
static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
1022
                          show_pwm_enable, set_pwm_enable, 2);
1023
static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO | S_IWUSR,
1024
                          show_pwm_freq, set_pwm_freq, 2);
1025
static SENSOR_DEVICE_ATTR(pwm3_mode, S_IRUGO, show_pwm_mode, NULL, 2);
1026
 
1027
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp, S_IRUGO | S_IWUSR,
1028
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1029
                            0, 0);
1030
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_fan, S_IRUGO | S_IWUSR,
1031
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1032
                            0, 0);
1033
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp, S_IRUGO | S_IWUSR,
1034
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1035
                            0, 1);
1036
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_fan, S_IRUGO | S_IWUSR,
1037
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1038
                            0, 1);
1039
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR,
1040
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1041
                            0, 2);
1042
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_fan, S_IRUGO | S_IWUSR,
1043
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1044
                            0, 2);
1045
 
1046
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp, S_IRUGO | S_IWUSR,
1047
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1048
                            1, 0);
1049
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_fan, S_IRUGO | S_IWUSR,
1050
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1051
                            1, 0);
1052
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp, S_IRUGO | S_IWUSR,
1053
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1054
                            1, 1);
1055
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_fan, S_IRUGO | S_IWUSR,
1056
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1057
                            1, 1);
1058
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR,
1059
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1060
                            1, 2);
1061
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_fan, S_IRUGO | S_IWUSR,
1062
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1063
                            1, 2);
1064
 
1065
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp, S_IRUGO | S_IWUSR,
1066
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1067
                            2, 0);
1068
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_fan, S_IRUGO | S_IWUSR,
1069
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1070
                            2, 0);
1071
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp, S_IRUGO | S_IWUSR,
1072
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1073
                            2, 1);
1074
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_fan, S_IRUGO | S_IWUSR,
1075
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1076
                            2, 1);
1077
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR,
1078
                            show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1079
                            2, 2);
1080
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_fan, S_IRUGO | S_IWUSR,
1081
                            show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1082
                            2, 2);
1083
 
1084
static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
1085
static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
1086
static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
1087
static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
1088
static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4);
1089
static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5);
1090
static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
1091
static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
1092
static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8);
1093
static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9);
1094
static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10);
1095
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11);
1096
static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12);
1097
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
1098
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
1099
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
1100
static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
1101
static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
1102
static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
1103
static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
1104
 
1105
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
1106
 
1107
static struct attribute *f71805f_attributes[] = {
1108
        &sensor_dev_attr_in0_input.dev_attr.attr,
1109
        &sensor_dev_attr_in0_max.dev_attr.attr,
1110
        &sensor_dev_attr_in0_min.dev_attr.attr,
1111
        &sensor_dev_attr_in1_input.dev_attr.attr,
1112
        &sensor_dev_attr_in1_max.dev_attr.attr,
1113
        &sensor_dev_attr_in1_min.dev_attr.attr,
1114
        &sensor_dev_attr_in2_input.dev_attr.attr,
1115
        &sensor_dev_attr_in2_max.dev_attr.attr,
1116
        &sensor_dev_attr_in2_min.dev_attr.attr,
1117
        &sensor_dev_attr_in3_input.dev_attr.attr,
1118
        &sensor_dev_attr_in3_max.dev_attr.attr,
1119
        &sensor_dev_attr_in3_min.dev_attr.attr,
1120
        &sensor_dev_attr_in5_input.dev_attr.attr,
1121
        &sensor_dev_attr_in5_max.dev_attr.attr,
1122
        &sensor_dev_attr_in5_min.dev_attr.attr,
1123
        &sensor_dev_attr_in6_input.dev_attr.attr,
1124
        &sensor_dev_attr_in6_max.dev_attr.attr,
1125
        &sensor_dev_attr_in6_min.dev_attr.attr,
1126
        &sensor_dev_attr_in7_input.dev_attr.attr,
1127
        &sensor_dev_attr_in7_max.dev_attr.attr,
1128
        &sensor_dev_attr_in7_min.dev_attr.attr,
1129
 
1130
        &sensor_dev_attr_fan1_input.dev_attr.attr,
1131
        &sensor_dev_attr_fan1_min.dev_attr.attr,
1132
        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
1133
        &sensor_dev_attr_fan1_target.dev_attr.attr,
1134
        &sensor_dev_attr_fan2_input.dev_attr.attr,
1135
        &sensor_dev_attr_fan2_min.dev_attr.attr,
1136
        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
1137
        &sensor_dev_attr_fan2_target.dev_attr.attr,
1138
        &sensor_dev_attr_fan3_input.dev_attr.attr,
1139
        &sensor_dev_attr_fan3_min.dev_attr.attr,
1140
        &sensor_dev_attr_fan3_alarm.dev_attr.attr,
1141
        &sensor_dev_attr_fan3_target.dev_attr.attr,
1142
 
1143
        &sensor_dev_attr_pwm1.dev_attr.attr,
1144
        &sensor_dev_attr_pwm1_enable.dev_attr.attr,
1145
        &sensor_dev_attr_pwm1_mode.dev_attr.attr,
1146
        &sensor_dev_attr_pwm2.dev_attr.attr,
1147
        &sensor_dev_attr_pwm2_enable.dev_attr.attr,
1148
        &sensor_dev_attr_pwm2_mode.dev_attr.attr,
1149
        &sensor_dev_attr_pwm3.dev_attr.attr,
1150
        &sensor_dev_attr_pwm3_enable.dev_attr.attr,
1151
        &sensor_dev_attr_pwm3_mode.dev_attr.attr,
1152
 
1153
        &sensor_dev_attr_temp1_input.dev_attr.attr,
1154
        &sensor_dev_attr_temp1_max.dev_attr.attr,
1155
        &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1156
        &sensor_dev_attr_temp1_type.dev_attr.attr,
1157
        &sensor_dev_attr_temp2_input.dev_attr.attr,
1158
        &sensor_dev_attr_temp2_max.dev_attr.attr,
1159
        &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1160
        &sensor_dev_attr_temp2_type.dev_attr.attr,
1161
        &sensor_dev_attr_temp3_input.dev_attr.attr,
1162
        &sensor_dev_attr_temp3_max.dev_attr.attr,
1163
        &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1164
        &sensor_dev_attr_temp3_type.dev_attr.attr,
1165
 
1166
        &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
1167
        &sensor_dev_attr_pwm1_auto_point1_fan.dev_attr.attr,
1168
        &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
1169
        &sensor_dev_attr_pwm1_auto_point2_fan.dev_attr.attr,
1170
        &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
1171
        &sensor_dev_attr_pwm1_auto_point3_fan.dev_attr.attr,
1172
        &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
1173
        &sensor_dev_attr_pwm2_auto_point1_fan.dev_attr.attr,
1174
        &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
1175
        &sensor_dev_attr_pwm2_auto_point2_fan.dev_attr.attr,
1176
        &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
1177
        &sensor_dev_attr_pwm2_auto_point3_fan.dev_attr.attr,
1178
        &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
1179
        &sensor_dev_attr_pwm3_auto_point1_fan.dev_attr.attr,
1180
        &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
1181
        &sensor_dev_attr_pwm3_auto_point2_fan.dev_attr.attr,
1182
        &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
1183
        &sensor_dev_attr_pwm3_auto_point3_fan.dev_attr.attr,
1184
 
1185
        &sensor_dev_attr_in0_alarm.dev_attr.attr,
1186
        &sensor_dev_attr_in1_alarm.dev_attr.attr,
1187
        &sensor_dev_attr_in2_alarm.dev_attr.attr,
1188
        &sensor_dev_attr_in3_alarm.dev_attr.attr,
1189
        &sensor_dev_attr_in5_alarm.dev_attr.attr,
1190
        &sensor_dev_attr_in6_alarm.dev_attr.attr,
1191
        &sensor_dev_attr_in7_alarm.dev_attr.attr,
1192
        &dev_attr_alarms_in.attr,
1193
        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
1194
        &sensor_dev_attr_temp2_alarm.dev_attr.attr,
1195
        &sensor_dev_attr_temp3_alarm.dev_attr.attr,
1196
        &dev_attr_alarms_temp.attr,
1197
        &dev_attr_alarms_fan.attr,
1198
 
1199
        &dev_attr_name.attr,
1200
        NULL
1201
};
1202
 
1203
static const struct attribute_group f71805f_group = {
1204
        .attrs = f71805f_attributes,
1205
};
1206
 
1207
static struct attribute *f71805f_attributes_optin[4][5] = {
1208
        {
1209
                &sensor_dev_attr_in4_input.dev_attr.attr,
1210
                &sensor_dev_attr_in4_max.dev_attr.attr,
1211
                &sensor_dev_attr_in4_min.dev_attr.attr,
1212
                &sensor_dev_attr_in4_alarm.dev_attr.attr,
1213
                NULL
1214
        }, {
1215
                &sensor_dev_attr_in8_input.dev_attr.attr,
1216
                &sensor_dev_attr_in8_max.dev_attr.attr,
1217
                &sensor_dev_attr_in8_min.dev_attr.attr,
1218
                &sensor_dev_attr_in8_alarm.dev_attr.attr,
1219
                NULL
1220
        }, {
1221
                &sensor_dev_attr_in9_input.dev_attr.attr,
1222
                &sensor_dev_attr_in9_max.dev_attr.attr,
1223
                &sensor_dev_attr_in9_min.dev_attr.attr,
1224
                &sensor_dev_attr_in9_alarm.dev_attr.attr,
1225
                NULL
1226
        }, {
1227
                &sensor_dev_attr_in10_input.dev_attr.attr,
1228
                &sensor_dev_attr_in10_max.dev_attr.attr,
1229
                &sensor_dev_attr_in10_min.dev_attr.attr,
1230
                &sensor_dev_attr_in10_alarm.dev_attr.attr,
1231
                NULL
1232
        }
1233
};
1234
 
1235
static const struct attribute_group f71805f_group_optin[4] = {
1236
        { .attrs = f71805f_attributes_optin[0] },
1237
        { .attrs = f71805f_attributes_optin[1] },
1238
        { .attrs = f71805f_attributes_optin[2] },
1239
        { .attrs = f71805f_attributes_optin[3] },
1240
};
1241
 
1242
/* We don't include pwm_freq files in the arrays above, because they must be
1243
   created conditionally (only if pwm_mode is 1 == PWM) */
1244
static struct attribute *f71805f_attributes_pwm_freq[] = {
1245
        &sensor_dev_attr_pwm1_freq.dev_attr.attr,
1246
        &sensor_dev_attr_pwm2_freq.dev_attr.attr,
1247
        &sensor_dev_attr_pwm3_freq.dev_attr.attr,
1248
        NULL
1249
};
1250
 
1251
static const struct attribute_group f71805f_group_pwm_freq = {
1252
        .attrs = f71805f_attributes_pwm_freq,
1253
};
1254
 
1255
/* We also need an indexed access to pwmN files to toggle writability */
1256
static struct attribute *f71805f_attr_pwm[] = {
1257
        &sensor_dev_attr_pwm1.dev_attr.attr,
1258
        &sensor_dev_attr_pwm2.dev_attr.attr,
1259
        &sensor_dev_attr_pwm3.dev_attr.attr,
1260
};
1261
 
1262
/*
1263
 * Device registration and initialization
1264
 */
1265
 
1266
static void __devinit f71805f_init_device(struct f71805f_data *data)
1267
{
1268
        u8 reg;
1269
        int i;
1270
 
1271
        reg = f71805f_read8(data, F71805F_REG_START);
1272
        if ((reg & 0x41) != 0x01) {
1273
                printk(KERN_DEBUG DRVNAME ": Starting monitoring "
1274
                       "operations\n");
1275
                f71805f_write8(data, F71805F_REG_START, (reg | 0x01) & ~0x40);
1276
        }
1277
 
1278
        /* Fan monitoring can be disabled. If it is, we won't be polling
1279
           the register values, and won't create the related sysfs files. */
1280
        for (i = 0; i < 3; i++) {
1281
                data->fan_ctrl[i] = f71805f_read8(data,
1282
                                                  F71805F_REG_FAN_CTRL(i));
1283
                /* Clear latch full bit, else "speed mode" fan speed control
1284
                   doesn't work */
1285
                if (data->fan_ctrl[i] & FAN_CTRL_LATCH_FULL) {
1286
                        data->fan_ctrl[i] &= ~FAN_CTRL_LATCH_FULL;
1287
                        f71805f_write8(data, F71805F_REG_FAN_CTRL(i),
1288
                                       data->fan_ctrl[i]);
1289
                }
1290
        }
1291
}
1292
 
1293
static int __devinit f71805f_probe(struct platform_device *pdev)
1294
{
1295
        struct f71805f_sio_data *sio_data = pdev->dev.platform_data;
1296
        struct f71805f_data *data;
1297
        struct resource *res;
1298
        int i, err;
1299
 
1300
        static const char *names[] = {
1301
                "f71805f",
1302
                "f71872f",
1303
        };
1304
 
1305
        if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) {
1306
                err = -ENOMEM;
1307
                printk(KERN_ERR DRVNAME ": Out of memory\n");
1308
                goto exit;
1309
        }
1310
 
1311
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1312
        if (!request_region(res->start + ADDR_REG_OFFSET, 2, DRVNAME)) {
1313
                err = -EBUSY;
1314
                dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
1315
                        (unsigned long)(res->start + ADDR_REG_OFFSET),
1316
                        (unsigned long)(res->start + ADDR_REG_OFFSET + 1));
1317
                goto exit_free;
1318
        }
1319
        data->addr = res->start;
1320
        data->name = names[sio_data->kind];
1321
        mutex_init(&data->update_lock);
1322
 
1323
        platform_set_drvdata(pdev, data);
1324
 
1325
        /* Some voltage inputs depend on chip model and configuration */
1326
        switch (sio_data->kind) {
1327
        case f71805f:
1328
                data->has_in = 0x1ff;
1329
                break;
1330
        case f71872f:
1331
                data->has_in = 0x6ef;
1332
                if (sio_data->fnsel1 & 0x01)
1333
                        data->has_in |= (1 << 4); /* in4 */
1334
                if (sio_data->fnsel1 & 0x02)
1335
                        data->has_in |= (1 << 8); /* in8 */
1336
                break;
1337
        }
1338
 
1339
        /* Initialize the F71805F chip */
1340
        f71805f_init_device(data);
1341
 
1342
        /* Register sysfs interface files */
1343
        if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group)))
1344
                goto exit_release_region;
1345
        if (data->has_in & (1 << 4)) { /* in4 */
1346
                if ((err = sysfs_create_group(&pdev->dev.kobj,
1347
                                              &f71805f_group_optin[0])))
1348
                        goto exit_remove_files;
1349
        }
1350
        if (data->has_in & (1 << 8)) { /* in8 */
1351
                if ((err = sysfs_create_group(&pdev->dev.kobj,
1352
                                              &f71805f_group_optin[1])))
1353
                        goto exit_remove_files;
1354
        }
1355
        if (data->has_in & (1 << 9)) { /* in9 (F71872F/FG only) */
1356
                if ((err = sysfs_create_group(&pdev->dev.kobj,
1357
                                              &f71805f_group_optin[2])))
1358
                        goto exit_remove_files;
1359
        }
1360
        if (data->has_in & (1 << 10)) { /* in9 (F71872F/FG only) */
1361
                if ((err = sysfs_create_group(&pdev->dev.kobj,
1362
                                              &f71805f_group_optin[3])))
1363
                        goto exit_remove_files;
1364
        }
1365
        for (i = 0; i < 3; i++) {
1366
                /* If control mode is PWM, create pwm_freq file */
1367
                if (!(data->fan_ctrl[i] & FAN_CTRL_DC_MODE)) {
1368
                        if ((err = sysfs_create_file(&pdev->dev.kobj,
1369
                                        f71805f_attributes_pwm_freq[i])))
1370
                                goto exit_remove_files;
1371
                }
1372
                /* If PWM is in manual mode, add write permission */
1373
                if (data->fan_ctrl[i] & FAN_CTRL_MODE_MANUAL) {
1374
                        if ((err = sysfs_chmod_file(&pdev->dev.kobj,
1375
                                                    f71805f_attr_pwm[i],
1376
                                                    S_IRUGO | S_IWUSR))) {
1377
                                dev_err(&pdev->dev, "chmod +w pwm%d failed\n",
1378
                                        i + 1);
1379
                                goto exit_remove_files;
1380
                        }
1381
                }
1382
        }
1383
 
1384
        data->hwmon_dev = hwmon_device_register(&pdev->dev);
1385
        if (IS_ERR(data->hwmon_dev)) {
1386
                err = PTR_ERR(data->hwmon_dev);
1387
                dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1388
                goto exit_remove_files;
1389
        }
1390
 
1391
        return 0;
1392
 
1393
exit_remove_files:
1394
        sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1395
        for (i = 0; i < 4; i++)
1396
                sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1397
        sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1398
exit_release_region:
1399
        release_region(res->start + ADDR_REG_OFFSET, 2);
1400
exit_free:
1401
        platform_set_drvdata(pdev, NULL);
1402
        kfree(data);
1403
exit:
1404
        return err;
1405
}
1406
 
1407
static int __devexit f71805f_remove(struct platform_device *pdev)
1408
{
1409
        struct f71805f_data *data = platform_get_drvdata(pdev);
1410
        struct resource *res;
1411
        int i;
1412
 
1413
        hwmon_device_unregister(data->hwmon_dev);
1414
        sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1415
        for (i = 0; i < 4; i++)
1416
                sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1417
        sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1418
        platform_set_drvdata(pdev, NULL);
1419
        kfree(data);
1420
 
1421
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1422
        release_region(res->start + ADDR_REG_OFFSET, 2);
1423
 
1424
        return 0;
1425
}
1426
 
1427
static struct platform_driver f71805f_driver = {
1428
        .driver = {
1429
                .owner  = THIS_MODULE,
1430
                .name   = DRVNAME,
1431
        },
1432
        .probe          = f71805f_probe,
1433
        .remove         = __devexit_p(f71805f_remove),
1434
};
1435
 
1436
static int __init f71805f_device_add(unsigned short address,
1437
                                     const struct f71805f_sio_data *sio_data)
1438
{
1439
        struct resource res = {
1440
                .start  = address,
1441
                .end    = address + REGION_LENGTH - 1,
1442
                .flags  = IORESOURCE_IO,
1443
        };
1444
        int err;
1445
 
1446
        pdev = platform_device_alloc(DRVNAME, address);
1447
        if (!pdev) {
1448
                err = -ENOMEM;
1449
                printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1450
                goto exit;
1451
        }
1452
 
1453
        res.name = pdev->name;
1454
        err = platform_device_add_resources(pdev, &res, 1);
1455
        if (err) {
1456
                printk(KERN_ERR DRVNAME ": Device resource addition failed "
1457
                       "(%d)\n", err);
1458
                goto exit_device_put;
1459
        }
1460
 
1461
        err = platform_device_add_data(pdev, sio_data,
1462
                                       sizeof(struct f71805f_sio_data));
1463
        if (err) {
1464
                printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1465
                goto exit_device_put;
1466
        }
1467
 
1468
        err = platform_device_add(pdev);
1469
        if (err) {
1470
                printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1471
                       err);
1472
                goto exit_device_put;
1473
        }
1474
 
1475
        return 0;
1476
 
1477
exit_device_put:
1478
        platform_device_put(pdev);
1479
exit:
1480
        return err;
1481
}
1482
 
1483
static int __init f71805f_find(int sioaddr, unsigned short *address,
1484
                               struct f71805f_sio_data *sio_data)
1485
{
1486
        int err = -ENODEV;
1487
        u16 devid;
1488
 
1489
        static const char *names[] = {
1490
                "F71805F/FG",
1491
                "F71872F/FG or F71806F/FG",
1492
        };
1493
 
1494
        superio_enter(sioaddr);
1495
 
1496
        devid = superio_inw(sioaddr, SIO_REG_MANID);
1497
        if (devid != SIO_FINTEK_ID)
1498
                goto exit;
1499
 
1500
        devid = superio_inw(sioaddr, SIO_REG_DEVID);
1501
        switch (devid) {
1502
        case SIO_F71805F_ID:
1503
                sio_data->kind = f71805f;
1504
                break;
1505
        case SIO_F71872F_ID:
1506
                sio_data->kind = f71872f;
1507
                sio_data->fnsel1 = superio_inb(sioaddr, SIO_REG_FNSEL1);
1508
                break;
1509
        default:
1510
                printk(KERN_INFO DRVNAME ": Unsupported Fintek device, "
1511
                       "skipping\n");
1512
                goto exit;
1513
        }
1514
 
1515
        superio_select(sioaddr, F71805F_LD_HWM);
1516
        if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
1517
                printk(KERN_WARNING DRVNAME ": Device not activated, "
1518
                       "skipping\n");
1519
                goto exit;
1520
        }
1521
 
1522
        *address = superio_inw(sioaddr, SIO_REG_ADDR);
1523
        if (*address == 0) {
1524
                printk(KERN_WARNING DRVNAME ": Base address not set, "
1525
                       "skipping\n");
1526
                goto exit;
1527
        }
1528
        *address &= ~(REGION_LENGTH - 1);       /* Ignore 3 LSB */
1529
 
1530
        err = 0;
1531
        printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %u\n",
1532
               names[sio_data->kind], *address,
1533
               superio_inb(sioaddr, SIO_REG_DEVREV));
1534
 
1535
exit:
1536
        superio_exit(sioaddr);
1537
        return err;
1538
}
1539
 
1540
static int __init f71805f_init(void)
1541
{
1542
        int err;
1543
        unsigned short address;
1544
        struct f71805f_sio_data sio_data;
1545
 
1546
        if (f71805f_find(0x2e, &address, &sio_data)
1547
         && f71805f_find(0x4e, &address, &sio_data))
1548
                return -ENODEV;
1549
 
1550
        err = platform_driver_register(&f71805f_driver);
1551
        if (err)
1552
                goto exit;
1553
 
1554
        /* Sets global pdev as a side effect */
1555
        err = f71805f_device_add(address, &sio_data);
1556
        if (err)
1557
                goto exit_driver;
1558
 
1559
        return 0;
1560
 
1561
exit_driver:
1562
        platform_driver_unregister(&f71805f_driver);
1563
exit:
1564
        return err;
1565
}
1566
 
1567
static void __exit f71805f_exit(void)
1568
{
1569
        platform_device_unregister(pdev);
1570
        platform_driver_unregister(&f71805f_driver);
1571
}
1572
 
1573
MODULE_AUTHOR("Jean Delvare <khali@linux-fr>");
1574
MODULE_LICENSE("GPL");
1575
MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
1576
 
1577
module_init(f71805f_init);
1578
module_exit(f71805f_exit);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.