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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [hwmon/] [asb100.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
    asb100.c - Part of lm_sensors, Linux kernel modules for hardware
3
                monitoring
4
 
5
    Copyright (C) 2004 Mark M. Hoffman <mhoffman@lightlink.com>
6
 
7
        (derived from w83781d.c)
8
 
9
    Copyright (C) 1998 - 2003  Frodo Looijaard <frodol@dds.nl>,
10
    Philip Edelbrock <phil@netroedge.com>, and
11
    Mark Studebaker <mdsxyz123@yahoo.com>
12
 
13
    This program is free software; you can redistribute it and/or modify
14
    it under the terms of the GNU General Public License as published by
15
    the Free Software Foundation; either version 2 of the License, or
16
    (at your option) any later version.
17
 
18
    This program is distributed in the hope that it will be useful,
19
    but WITHOUT ANY WARRANTY; without even the implied warranty of
20
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
    GNU General Public License for more details.
22
 
23
    You should have received a copy of the GNU General Public License
24
    along with this program; if not, write to the Free Software
25
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26
*/
27
 
28
/*
29
    This driver supports the hardware sensor chips: Asus ASB100 and
30
    ASB100-A "BACH".
31
 
32
    ASB100-A supports pwm1, while plain ASB100 does not.  There is no known
33
    way for the driver to tell which one is there.
34
 
35
    Chip        #vin    #fanin  #pwm    #temp   wchipid vendid  i2c     ISA
36
    asb100      7       3       1       4       0x31    0x0694  yes     no
37
*/
38
 
39
#include <linux/module.h>
40
#include <linux/slab.h>
41
#include <linux/i2c.h>
42
#include <linux/hwmon.h>
43
#include <linux/hwmon-vid.h>
44
#include <linux/err.h>
45
#include <linux/init.h>
46
#include <linux/jiffies.h>
47
#include <linux/mutex.h>
48
#include "lm75.h"
49
 
50
/*
51
        HISTORY:
52
        2003-12-29      1.0.0   Ported from lm_sensors project for kernel 2.6
53
*/
54
#define ASB100_VERSION "1.0.0"
55
 
56
/* I2C addresses to scan */
57
static unsigned short normal_i2c[] = { 0x2d, I2C_CLIENT_END };
58
 
59
/* Insmod parameters */
60
I2C_CLIENT_INSMOD_1(asb100);
61
I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
62
        "{bus, clientaddr, subclientaddr1, subclientaddr2}");
63
 
64
/* Voltage IN registers 0-6 */
65
#define ASB100_REG_IN(nr)       (0x20 + (nr))
66
#define ASB100_REG_IN_MAX(nr)   (0x2b + (nr * 2))
67
#define ASB100_REG_IN_MIN(nr)   (0x2c + (nr * 2))
68
 
69
/* FAN IN registers 1-3 */
70
#define ASB100_REG_FAN(nr)      (0x28 + (nr))
71
#define ASB100_REG_FAN_MIN(nr)  (0x3b + (nr))
72
 
73
/* TEMPERATURE registers 1-4 */
74
static const u16 asb100_reg_temp[]      = {0, 0x27, 0x150, 0x250, 0x17};
75
static const u16 asb100_reg_temp_max[]  = {0, 0x39, 0x155, 0x255, 0x18};
76
static const u16 asb100_reg_temp_hyst[] = {0, 0x3a, 0x153, 0x253, 0x19};
77
 
78
#define ASB100_REG_TEMP(nr) (asb100_reg_temp[nr])
79
#define ASB100_REG_TEMP_MAX(nr) (asb100_reg_temp_max[nr])
80
#define ASB100_REG_TEMP_HYST(nr) (asb100_reg_temp_hyst[nr])
81
 
82
#define ASB100_REG_TEMP2_CONFIG 0x0152
83
#define ASB100_REG_TEMP3_CONFIG 0x0252
84
 
85
 
86
#define ASB100_REG_CONFIG       0x40
87
#define ASB100_REG_ALARM1       0x41
88
#define ASB100_REG_ALARM2       0x42
89
#define ASB100_REG_SMIM1        0x43
90
#define ASB100_REG_SMIM2        0x44
91
#define ASB100_REG_VID_FANDIV   0x47
92
#define ASB100_REG_I2C_ADDR     0x48
93
#define ASB100_REG_CHIPID       0x49
94
#define ASB100_REG_I2C_SUBADDR  0x4a
95
#define ASB100_REG_PIN          0x4b
96
#define ASB100_REG_IRQ          0x4c
97
#define ASB100_REG_BANK         0x4e
98
#define ASB100_REG_CHIPMAN      0x4f
99
 
100
#define ASB100_REG_WCHIPID      0x58
101
 
102
/* bit 7 -> enable, bits 0-3 -> duty cycle */
103
#define ASB100_REG_PWM1         0x59
104
 
105
/* CONVERSIONS
106
   Rounding and limit checking is only done on the TO_REG variants. */
107
 
108
/* These constants are a guess, consistent w/ w83781d */
109
#define ASB100_IN_MIN (   0)
110
#define ASB100_IN_MAX (4080)
111
 
112
/* IN: 1/1000 V (0V to 4.08V)
113
   REG: 16mV/bit */
114
static u8 IN_TO_REG(unsigned val)
115
{
116
        unsigned nval = SENSORS_LIMIT(val, ASB100_IN_MIN, ASB100_IN_MAX);
117
        return (nval + 8) / 16;
118
}
119
 
