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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [hwmon/] [max6650.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
 * max6650.c - Part of lm_sensors, Linux kernel modules for hardware
3
 *             monitoring.
4
 *
5
 * (C) 2007 by Hans J. Koch <hjk@linutronix.de>
6
 *
7
 * based on code written by John Morris <john.morris@spirentcom.com>
8
 * Copyright (c) 2003 Spirent Communications
9
 * and Claus Gindhart <claus.gindhart@kontron.com>
10
 *
11
 * This module has only been tested with the MAX6650 chip. It should
12
 * also work with the MAX6651. It does not distinguish max6650 and max6651
13
 * chips.
14
 *
15
 * Tha datasheet was last seen at:
16
 *
17
 *        http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
18
 *
19
 * This program is free software; you can redistribute it and/or modify
20
 * it under the terms of the GNU General Public License as published by
21
 * the Free Software Foundation; either version 2 of the License, or
22
 * (at your option) any later version.
23
 *
24
 * This program is distributed in the hope that it will be useful,
25
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27
 * GNU General Public License for more details.
28
 *
29
 * You should have received a copy of the GNU General Public License
30
 * along with this program; if not, write to the Free Software
31
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32
 */
33
 
34
#include <linux/module.h>
35
#include <linux/init.h>
36
#include <linux/slab.h>
37
#include <linux/jiffies.h>
38
#include <linux/i2c.h>
39
#include <linux/hwmon.h>
40
#include <linux/hwmon-sysfs.h>
41
#include <linux/err.h>
42
 
43
/*
44
 * Addresses to scan. There are four disjoint possibilities, by pin config.
45
 */
46
 
47
static unsigned short normal_i2c[] = {0x1b, 0x1f, 0x48, 0x4b, I2C_CLIENT_END};
48
 
49
/*
50
 * Insmod parameters
51
 */
52
 
53
/* fan_voltage: 5=5V fan, 12=12V fan, 0=don't change */
54
static int fan_voltage;
55
/* prescaler: Possible values are 1, 2, 4, 8, 16 or 0 for don't change */
56
static int prescaler;
57
/* clock: The clock frequency of the chip the driver should assume */
58
static int clock = 254000;
59
 
60
module_param(fan_voltage, int, S_IRUGO);
61
module_param(prescaler, int, S_IRUGO);
62
module_param(clock, int, S_IRUGO);
63
 
64
I2C_CLIENT_INSMOD_1(max6650);
65
 
66
/*
67
 * MAX 6650/6651 registers
68
 */
69
 
70
#define MAX6650_REG_SPEED       0x00
71
#define MAX6650_REG_CONFIG      0x02
72
#define MAX6650_REG_GPIO_DEF    0x04
73
#define MAX6650_REG_DAC         0x06
74
#define MAX6650_REG_ALARM_EN    0x08
75
#define MAX6650_REG_ALARM       0x0A
76
#define MAX6650_REG_TACH0       0x0C
77
#define MAX6650_REG_TACH1       0x0E
78
#define MAX6650_REG_TACH2       0x10
79
#define MAX6650_REG_TACH3       0x12
80
#define MAX6650_REG_GPIO_STAT   0x14
81
#define MAX6650_REG_COUNT       0x16
82
 
83
/*
84
 * Config register bits
85
 */
86
 
87
#define MAX6650_CFG_V12                 0x08
88
#define MAX6650_CFG_PRESCALER_MASK      0x07
89
#define MAX6650_CFG_PRESCALER_2         0x01
90
#define MAX6650_CFG_PRESCALER_4         0x02
91
#define MAX6650_CFG_PRESCALER_8         0x03
92
#define MAX6650_CFG_PRESCALER_16        0x04
93
#define MAX6650_CFG_MODE_MASK           0x30
94
#define MAX6650_CFG_MODE_ON             0x00
95
#define MAX6650_CFG_MODE_OFF            0x10
96
#define MAX6650_CFG_MODE_CLOSED_LOOP    0x20
97
#define MAX6650_CFG_MODE_OPEN_LOOP      0x30
98
#define MAX6650_COUNT_MASK              0x03
99
 
100
/* Minimum and maximum values of the FAN-RPM */
101
#define FAN_RPM_MIN 240
102
#define FAN_RPM_MAX 30000
103
 
104
#define DIV_FROM_REG(reg) (1 << (reg & 7))
105
 
106
static int max6650_attach_adapter(struct i2c_adapter *adapter);
107
static int max6650_detect(struct i2c_adapter *adapter, int address, int kind);
108
static int max6650_init_client(struct i2c_client *client);
109
static int max6650_detach_client(struct i2c_client *client);
110
static struct max6650_data *max6650_update_device(struct device *dev);
111
 
112
/*
113
 * Driver data (common to all clients)
114
 */
115
 
116
static struct i2c_driver max6650_driver = {
117
        .driver = {
118
                .name   = "max6650",
119
        },
120
        .attach_adapter = max6650_attach_adapter,
121
        .detach_client  = max6650_detach_client,
122
};
123
 
124
/*
125
 * Client data (each client gets its own)
126
 */
127
 
128
struct max6650_data
129
{
130
        struct i2c_client client;
131
        struct device *hwmon_dev;
132
        struct mutex update_lock;
133
        char valid; /* zero until following fields are valid */
134
        unsigned long last_updated; /* in jiffies */
135
 
136
        /* register values */
137
        u8 speed;
138
        u8 config;
139
        u8 tach[4];
140
        u8 count;
141
        u8 dac;
142
};
143
 
144
static ssize_t get_fan(struct device *dev, struct device_attribute *devattr,
145
                       char *buf)
146
{
147
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
148
        struct max6650_data *data = max6650_update_device(dev);
149
        int rpm;
150
 
151
        /*
152
        * Calculation details:
153
        *
154
        * Each tachometer counts over an interval given by the "count"
155
        * register (0.25, 0.5, 1 or 2 seconds). This module assumes
156
        * that the fans produce two pulses per revolution (this seems
157
        * to be the most common).
158
        */
159
 
160
        rpm = ((data->tach[attr->index] * 120) / DIV_FROM_REG(data->count));
161
        return sprintf(buf, "%d\n", rpm);
162
}
163
 
164
/*
165
 * Set the fan speed to the specified RPM (or read back the RPM setting).
166
 * This works in closed loop mode only. Use pwm1 for open loop speed setting.
167
 *
168
 * The MAX6650/1 will automatically control fan speed when in closed loop
169
 * mode.
170
 *
171
 * Assumptions:
172
 *
173
 * 1) The MAX6650/1 internal 254kHz clock frequency is set correctly. Use
174
 *    the clock module parameter if you need to fine tune this.
175
 *
176
 * 2) The prescaler (low three bits of the config register) has already
177
 *    been set to an appropriate value. Use the prescaler module parameter
178
 *    if your BIOS doesn't initialize the chip properly.
179
 *
180
 * The relevant equations are given on pages 21 and 22 of the datasheet.
181
 *
182
 * From the datasheet, the relevant equation when in regulation is:
183
 *
184
 *    [fCLK / (128 x (KTACH + 1))] = 2 x FanSpeed / KSCALE
185
 *
186
 * where:
187
 *
188
 *    fCLK is the oscillator frequency (either the 254kHz internal
189
 *         oscillator or the externally applied clock)
190
 *
191
 *    KTACH is the value in the speed register
192
 *
193
 *    FanSpeed is the speed of the fan in rps
194
 *
195
 *    KSCALE is the prescaler value (1, 2, 4, 8, or 16)
196
 *
197
 * When reading, we need to solve for FanSpeed. When writing, we need to
198
 * solve for KTACH.
199
 *
200
 * Note: this tachometer is completely separate from the tachometers
201
 * used to measure the fan speeds. Only one fan's speed (fan1) is
202
 * controlled.
203
 */
204
 
205
static ssize_t get_target(struct device *dev, struct device_attribute *devattr,
206
                         char *buf)
207
{
208
        struct max6650_data *data = max6650_update_device(dev);
209
        int kscale, ktach, rpm;
210
 
211
        /*
212
        * Use the datasheet equation:
213
        *
214
        *    FanSpeed = KSCALE x fCLK / [256 x (KTACH + 1)]
215
        *
216
        * then multiply by 60 to give rpm.
217
        */
218
 
219
        kscale = DIV_FROM_REG(data->config);
220
        ktach = data->speed;
221
        rpm = 60 * kscale * clock / (256 * (ktach + 1));
222
        return sprintf(buf, "%d\n", rpm);
223
}
224
 
225
static ssize_t set_target(struct device *dev, struct device_attribute *devattr,
226
                         const char *buf, size_t count)
227
{
228
        struct i2c_client *client = to_i2c_client(dev);
229
        struct max6650_data *data = i2c_get_clientdata(client);
230
        int rpm = simple_strtoul(buf, NULL, 10);
231
        int kscale, ktach;
232
 
233
        rpm = SENSORS_LIMIT(rpm, FAN_RPM_MIN, FAN_RPM_MAX);
234
 
235
        /*
236
        * Divide the required speed by 60 to get from rpm to rps, then
237
        * use the datasheet equation:
238
        *
239
        *     KTACH = [(fCLK x KSCALE) / (256 x FanSpeed)] - 1
240
        */
241
 
242
        mutex_lock(&data->update_lock);
243
 
244
        kscale = DIV_FROM_REG(data->config);
245
        ktach = ((clock * kscale) / (256 * rpm / 60)) - 1;
246
        if (ktach < 0)
247
                ktach = 0;
248
        if (ktach > 255)
249
                ktach = 255;
250
        data->speed = ktach;
251
 
252
        i2c_smbus_write_byte_data(client, MAX6650_REG_SPEED, data->speed);
253
 
254
        mutex_unlock(&data->update_lock);
255
 
256
        return count;
257
}
258
 
259
/*
260
 * Get/set the fan speed in open loop mode using pwm1 sysfs file.
261
 * Speed is given as a relative value from 0 to 255, where 255 is maximum
262
 * speed. Note that this is done by writing directly to the chip's DAC,
263
 * it won't change the closed loop speed set by fan1_target.
264
 * Also note that due to rounding errors it is possible that you don't read
265
 * back exactly the value you have set.
266
 */
267
 
268
static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr,
269
                       char *buf)
