blob: 9399532408276e0d3f88841f00ca62afbe652d57 [file] [log] [blame]
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +02001/*
2 * max6650.c - Part of lm_sensors, Linux kernel modules for hardware
3 * monitoring.
4 *
Hans J. Koch2aa25c22010-11-15 21:38:56 +01005 * (C) 2007 by Hans J. Koch <hjk@hansjkoch.de>
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +02006 *
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 *
Christian Engelmayer52b52262009-06-15 18:39:52 +020015 * The datasheet was last seen at:
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020016 *
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>
Mike Looijmansa6cdeef2016-08-22 08:47:51 +020042#include <linux/of_device.h>
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -040043#include <linux/thermal.h>
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020044
45/*
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020046 * Insmod parameters
47 */
48
49/* fan_voltage: 5=5V fan, 12=12V fan, 0=don't change */
50static int fan_voltage;
51/* prescaler: Possible values are 1, 2, 4, 8, 16 or 0 for don't change */
52static int prescaler;
Mike Looijmansa6cdeef2016-08-22 08:47:51 +020053/* clock: The clock frequency of the chip (max6651 can be clocked externally) */
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020054static int clock = 254000;
55
Guenter Roeck0f50b2e2018-12-10 14:02:17 -080056module_param(fan_voltage, int, 0444);
57module_param(prescaler, int, 0444);
58module_param(clock, int, 0444);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020059
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +020060/*
61 * MAX 6650/6651 registers
62 */
63
64#define MAX6650_REG_SPEED 0x00
65#define MAX6650_REG_CONFIG 0x02
66#define MAX6650_REG_GPIO_DEF 0x04
67#define MAX6650_REG_DAC 0x06
68#define MAX6650_REG_ALARM_EN 0x08
69#define MAX6650_REG_ALARM 0x0A
70#define MAX6650_REG_TACH0 0x0C
71#define MAX6650_REG_TACH1 0x0E
72#define MAX6650_REG_TACH2 0x10
73#define MAX6650_REG_TACH3 0x12
74#define MAX6650_REG_GPIO_STAT 0x14
75#define MAX6650_REG_COUNT 0x16
76
77/*
78 * Config register bits
79 */
80
81#define MAX6650_CFG_V12 0x08
82#define MAX6650_CFG_PRESCALER_MASK 0x07
83#define MAX6650_CFG_PRESCALER_2 0x01
84#define MAX6650_CFG_PRESCALER_4 0x02
85#define MAX6650_CFG_PRESCALER_8 0x03
86#define MAX6650_CFG_PRESCALER_16 0x04
87#define MAX6650_CFG_MODE_MASK 0x30
88#define MAX6650_CFG_MODE_ON 0x00
89#define MAX6650_CFG_MODE_OFF 0x10
90#define MAX6650_CFG_MODE_CLOSED_LOOP 0x20
91#define MAX6650_CFG_MODE_OPEN_LOOP 0x30
92#define MAX6650_COUNT_MASK 0x03
93
Christian Engelmayer52b52262009-06-15 18:39:52 +020094/*
95 * Alarm status register bits
96 */
97
98#define MAX6650_ALRM_MAX 0x01
99#define MAX6650_ALRM_MIN 0x02
100#define MAX6650_ALRM_TACH 0x04
101#define MAX6650_ALRM_GPIO1 0x08
102#define MAX6650_ALRM_GPIO2 0x10
103
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200104/* Minimum and maximum values of the FAN-RPM */
105#define FAN_RPM_MIN 240
106#define FAN_RPM_MAX 30000
107
108#define DIV_FROM_REG(reg) (1 << (reg & 7))
109
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200110/*
111 * Client data (each client gets its own)
112 */
113
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800114struct max6650_data {
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800115 struct i2c_client *client;
116 const struct attribute_group *groups[3];
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400117 struct thermal_cooling_device *cooling_dev;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200118 struct mutex update_lock;
Jean Delvare9c084da2011-05-25 20:43:32 +0200119 int nr_fans;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200120 char valid; /* zero until following fields are valid */
121 unsigned long last_updated; /* in jiffies */
122
123 /* register values */
124 u8 speed;
125 u8 config;
126 u8 tach[4];
127 u8 count;
128 u8 dac;
Christian Engelmayer52b52262009-06-15 18:39:52 +0200129 u8 alarm;
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400130 unsigned long cooling_dev_state;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200131};
132
Guenter Roeck1577f942014-02-11 22:26:12 -0800133static const u8 tach_reg[] = {
134 MAX6650_REG_TACH0,
135 MAX6650_REG_TACH1,
136 MAX6650_REG_TACH2,
137 MAX6650_REG_TACH3,
138};
139
Guenter Roeck2720ce72019-04-04 06:44:14 -0700140static const struct of_device_id __maybe_unused max6650_dt_match[] = {
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200141 {
142 .compatible = "maxim,max6650",
143 .data = (void *)1
144 },
145 {
146 .compatible = "maxim,max6651",
147 .data = (void *)4
148 },
149 { },
150};
151MODULE_DEVICE_TABLE(of, max6650_dt_match);
152
Guenter Roeck1577f942014-02-11 22:26:12 -0800153static struct max6650_data *max6650_update_device(struct device *dev)
154{
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800155 struct max6650_data *data = dev_get_drvdata(dev);
156 struct i2c_client *client = data->client;
Guenter Roeck1577f942014-02-11 22:26:12 -0800157 int i;
Guenter Roeck1577f942014-02-11 22:26:12 -0800158
159 mutex_lock(&data->update_lock);
160
161 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
162 data->speed = i2c_smbus_read_byte_data(client,
163 MAX6650_REG_SPEED);
164 data->config = i2c_smbus_read_byte_data(client,
165 MAX6650_REG_CONFIG);
166 for (i = 0; i < data->nr_fans; i++) {
167 data->tach[i] = i2c_smbus_read_byte_data(client,
168 tach_reg[i]);
169 }
170 data->count = i2c_smbus_read_byte_data(client,
171 MAX6650_REG_COUNT);
172 data->dac = i2c_smbus_read_byte_data(client, MAX6650_REG_DAC);
173
174 /*
175 * Alarms are cleared on read in case the condition that
176 * caused the alarm is removed. Keep the value latched here
177 * for providing the register through different alarm files.
178 */
179 data->alarm |= i2c_smbus_read_byte_data(client,
180 MAX6650_REG_ALARM);
181
182 data->last_updated = jiffies;
183 data->valid = 1;
184 }
185
186 mutex_unlock(&data->update_lock);
187
188 return data;
189}
190
Mike Looijmans20005cc2016-08-24 10:13:26 +0200191/*
192 * Change the operating mode of the chip (if needed).
193 * mode is one of the MAX6650_CFG_MODE_* values.
194 */
195static int max6650_set_operating_mode(struct max6650_data *data, u8 mode)
196{
197 int result;
198 u8 config = data->config;
199
200 if (mode == (config & MAX6650_CFG_MODE_MASK))
201 return 0;
202
203 config = (config & ~MAX6650_CFG_MODE_MASK) | mode;
204
205 result = i2c_smbus_write_byte_data(data->client, MAX6650_REG_CONFIG,
206 config);
207 if (result < 0)
208 return result;
209
210 data->config = config;
211
212 return 0;
213}
214
Guenter Roeck44007112018-12-06 10:46:16 -0800215static ssize_t fan_show(struct device *dev, struct device_attribute *devattr,
216 char *buf)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200217{
218 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
219 struct max6650_data *data = max6650_update_device(dev);
220 int rpm;
221
222 /*
Guenter Roeck703af962012-01-19 11:02:22 -0800223 * Calculation details:
224 *
225 * Each tachometer counts over an interval given by the "count"
226 * register (0.25, 0.5, 1 or 2 seconds). This module assumes
227 * that the fans produce two pulses per revolution (this seems
228 * to be the most common).
229 */
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200230
231 rpm = ((data->tach[attr->index] * 120) / DIV_FROM_REG(data->count));
232 return sprintf(buf, "%d\n", rpm);
233}
234
235/*
236 * Set the fan speed to the specified RPM (or read back the RPM setting).
237 * This works in closed loop mode only. Use pwm1 for open loop speed setting.
238 *
239 * The MAX6650/1 will automatically control fan speed when in closed loop
240 * mode.
241 *
242 * Assumptions:
243 *
244 * 1) The MAX6650/1 internal 254kHz clock frequency is set correctly. Use
245 * the clock module parameter if you need to fine tune this.
246 *
247 * 2) The prescaler (low three bits of the config register) has already
248 * been set to an appropriate value. Use the prescaler module parameter
249 * if your BIOS doesn't initialize the chip properly.
250 *
251 * The relevant equations are given on pages 21 and 22 of the datasheet.
252 *
253 * From the datasheet, the relevant equation when in regulation is:
254 *
255 * [fCLK / (128 x (KTACH + 1))] = 2 x FanSpeed / KSCALE
256 *
257 * where:
258 *
259 * fCLK is the oscillator frequency (either the 254kHz internal
260 * oscillator or the externally applied clock)
261 *
262 * KTACH is the value in the speed register
263 *
264 * FanSpeed is the speed of the fan in rps
265 *
266 * KSCALE is the prescaler value (1, 2, 4, 8, or 16)
267 *
268 * When reading, we need to solve for FanSpeed. When writing, we need to
269 * solve for KTACH.
270 *
271 * Note: this tachometer is completely separate from the tachometers
272 * used to measure the fan speeds. Only one fan's speed (fan1) is
273 * controlled.
274 */
275
Julia Lawall1fc67372016-12-22 13:05:31 +0100276static ssize_t fan1_target_show(struct device *dev,
277 struct device_attribute *devattr, char *buf)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200278{
279 struct max6650_data *data = max6650_update_device(dev);
280 int kscale, ktach, rpm;
281
282 /*
Guenter Roeck703af962012-01-19 11:02:22 -0800283 * Use the datasheet equation:
284 *
285 * FanSpeed = KSCALE x fCLK / [256 x (KTACH + 1)]
286 *
287 * then multiply by 60 to give rpm.
288 */
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200289
290 kscale = DIV_FROM_REG(data->config);
291 ktach = data->speed;
292 rpm = 60 * kscale * clock / (256 * (ktach + 1));
293 return sprintf(buf, "%d\n", rpm);
294}
295
Mike Looijmans20005cc2016-08-24 10:13:26 +0200296static int max6650_set_target(struct max6650_data *data, unsigned long rpm)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200297{
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200298 int kscale, ktach;
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800299
Mike Looijmans20005cc2016-08-24 10:13:26 +0200300 if (rpm == 0)
301 return max6650_set_operating_mode(data, MAX6650_CFG_MODE_OFF);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200302
Guenter Roeck2a844c12013-01-09 08:09:34 -0800303 rpm = clamp_val(rpm, FAN_RPM_MIN, FAN_RPM_MAX);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200304
305 /*
Guenter Roeck703af962012-01-19 11:02:22 -0800306 * Divide the required speed by 60 to get from rpm to rps, then
307 * use the datasheet equation:
308 *
309 * KTACH = [(fCLK x KSCALE) / (256 x FanSpeed)] - 1
310 */
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200311
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200312 kscale = DIV_FROM_REG(data->config);
313 ktach = ((clock * kscale) / (256 * rpm / 60)) - 1;
314 if (ktach < 0)
315 ktach = 0;
316 if (ktach > 255)
317 ktach = 255;
318 data->speed = ktach;
319
Mike Looijmans20005cc2016-08-24 10:13:26 +0200320 return i2c_smbus_write_byte_data(data->client, MAX6650_REG_SPEED,
321 data->speed);
322}
323
Julia Lawall1fc67372016-12-22 13:05:31 +0100324static ssize_t fan1_target_store(struct device *dev,
325 struct device_attribute *devattr,
326 const char *buf, size_t count)
Mike Looijmans20005cc2016-08-24 10:13:26 +0200327{
328 struct max6650_data *data = dev_get_drvdata(dev);
329 unsigned long rpm;
330 int err;
331
332 err = kstrtoul(buf, 10, &rpm);
333 if (err)
334 return err;
335
336 mutex_lock(&data->update_lock);
337
338 err = max6650_set_target(data, rpm);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200339
340 mutex_unlock(&data->update_lock);
341
Mike Looijmans20005cc2016-08-24 10:13:26 +0200342 if (err < 0)
343 return err;
344
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200345 return count;
346}
347
348/*
349 * Get/set the fan speed in open loop mode using pwm1 sysfs file.
350 * Speed is given as a relative value from 0 to 255, where 255 is maximum
351 * speed. Note that this is done by writing directly to the chip's DAC,
352 * it won't change the closed loop speed set by fan1_target.
353 * Also note that due to rounding errors it is possible that you don't read
354 * back exactly the value you have set.
355 */
356
Julia Lawall1fc67372016-12-22 13:05:31 +0100357static ssize_t pwm1_show(struct device *dev, struct device_attribute *devattr,
358 char *buf)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200359{
360 int pwm;
361 struct max6650_data *data = max6650_update_device(dev);
362
Guenter Roeck703af962012-01-19 11:02:22 -0800363 /*
364 * Useful range for dac is 0-180 for 12V fans and 0-76 for 5V fans.
365 * Lower DAC values mean higher speeds.
366 */
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200367 if (data->config & MAX6650_CFG_V12)
368 pwm = 255 - (255 * (int)data->dac)/180;
369 else
370 pwm = 255 - (255 * (int)data->dac)/76;
371
372 if (pwm < 0)
373 pwm = 0;
374
375 return sprintf(buf, "%d\n", pwm);
376}
377
Julia Lawall1fc67372016-12-22 13:05:31 +0100378static ssize_t pwm1_store(struct device *dev,
379 struct device_attribute *devattr, const char *buf,
380 size_t count)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200381{
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800382 struct max6650_data *data = dev_get_drvdata(dev);
383 struct i2c_client *client = data->client;
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800384 unsigned long pwm;
385 int err;
386
387 err = kstrtoul(buf, 10, &pwm);
388 if (err)
389 return err;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200390
Guenter Roeck2a844c12013-01-09 08:09:34 -0800391 pwm = clamp_val(pwm, 0, 255);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200392
393 mutex_lock(&data->update_lock);
394
395 if (data->config & MAX6650_CFG_V12)
396 data->dac = 180 - (180 * pwm)/255;
397 else
398 data->dac = 76 - (76 * pwm)/255;
Mike Looijmans20005cc2016-08-24 10:13:26 +0200399 err = i2c_smbus_write_byte_data(client, MAX6650_REG_DAC, data->dac);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200400
401 mutex_unlock(&data->update_lock);
402
Mike Looijmans20005cc2016-08-24 10:13:26 +0200403 return err < 0 ? err : count;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200404}
405
406/*
407 * Get/Set controller mode:
408 * Possible values:
409 * 0 = Fan always on
410 * 1 = Open loop, Voltage is set according to speed, not regulated.
411 * 2 = Closed loop, RPM for all fans regulated by fan1 tachometer
Mike Looijmans20005cc2016-08-24 10:13:26 +0200412 * 3 = Fan off
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200413 */
Julia Lawall1fc67372016-12-22 13:05:31 +0100414static ssize_t pwm1_enable_show(struct device *dev,
415 struct device_attribute *devattr, char *buf)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200416{
417 struct max6650_data *data = max6650_update_device(dev);
418 int mode = (data->config & MAX6650_CFG_MODE_MASK) >> 4;
Mike Looijmans20005cc2016-08-24 10:13:26 +0200419 int sysfs_modes[4] = {0, 3, 2, 1};
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200420
421 return sprintf(buf, "%d\n", sysfs_modes[mode]);
422}
423
Julia Lawall1fc67372016-12-22 13:05:31 +0100424static ssize_t pwm1_enable_store(struct device *dev,
425 struct device_attribute *devattr,
426 const char *buf, size_t count)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200427{
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800428 struct max6650_data *data = dev_get_drvdata(dev);
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800429 unsigned long mode;
430 int err;
Mike Looijmans20005cc2016-08-24 10:13:26 +0200431 const u8 max6650_modes[] = {
432 MAX6650_CFG_MODE_ON,
433 MAX6650_CFG_MODE_OPEN_LOOP,
434 MAX6650_CFG_MODE_CLOSED_LOOP,
435 MAX6650_CFG_MODE_OFF,
436 };
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200437
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800438 err = kstrtoul(buf, 10, &mode);
439 if (err)
440 return err;
441
Mike Looijmans20005cc2016-08-24 10:13:26 +0200442 if (mode >= ARRAY_SIZE(max6650_modes))
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200443 return -EINVAL;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200444
445 mutex_lock(&data->update_lock);
446
Mike Looijmans20005cc2016-08-24 10:13:26 +0200447 max6650_set_operating_mode(data, max6650_modes[mode]);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200448
449 mutex_unlock(&data->update_lock);
450
451 return count;
452}
453
454/*
455 * Read/write functions for fan1_div sysfs file. The MAX6650 has no such
456 * divider. We handle this by converting between divider and counttime:
457 *
458 * (counttime == k) <==> (divider == 2^k), k = 0, 1, 2, or 3
459 *
460 * Lower values of k allow to connect a faster fan without the risk of
461 * counter overflow. The price is lower resolution. You can also set counttime
462 * using the module parameter. Note that the module parameter "prescaler" also
463 * influences the behaviour. Unfortunately, there's no sysfs attribute
464 * defined for that. See the data sheet for details.
465 */
466
Julia Lawall1fc67372016-12-22 13:05:31 +0100467static ssize_t fan1_div_show(struct device *dev,
468 struct device_attribute *devattr, char *buf)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200469{
470 struct max6650_data *data = max6650_update_device(dev);
471
472 return sprintf(buf, "%d\n", DIV_FROM_REG(data->count));
473}
474
Julia Lawall1fc67372016-12-22 13:05:31 +0100475static ssize_t fan1_div_store(struct device *dev,
476 struct device_attribute *devattr,
477 const char *buf, size_t count)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200478{
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800479 struct max6650_data *data = dev_get_drvdata(dev);
480 struct i2c_client *client = data->client;
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800481 unsigned long div;
482 int err;
483
484 err = kstrtoul(buf, 10, &div);
485 if (err)
486 return err;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200487
488 mutex_lock(&data->update_lock);
489 switch (div) {
490 case 1:
491 data->count = 0;
492 break;
493 case 2:
494 data->count = 1;
495 break;
496 case 4:
497 data->count = 2;
498 break;
499 case 8:
500 data->count = 3;
501 break;
502 default:
Jiri Slaby025dc742009-07-11 13:42:37 +0200503 mutex_unlock(&data->update_lock);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200504 return -EINVAL;
505 }
506
507 i2c_smbus_write_byte_data(client, MAX6650_REG_COUNT, data->count);
508 mutex_unlock(&data->update_lock);
509
510 return count;
511}
512
Christian Engelmayer52b52262009-06-15 18:39:52 +0200513/*
514 * Get alarm stati:
515 * Possible values:
516 * 0 = no alarm
517 * 1 = alarm
518 */
519
Guenter Roeck44007112018-12-06 10:46:16 -0800520static ssize_t alarm_show(struct device *dev,
521 struct device_attribute *devattr, char *buf)
Christian Engelmayer52b52262009-06-15 18:39:52 +0200522{
523 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
524 struct max6650_data *data = max6650_update_device(dev);
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800525 struct i2c_client *client = data->client;
Christian Engelmayer52b52262009-06-15 18:39:52 +0200526 int alarm = 0;
527
528 if (data->alarm & attr->index) {
529 mutex_lock(&data->update_lock);
530 alarm = 1;
531 data->alarm &= ~attr->index;
532 data->alarm |= i2c_smbus_read_byte_data(client,
533 MAX6650_REG_ALARM);
534 mutex_unlock(&data->update_lock);
535 }
536
537 return sprintf(buf, "%d\n", alarm);
538}
539
Guenter Roeck44007112018-12-06 10:46:16 -0800540static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
541static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
542static SENSOR_DEVICE_ATTR_RO(fan3_input, fan, 2);
543static SENSOR_DEVICE_ATTR_RO(fan4_input, fan, 3);
Julia Lawall1fc67372016-12-22 13:05:31 +0100544static DEVICE_ATTR_RW(fan1_target);
545static DEVICE_ATTR_RW(fan1_div);
546static DEVICE_ATTR_RW(pwm1_enable);
547static DEVICE_ATTR_RW(pwm1);
Guenter Roeck44007112018-12-06 10:46:16 -0800548static SENSOR_DEVICE_ATTR_RO(fan1_max_alarm, alarm, MAX6650_ALRM_MAX);
549static SENSOR_DEVICE_ATTR_RO(fan1_min_alarm, alarm, MAX6650_ALRM_MIN);
550static SENSOR_DEVICE_ATTR_RO(fan1_fault, alarm, MAX6650_ALRM_TACH);
551static SENSOR_DEVICE_ATTR_RO(gpio1_alarm, alarm, MAX6650_ALRM_GPIO1);
552static SENSOR_DEVICE_ATTR_RO(gpio2_alarm, alarm, MAX6650_ALRM_GPIO2);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200553
Al Viro587a1f12011-07-23 23:11:19 -0400554static umode_t max6650_attrs_visible(struct kobject *kobj, struct attribute *a,
Christian Engelmayer52b52262009-06-15 18:39:52 +0200555 int n)
556{
557 struct device *dev = container_of(kobj, struct device, kobj);
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800558 struct max6650_data *data = dev_get_drvdata(dev);
559 struct i2c_client *client = data->client;
Christian Engelmayer52b52262009-06-15 18:39:52 +0200560 u8 alarm_en = i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM_EN);
561 struct device_attribute *devattr;
562
563 /*
564 * Hide the alarms that have not been enabled by the firmware
565 */
566
567 devattr = container_of(a, struct device_attribute, attr);
568 if (devattr == &sensor_dev_attr_fan1_max_alarm.dev_attr
569 || devattr == &sensor_dev_attr_fan1_min_alarm.dev_attr
570 || devattr == &sensor_dev_attr_fan1_fault.dev_attr
571 || devattr == &sensor_dev_attr_gpio1_alarm.dev_attr
572 || devattr == &sensor_dev_attr_gpio2_alarm.dev_attr) {
573 if (!(alarm_en & to_sensor_dev_attr(devattr)->index))
574 return 0;
575 }
576
577 return a->mode;
578}
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200579
580static struct attribute *max6650_attrs[] = {
581 &sensor_dev_attr_fan1_input.dev_attr.attr,
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200582 &dev_attr_fan1_target.attr,
583 &dev_attr_fan1_div.attr,
584 &dev_attr_pwm1_enable.attr,
585 &dev_attr_pwm1.attr,
Christian Engelmayer52b52262009-06-15 18:39:52 +0200586 &sensor_dev_attr_fan1_max_alarm.dev_attr.attr,
587 &sensor_dev_attr_fan1_min_alarm.dev_attr.attr,
588 &sensor_dev_attr_fan1_fault.dev_attr.attr,
589 &sensor_dev_attr_gpio1_alarm.dev_attr.attr,
590 &sensor_dev_attr_gpio2_alarm.dev_attr.attr,
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200591 NULL
592};
593
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800594static const struct attribute_group max6650_group = {
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200595 .attrs = max6650_attrs,
Christian Engelmayer52b52262009-06-15 18:39:52 +0200596 .is_visible = max6650_attrs_visible,
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200597};
598
Jean Delvare9c084da2011-05-25 20:43:32 +0200599static struct attribute *max6651_attrs[] = {
600 &sensor_dev_attr_fan2_input.dev_attr.attr,
601 &sensor_dev_attr_fan3_input.dev_attr.attr,
602 &sensor_dev_attr_fan4_input.dev_attr.attr,
603 NULL
604};
605
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800606static const struct attribute_group max6651_group = {
Jean Delvare9c084da2011-05-25 20:43:32 +0200607 .attrs = max6651_attrs,
608};
609
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200610/*
611 * Real code
612 */
613
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800614static int max6650_init_client(struct max6650_data *data,
615 struct i2c_client *client)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200616{
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800617 struct device *dev = &client->dev;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200618 int config;
619 int err = -EIO;
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200620 u32 voltage;
621 u32 prescale;
Mike Looijmans20005cc2016-08-24 10:13:26 +0200622 u32 target_rpm;
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200623
624 if (of_property_read_u32(dev->of_node, "maxim,fan-microvolt",
625 &voltage))
626 voltage = fan_voltage;
627 else
628 voltage /= 1000000; /* Microvolts to volts */
629 if (of_property_read_u32(dev->of_node, "maxim,fan-prescale",
630 &prescale))
631 prescale = prescaler;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200632
633 config = i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG);
634
635 if (config < 0) {
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800636 dev_err(dev, "Error reading config, aborting.\n");
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200637 return err;
638 }
639
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200640 switch (voltage) {
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800641 case 0:
642 break;
643 case 5:
644 config &= ~MAX6650_CFG_V12;
645 break;
646 case 12:
647 config |= MAX6650_CFG_V12;
648 break;
649 default:
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200650 dev_err(dev, "illegal value for fan_voltage (%d)\n", voltage);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200651 }
652
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200653 switch (prescale) {
Guenter Roeckbafda5d2012-01-14 21:32:21 -0800654 case 0:
655 break;
656 case 1:
657 config &= ~MAX6650_CFG_PRESCALER_MASK;
658 break;
659 case 2:
660 config = (config & ~MAX6650_CFG_PRESCALER_MASK)
661 | MAX6650_CFG_PRESCALER_2;
662 break;
663 case 4:
664 config = (config & ~MAX6650_CFG_PRESCALER_MASK)
665 | MAX6650_CFG_PRESCALER_4;
666 break;
667 case 8:
668 config = (config & ~MAX6650_CFG_PRESCALER_MASK)
669 | MAX6650_CFG_PRESCALER_8;
670 break;
671 case 16:
672 config = (config & ~MAX6650_CFG_PRESCALER_MASK)
673 | MAX6650_CFG_PRESCALER_16;
674 break;
675 default:
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200676 dev_err(dev, "illegal value for prescaler (%d)\n", prescale);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200677 }
678
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200679 dev_info(dev, "Fan voltage: %dV, prescaler: %d.\n",
680 (config & MAX6650_CFG_V12) ? 12 : 5,
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200681 1 << (config & MAX6650_CFG_PRESCALER_MASK));
682
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200683 if (i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, config)) {
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800684 dev_err(dev, "Config write error, aborting.\n");
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200685 return err;
686 }
687
688 data->config = config;
689 data->count = i2c_smbus_read_byte_data(client, MAX6650_REG_COUNT);
690
Mike Looijmans20005cc2016-08-24 10:13:26 +0200691 if (!of_property_read_u32(client->dev.of_node, "maxim,fan-target-rpm",
692 &target_rpm)) {
693 max6650_set_target(data, target_rpm);
694 max6650_set_operating_mode(data, MAX6650_CFG_MODE_CLOSED_LOOP);
695 }
696
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200697 return 0;
698}
699
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400700#if IS_ENABLED(CONFIG_THERMAL)
701
702static int max6650_get_max_state(struct thermal_cooling_device *cdev,
703 unsigned long *state)
704{
705 *state = 255;
706
707 return 0;
708}
709
710static int max6650_get_cur_state(struct thermal_cooling_device *cdev,
711 unsigned long *state)
712{
713 struct max6650_data *data = cdev->devdata;
714
715 *state = data->cooling_dev_state;
716
717 return 0;
718}
719
720static int max6650_set_cur_state(struct thermal_cooling_device *cdev,
721 unsigned long state)
722{
723 struct max6650_data *data = cdev->devdata;
724 struct i2c_client *client = data->client;
725 int err;
726
727 state = clamp_val(state, 0, 255);
728
729 mutex_lock(&data->update_lock);
730
731 if (data->config & MAX6650_CFG_V12)
732 data->dac = 180 - (180 * state)/255;
733 else
734 data->dac = 76 - (76 * state)/255;
735
736 err = i2c_smbus_write_byte_data(client, MAX6650_REG_DAC, data->dac);
737
738 if (!err) {
739 max6650_set_operating_mode(data, state ?
740 MAX6650_CFG_MODE_OPEN_LOOP :
741 MAX6650_CFG_MODE_OFF);
742 data->cooling_dev_state = state;
743 }
744
745 mutex_unlock(&data->update_lock);
746
747 return err < 0 ? err : 0;
748}
749
750static const struct thermal_cooling_device_ops max6650_cooling_ops = {
751 .get_max_state = max6650_get_max_state,
752 .get_cur_state = max6650_get_cur_state,
753 .set_cur_state = max6650_set_cur_state,
754};
755#endif
756
Guenter Roeck1577f942014-02-11 22:26:12 -0800757static int max6650_probe(struct i2c_client *client,
758 const struct i2c_device_id *id)
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200759{
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800760 struct device *dev = &client->dev;
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200761 const struct of_device_id *of_id =
762 of_match_device(of_match_ptr(max6650_dt_match), dev);
Guenter Roeck1577f942014-02-11 22:26:12 -0800763 struct max6650_data *data;
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800764 struct device *hwmon_dev;
Guenter Roeck1577f942014-02-11 22:26:12 -0800765 int err;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200766
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800767 data = devm_kzalloc(dev, sizeof(struct max6650_data), GFP_KERNEL);
Guenter Roeck0b5e33b2014-02-11 22:40:33 -0800768 if (!data)
Guenter Roeck1577f942014-02-11 22:26:12 -0800769 return -ENOMEM;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200770
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800771 data->client = client;
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400772 i2c_set_clientdata(client, data);
Guenter Roeck1577f942014-02-11 22:26:12 -0800773 mutex_init(&data->update_lock);
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200774 data->nr_fans = of_id ? (int)(uintptr_t)of_id->data : id->driver_data;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200775
Guenter Roeck1577f942014-02-11 22:26:12 -0800776 /*
777 * Initialize the max6650 chip
778 */
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800779 err = max6650_init_client(data, client);
Guenter Roeck1577f942014-02-11 22:26:12 -0800780 if (err)
781 return err;
782
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800783 data->groups[0] = &max6650_group;
Guenter Roeck1577f942014-02-11 22:26:12 -0800784 /* 3 additional fan inputs for the MAX6651 */
Guenter Roeck1577f942014-02-11 22:26:12 -0800785 if (data->nr_fans == 4)
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800786 data->groups[1] = &max6651_group;
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200787
Guenter Roeck71ba0f32014-02-11 22:43:54 -0800788 hwmon_dev = devm_hwmon_device_register_with_groups(dev,
Guenter Roeck17eaa25c2014-02-11 22:37:01 -0800789 client->name, data,
790 data->groups);
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400791 err = PTR_ERR_OR_ZERO(hwmon_dev);
792 if (err)
793 return err;
794
795#if IS_ENABLED(CONFIG_THERMAL)
796 data->cooling_dev =
797 thermal_of_cooling_device_register(client->dev.of_node,
798 client->name, data,
799 &max6650_cooling_ops);
800 if (IS_ERR(data->cooling_dev))
801 dev_warn(&client->dev,
802 "thermal cooling device register failed: %ld\n",
803 PTR_ERR(data->cooling_dev));
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400804#endif
805 return 0;
806}
807
808static int max6650_remove(struct i2c_client *client)
809{
810 struct max6650_data *data = i2c_get_clientdata(client);
811
812 if (!IS_ERR(data->cooling_dev))
813 thermal_cooling_device_unregister(data->cooling_dev);
814
815 return 0;
Guenter Roeck1577f942014-02-11 22:26:12 -0800816}
817
818static const struct i2c_device_id max6650_id[] = {
819 { "max6650", 1 },
820 { "max6651", 4 },
821 { }
822};
823MODULE_DEVICE_TABLE(i2c, max6650_id);
824
825static struct i2c_driver max6650_driver = {
826 .driver = {
827 .name = "max6650",
Mike Looijmansa6cdeef2016-08-22 08:47:51 +0200828 .of_match_table = of_match_ptr(max6650_dt_match),
Guenter Roeck1577f942014-02-11 22:26:12 -0800829 },
830 .probe = max6650_probe,
Jean-Francois Dagenais4f8d3742019-04-18 20:57:22 -0400831 .remove = max6650_remove,
Guenter Roeck1577f942014-02-11 22:26:12 -0800832 .id_table = max6650_id,
833};
834
Axel Linf0967ee2012-01-20 15:38:18 +0800835module_i2c_driver(max6650_driver);
Hans-Juergen Kochd20620d2007-05-08 17:22:00 +0200836
837MODULE_AUTHOR("Hans J. Koch");
838MODULE_DESCRIPTION("MAX6650 sensor driver");
839MODULE_LICENSE("GPL");