120
static unsigned IN_FROM_REG(u8 reg)
121
{
122
        return reg * 16;
123
}
124
 
125
static u8 FAN_TO_REG(long rpm, int div)
126
{
127
        if (rpm == -1)
128
                return 0;
129
        if (rpm == 0)
130
                return 255;
131
        rpm = SENSORS_LIMIT(rpm, 1, 1000000);
132
        return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
133
}
134
 
135
static int FAN_FROM_REG(u8 val, int div)
136
{
137
        return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
138
}
139
 
140
/* These constants are a guess, consistent w/ w83781d */
141
#define ASB100_TEMP_MIN (-128000)
142
#define ASB100_TEMP_MAX ( 127000)
143
 
144
/* TEMP: 0.001C/bit (-128C to +127C)
145
   REG: 1C/bit, two's complement */
146
static u8 TEMP_TO_REG(long temp)
147
{
148
        int ntemp = SENSORS_LIMIT(temp, ASB100_TEMP_MIN, ASB100_TEMP_MAX);
149
        ntemp += (ntemp<0 ? -500 : 500);
150
        return (u8)(ntemp / 1000);
151
}
152
 
153
static int TEMP_FROM_REG(u8 reg)
154
{
155
        return (s8)reg * 1000;
156
}
157
 
158
/* PWM: 0 - 255 per sensors documentation
159
   REG: (6.25% duty cycle per bit) */
160
static u8 ASB100_PWM_TO_REG(int pwm)
161
{
162
        pwm = SENSORS_LIMIT(pwm, 0, 255);
163
        return (u8)(pwm / 16);
164
}
165
 
166
static int ASB100_PWM_FROM_REG(u8 reg)
167
{
168
        return reg * 16;
169
}
170
 
171
#define DIV_FROM_REG(val) (1 << (val))
172
 
173
/* FAN DIV: 1, 2, 4, or 8 (defaults to 2)
174
   REG: 0, 1, 2, or 3 (respectively) (defaults to 1) */
175
static u8 DIV_TO_REG(long val)
176
{
177
        return val==8 ? 3 : val==4 ? 2 : val==1 ? 0 : 1;
178
}
179
 
180
/* For each registered client, we need to keep some data in memory. That
181
   data is pointed to by client->data. The structure itself is
182
   dynamically allocated, at the same time the client itself is allocated. */
183
struct asb100_data {
184
        struct i2c_client client;
185
        struct device *hwmon_dev;
186
        struct mutex lock;
187
        enum chips type;
188
 
189
        struct mutex update_lock;
190
        unsigned long last_updated;     /* In jiffies */
191
 
192
        /* array of 2 pointers to subclients */
193
        struct i2c_client *lm75[2];
194
 
195
        char valid;             /* !=0 if following fields are valid */
196
        u8 in[7];               /* Register value */
197
        u8 in_max[7];           /* Register value */
198
        u8 in_min[7];           /* Register value */
199
        u8 fan[3];              /* Register value */
200
        u8 fan_min[3];          /* Register value */
201
        u16 temp[4];            /* Register value (0 and 3 are u8 only) */
202
        u16 temp_max[4];        /* Register value (0 and 3 are u8 only) */
203
        u16 temp_hyst[4];       /* Register value (0 and 3 are u8 only) */
204
        u8 fan_div[3];          /* Register encoding, right justified */
205
        u8 pwm;                 /* Register encoding */
206
        u8 vid;                 /* Register encoding, combined */
207
        u32 alarms;             /* Register encoding, combined */
208
        u8 vrm;
209
};
210
 
211
static int asb100_read_value(struct i2c_client *client, u16 reg);
212
static void asb100_write_value(struct i2c_client *client, u16 reg, u16 val);
213
 
214
static int asb100_attach_adapter(struct i2c_adapter *adapter);
215
static int asb100_detect(struct i2c_adapter *adapter, int address, int kind);
216
static int asb100_detach_client(struct i2c_client *client);
217
static struct asb100_data *asb100_update_device(struct device *dev);
218
static void asb100_init_client(struct i2c_client *client);
219
 
220
static struct i2c_driver asb100_driver = {
221
        .driver = {
222
                .name   = "asb100",
223
        },
224
        .id             = I2C_DRIVERID_ASB100,
225
        .attach_adapter = asb100_attach_adapter,
226
        .detach_client  = asb100_detach_client,
227
};
228
 
229
/* 7 Voltages */
230
#define show_in_reg(reg) \
231
static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
232
{ \
233
        struct asb100_data *data = asb100_update_device(dev); \
234
        return sprintf(buf, "%d\n", IN_FROM_REG(data->reg[nr])); \
235
}
236
 
237
show_in_reg(in)
238
show_in_reg(in_min)
239
show_in_reg(in_max)
240
 
241
#define set_in_reg(REG, reg) \
242
static ssize_t set_in_##reg(struct device *dev, const char *buf, \
243
                size_t count, int nr) \