270
{
271
        int pwm;
272
        struct max6650_data *data = max6650_update_device(dev);
273
 
274
        /* Useful range for dac is 0-180 for 12V fans and 0-76 for 5V fans.
275
           Lower DAC values mean higher speeds. */
276
        if (data->config & MAX6650_CFG_V12)
277
                pwm = 255 - (255 * (int)data->dac)/180;
278
        else
279
                pwm = 255 - (255 * (int)data->dac)/76;
280
 
281
        if (pwm < 0)
282
                pwm = 0;
283
 
284
        return sprintf(buf, "%d\n", pwm);
285
}
286
 
287
static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
288
                        const char *buf, size_t count)
289
{
290
        struct i2c_client *client = to_i2c_client(dev);
291
        struct max6650_data *data = i2c_get_clientdata(client);
292
        int pwm = simple_strtoul(buf, NULL, 10);
293
 
294
        pwm = SENSORS_LIMIT(pwm, 0, 255);
295
 
296
        mutex_lock(&data->update_lock);
297
 
298
        if (data->config & MAX6650_CFG_V12)
299
                data->dac = 180 - (180 * pwm)/255;
300
        else
301
                data->dac = 76 - (76 * pwm)/255;
302
 
303
        i2c_smbus_write_byte_data(client, MAX6650_REG_DAC, data->dac);
304
 
305
        mutex_unlock(&data->update_lock);
306
 
307
        return count;
308
}
309
 
