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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [hwmon/] [vt1211.c] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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