244
{ \
245
        struct i2c_client *client = to_i2c_client(dev); \
246
        struct asb100_data *data = i2c_get_clientdata(client); \
247
        unsigned long val = simple_strtoul(buf, NULL, 10); \
248
 \
249
        mutex_lock(&data->update_lock); \
250
        data->in_##reg[nr] = IN_TO_REG(val); \
251
        asb100_write_value(client, ASB100_REG_IN_##REG(nr), \
252
                data->in_##reg[nr]); \
253
        mutex_unlock(&data->update_lock); \
254
        return count; \
255
}
256
 
257
set_in_reg(MIN, min)
258
set_in_reg(MAX, max)
259
 
260
#define sysfs_in(offset) \
261
static ssize_t \
262
        show_in##offset (struct device *dev, struct device_attribute *attr, char *buf) \
263
{ \
264
        return show_in(dev, buf, offset); \
265
} \
266
static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
267
                show_in##offset, NULL); \
268
static ssize_t \
269
        show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
270
{ \
271
        return show_in_min(dev, buf, offset); \
272
} \
273
static ssize_t \
274
        show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \
275
{ \
276
        return show_in_max(dev, buf, offset); \
277
} \
278
static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr, \
279
                const char *buf, size_t count) \
280
{ \
281
        return set_in_min(dev, buf, count, offset); \
282
} \
283
static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr, \
284
                const char *buf, size_t count) \
285
{ \
286
        return set_in_max(dev, buf, count, offset); \
287
} \
288
static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
289
                show_in##offset##_min, set_in##offset##_min); \
290
static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
291
                show_in##offset##_max, set_in##offset##_max);
292
 
293
sysfs_in(0);
294
sysfs_in(1);
295
sysfs_in(2);
296
sysfs_in(3);
297
sysfs_in(4);
298
sysfs_in(5);
299
sysfs_in(6);
300
 
301
/* 3 Fans */
302
static ssize_t show_fan(struct device *dev, char *buf, int nr)
303
{
304
        struct asb100_data *data = asb100_update_device(dev);
305
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
306
                DIV_FROM_REG(data->fan_div[nr])));
307
}
308
 
309
static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
310
{
311
        struct asb100_data *data = asb100_update_device(dev);
312
        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
313
                DIV_FROM_REG(data->fan_div[nr])));
314
}
315
 
316
static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
317
{
318
        struct asb100_data *data = asb100_update_device(dev);
319
        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
320
}
321
 
322
static ssize_t set_fan_min(struct device *dev, const char *buf,
323
                                size_t count, int nr)
324
{
325
        struct i2c_client *client = to_i2c_client(dev);
326
        struct asb100_data *data = i2c_get_clientdata(client);
327
        u32 val = simple_strtoul(buf, NULL, 10);
328
 
329
        mutex_lock(&data->update_lock);
330
        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
331
        asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]);
332
        mutex_unlock(&data->update_lock);
333
        return count;
334
}
335
 
336
/* Note: we save and restore the fan minimum here, because its value is
337
   determined in part by the fan divisor.  This follows the principle of
338
   least surprise; the user doesn't expect the fan minimum to change just
339
   because the divisor changed. */
340
static ssize_t set_fan_div(struct device *dev, const char *buf,
341
                                size_t count, int nr)
342
{
343
        struct i2c_client *client = to_i2c_client(dev);
344
        struct asb100_data *data = i2c_get_clientdata(client);
345
        unsigned long min;
346
        unsigned long val = simple_strtoul(buf, NULL, 10);
347
        int reg;
348
 
349
        mutex_lock(&data->update_lock);
350
 
351
        min = FAN_FROM_REG(data->fan_min[nr],
352
                        DIV_FROM_REG(data->fan_div[nr]));
353
        data->fan_div[nr] = DIV_TO_REG(val);
354
 
355
        switch(nr) {
356
        case 0:  /* fan 1 */
357
                reg = asb100_read_value(client, ASB100_REG_VID_FANDIV);
358
                reg = (reg & 0xcf) | (data->fan_div[0] << 4);
359
                asb100_write_value(client, ASB100_REG_VID_FANDIV, reg);
360
                break;
361
 
362
        case 1: /* fan 2 */
363
                reg = asb100_read_value(client, ASB100_REG_VID_FANDIV);
364
                reg = (reg & 0x3f) | (data->fan_div[1] << 6);
365
                asb100_write_value(client, ASB100_REG_VID_FANDIV, reg);
366
                break;
367
 
368
        case 2: /* fan 3 */
369
                reg = asb100_read_value(client, ASB100_REG_PIN);
370
                reg = (reg & 0x3f) | (data->fan_div[2] << 6);
371
                asb100_write_value(client, ASB100_REG_PIN, reg);
372
                break;
373
        }
374
 
375
        data->fan_min[nr] =
376
                FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
377
        asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]);
378
 
379
        mutex_unlock(&data->update_lock);
380
 
381
        return count;
382
}
383
 
384
#define sysfs_fan(offset) \
385
static ssize_t show_fan##offset(struct device *dev, struct device_attribute *attr, char *buf) \
386
{ \
387
        return show_fan(dev, buf, offset - 1); \
388
} \
389
static ssize_t show_fan##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \
390
{ \
391
        return show_fan_min(dev, buf, offset - 1); \
392
} \
393
static ssize_t show_fan##offset##_div(struct device *dev, struct device_attribute *attr, char *buf) \
394
{ \
395
        return show_fan_div(dev, buf, offset - 1); \
396
} \
397
static ssize_t set_fan##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \
398
                                        size_t count) \