310
/*
311
 * Get/Set controller mode:
312
 * Possible values:
313
 * 0 = Fan always on
314
 * 1 = Open loop, Voltage is set according to speed, not regulated.
315
 * 2 = Closed loop, RPM for all fans regulated by fan1 tachometer
316
 */
317
 
318
static ssize_t get_enable(struct device *dev, struct device_attribute *devattr,
319
                          char *buf)
320
{
321
        struct max6650_data *data = max6650_update_device(dev);
322
        int mode = (data->config & MAX6650_CFG_MODE_MASK) >> 4;
323
        int sysfs_modes[4] = {0, 1, 2, 1};
324
 
325
        return sprintf(buf, "%d\n", sysfs_modes[mode]);
326
}
327
 
328
static ssize_t set_enable(struct device *dev, struct device_attribute *devattr,
329
                          const char *buf, size_t count)
330
{
331
        struct i2c_client *client = to_i2c_client(dev);
332
        struct max6650_data *data = i2c_get_clientdata(client);
333
        int mode = simple_strtoul(buf, NULL, 10);
334
        int max6650_modes[3] = {0, 3, 2};
335
 
336
        if ((mode < 0)||(mode > 2)) {
337
                dev_err(&client->dev,
338
                        "illegal value for pwm1_enable (%d)\n", mode);
339
                return -EINVAL;
340
        }
341
 
342
        mutex_lock(&data->update_lock);
343
 
344
        data->config = i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG);
