1 // SPDX-License-Identifier: GPL-2.0+
3 * Hardware monitoring driver for EMC2305 fan controller
5 * Copyright (C) 2022 Nvidia Technologies Ltd.
9 #include <linux/hwmon.h>
10 #include <linux/i2c.h>
11 #include <linux/module.h>
12 #include <linux/platform_data/emc2305.h>
13 #include <linux/thermal.h>
15 #define EMC2305_REG_DRIVE_FAIL_STATUS 0x27
16 #define EMC2305_REG_VENDOR 0xfe
17 #define EMC2305_FAN_MAX 0xff
18 #define EMC2305_FAN_MIN 0x00
19 #define EMC2305_FAN_MAX_STATE 10
20 #define EMC2305_DEVICE 0x34
21 #define EMC2305_VENDOR 0x5d
22 #define EMC2305_REG_PRODUCT_ID 0xfd
23 #define EMC2305_TACH_REGS_UNUSE_BITS 3
24 #define EMC2305_TACH_CNT_MULTIPLIER 0x02
25 #define EMC2305_TACH_RANGE_MIN 480
27 #define EMC2305_PWM_DUTY2STATE(duty, max_state, pwm_max) \
28 DIV_ROUND_CLOSEST((duty) * (max_state), (pwm_max))
29 #define EMC2305_PWM_STATE2DUTY(state, max_state, pwm_max) \
30 DIV_ROUND_CLOSEST((state) * (pwm_max), (max_state))
33 * Factor by equations [2] and [3] from data sheet; valid for fans where the number of edges
34 * equal (poles * 2 + 1).
36 #define EMC2305_RPM_FACTOR 3932160
38 #define EMC2305_REG_FAN_DRIVE(n) (0x30 + 0x10 * (n))
39 #define EMC2305_REG_FAN_MIN_DRIVE(n) (0x38 + 0x10 * (n))
40 #define EMC2305_REG_FAN_TACH(n) (0x3e + 0x10 * (n))
42 enum emc230x_product_id
{
49 static const struct i2c_device_id emc2305_ids
[] = {
56 MODULE_DEVICE_TABLE(i2c
, emc2305_ids
);
59 * struct emc2305_cdev_data - device-specific cooling device state
60 * @cdev: cooling device
61 * @cur_state: cooling current state
62 * @last_hwmon_state: last cooling state updated by hwmon subsystem
63 * @last_thermal_state: last cooling state updated by thermal subsystem
65 * The 'last_hwmon_state' and 'last_thermal_state' fields are provided to support fan low limit
66 * speed feature. The purpose of this feature is to provides ability to limit fan speed
67 * according to some system wise considerations, like absence of some replaceable units (PSU or
68 * line cards), high system ambient temperature, unreliable transceivers temperature sensing or
69 * some other factors which indirectly impacts system's airflow
70 * Fan low limit feature is supported through 'hwmon' interface: 'hwmon' 'pwm' attribute is
71 * used for setting low limit for fan speed in case 'thermal' subsystem is configured in
72 * kernel. In this case setting fan speed through 'hwmon' will never let the 'thermal'
73 * subsystem to select a lower duty cycle than the duty cycle selected with the 'pwm'
75 * From other side, fan speed is to be updated in hardware through 'pwm' only in case the
76 * requested fan speed is above last speed set by 'thermal' subsystem, otherwise requested fan
77 * speed will be just stored with no PWM update.
79 struct emc2305_cdev_data
{
80 struct thermal_cooling_device
*cdev
;
81 unsigned int cur_state
;
82 unsigned long last_hwmon_state
;
83 unsigned long last_thermal_state
;
87 * struct emc2305_data - device-specific data
89 * @hwmon_dev: hwmon device
90 * @max_state: maximum cooling state of the cooling device
91 * @pwm_num: number of PWM channels
92 * @pwm_separate: separate PWM settings for every channel
93 * @pwm_min: array of minimum PWM per channel
94 * @cdev_data: array of cooling devices data
97 struct i2c_client
*client
;
98 struct device
*hwmon_dev
;
102 u8 pwm_min
[EMC2305_PWM_MAX
];
103 struct emc2305_cdev_data cdev_data
[EMC2305_PWM_MAX
];
106 static char *emc2305_fan_name
[] = {
115 static void emc2305_unset_tz(struct device
*dev
);
117 static int emc2305_get_max_channel(const struct emc2305_data
*data
)
119 return data
->pwm_num
;
122 static int emc2305_get_cdev_idx(struct thermal_cooling_device
*cdev
)
124 struct emc2305_data
*data
= cdev
->devdata
;
125 size_t len
= strlen(cdev
->type
);
132 * Returns index of cooling device 0..4 in case of separate PWM setting.
133 * Zero index is used in case of one common PWM setting.
134 * If the mode is not set as pwm_separate, all PWMs are to be bound
135 * to the common thermal zone and should work at the same speed
136 * to perform cooling for the same thermal junction.
137 * Otherwise, return specific channel that will be used in bound
138 * related PWM to the thermal zone.
140 if (!data
->pwm_separate
)
143 ret
= cdev
->type
[len
- 1];
153 static int emc2305_get_cur_state(struct thermal_cooling_device
*cdev
, unsigned long *state
)
156 struct emc2305_data
*data
= cdev
->devdata
;
158 cdev_idx
= emc2305_get_cdev_idx(cdev
);
162 *state
= data
->cdev_data
[cdev_idx
].cur_state
;
166 static int emc2305_get_max_state(struct thermal_cooling_device
*cdev
, unsigned long *state
)
168 struct emc2305_data
*data
= cdev
->devdata
;
169 *state
= data
->max_state
;
173 static int __emc2305_set_cur_state(struct emc2305_data
*data
, int cdev_idx
, unsigned long state
)
176 struct i2c_client
*client
= data
->client
;
179 state
= max_t(unsigned long, state
, data
->cdev_data
[cdev_idx
].last_hwmon_state
);
181 val
= EMC2305_PWM_STATE2DUTY(state
, data
->max_state
, EMC2305_FAN_MAX
);
183 data
->cdev_data
[cdev_idx
].cur_state
= state
;
184 if (data
->pwm_separate
) {
185 ret
= i2c_smbus_write_byte_data(client
, EMC2305_REG_FAN_DRIVE(cdev_idx
), val
);
190 * Set the same PWM value in all channels
191 * if common PWM channel is used.
193 for (i
= 0; i
< data
->pwm_num
; i
++) {
194 ret
= i2c_smbus_write_byte_data(client
, EMC2305_REG_FAN_DRIVE(i
), val
);
203 static int emc2305_set_cur_state(struct thermal_cooling_device
*cdev
, unsigned long state
)
206 struct emc2305_data
*data
= cdev
->devdata
;
208 if (state
> data
->max_state
)
211 cdev_idx
= emc2305_get_cdev_idx(cdev
);
215 /* Save thermal state. */
216 data
->cdev_data
[cdev_idx
].last_thermal_state
= state
;
217 ret
= __emc2305_set_cur_state(data
, cdev_idx
, state
);
224 static const struct thermal_cooling_device_ops emc2305_cooling_ops
= {
225 .get_max_state
= emc2305_get_max_state
,
226 .get_cur_state
= emc2305_get_cur_state
,
227 .set_cur_state
= emc2305_set_cur_state
,
230 static int emc2305_show_fault(struct device
*dev
, int channel
)
232 struct emc2305_data
*data
= dev_get_drvdata(dev
);
233 struct i2c_client
*client
= data
->client
;
236 status_reg
= i2c_smbus_read_byte_data(client
, EMC2305_REG_DRIVE_FAIL_STATUS
);
240 return status_reg
& (1 << channel
) ? 1 : 0;
243 static int emc2305_show_fan(struct device
*dev
, int channel
)
245 struct emc2305_data
*data
= dev_get_drvdata(dev
);
246 struct i2c_client
*client
= data
->client
;
249 ret
= i2c_smbus_read_word_swapped(client
, EMC2305_REG_FAN_TACH(channel
));
253 ret
= ret
>> EMC2305_TACH_REGS_UNUSE_BITS
;
254 ret
= EMC2305_RPM_FACTOR
/ ret
;
255 if (ret
<= EMC2305_TACH_RANGE_MIN
)
258 return ret
* EMC2305_TACH_CNT_MULTIPLIER
;
261 static int emc2305_show_pwm(struct device
*dev
, int channel
)
263 struct emc2305_data
*data
= dev_get_drvdata(dev
);
264 struct i2c_client
*client
= data
->client
;
266 return i2c_smbus_read_byte_data(client
, EMC2305_REG_FAN_DRIVE(channel
));
269 static int emc2305_set_pwm(struct device
*dev
, long val
, int channel
)
271 struct emc2305_data
*data
= dev_get_drvdata(dev
);
272 struct i2c_client
*client
= data
->client
;
275 if (val
< data
->pwm_min
[channel
] || val
> EMC2305_FAN_MAX
)
278 ret
= i2c_smbus_write_byte_data(client
, EMC2305_REG_FAN_DRIVE(channel
), val
);
281 data
->cdev_data
[channel
].cur_state
= EMC2305_PWM_DUTY2STATE(val
, data
->max_state
,
286 static int emc2305_set_single_tz(struct device
*dev
, int idx
)
288 struct emc2305_data
*data
= dev_get_drvdata(dev
);
290 int i
, cdev_idx
, ret
;
292 cdev_idx
= (idx
) ? idx
- 1 : 0;
293 pwm
= data
->pwm_min
[cdev_idx
];
295 data
->cdev_data
[cdev_idx
].cdev
=
296 thermal_cooling_device_register(emc2305_fan_name
[idx
], data
,
297 &emc2305_cooling_ops
);
299 if (IS_ERR(data
->cdev_data
[cdev_idx
].cdev
)) {
300 dev_err(dev
, "Failed to register cooling device %s\n", emc2305_fan_name
[idx
]);
301 return PTR_ERR(data
->cdev_data
[cdev_idx
].cdev
);
303 /* Set minimal PWM speed. */
304 if (data
->pwm_separate
) {
305 ret
= emc2305_set_pwm(dev
, pwm
, cdev_idx
);
309 for (i
= 0; i
< data
->pwm_num
; i
++) {
310 ret
= emc2305_set_pwm(dev
, pwm
, i
);
315 data
->cdev_data
[cdev_idx
].cur_state
=
316 EMC2305_PWM_DUTY2STATE(data
->pwm_min
[cdev_idx
], data
->max_state
,
318 data
->cdev_data
[cdev_idx
].last_hwmon_state
=
319 EMC2305_PWM_DUTY2STATE(data
->pwm_min
[cdev_idx
], data
->max_state
,
324 static int emc2305_set_tz(struct device
*dev
)
326 struct emc2305_data
*data
= dev_get_drvdata(dev
);
329 if (!data
->pwm_separate
)
330 return emc2305_set_single_tz(dev
, 0);
332 for (i
= 0; i
< data
->pwm_num
; i
++) {
333 ret
= emc2305_set_single_tz(dev
, i
+ 1);
335 goto thermal_cooling_device_register_fail
;
339 thermal_cooling_device_register_fail
:
340 emc2305_unset_tz(dev
);
344 static void emc2305_unset_tz(struct device
*dev
)
346 struct emc2305_data
*data
= dev_get_drvdata(dev
);
349 /* Unregister cooling device. */
350 for (i
= 0; i
< EMC2305_PWM_MAX
; i
++)
351 if (data
->cdev_data
[i
].cdev
)
352 thermal_cooling_device_unregister(data
->cdev_data
[i
].cdev
);
356 emc2305_is_visible(const void *data
, enum hwmon_sensor_types type
, u32 attr
, int channel
)
358 int max_channel
= emc2305_get_max_channel(data
);
360 /* Don't show channels which are not physically connected. */
361 if (channel
>= max_channel
)
366 case hwmon_fan_input
:
368 case hwmon_fan_fault
:
376 case hwmon_pwm_input
:
390 emc2305_write(struct device
*dev
, enum hwmon_sensor_types type
, u32 attr
, int channel
, long val
)
392 struct emc2305_data
*data
= dev_get_drvdata(dev
);
398 case hwmon_pwm_input
:
399 /* If thermal is configured - handle PWM limit setting. */
400 if (IS_REACHABLE(CONFIG_THERMAL
)) {
401 if (data
->pwm_separate
)
405 data
->cdev_data
[cdev_idx
].last_hwmon_state
=
406 EMC2305_PWM_DUTY2STATE(val
, data
->max_state
,
409 * Update PWM only in case requested state is not less than the
410 * last thermal state.
412 if (data
->cdev_data
[cdev_idx
].last_hwmon_state
>=
413 data
->cdev_data
[cdev_idx
].last_thermal_state
)
414 return __emc2305_set_cur_state(data
, cdev_idx
,
415 data
->cdev_data
[cdev_idx
].last_hwmon_state
);
418 return emc2305_set_pwm(dev
, val
, channel
);
431 emc2305_read(struct device
*dev
, enum hwmon_sensor_types type
, u32 attr
, int channel
, long *val
)
438 case hwmon_fan_input
:
439 ret
= emc2305_show_fan(dev
, channel
);
444 case hwmon_fan_fault
:
445 ret
= emc2305_show_fault(dev
, channel
);
456 case hwmon_pwm_input
:
457 ret
= emc2305_show_pwm(dev
, channel
);
473 static const struct hwmon_ops emc2305_ops
= {
474 .is_visible
= emc2305_is_visible
,
475 .read
= emc2305_read
,
476 .write
= emc2305_write
,
479 static const struct hwmon_channel_info
* const emc2305_info
[] = {
480 HWMON_CHANNEL_INFO(fan
,
481 HWMON_F_INPUT
| HWMON_F_FAULT
,
482 HWMON_F_INPUT
| HWMON_F_FAULT
,
483 HWMON_F_INPUT
| HWMON_F_FAULT
,
484 HWMON_F_INPUT
| HWMON_F_FAULT
,
485 HWMON_F_INPUT
| HWMON_F_FAULT
),
486 HWMON_CHANNEL_INFO(pwm
,
495 static const struct hwmon_chip_info emc2305_chip_info
= {
497 .info
= emc2305_info
,
500 static int emc2305_identify(struct device
*dev
)
502 struct i2c_client
*client
= to_i2c_client(dev
);
503 struct emc2305_data
*data
= i2c_get_clientdata(client
);
506 ret
= i2c_smbus_read_byte_data(client
, EMC2305_REG_PRODUCT_ID
);
530 static int emc2305_probe(struct i2c_client
*client
)
532 struct i2c_adapter
*adapter
= client
->adapter
;
533 struct device
*dev
= &client
->dev
;
534 struct emc2305_data
*data
;
535 struct emc2305_platform_data
*pdata
;
540 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
| I2C_FUNC_SMBUS_WORD_DATA
))
543 vendor
= i2c_smbus_read_byte_data(client
, EMC2305_REG_VENDOR
);
544 if (vendor
!= EMC2305_VENDOR
)
547 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
551 i2c_set_clientdata(client
, data
);
552 data
->client
= client
;
554 ret
= emc2305_identify(dev
);
558 pdata
= dev_get_platdata(&client
->dev
);
560 if (!pdata
->max_state
|| pdata
->max_state
> EMC2305_FAN_MAX_STATE
)
562 data
->max_state
= pdata
->max_state
;
564 * Validate a number of active PWM channels. Note that
565 * configured number can be less than the actual maximum
566 * supported by the device.
568 if (!pdata
->pwm_num
|| pdata
->pwm_num
> EMC2305_PWM_MAX
)
570 data
->pwm_num
= pdata
->pwm_num
;
571 data
->pwm_separate
= pdata
->pwm_separate
;
572 for (i
= 0; i
< EMC2305_PWM_MAX
; i
++)
573 data
->pwm_min
[i
] = pdata
->pwm_min
[i
];
575 data
->max_state
= EMC2305_FAN_MAX_STATE
;
576 data
->pwm_separate
= false;
577 for (i
= 0; i
< EMC2305_PWM_MAX
; i
++)
578 data
->pwm_min
[i
] = EMC2305_FAN_MIN
;
581 data
->hwmon_dev
= devm_hwmon_device_register_with_info(dev
, "emc2305", data
,
582 &emc2305_chip_info
, NULL
);
583 if (IS_ERR(data
->hwmon_dev
))
584 return PTR_ERR(data
->hwmon_dev
);
586 if (IS_REACHABLE(CONFIG_THERMAL
)) {
587 ret
= emc2305_set_tz(dev
);
592 for (i
= 0; i
< data
->pwm_num
; i
++) {
593 ret
= i2c_smbus_write_byte_data(client
, EMC2305_REG_FAN_MIN_DRIVE(i
),
602 static void emc2305_remove(struct i2c_client
*client
)
604 struct device
*dev
= &client
->dev
;
606 if (IS_REACHABLE(CONFIG_THERMAL
))
607 emc2305_unset_tz(dev
);
610 static struct i2c_driver emc2305_driver
= {
614 .probe
= emc2305_probe
,
615 .remove
= emc2305_remove
,
616 .id_table
= emc2305_ids
,
619 module_i2c_driver(emc2305_driver
);
621 MODULE_AUTHOR("Nvidia");
622 MODULE_DESCRIPTION("Microchip EMC2305 fan controller driver");
623 MODULE_LICENSE("GPL");