399
{ \
400
        return set_fan_min(dev, buf, count, offset - 1); \
401
} \
402
static ssize_t set_fan##offset##_div(struct device *dev, struct device_attribute *attr, const char *buf, \
403
                                        size_t count) \
404
{ \
405
        return set_fan_div(dev, buf, count, offset - 1); \
406
} \
407
static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
408
                show_fan##offset, NULL); \
409
static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
410
                show_fan##offset##_min, set_fan##offset##_min); \
411
static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
412
                show_fan##offset##_div, set_fan##offset##_div);
413
 
414
sysfs_fan(1);
415
sysfs_fan(2);
416
sysfs_fan(3);
417
 
418
/* 4 Temp. Sensors */
419
static int sprintf_temp_from_reg(u16 reg, char *buf, int nr)
420
{
421
        int ret = 0;
422
 
423
        switch (nr) {
424
        case 1: case 2:
425
                ret = sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(reg));
426
                break;
427
        case 0: case 3: default:
428
                ret = sprintf(buf, "%d\n", TEMP_FROM_REG(reg));
429
                break;
430
        }
431
        return ret;
432
}
433
 
434
#define show_temp_reg(reg) \
435
static ssize_t show_##reg(struct device *dev, char *buf, int nr) \
436
{ \
437
        struct asb100_data *data = asb100_update_device(dev); \
438
        return sprintf_temp_from_reg(data->reg[nr], buf, nr); \
439
}
440
 
441
show_temp_reg(temp);
442
show_temp_reg(temp_max);
443
show_temp_reg(temp_hyst);
444
 
445
#define set_temp_reg(REG, reg) \
446
static ssize_t set_##reg(struct device *dev, const char *buf, \
447
                        size_t count, int nr) \
448
{ \
449
        struct i2c_client *client = to_i2c_client(dev); \
450
        struct asb100_data *data = i2c_get_clientdata(client); \
451
        long val = simple_strtol(buf, NULL, 10); \
452
 \
453
        mutex_lock(&data->update_lock); \
454
        switch (nr) { \
455
        case 1: case 2: \
456
                data->reg[nr] = LM75_TEMP_TO_REG(val); \
457
                break; \
458
        case 0: case 3: default: \
459
                data->reg[nr] = TEMP_TO_REG(val); \
460
                break; \
461
        } \
462
        asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \
463
                        data->reg[nr]); \
464
        mutex_unlock(&data->update_lock); \
465
        return count; \
466
}
467
 
468
set_temp_reg(MAX, temp_max);
469
set_temp_reg(HYST, temp_hyst);
470
 
471
#define sysfs_temp(num) \
472
static ssize_t show_temp##num(struct device *dev, struct device_attribute *attr, char *buf) \
473
{ \
474
        return show_temp(dev, buf, num-1); \
475
} \
476
static DEVICE_ATTR(temp##num##_input, S_IRUGO, show_temp##num, NULL); \
477
static ssize_t show_temp_max##num(struct device *dev, struct device_attribute *attr, char *buf) \
478
{ \
479
        return show_temp_max(dev, buf, num-1); \
480
} \
481
static ssize_t set_temp_max##num(struct device *dev, struct device_attribute *attr, const char *buf, \
482
                                        size_t count) \
483
{ \
484
        return set_temp_max(dev, buf, count, num-1); \
485
} \
486
static DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \
487
                show_temp_max##num, set_temp_max##num); \
488
static ssize_t show_temp_hyst##num(struct device *dev, struct device_attribute *attr, char *buf) \
489
{ \
490
        return show_temp_hyst(dev, buf, num-1); \
491
} \
492
static ssize_t set_temp_hyst##num(struct device *dev, struct device_attribute *attr, const char *buf, \
493
                                        size_t count) \
494
{ \
495
        return set_temp_hyst(dev, buf, count, num-1); \
496
} \
497
static DEVICE_ATTR(temp##num##_max_hyst, S_IRUGO | S_IWUSR, \
498
                show_temp_hyst##num, set_temp_hyst##num);
499
 
500
sysfs_temp(1);
501
sysfs_temp(2);
502
sysfs_temp(3);
503
sysfs_temp(4);
504
 
505
/* VID */
506
static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
507
{
508
        struct asb100_data *data = asb100_update_device(dev);
509
        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
510
}
511
 
512
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
513
 
514
/* VRM */
515
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
516
{
517
        struct asb100_data *data = dev_get_drvdata(dev);
518
        return sprintf(buf, "%d\n", data->vrm);
519
}
520
 
521
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
522
{
523
        struct i2c_client *client = to_i2c_client(dev);
524
        struct asb100_data *data = i2c_get_clientdata(client);
525
        unsigned long val = simple_strtoul(buf, NULL, 10);
526
        data->vrm = val;
527
        return count;
528
}
529
 
530
/* Alarms */
531
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
532
 
533
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
534
{
535
        struct asb100_data *data = asb100_update_device(dev);
536
        return sprintf(buf, "%u\n", data->alarms);
537
}
538
 
539
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
540
 
541
/* 1 PWM */
542
static ssize_t show_pwm1(struct device *dev, struct device_attribute *attr, char *buf)
543
{
544
        struct asb100_data *data = asb100_update_device(dev);
545
        return sprintf(buf, "%d\n", ASB100_PWM_FROM_REG(data->pwm & 0x0f));
546
}
547
 
548
static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
549
{
550
        struct i2c_client *client = to_i2c_client(dev);
551
        struct asb100_data *data = i2c_get_clientdata(client);
552
        unsigned long val = simple_strtoul(buf, NULL, 10);
553
 
554
        mutex_lock(&data->update_lock);
555
        data->pwm &= 0x80; /* keep the enable bit */
556
        data->pwm |= (0x0f & ASB100_PWM_TO_REG(val));
557
        asb100_write_value(client, ASB100_REG_PWM1, data->pwm);
558
        mutex_unlock(&data->update_lock);
559
        return count;
560
}
561
 
562
static ssize_t show_pwm_enable1(struct device *dev, struct device_attribute *attr, char *buf)
563
{
564
        struct asb100_data *data = asb100_update_device(dev);
565
        return sprintf(buf, "%d\n", (data->pwm & 0x80) ? 1 : 0);
566
}
567
 
568
static ssize_t set_pwm_enable1(struct device *dev, struct device_attribute *attr, const char *buf,
569
                                size_t count)
570
{
571
        struct i2c_client *client = to_i2c_client(dev);
572
        struct asb100_data *data = i2c_get_clientdata(client);
573
        unsigned long val = simple_strtoul(buf, NULL, 10);
574
 
575
        mutex_lock(&data->update_lock);
576
        data->pwm &= 0x0f; /* keep the duty cycle bits */
577
        data->pwm |= (val ? 0x80 : 0x00);
578
        asb100_write_value(client, ASB100_REG_PWM1, data->pwm);
579
        mutex_unlock(&data->update_lock);
580
        return count;
581
}
582
 
583
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1);
584
static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
585
                show_pwm_enable1, set_pwm_enable1);