345
        data->config = (data->config & ~MAX6650_CFG_MODE_MASK)
346
                       | (max6650_modes[mode] << 4);
347
 
348
        i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, data->config);
349
 
350
        mutex_unlock(&data->update_lock);
351
 
352
        return count;
353
}
354
 
355
/*
356
 * Read/write functions for fan1_div sysfs file. The MAX6650 has no such
357
 * divider. We handle this by converting between divider and counttime:
358
 *
359
 * (counttime == k) <==> (divider == 2^k), k = 0, 1, 2, or 3
360
 *
361
 * Lower values of k allow to connect a faster fan without the risk of
362
 * counter overflow. The price is lower resolution. You can also set counttime
363
 * using the module parameter. Note that the module parameter "prescaler" also
364
 * influences the behaviour. Unfortunately, there's no sysfs attribute
365
 * defined for that. See the data sheet for details.
366
 */
367
 
368
static ssize_t get_div(struct device *dev, struct device_attribute *devattr,
369
                       char *buf)
370
{
371
        struct max6650_data *data = max6650_update_device(dev);
372
 
373
        return sprintf(buf, "%d\n", DIV_FROM_REG(data->count));
374
}
375
 
376
static ssize_t set_div(struct device *dev, struct device_attribute *devattr,
377
                       const char *buf, size_t count)
378
{
379
        struct i2c_client *client = to_i2c_client(dev);
380
        struct max6650_data *data = i2c_get_clientdata(client);
381
        int div = simple_strtoul(buf, NULL, 10);
382
 
383
        mutex_lock(&data->update_lock);
384
        switch (div) {
385
        case 1:
386
                data->count = 0;
387
                break;
388
        case 2:
389
                data->count = 1;
390
                break;
391
        case 4:
392
                data->count = 2;
393
                break;
394
        case 8:
395
                data->count = 3;
396
                break;
397
        default:
398
                dev_err(&client->dev,
399
                        "illegal value for fan divider (%d)\n", div);
400
                return -EINVAL;
401
        }
402
 
403
        i2c_smbus_write_byte_data(client, MAX6650_REG_COUNT, data->count);
404
        mutex_unlock(&data->update_lock);
405
 
406
        return count;
407
}
408
 
409
static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0);
410
static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1);
411
static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2);
412
static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3);
413
static DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, get_target, set_target);
414
static DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_div, set_div);
415
static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, get_enable, set_enable);
416
static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm);
417
 
418
 
419
static struct attribute *max6650_attrs[] = {
420
        &sensor_dev_attr_fan1_input.dev_attr.attr,
421
        &sensor_dev_attr_fan2_input.dev_attr.attr,
422
        &sensor_dev_attr_fan3_input.dev_attr.attr,
423
        &sensor_dev_attr_fan4_input.dev_attr.attr,
424
        &dev_attr_fan1_target.attr,
425
        &dev_attr_fan1_div.attr,
426
        &dev_attr_pwm1_enable.attr,
427
        &dev_attr_pwm1.attr,
428
        NULL
429
};
430
 
431
static struct attribute_group max6650_attr_grp = {
432
        .attrs = max6650_attrs,
433
};
434
 
435
/*
436
 * Real code
437
 */
438
 
439
static int max6650_attach_adapter(struct i2c_adapter *adapter)
440
{
441
        if (!(adapter->class & I2C_CLASS_HWMON)) {
442
                dev_dbg(&adapter->dev,
443
                        "FATAL: max6650_attach_adapter class HWMON not set\n");
444
                return 0;
445
        }
446
 
447
        return i2c_probe(adapter, &addr_data, max6650_detect);
448
}
449
 
450
/*
451
 * The following function does more than just detection. If detection
452
 * succeeds, it also registers the new chip.
453
 */
454
 
455
static int max6650_detect(struct i2c_adapter *adapter, int address, int kind)
456
{
457
        struct i2c_client *client;
458
        struct max6650_data *data;
459
        int err = -ENODEV;
460
 
461
        dev_dbg(&adapter->dev, "max6650_detect called, kind = %d\n", kind);
462
 
463
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
464
                dev_dbg(&adapter->dev, "max6650: I2C bus doesn't support "
465
                                        "byte read mode, skipping.\n");
466
                return 0;
467
        }
