blob: 8ade1be61a39289c64846355c92776365a9b5c68 [file] [log] [blame]
Edward A. James537225b2017-05-16 16:05:46 -05001From b3991e27b26930ef46206dad17715d8ac2f38a4e Mon Sep 17 00:00:00 2001
2From: Timothy Pearson <tpearson@raptorengineering.com>
3Date: Tue, 11 Oct 2016 09:35:51 -0500
4Subject: [PATCH] hwmon: Add support for MAX31785 intelligent fan controller
5
6Add a basic driver for the MAX31785, focusing on the fan control
7features but ignoring the temperature and voltage monitoring
8features of the device.
9
10This driver supports all fan control modes and tachometer / PWM
11readback where applicable.
12
13Signed-off-by: Timothy Pearson <tpearson@raptorengineering.com>
14Signed-off-by: Joel Stanley <joel@jms.id.au>
15---
16 Documentation/hwmon/max31785 | 36 +++
17 drivers/hwmon/Kconfig | 10 +
18 drivers/hwmon/Makefile | 1 +
19 drivers/hwmon/max31785.c | 714 +++++++++++++++++++++++++++++++++++++++++++
20 4 files changed, 761 insertions(+)
21 create mode 100644 Documentation/hwmon/max31785
22 create mode 100644 drivers/hwmon/max31785.c
23
24diff --git a/Documentation/hwmon/max31785 b/Documentation/hwmon/max31785
25new file mode 100644
26index 0000000..0911d20
27--- /dev/null
28+++ b/Documentation/hwmon/max31785
29@@ -0,0 +1,36 @@
30+Kernel driver max31785
31+======================
32+
33+Supported chips:
34+ * Maxim MAX31785
35+ Prefix: 'max31785'
36+ Addresses scanned: 0x52 0x53 0x54 0x55
37+ Datasheet: http://pdfserv.maximintegrated.com/en/ds/MAX31785.pdf
38+
39+Author: Timothy Pearson <tpearson@raptorengineering.com>
40+
41+
42+Description
43+-----------
44+
45+This driver implements support for the Maxim MAX31785 chip.
46+
47+The MAX31785 controls the speeds of up to six fans using six independent
48+PWM outputs. The desired fan speeds (or PWM duty cycles) are written
49+through the I2C interface. The outputs drive "4-wire" fans directly,
50+or can be used to modulate the fan's power terminals using an external
51+pass transistor.
52+
53+Tachometer inputs monitor fan tachometer logic outputs for precise (+/-1%)
54+monitoring and control of fan RPM as well as detection of fan failure.
55+
56+
57+Sysfs entries
58+-------------
59+
60+fan[1-6]_input RO fan tachometer speed in RPM
61+fan[1-6]_fault RO fan experienced fault
62+fan[1-6]_pulses RW tachometer pulses per fan revolution
63+fan[1-6]_target RW desired fan speed in RPM
64+pwm[1-6]_enable RW pwm mode, 0=disabled, 1=pwm, 2=rpm, 3=automatic
65+pwm[1-6] RW fan target duty cycle (0-255)
66diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
67index 190d270..136605d 100644
68--- a/drivers/hwmon/Kconfig
69+++ b/drivers/hwmon/Kconfig
70@@ -886,6 +886,16 @@ config SENSORS_MAX6697
71 This driver can also be built as a module. If so, the module
72 will be called max6697.
73
74+config SENSORS_MAX31785
75+ tristate "Maxim MAX31785 sensor chip"
76+ depends on I2C
77+ help
78+ If you say yes here you get support for 6-Channel PWM-Output
79+ Fan RPM Controller.
80+
81+ This driver can also be built as a module. If so, the module
82+ will be called max31785.
83+
84 config SENSORS_MAX31790
85 tristate "Maxim MAX31790 sensor chip"
86 depends on I2C
87diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
88index d2cb7e8..e8ba5c6 100644
89--- a/drivers/hwmon/Makefile
90+++ b/drivers/hwmon/Makefile
91@@ -119,6 +119,7 @@ obj-$(CONFIG_SENSORS_MAX6639) += max6639.o
92 obj-$(CONFIG_SENSORS_MAX6642) += max6642.o
93 obj-$(CONFIG_SENSORS_MAX6650) += max6650.o
94 obj-$(CONFIG_SENSORS_MAX6697) += max6697.o
95+obj-$(CONFIG_SENSORS_MAX31785) += max31785.o
96 obj-$(CONFIG_SENSORS_MAX31790) += max31790.o
97 obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
98 obj-$(CONFIG_SENSORS_MCP3021) += mcp3021.o
99diff --git a/drivers/hwmon/max31785.c b/drivers/hwmon/max31785.c
100new file mode 100644
101index 0000000..fb7b3f0
102--- /dev/null
103+++ b/drivers/hwmon/max31785.c
104@@ -0,0 +1,714 @@
105+/*
106+ * max31785.c - Part of lm_sensors, Linux kernel modules for hardware
107+ * monitoring.
108+ *
109+ * (C) 2016 Raptor Engineering, LLC
110+ *
111+ * This program is free software; you can redistribute it and/or modify
112+ * it under the terms of the GNU General Public License as published by
113+ * the Free Software Foundation; either version 2 of the License, or
114+ * (at your option) any later version.
115+ *
116+ * This program is distributed in the hope that it will be useful,
117+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
118+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
119+ * GNU General Public License for more details.
120+ */
121+
122+#include <linux/err.h>
123+#include <linux/hwmon.h>
124+#include <linux/hwmon-sysfs.h>
125+#include <linux/i2c.h>
126+#include <linux/init.h>
127+#include <linux/jiffies.h>
128+#include <linux/module.h>
129+#include <linux/slab.h>
130+
131+/* MAX31785 device IDs */
132+#define MAX31785_MFR_ID 0x4d
133+#define MAX31785_MFR_MODEL 0x53
134+
135+/* MAX31785 registers */
136+#define MAX31785_REG_PAGE 0x00
137+#define MAX31785_PAGE_FAN_CONFIG(ch) (0x00 + (ch))
138+#define MAX31785_REG_FAN_CONFIG_1_2 0x3a
139+#define MAX31785_REG_FAN_COMMAND_1 0x3b
140+#define MAX31785_REG_STATUS_FANS_1_2 0x81
141+#define MAX31785_REG_FAN_SPEED_1 0x90
142+#define MAX31785_REG_MFR_ID 0x99
143+#define MAX31785_REG_MFR_MODEL 0x9a
144+#define MAX31785_REG_MFR_FAN_CONFIG 0xf1
145+#define MAX31785_REG_READ_FAN_PWM 0xf3
146+
147+/* Fan Config register bits */
148+#define MAX31785_FAN_CFG_PWM_ENABLE 0x80
149+#define MAX31785_FAN_CFG_CONTROL_MODE_RPM 0x40
150+#define MAX31785_FAN_CFG_PULSE_MASK 0x30
151+#define MAX31785_FAN_CFG_PULSE_SHIFT 4
152+#define MAX31785_FAN_CFG_PULSE_OFFSET 1
153+
154+/* Fan Status register bits */
155+#define MAX31785_FAN_STATUS_FAULT_MASK 0x80
156+
157+/* Fan Command constants */
158+#define MAX31785_FAN_COMMAND_PWM_RATIO 40
159+
160+#define NR_CHANNEL 6
161+
162+/* Addresses to scan */
163+static const unsigned short normal_i2c[] = { 0x52, 0x53, 0x54, 0x55,
164+ I2C_CLIENT_END };
165+
166+/*
167+ * Client data (each client gets its own)
168+ */
169+struct max31785_data {
170+ struct i2c_client *client;
171+ struct mutex device_lock;
172+ bool valid; /* zero until following fields are valid */
173+ unsigned long last_updated; /* in jiffies */
174+
175+ /* register values */
176+ u8 fan_config[NR_CHANNEL];
177+ u16 fan_command[NR_CHANNEL];
178+ u8 mfr_fan_config[NR_CHANNEL];
179+ u8 fault_status[NR_CHANNEL];
180+ u16 tach_rpm[NR_CHANNEL];
181+ u16 pwm[NR_CHANNEL];
182+};
183+
184+static int max31785_set_page(struct i2c_client *client,
185+ u8 page)
186+{
187+ return i2c_smbus_write_byte_data(client,
188+ MAX31785_REG_PAGE,
189+ page);
190+}
191+
192+static int max31785_read_fan_data(struct i2c_client *client,
193+ u8 fan, u8 reg, u8 byte_mode)
194+{
195+ int rv;
196+
197+ rv = max31785_set_page(client, MAX31785_PAGE_FAN_CONFIG(fan));
198+ if (rv < 0)
199+ return rv;
200+
201+ if (byte_mode)
202+ rv = i2c_smbus_read_byte_data(client, reg);
203+ else
204+ rv = i2c_smbus_read_word_data(client, reg);
205+
206+ return rv;
207+}
208+
209+static int max31785_write_fan_data(struct i2c_client *client,
210+ u8 fan, u8 reg, u16 data,
211+ u8 byte_mode)
212+{
213+ int err;
214+
215+ err = max31785_set_page(client, MAX31785_PAGE_FAN_CONFIG(fan));
216+ if (err < 0)
217+ return err;
218+
219+ if (byte_mode)
220+ err = i2c_smbus_write_byte_data(client, reg, data);
221+ else
222+ err = i2c_smbus_write_word_data(client, reg, data);
223+
224+ if (err < 0)
225+ return err;
226+
227+ return 0;
228+}
229+
230+static bool is_automatic_control_mode(struct max31785_data *data,
231+ int index)
232+{
233+ if (data->fan_command[index] > 0x7fff)
234+ return true;
235+ else
236+ return false;
237+}
238+
239+static struct max31785_data *max31785_update_device(struct device *dev)
240+{
241+ struct max31785_data *data = dev_get_drvdata(dev);
242+ struct i2c_client *client = data->client;
243+ struct max31785_data *ret = data;
244+ int i;
245+ int rv;
246+
247+ mutex_lock(&data->device_lock);
248+
249+ if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
250+ for (i = 0; i < NR_CHANNEL; i++) {
251+ rv = max31785_read_fan_data(client, i,
252+ MAX31785_REG_STATUS_FANS_1_2, 1);
253+ if (rv < 0)
254+ goto abort;
255+ data->fault_status[i] = rv;
256+
257+ rv = max31785_read_fan_data(client, i,
258+ MAX31785_REG_FAN_SPEED_1, 0);
259+ if (rv < 0)
260+ goto abort;
261+ data->tach_rpm[i] = rv;
262+
263+ if ((data->fan_config[i]
264+ & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
265+ || is_automatic_control_mode(data, i)) {
266+ rv = max31785_read_fan_data(client, i,
267+ MAX31785_REG_READ_FAN_PWM, 0);
268+ if (rv < 0)
269+ goto abort;
270+ data->pwm[i] = rv;
271+ }
272+
273+ if (!is_automatic_control_mode(data, i)) {
274+ /* Poke watchdog for manual fan control */
275+ rv = max31785_write_fan_data(client,
276+ i, MAX31785_REG_FAN_COMMAND_1,
277+ data->fan_command[i], 0);
278+ if (rv < 0)
279+ goto abort;
280+ }
281+ }
282+
283+ data->last_updated = jiffies;
284+ data->valid = true;
285+ }
286+ goto done;
287+
288+abort:
289+ data->valid = false;
290+ ret = ERR_PTR(rv);
291+
292+done:
293+ mutex_unlock(&data->device_lock);
294+
295+ return ret;
296+}
297+
298+static ssize_t get_fan(struct device *dev,
299+ struct device_attribute *devattr, char *buf)
300+{
301+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
302+ struct max31785_data *data = max31785_update_device(dev);
303+
304+ if (IS_ERR(data))
305+ return PTR_ERR(data);
306+
307+ return sprintf(buf, "%d\n", data->tach_rpm[attr->index]);
308+}
309+
310+static ssize_t get_fan_target(struct device *dev,
311+ struct device_attribute *devattr, char *buf)
312+{
313+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
314+ struct max31785_data *data = max31785_update_device(dev);
315+ int rpm;
316+
317+ if (IS_ERR(data))
318+ return PTR_ERR(data);
319+
320+ if (data->fan_config[attr->index]
321+ & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
322+ rpm = data->fan_command[attr->index];
323+ else
324+ rpm = data->fan_command[attr->index]
325+ / MAX31785_FAN_COMMAND_PWM_RATIO;
326+
327+ return sprintf(buf, "%d\n", rpm);
328+}
329+
330+static ssize_t set_fan_target(struct device *dev,
331+ struct device_attribute *devattr,
332+ const char *buf, size_t count)
333+{
334+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
335+ struct max31785_data *data = dev_get_drvdata(dev);
336+ struct i2c_client *client = data->client;
337+ unsigned long rpm;
338+ int err;
339+
340+ err = kstrtoul(buf, 10, &rpm);
341+ if (err)
342+ return err;
343+
344+ if (rpm > 0x7fff)
345+ return -EINVAL;
346+
347+ mutex_lock(&data->device_lock);
348+
349+ /* Write new RPM value */
350+ data->fan_command[attr->index] = rpm;
351+ err = max31785_write_fan_data(client, attr->index,
352+ MAX31785_REG_FAN_COMMAND_1,
353+ data->fan_command[attr->index], 0);
354+
355+ mutex_unlock(&data->device_lock);
356+
357+ if (err < 0)
358+ return err;
359+
360+ return count;
361+}
362+
363+static ssize_t get_fan_pulses(struct device *dev,
364+ struct device_attribute *devattr, char *buf)
365+{
366+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
367+ struct max31785_data *data = max31785_update_device(dev);
368+ int pulses;
369+
370+ if (IS_ERR(data))
371+ return PTR_ERR(data);
372+
373+ pulses = ((data->fan_config[attr->index] & MAX31785_FAN_CFG_PULSE_MASK)
374+ >> MAX31785_FAN_CFG_PULSE_SHIFT)
375+ + MAX31785_FAN_CFG_PULSE_OFFSET;
376+
377+ return sprintf(buf, "%d\n", pulses);
378+}
379+
380+static ssize_t set_fan_pulses(struct device *dev,
381+ struct device_attribute *devattr,
382+ const char *buf, size_t count)
383+{
384+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
385+ struct max31785_data *data = dev_get_drvdata(dev);
386+ struct i2c_client *client = data->client;
387+ unsigned long pulses;
388+ int err;
389+
390+ err = kstrtoul(buf, 10, &pulses);
391+ if (err)
392+ return err;
393+
394+ if (pulses > 4)
395+ return -EINVAL;
396+
397+ data->fan_config[attr->index] &= MAX31785_FAN_CFG_PULSE_MASK;
398+ data->fan_config[attr->index] |=
399+ ((pulses - MAX31785_FAN_CFG_PULSE_OFFSET)
400+ << MAX31785_FAN_CFG_PULSE_SHIFT);
401+
402+ mutex_lock(&data->device_lock);
403+
404+ /* Write new pulse value */
405+ data->fan_command[attr->index] = pulses;
406+ err = max31785_write_fan_data(client, attr->index,
407+ MAX31785_REG_FAN_CONFIG_1_2,
408+ data->fan_config[attr->index], 1);
409+
410+ mutex_unlock(&data->device_lock);
411+
412+ if (err < 0)
413+ return err;
414+
415+ return count;
416+}
417+
418+static ssize_t get_pwm(struct device *dev,
419+ struct device_attribute *devattr, char *buf)
420+{
421+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
422+ struct max31785_data *data = max31785_update_device(dev);
423+ int pwm;
424+
425+ if (IS_ERR(data))
426+ return PTR_ERR(data);
427+
428+ if ((data->fan_config[attr->index]
429+ & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
430+ || is_automatic_control_mode(data, attr->index))
431+ pwm = data->pwm[attr->index] / 100;
432+ else
433+ pwm = data->fan_command[attr->index]
434+ / MAX31785_FAN_COMMAND_PWM_RATIO;
435+
436+ return sprintf(buf, "%d\n", pwm);
437+}
438+
439+static ssize_t set_pwm(struct device *dev,
440+ struct device_attribute *devattr,
441+ const char *buf, size_t count)
442+{
443+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
444+ struct max31785_data *data = dev_get_drvdata(dev);
445+ struct i2c_client *client = data->client;
446+ unsigned long pwm;
447+ int err;
448+
449+ err = kstrtoul(buf, 10, &pwm);
450+ if (err)
451+ return err;
452+
453+ if (pwm > 255)
454+ return -EINVAL;
455+
456+ mutex_lock(&data->device_lock);
457+
458+ /* Write new PWM value */
459+ data->fan_command[attr->index] = pwm * MAX31785_FAN_COMMAND_PWM_RATIO;
460+ err = max31785_write_fan_data(client, attr->index,
461+ MAX31785_REG_FAN_COMMAND_1,
462+ data->fan_command[attr->index], 0);
463+
464+ mutex_unlock(&data->device_lock);
465+
466+ if (err < 0)
467+ return err;
468+
469+ return count;
470+}
471+
472+static ssize_t get_pwm_enable(struct device *dev,
473+ struct device_attribute *devattr, char *buf)
474+{
475+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
476+ struct max31785_data *data = max31785_update_device(dev);
477+ int mode;
478+
479+ if (IS_ERR(data))
480+ return PTR_ERR(data);
481+
482+ if (!(data->fan_config[attr->index] & MAX31785_FAN_CFG_PWM_ENABLE))
483+ mode = 0;
484+ else if (is_automatic_control_mode(data, attr->index))
485+ mode = 3;
486+ else if (data->fan_config[attr->index]
487+ & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
488+ mode = 2;
489+ else
490+ mode = 1;
491+
492+ return sprintf(buf, "%d\n", mode);
493+}
494+
495+static ssize_t set_pwm_enable(struct device *dev,
496+ struct device_attribute *devattr,
497+ const char *buf, size_t count)
498+{
499+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
500+ struct max31785_data *data = dev_get_drvdata(dev);
501+ struct i2c_client *client = data->client;
502+ unsigned long mode;
503+ int err;
504+
505+ err = kstrtoul(buf, 10, &mode);
506+ if (err)
507+ return err;
508+
509+ switch (mode) {
510+ case 0:
511+ data->fan_config[attr->index] =
512+ data->fan_config[attr->index]
513+ & ~MAX31785_FAN_CFG_PWM_ENABLE;
514+ break;
515+ case 1:
516+ case 2:
517+ case 3:
518+ data->fan_config[attr->index] =
519+ data->fan_config[attr->index]
520+ | MAX31785_FAN_CFG_PWM_ENABLE;
521+ break;
522+ default:
523+ return -EINVAL;
524+ }
525+
526+ switch (mode) {
527+ case 0:
528+ break;
529+ case 1:
530+ data->fan_config[attr->index] =
531+ data->fan_config[attr->index]
532+ & ~MAX31785_FAN_CFG_CONTROL_MODE_RPM;
533+ break;
534+ case 2:
535+ data->fan_config[attr->index] =
536+ data->fan_config[attr->index]
537+ | MAX31785_FAN_CFG_CONTROL_MODE_RPM;
538+ break;
539+ case 3:
540+ data->fan_command[attr->index] = 0xffff;
541+ break;
542+ default:
543+ return -EINVAL;
544+ }
545+
546+ mutex_lock(&data->device_lock);
547+
548+ err = max31785_write_fan_data(client, attr->index,
549+ MAX31785_REG_FAN_CONFIG_1_2,
550+ data->fan_config[attr->index], 1);
551+
552+ if (err < 0)
553+ goto abort;
554+
555+ err = max31785_write_fan_data(client, attr->index,
556+ MAX31785_REG_FAN_COMMAND_1,
557+ data->fan_command[attr->index], 0);
558+
559+abort:
560+ mutex_unlock(&data->device_lock);
561+
562+ if (err < 0)
563+ return err;
564+
565+ return count;
566+}
567+
568+static ssize_t get_fan_fault(struct device *dev,
569+ struct device_attribute *devattr, char *buf)
570+{
571+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
572+ struct max31785_data *data = max31785_update_device(dev);
573+ int fault;
574+
575+ if (IS_ERR(data))
576+ return PTR_ERR(data);
577+
578+ fault = !!(data->fault_status[attr->index]
579+ & MAX31785_FAN_STATUS_FAULT_MASK);
580+
581+ return sprintf(buf, "%d\n", fault);
582+}
583+
584+static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0);
585+static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1);
586+static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2);
587+static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3);
588+static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, get_fan, NULL, 4);
589+static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, get_fan, NULL, 5);
590+
591+static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, get_fan_fault, NULL, 0);
592+static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, get_fan_fault, NULL, 1);
593+static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, get_fan_fault, NULL, 2);
594+static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, get_fan_fault, NULL, 3);
595+static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, get_fan_fault, NULL, 4);
596+static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, get_fan_fault, NULL, 5);
597+
598+static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO,
599+ get_fan_target, set_fan_target, 0);
600+static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO,
601+ get_fan_target, set_fan_target, 1);
602+static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO,
603+ get_fan_target, set_fan_target, 2);
604+static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO,
605+ get_fan_target, set_fan_target, 3);
606+static SENSOR_DEVICE_ATTR(fan5_target, S_IWUSR | S_IRUGO,
607+ get_fan_target, set_fan_target, 4);
608+static SENSOR_DEVICE_ATTR(fan6_target, S_IWUSR | S_IRUGO,
609+ get_fan_target, set_fan_target, 5);
610+
611+static SENSOR_DEVICE_ATTR(fan1_pulses, S_IWUSR | S_IRUGO,
612+ get_fan_pulses, set_fan_pulses, 0);
613+static SENSOR_DEVICE_ATTR(fan2_pulses, S_IWUSR | S_IRUGO,
614+ get_fan_pulses, set_fan_pulses, 1);
615+static SENSOR_DEVICE_ATTR(fan3_pulses, S_IWUSR | S_IRUGO,
616+ get_fan_pulses, set_fan_pulses, 2);
617+static SENSOR_DEVICE_ATTR(fan4_pulses, S_IWUSR | S_IRUGO,
618+ get_fan_pulses, set_fan_pulses, 3);
619+static SENSOR_DEVICE_ATTR(fan5_pulses, S_IWUSR | S_IRUGO,
620+ get_fan_pulses, set_fan_pulses, 4);
621+static SENSOR_DEVICE_ATTR(fan6_pulses, S_IWUSR | S_IRUGO,
622+ get_fan_pulses, set_fan_pulses, 5);
623+
624+static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 0);
625+static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 1);
626+static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 2);
627+static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 3);
628+static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 4);
629+static SENSOR_DEVICE_ATTR(pwm6, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 5);
630+
631+static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
632+ get_pwm_enable, set_pwm_enable, 0);
633+static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
634+ get_pwm_enable, set_pwm_enable, 1);
635+static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
636+ get_pwm_enable, set_pwm_enable, 2);
637+static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO,
638+ get_pwm_enable, set_pwm_enable, 3);
639+static SENSOR_DEVICE_ATTR(pwm5_enable, S_IWUSR | S_IRUGO,
640+ get_pwm_enable, set_pwm_enable, 4);
641+static SENSOR_DEVICE_ATTR(pwm6_enable, S_IWUSR | S_IRUGO,
642+ get_pwm_enable, set_pwm_enable, 5);
643+
644+static struct attribute *max31785_attrs[] = {
645+ &sensor_dev_attr_fan1_input.dev_attr.attr,
646+ &sensor_dev_attr_fan2_input.dev_attr.attr,
647+ &sensor_dev_attr_fan3_input.dev_attr.attr,
648+ &sensor_dev_attr_fan4_input.dev_attr.attr,
649+ &sensor_dev_attr_fan5_input.dev_attr.attr,
650+ &sensor_dev_attr_fan6_input.dev_attr.attr,
651+
652+ &sensor_dev_attr_fan1_fault.dev_attr.attr,
653+ &sensor_dev_attr_fan2_fault.dev_attr.attr,
654+ &sensor_dev_attr_fan3_fault.dev_attr.attr,
655+ &sensor_dev_attr_fan4_fault.dev_attr.attr,
656+ &sensor_dev_attr_fan5_fault.dev_attr.attr,
657+ &sensor_dev_attr_fan6_fault.dev_attr.attr,
658+
659+ &sensor_dev_attr_fan1_target.dev_attr.attr,
660+ &sensor_dev_attr_fan2_target.dev_attr.attr,
661+ &sensor_dev_attr_fan3_target.dev_attr.attr,
662+ &sensor_dev_attr_fan4_target.dev_attr.attr,
663+ &sensor_dev_attr_fan5_target.dev_attr.attr,
664+ &sensor_dev_attr_fan6_target.dev_attr.attr,
665+
666+ &sensor_dev_attr_fan1_pulses.dev_attr.attr,
667+ &sensor_dev_attr_fan2_pulses.dev_attr.attr,
668+ &sensor_dev_attr_fan3_pulses.dev_attr.attr,
669+ &sensor_dev_attr_fan4_pulses.dev_attr.attr,
670+ &sensor_dev_attr_fan5_pulses.dev_attr.attr,
671+ &sensor_dev_attr_fan6_pulses.dev_attr.attr,
672+
673+ &sensor_dev_attr_pwm1.dev_attr.attr,
674+ &sensor_dev_attr_pwm2.dev_attr.attr,
675+ &sensor_dev_attr_pwm3.dev_attr.attr,
676+ &sensor_dev_attr_pwm4.dev_attr.attr,
677+ &sensor_dev_attr_pwm5.dev_attr.attr,
678+ &sensor_dev_attr_pwm6.dev_attr.attr,
679+
680+ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
681+ &sensor_dev_attr_pwm2_enable.dev_attr.attr,
682+ &sensor_dev_attr_pwm3_enable.dev_attr.attr,
683+ &sensor_dev_attr_pwm4_enable.dev_attr.attr,
684+ &sensor_dev_attr_pwm5_enable.dev_attr.attr,
685+ &sensor_dev_attr_pwm6_enable.dev_attr.attr,
686+ NULL
687+};
688+
689+static umode_t max31785_attrs_visible(struct kobject *kobj,
690+ struct attribute *a, int n)
691+{
692+ return a->mode;
693+}
694+
695+static const struct attribute_group max31785_group = {
696+ .attrs = max31785_attrs,
697+ .is_visible = max31785_attrs_visible,
698+};
699+__ATTRIBUTE_GROUPS(max31785);
700+
701+static int max31785_init_client(struct i2c_client *client,
702+ struct max31785_data *data)
703+{
704+ int i, rv;
705+
706+ for (i = 0; i < NR_CHANNEL; i++) {
707+ rv = max31785_read_fan_data(client, i,
708+ MAX31785_REG_FAN_CONFIG_1_2, 1);
709+ if (rv < 0)
710+ return rv;
711+ data->fan_config[i] = rv;
712+
713+ rv = max31785_read_fan_data(client, i,
714+ MAX31785_REG_FAN_COMMAND_1, 0);
715+ if (rv < 0)
716+ return rv;
717+ data->fan_command[i] = rv;
718+
719+ rv = max31785_read_fan_data(client, i,
720+ MAX31785_REG_MFR_FAN_CONFIG, 1);
721+ if (rv < 0)
722+ return rv;
723+ data->mfr_fan_config[i] = rv;
724+
725+ if (!((data->fan_config[i]
726+ & MAX31785_FAN_CFG_CONTROL_MODE_RPM)
727+ || is_automatic_control_mode(data, i))) {
728+ data->pwm[i] = 0;
729+ }
730+ }
731+
732+ return rv;
733+}
734+
735+/* Return 0 if detection is successful, -ENODEV otherwise */
736+static int max31785_detect(struct i2c_client *client,
737+ struct i2c_board_info *info)
738+{
739+ struct i2c_adapter *adapter = client->adapter;
740+ int rv;
741+
742+ if (!i2c_check_functionality(adapter,
743+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
744+ return -ENODEV;
745+
746+ /* Probe manufacturer / model registers */
747+ rv = i2c_smbus_read_byte_data(client, MAX31785_REG_MFR_ID);
748+ if (rv < 0)
749+ return -ENODEV;
750+ if (rv != MAX31785_MFR_ID)
751+ return -ENODEV;
752+
753+ rv = i2c_smbus_read_byte_data(client, MAX31785_REG_MFR_MODEL);
754+ if (rv < 0)
755+ return -ENODEV;
756+ if (rv != MAX31785_MFR_MODEL)
757+ return -ENODEV;
758+
759+ strlcpy(info->type, "max31785", I2C_NAME_SIZE);
760+
761+ return 0;
762+}
763+
764+static int max31785_probe(struct i2c_client *client,
765+ const struct i2c_device_id *id)
766+{
767+ struct i2c_adapter *adapter = client->adapter;
768+ struct device *dev = &client->dev;
769+ struct max31785_data *data;
770+ struct device *hwmon_dev;
771+ int err;
772+
773+ if (!i2c_check_functionality(adapter,
774+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
775+ return -ENODEV;
776+
777+ data = devm_kzalloc(dev, sizeof(struct max31785_data), GFP_KERNEL);
778+ if (!data)
779+ return -ENOMEM;
780+
781+ data->client = client;
782+ mutex_init(&data->device_lock);
783+
784+ /*
785+ * Initialize the max31785 chip
786+ */
787+ err = max31785_init_client(client, data);
788+ if (err)
789+ return err;
790+
791+ hwmon_dev = devm_hwmon_device_register_with_groups(dev,
792+ client->name, data, max31785_groups);
793+
794+ return PTR_ERR_OR_ZERO(hwmon_dev);
795+}
796+
797+static const struct i2c_device_id max31785_id[] = {
798+ { "max31785", 0 },
799+ { }
800+};
801+MODULE_DEVICE_TABLE(i2c, max31785_id);
802+
803+static struct i2c_driver max31785_driver = {
804+ .class = I2C_CLASS_HWMON,
805+ .probe = max31785_probe,
806+ .driver = {
807+ .name = "max31785",
808+ },
809+ .id_table = max31785_id,
810+ .detect = max31785_detect,
811+ .address_list = normal_i2c,
812+};
813+
814+module_i2c_driver(max31785_driver);
815+
816+MODULE_AUTHOR("Timothy Pearson <tpearson@raptorengineering.com>");
817+MODULE_DESCRIPTION("MAX31785 sensor driver");
818+MODULE_LICENSE("GPL");
819--
8201.8.3.1
821