586
 
587
static struct attribute *asb100_attributes[] = {
588
        &dev_attr_in0_input.attr,
589
        &dev_attr_in0_min.attr,
590
        &dev_attr_in0_max.attr,
591
        &dev_attr_in1_input.attr,
592
        &dev_attr_in1_min.attr,
593
        &dev_attr_in1_max.attr,
594
        &dev_attr_in2_input.attr,
595
        &dev_attr_in2_min.attr,
596
        &dev_attr_in2_max.attr,
597
        &dev_attr_in3_input.attr,
598
        &dev_attr_in3_min.attr,
599
        &dev_attr_in3_max.attr,
600
        &dev_attr_in4_input.attr,
601
        &dev_attr_in4_min.attr,
602
        &dev_attr_in4_max.attr,
603
        &dev_attr_in5_input.attr,
604
        &dev_attr_in5_min.attr,
605
        &dev_attr_in5_max.attr,
606
        &dev_attr_in6_input.attr,
607
        &dev_attr_in6_min.attr,
608
        &dev_attr_in6_max.attr,
609
 
610
        &dev_attr_fan1_input.attr,
611
        &dev_attr_fan1_min.attr,
612
        &dev_attr_fan1_div.attr,
613
        &dev_attr_fan2_input.attr,
614
        &dev_attr_fan2_min.attr,
615
        &dev_attr_fan2_div.attr,
616
        &dev_attr_fan3_input.attr,
617
        &dev_attr_fan3_min.attr,
618
        &dev_attr_fan3_div.attr,
619
 
620
        &dev_attr_temp1_input.attr,
621
        &dev_attr_temp1_max.attr,
622
        &dev_attr_temp1_max_hyst.attr,
623
        &dev_attr_temp2_input.attr,
624
        &dev_attr_temp2_max.attr,
625
        &dev_attr_temp2_max_hyst.attr,
626
        &dev_attr_temp3_input.attr,
627
        &dev_attr_temp3_max.attr,
628
        &dev_attr_temp3_max_hyst.attr,
629
        &dev_attr_temp4_input.attr,
630
        &dev_attr_temp4_max.attr,
631
        &dev_attr_temp4_max_hyst.attr,
632
 
633
        &dev_attr_cpu0_vid.attr,
634
        &dev_attr_vrm.attr,
635
        &dev_attr_alarms.attr,
636
        &dev_attr_pwm1.attr,
637
        &dev_attr_pwm1_enable.attr,
638
 
639
        NULL
640
};
641
 
642
static const struct attribute_group asb100_group = {
643
        .attrs = asb100_attributes,
644
};
645
 
646
/* This function is called when:
647
        asb100_driver is inserted (when this module is loaded), for each
648
                available adapter
649
        when a new adapter is inserted (and asb100_driver is still present)
650
 */
651
static int asb100_attach_adapter(struct i2c_adapter *adapter)
652
{
653
        if (!(adapter->class & I2C_CLASS_HWMON))
654
                return 0;
655
        return i2c_probe(adapter, &addr_data, asb100_detect);
656
}
657
 
658
static int asb100_detect_subclients(struct i2c_adapter *adapter, int address,
659
                int kind, struct i2c_client *new_client)