468
 
469
        if (!(data = kzalloc(sizeof(struct max6650_data), GFP_KERNEL))) {
470
                dev_err(&adapter->dev, "max6650: out of memory.\n");
471
                return -ENOMEM;
472
        }
473
 
474
        client = &data->client;
475
        i2c_set_clientdata(client, data);
476
        client->addr = address;
477
        client->adapter = adapter;
478
        client->driver = &max6650_driver;
479
 
480
        /*
481
         * Now we do the remaining detection. A negative kind means that
482
         * the driver was loaded with no force parameter (default), so we
483
         * must both detect and identify the chip (actually there is only
484
         * one possible kind of chip for now, max6650). A zero kind means that
485
         * the driver was loaded with the force parameter, the detection
486
         * step shall be skipped. A positive kind means that the driver
487
         * was loaded with the force parameter and a given kind of chip is
488
         * requested, so both the detection and the identification steps
489
         * are skipped.
490
         *
491
         * Currently I can find no way to distinguish between a MAX6650 and
492
         * a MAX6651. This driver has only been tried on the former.
493
         */
494
 
495
        if ((kind < 0) &&
496
           (  (i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG) & 0xC0)
497
            ||(i2c_smbus_read_byte_data(client, MAX6650_REG_GPIO_STAT) & 0xE0)
498
            ||(i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM_EN) & 0xE0)
499
            ||(i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM) & 0xE0)
500
            ||(i2c_smbus_read_byte_data(client, MAX6650_REG_COUNT) & 0xFC))) {
501
                dev_dbg(&adapter->dev,
502
                        "max6650: detection failed at 0x%02x.\n", address);
503
                goto err_free;
504
        }
505
 
506
        dev_info(&adapter->dev, "max6650: chip found at 0x%02x.\n", address);
507
 
508
        strlcpy(client->name, "max6650", I2C_NAME_SIZE);
509
        mutex_init(&data->update_lock);
510
 
511
        if ((err = i2c_attach_client(client))) {
512
                dev_err(&adapter->dev, "max6650: failed to attach client.\n");
513
                goto err_free;
514
        }
515
 
516
        /*
517
         * Initialize the max6650 chip
518
         */
519
        if (max6650_init_client(client))
520
                goto err_detach;
521
 
522
        err = sysfs_create_group(&client->dev.kobj, &max6650_attr_grp);
523
        if (err)
524
                goto err_detach;
525
 
526
        data->hwmon_dev = hwmon_device_register(&client->dev);
527
        if (!IS_ERR(data->hwmon_dev))
528
                return 0;
529
 
530
        err = PTR_ERR(data->hwmon_dev);
531
        dev_err(&client->dev, "error registering hwmon device.\n");
532
        sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp);
533
err_detach:
534
        i2c_detach_client(client);
535
err_free:
536
        kfree(data);
537
        return err;
538
}
539
 
540
static int max6650_detach_client(struct i2c_client *client)
541
{
542
        struct max6650_data *data = i2c_get_clientdata(client);
543
        int err;
544
 
545
        sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp);
546
        hwmon_device_unregister(data->hwmon_dev);
547
        err = i2c_detach_client(client);
548
        if (!err)
549
                kfree(data);
550
        return err;
551
}
552
 
553
static int max6650_init_client(struct i2c_client *client)
554
{
555
        struct max6650_data *data = i2c_get_clientdata(client);
556
        int config;
557
        int err = -EIO;
558
 
559
        config = i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG);
560
 
561
        if (config < 0) {
562
                dev_err(&client->dev, "Error reading config, aborting.\n");
563
                return err;
564
        }
565
 
566
        switch (fan_voltage) {
567
                case 0:
568
                        break;
569
                case 5:
570
                        config &= ~MAX6650_CFG_V12;
571
                        break;
572
                case 12:
573
                        config |= MAX6650_CFG_V12;
574
                        break;
575
                default:
576
                        dev_err(&client->dev,
577
                                "illegal value for fan_voltage (%d)\n",
578
                                fan_voltage);
579
        }
580
 
581
        dev_info(&client->dev, "Fan voltage is set to %dV.\n",
582
                 (config & MAX6650_CFG_V12) ? 12 : 5);