660
{
661
        int i, id, err;
662
        struct asb100_data *data = i2c_get_clientdata(new_client);
663
 
664
        data->lm75[0] = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
665
        if (!(data->lm75[0])) {
666
                err = -ENOMEM;
667
                goto ERROR_SC_0;
668
        }
669
 
670
        data->lm75[1] = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
671
        if (!(data->lm75[1])) {
672
                err = -ENOMEM;
673
                goto ERROR_SC_1;
674
        }
675
 
676
        id = i2c_adapter_id(adapter);
677
 
678
        if (force_subclients[0] == id && force_subclients[1] == address) {
679
                for (i = 2; i <= 3; i++) {
680
                        if (force_subclients[i] < 0x48 ||
681
                            force_subclients[i] > 0x4f) {
682
                                dev_err(&new_client->dev, "invalid subclient "
683
                                        "address %d; must be 0x48-0x4f\n",
684
                                        force_subclients[i]);
685
                                err = -ENODEV;
686
                                goto ERROR_SC_2;
687
                        }
688
                }
689
                asb100_write_value(new_client, ASB100_REG_I2C_SUBADDR,
690
                                        (force_subclients[2] & 0x07) |
691
                                        ((force_subclients[3] & 0x07) <<4));
692
                data->lm75[0]->addr = force_subclients[2];
693
                data->lm75[1]->addr = force_subclients[3];
694
        } else {
695
                int val = asb100_read_value(new_client, ASB100_REG_I2C_SUBADDR);
696
                data->lm75[0]->addr = 0x48 + (val & 0x07);
697
                data->lm75[1]->addr = 0x48 + ((val >> 4) & 0x07);
698
        }
699
 
700
        if(data->lm75[0]->addr == data->lm75[1]->addr) {
701
                dev_err(&new_client->dev, "duplicate addresses 0x%x "
702
                                "for subclients\n", data->lm75[0]->addr);
703
                err = -ENODEV;
704
                goto ERROR_SC_2;
705
        }
706
 
707
        for (i = 0; i <= 1; i++) {
708
                i2c_set_clientdata(data->lm75[i], NULL);
709
                data->lm75[i]->adapter = adapter;
710
                data->lm75[i]->driver = &asb100_driver;
711
                data->lm75[i]->flags = 0;
712
                strlcpy(data->lm75[i]->name, "asb100 subclient", I2C_NAME_SIZE);
713
        }
714
 
715
        if ((err = i2c_attach_client(data->lm75[0]))) {
716
                dev_err(&new_client->dev, "subclient %d registration "
717
                        "at address 0x%x failed.\n", i, data->lm75[0]->addr);
718
                goto ERROR_SC_2;
719
        }
720
 
721
        if ((err = i2c_attach_client(data->lm75[1]))) {
722
                dev_err(&new_client->dev, "subclient %d registration "
723
                        "at address 0x%x failed.\n", i, data->lm75[1]->addr);
724
                goto ERROR_SC_3;
725
        }
726
 
727
        return 0;
728
 
729
/* Undo inits in case of errors */
730
ERROR_SC_3:
731
        i2c_detach_client(data->lm75[0]);
732
ERROR_SC_2:
733
        kfree(data->lm75[1]);
734
ERROR_SC_1:
735
        kfree(data->lm75[0]);
736
ERROR_SC_0:
737
        return err;
738
}
739
 
740
static int asb100_detect(struct i2c_adapter *adapter, int address, int kind)
741
{
742
        int err;
743
        struct i2c_client *new_client;
744
        struct asb100_data *data;
745
 
746
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
747
                pr_debug("asb100.o: detect failed, "
748
                                "smbus byte data not supported!\n");
749
                err = -ENODEV;
750
                goto ERROR0;
751
        }
752
 
753
        /* OK. For now, we presume we have a valid client. We now create the
754
           client structure, even though we cannot fill it completely yet.
755
           But it allows us to access asb100_{read,write}_value. */
756
 
757
        if (!(data = kzalloc(sizeof(struct asb100_data), GFP_KERNEL))) {
758
                pr_debug("asb100.o: detect failed, kzalloc failed!\n");
759
                err = -ENOMEM;
760
                goto ERROR0;
761
        }
762
 
763
        new_client = &data->client;
764
        mutex_init(&data->lock);
765
        i2c_set_clientdata(new_client, data);
766
        new_client->addr = address;
767
        new_client->adapter = adapter;
768
        new_client->driver = &asb100_driver;
769
        new_client->flags = 0;
770
 
771
        /* Now, we do the remaining detection. */
772
 
773
        /* The chip may be stuck in some other bank than bank 0. This may
774
           make reading other information impossible. Specify a force=... or
775
           force_*=... parameter, and the chip will be reset to the right
776
           bank. */
777
        if (kind < 0) {
778
 
779
                int val1 = asb100_read_value(new_client, ASB100_REG_BANK);
780
                int val2 = asb100_read_value(new_client, ASB100_REG_CHIPMAN);
781
 
782
                /* If we're in bank 0 */
783
                if ( (!(val1 & 0x07)) &&
784
                                /* Check for ASB100 ID (low byte) */
785
                                ( ((!(val1 & 0x80)) && (val2 != 0x94)) ||
786
                                /* Check for ASB100 ID (high byte ) */
787
                                ((val1 & 0x80) && (val2 != 0x06)) ) ) {
788
                        pr_debug("asb100.o: detect failed, "
789
                                        "bad chip id 0x%02x!\n", val2);
790
                        err = -ENODEV;
791
                        goto ERROR1;
792
                }
793
 
794
        } /* kind < 0 */
795
 
796
        /* We have either had a force parameter, or we have already detected
797
           Winbond. Put it now into bank 0 and Vendor ID High Byte */
798
        asb100_write_value(new_client, ASB100_REG_BANK,
799
                (asb100_read_value(new_client, ASB100_REG_BANK) & 0x78) | 0x80);