583
 
584
        switch (prescaler) {
585
                case 0:
586
                        break;
587
                case 1:
588
                        config &= ~MAX6650_CFG_PRESCALER_MASK;
589
                        break;
590
                case 2:
591
                        config = (config & ~MAX6650_CFG_PRESCALER_MASK)
592
                                 | MAX6650_CFG_PRESCALER_2;
593
                        break;
594
                case  4:
595
                        config = (config & ~MAX6650_CFG_PRESCALER_MASK)
596
                                 | MAX6650_CFG_PRESCALER_4;
597
                        break;
598
                case  8:
599
                        config = (config & ~MAX6650_CFG_PRESCALER_MASK)
600
                                 | MAX6650_CFG_PRESCALER_8;
601
                        break;
602
                case 16:
603
                        config = (config & ~MAX6650_CFG_PRESCALER_MASK)
604
                                 | MAX6650_CFG_PRESCALER_16;
605
                        break;
606
                default:
607
                        dev_err(&client->dev,
608
                                "illegal value for prescaler (%d)\n",
609
                                prescaler);
610
        }
611
 
612
        dev_info(&client->dev, "Prescaler is set to %d.\n",
613
                 1 << (config & MAX6650_CFG_PRESCALER_MASK));
614
 
615
        /* If mode is set to "full off", we change it to "open loop" and
616
         * set DAC to 255, which has the same effect. We do this because
617
         * there's no "full off" mode defined in hwmon specifcations.
618
         */
619
 
620
        if ((config & MAX6650_CFG_MODE_MASK) == MAX6650_CFG_MODE_OFF) {
621
                dev_dbg(&client->dev, "Change mode to open loop, full off.\n");
622
                config = (config & ~MAX6650_CFG_MODE_MASK)
623
                         | MAX6650_CFG_MODE_OPEN_LOOP;
624
                if (i2c_smbus_write_byte_data(client, MAX6650_REG_DAC, 255)) {
625
                        dev_err(&client->dev, "DAC write error, aborting.\n");
626
                        return err;
627
                }
628
        }
629
 
630
        if (i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, config)) {
631
                dev_err(&client->dev, "Config write error, aborting.\n");
632
                return err;
633
        }
634
 
635
        data->config = config;
636
        data->count = i2c_smbus_read_byte_data(client, MAX6650_REG_COUNT);
637
 
638
        return 0;
639
}
640
 
641
static const u8 tach_reg[] = {
642
        MAX6650_REG_TACH0,
643
        MAX6650_REG_TACH1,
644
        MAX6650_REG_TACH2,
645
        MAX6650_REG_TACH3,
646
};
647
 
648
static struct max6650_data *max6650_update_device(struct device *dev)
649
{
650
        int i;
651
        struct i2c_client *client = to_i2c_client(dev);
652
        struct max6650_data *data = i2c_get_clientdata(client);
653
 
654
        mutex_lock(&data->update_lock);
655
 
656
        if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
657
                data->speed = i2c_smbus_read_byte_data(client,
658
                                                       MAX6650_REG_SPEED);
659
                data->config = i2c_smbus_read_byte_data(client,
660
                                                        MAX6650_REG_CONFIG);
661
                for (i = 0; i < 4; i++) {
662
                        data->tach[i] = i2c_smbus_read_byte_data(client,
663
                                                                 tach_reg[i]);
664
                }
665
                data->count = i2c_smbus_read_byte_data(client,
666
                                                        MAX6650_REG_COUNT);
667
                data->dac = i2c_smbus_read_byte_data(client, MAX6650_REG_DAC);
668
 
669
                data->last_updated = jiffies;
670
                data->valid = 1;
671
        }
672
 
673
        mutex_unlock(&data->update_lock);
674
 
675
        return data;
676
}
677
 
678
static int __init sensors_max6650_init(void)
679
{
680
        return i2c_add_driver(&max6650_driver);
681
}
682
 
683
static void __exit sensors_max6650_exit(void)
684
{
685
        i2c_del_driver(&max6650_driver);
686
}
687
 
688
MODULE_AUTHOR("Hans J. Koch");
689
MODULE_DESCRIPTION("MAX6650 sensor driver");
690
MODULE_LICENSE("GPL");
691
 
692
module_init(sensors_max6650_init);
693
module_exit(sensors_max6650_exit);

powered by: WebSVN 2.1.0

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