800
 
801
        /* Determine the chip type. */
802
        if (kind <= 0) {
803
                int val1 = asb100_read_value(new_client, ASB100_REG_WCHIPID);
804
                int val2 = asb100_read_value(new_client, ASB100_REG_CHIPMAN);
805
 
806
                if ((val1 == 0x31) && (val2 == 0x06))
807
                        kind = asb100;
808
                else {
809
                        if (kind == 0)
810
                                dev_warn(&new_client->dev, "ignoring "
811
                                        "'force' parameter for unknown chip "
812
                                        "at adapter %d, address 0x%02x.\n",
813
                                        i2c_adapter_id(adapter), address);
814
                        err = -ENODEV;
815
                        goto ERROR1;
816
                }
817
        }
818
 
819
        /* Fill in remaining client fields and put it into the global list */
820
        strlcpy(new_client->name, "asb100", I2C_NAME_SIZE);
821
        data->type = kind;
822
 
823
        data->valid = 0;
824
        mutex_init(&data->update_lock);
825
 
826
        /* Tell the I2C layer a new client has arrived */
827
        if ((err = i2c_attach_client(new_client)))
828
                goto ERROR1;
829
 
830
        /* Attach secondary lm75 clients */
831
        if ((err = asb100_detect_subclients(adapter, address, kind,
832
                        new_client)))
833
                goto ERROR2;
834
 
835
        /* Initialize the chip */
836
        asb100_init_client(new_client);
837
 
838
        /* A few vars need to be filled upon startup */
839
        data->fan_min[0] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(0));
840
        data->fan_min[1] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(1));
841
        data->fan_min[2] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(2));
842
 
843
        /* Register sysfs hooks */
844
        if ((err = sysfs_create_group(&new_client->dev.kobj, &asb100_group)))
845
                goto ERROR3;
846
 
847
        data->hwmon_dev = hwmon_device_register(&new_client->dev);
848
        if (IS_ERR(data->hwmon_dev)) {
849
                err = PTR_ERR(data->hwmon_dev);
850
                goto ERROR4;
851
        }
852
 
853
        return 0;
854
 
855
ERROR4:
856
        sysfs_remove_group(&new_client->dev.kobj, &asb100_group);
857
ERROR3:
858
        i2c_detach_client(data->lm75[1]);
859
        i2c_detach_client(data->lm75[0]);
860
        kfree(data->lm75[1]);
861
        kfree(data->lm75[0]);
862
ERROR2:
863
        i2c_detach_client(new_client);
864
ERROR1:
865
        kfree(data);
866
ERROR0:
867
        return err;
868
}
869
 
870
static int asb100_detach_client(struct i2c_client *client)
871
{
872
        struct asb100_data *data = i2c_get_clientdata(client);
873
        int err;
874
 
875
        /* main client */
876
        if (data) {
877
                hwmon_device_unregister(data->hwmon_dev);
878
                sysfs_remove_group(&client->dev.kobj, &asb100_group);
879
        }
880
 
881
        if ((err = i2c_detach_client(client)))
882
                return err;
883
 
884
        /* main client */
885
        if (data)
886
                kfree(data);
887
 
888
        /* subclient */
889
        else
890
                kfree(client);
891
 
892
        return 0;
893
}
894
 
895
/* The SMBus locks itself, usually, but nothing may access the chip between
896
   bank switches. */
897
static int asb100_read_value(struct i2c_client *client, u16 reg)
898
{
899
        struct asb100_data *data = i2c_get_clientdata(client);
900
        struct i2c_client *cl;
901
        int res, bank;
902
 
903
        mutex_lock(&data->lock);
904
 
905
        bank = (reg >> 8) & 0x0f;
906
        if (bank > 2)
907
                /* switch banks */
908
                i2c_smbus_write_byte_data(client, ASB100_REG_BANK, bank);
909
 
910
        if (bank == 0 || bank > 2) {
911
                res = i2c_smbus_read_byte_data(client, reg & 0xff);
912
        } else {
913
                /* switch to subclient */
914
                cl = data->lm75[bank - 1];
915
 
916
                /* convert from ISA to LM75 I2C addresses */
917
                switch (reg & 0xff) {
918
                case 0x50: /* TEMP */
919
                        res = swab16(i2c_smbus_read_word_data (cl, 0));
920
                        break;
921
                case 0x52: /* CONFIG */
922
                        res = i2c_smbus_read_byte_data(cl, 1);
923
                        break;
924
                case 0x53: /* HYST */
925
                        res = swab16(i2c_smbus_read_word_data (cl, 2));
926
                        break;
927
                case 0x55: /* MAX */
928
                default:
929
                        res = swab16(i2c_smbus_read_word_data (cl, 3));
930
                        break;
931
                }
932
        }
933
 
934
        if (bank > 2)
935
                i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0);
936
 
937
        mutex_unlock(&data->lock);
938
 
939
        return res;
940
}
941
 
942
static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value)
943
{
944
        struct asb100_data *data = i2c_get_clientdata(client);
945
        struct i2c_client *cl;
946
        int bank;
947
 
948
        mutex_lock(&data->lock);
949
 
950
        bank = (reg >> 8) & 0x0f;
951
        if (bank > 2)
952
                /* switch banks */
953
                i2c_smbus_write_byte_data(client, ASB100_REG_BANK, bank);
954
 
955
        if (bank == 0 || bank > 2) {
956
                i2c_smbus_write_byte_data(client, reg & 0xff, value & 0xff);
957
        } else {
958
                /* switch to subclient */
959
                cl = data->lm75[bank - 1];
960
 
961
                /* convert from ISA to LM75 I2C addresses */
962
                switch (reg & 0xff) {
963
                case 0x52: /* CONFIG */
964
                        i2c_smbus_write_byte_data(cl, 1, value & 0xff);
965
                        break;
966
                case 0x53: /* HYST */
967
                        i2c_smbus_write_word_data(cl, 2, swab16(value));
968
                        break;
969
                case 0x55: /* MAX */
970
                        i2c_smbus_write_word_data(cl, 3, swab16(value));
971
                        break;
972
                }
973
        }
974
 
975
        if (bank > 2)
976
                i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0);
977
 
978
        mutex_unlock(&data->lock);
979
}
980
 
981
static void asb100_init_client(struct i2c_client *client)
982
{
983
        struct asb100_data *data = i2c_get_clientdata(client);
984
        int vid = 0;
985
 
986
        vid = asb100_read_value(client, ASB100_REG_VID_FANDIV) & 0x0f;
987
        vid |= (asb100_read_value(client, ASB100_REG_CHIPID) & 0x01) << 4;
988
        data->vrm = vid_which_vrm();
989
        vid = vid_from_reg(vid, data->vrm);
990
 
991
        /* Start monitoring */
992
        asb100_write_value(client, ASB100_REG_CONFIG,
993
                (asb100_read_value(client, ASB100_REG_CONFIG) & 0xf7) | 0x01);
994
}
995
 
996
static struct asb100_data *asb100_update_device(struct device *dev)
997
{
998
        struct i2c_client *client = to_i2c_client(dev);
999
        struct asb100_data *data = i2c_get_clientdata(client);
1000
        int i;
1001
 
1002
        mutex_lock(&data->update_lock);
1003
 
1004
        if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1005
                || !data->valid) {
1006
 
1007
                dev_dbg(&client->dev, "starting device update...\n");
1008
 
1009
                /* 7 voltage inputs */
1010
                for (i = 0; i < 7; i++) {
1011
                        data->in[i] = asb100_read_value(client,
1012
                                ASB100_REG_IN(i));
1013
                        data->in_min[i] = asb100_read_value(client,
1014
                                ASB100_REG_IN_MIN(i));
1015
                        data->in_max[i] = asb100_read_value(client,
1016
                                ASB100_REG_IN_MAX(i));
1017
                }
1018
 
1019
                /* 3 fan inputs */
1020
                for (i = 0; i < 3; i++) {
1021
                        data->fan[i] = asb100_read_value(client,
1022
                                        ASB100_REG_FAN(i));
1023
                        data->fan_min[i] = asb100_read_value(client,
1024
                                        ASB100_REG_FAN_MIN(i));
1025
                }
1026
 
1027
                /* 4 temperature inputs */
1028
                for (i = 1; i <= 4; i++) {
1029
                        data->temp[i-1] = asb100_read_value(client,
1030
                                        ASB100_REG_TEMP(i));
1031
                        data->temp_max[i-1] = asb100_read_value(client,
1032
                                        ASB100_REG_TEMP_MAX(i));
1033
                        data->temp_hyst[i-1] = asb100_read_value(client,
1034
                                        ASB100_REG_TEMP_HYST(i));
1035
                }
1036
 
1037
                /* VID and fan divisors */
1038
                i = asb100_read_value(client, ASB100_REG_VID_FANDIV);
1039
                data->vid = i & 0x0f;
1040
                data->vid |= (asb100_read_value(client,
1041
                                ASB100_REG_CHIPID) & 0x01) << 4;
1042
                data->fan_div[0] = (i >> 4) & 0x03;
1043
                data->fan_div[1] = (i >> 6) & 0x03;
1044
                data->fan_div[2] = (asb100_read_value(client,
1045
                                ASB100_REG_PIN) >> 6) & 0x03;
1046
 
1047
                /* PWM */
1048
                data->pwm = asb100_read_value(client, ASB100_REG_PWM1);
1049
 
1050
                /* alarms */
1051
                data->alarms = asb100_read_value(client, ASB100_REG_ALARM1) +
1052
                        (asb100_read_value(client, ASB100_REG_ALARM2) << 8);
1053
 
1054
                data->last_updated = jiffies;
1055
                data->valid = 1;
1056
 
1057
                dev_dbg(&client->dev, "... device update complete\n");
1058
        }
1059
 
1060
        mutex_unlock(&data->update_lock);
1061
 
1062
        return data;
1063
}
1064
 
1065
static int __init asb100_init(void)
1066
{
1067
        return i2c_add_driver(&asb100_driver);
1068
}
1069
 
1070
static void __exit asb100_exit(void)
1071
{
1072
        i2c_del_driver(&asb100_driver);
1073
}
1074
 
1075
MODULE_AUTHOR("Mark M. Hoffman <mhoffman@lightlink.com>");
1076
MODULE_DESCRIPTION("ASB100 Bach driver");
1077
MODULE_LICENSE("GPL");
1078
 
1079
module_init(asb100_init);
1080
module_exit(asb100_exit);
1081
 

powered by: WebSVN 2.1.0

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