1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pwm-fan.c - Hwmon driver for fans connected to PWM lines.
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 * Author: Kamil Debski <k.debski@samsung.com>
10 #include <linux/hwmon.h>
11 #include <linux/interrupt.h>
12 #include <linux/module.h>
13 #include <linux/mutex.h>
15 #include <linux/platform_device.h>
16 #include <linux/pwm.h>
17 #include <linux/regulator/consumer.h>
18 #include <linux/sysfs.h>
19 #include <linux/thermal.h>
20 #include <linux/timer.h>
26 struct pwm_device
*pwm
;
27 struct regulator
*reg_en
;
32 u8 pulses_per_revolution
;
34 struct timer_list rpm_timer
;
36 unsigned int pwm_value
;
37 unsigned int pwm_fan_state
;
38 unsigned int pwm_fan_max_state
;
39 unsigned int *pwm_fan_cooling_levels
;
40 struct thermal_cooling_device
*cdev
;
42 struct hwmon_chip_info info
;
45 static const u32 pwm_fan_channel_config_pwm
[] = {
50 static const struct hwmon_channel_info pwm_fan_channel_pwm
= {
52 .config
= pwm_fan_channel_config_pwm
,
55 static const u32 pwm_fan_channel_config_fan
[] = {
60 static const struct hwmon_channel_info pwm_fan_channel_fan
= {
62 .config
= pwm_fan_channel_config_fan
,
65 /* This handler assumes self resetting edge triggered interrupt. */
66 static irqreturn_t
pulse_handler(int irq
, void *dev_id
)
68 struct pwm_fan_ctx
*ctx
= dev_id
;
70 atomic_inc(&ctx
->pulses
);
75 static void sample_timer(struct timer_list
*t
)
77 struct pwm_fan_ctx
*ctx
= from_timer(ctx
, t
, rpm_timer
);
78 unsigned int delta
= ktime_ms_delta(ktime_get(), ctx
->sample_start
);
82 pulses
= atomic_read(&ctx
->pulses
);
83 atomic_sub(pulses
, &ctx
->pulses
);
84 ctx
->rpm
= (unsigned int)(pulses
* 1000 * 60) /
85 (ctx
->pulses_per_revolution
* delta
);
87 ctx
->sample_start
= ktime_get();
90 mod_timer(&ctx
->rpm_timer
, jiffies
+ HZ
);
93 static int __set_pwm(struct pwm_fan_ctx
*ctx
, unsigned long pwm
)
97 struct pwm_state state
= { };
99 mutex_lock(&ctx
->lock
);
100 if (ctx
->pwm_value
== pwm
)
101 goto exit_set_pwm_err
;
103 pwm_init_state(ctx
->pwm
, &state
);
104 period
= ctx
->pwm
->args
.period
;
105 state
.duty_cycle
= DIV_ROUND_UP(pwm
* (period
- 1), MAX_PWM
);
106 state
.enabled
= pwm
? true : false;
108 ret
= pwm_apply_state(ctx
->pwm
, &state
);
110 ctx
->pwm_value
= pwm
;
112 mutex_unlock(&ctx
->lock
);
116 static void pwm_fan_update_state(struct pwm_fan_ctx
*ctx
, unsigned long pwm
)
120 for (i
= 0; i
< ctx
->pwm_fan_max_state
; ++i
)
121 if (pwm
< ctx
->pwm_fan_cooling_levels
[i
+ 1])
124 ctx
->pwm_fan_state
= i
;
127 static int pwm_fan_write(struct device
*dev
, enum hwmon_sensor_types type
,
128 u32 attr
, int channel
, long val
)
130 struct pwm_fan_ctx
*ctx
= dev_get_drvdata(dev
);
133 if (val
< 0 || val
> MAX_PWM
)
136 ret
= __set_pwm(ctx
, val
);
140 pwm_fan_update_state(ctx
, val
);
144 static int pwm_fan_read(struct device
*dev
, enum hwmon_sensor_types type
,
145 u32 attr
, int channel
, long *val
)
147 struct pwm_fan_ctx
*ctx
= dev_get_drvdata(dev
);
151 *val
= ctx
->pwm_value
;
163 static umode_t
pwm_fan_is_visible(const void *data
,
164 enum hwmon_sensor_types type
,
165 u32 attr
, int channel
)
179 static const struct hwmon_ops pwm_fan_hwmon_ops
= {
180 .is_visible
= pwm_fan_is_visible
,
181 .read
= pwm_fan_read
,
182 .write
= pwm_fan_write
,
185 /* thermal cooling device callbacks */
186 static int pwm_fan_get_max_state(struct thermal_cooling_device
*cdev
,
187 unsigned long *state
)
189 struct pwm_fan_ctx
*ctx
= cdev
->devdata
;
194 *state
= ctx
->pwm_fan_max_state
;
199 static int pwm_fan_get_cur_state(struct thermal_cooling_device
*cdev
,
200 unsigned long *state
)
202 struct pwm_fan_ctx
*ctx
= cdev
->devdata
;
207 *state
= ctx
->pwm_fan_state
;
213 pwm_fan_set_cur_state(struct thermal_cooling_device
*cdev
, unsigned long state
)
215 struct pwm_fan_ctx
*ctx
= cdev
->devdata
;
218 if (!ctx
|| (state
> ctx
->pwm_fan_max_state
))
221 if (state
== ctx
->pwm_fan_state
)
224 ret
= __set_pwm(ctx
, ctx
->pwm_fan_cooling_levels
[state
]);
226 dev_err(&cdev
->device
, "Cannot set pwm!\n");
230 ctx
->pwm_fan_state
= state
;
235 static const struct thermal_cooling_device_ops pwm_fan_cooling_ops
= {
236 .get_max_state
= pwm_fan_get_max_state
,
237 .get_cur_state
= pwm_fan_get_cur_state
,
238 .set_cur_state
= pwm_fan_set_cur_state
,
241 static int pwm_fan_of_get_cooling_data(struct device
*dev
,
242 struct pwm_fan_ctx
*ctx
)
244 struct device_node
*np
= dev
->of_node
;
247 if (!of_find_property(np
, "cooling-levels", NULL
))
250 ret
= of_property_count_u32_elems(np
, "cooling-levels");
252 dev_err(dev
, "Wrong data!\n");
253 return ret
? : -EINVAL
;
257 ctx
->pwm_fan_cooling_levels
= devm_kcalloc(dev
, num
, sizeof(u32
),
259 if (!ctx
->pwm_fan_cooling_levels
)
262 ret
= of_property_read_u32_array(np
, "cooling-levels",
263 ctx
->pwm_fan_cooling_levels
, num
);
265 dev_err(dev
, "Property 'cooling-levels' cannot be read!\n");
269 for (i
= 0; i
< num
; i
++) {
270 if (ctx
->pwm_fan_cooling_levels
[i
] > MAX_PWM
) {
271 dev_err(dev
, "PWM fan state[%d]:%d > %d\n", i
,
272 ctx
->pwm_fan_cooling_levels
[i
], MAX_PWM
);
277 ctx
->pwm_fan_max_state
= num
- 1;
282 static void pwm_fan_regulator_disable(void *data
)
284 regulator_disable(data
);
287 static void pwm_fan_pwm_disable(void *__ctx
)
289 struct pwm_fan_ctx
*ctx
= __ctx
;
290 pwm_disable(ctx
->pwm
);
291 del_timer_sync(&ctx
->rpm_timer
);
294 static int pwm_fan_probe(struct platform_device
*pdev
)
296 struct thermal_cooling_device
*cdev
;
297 struct device
*dev
= &pdev
->dev
;
298 struct pwm_fan_ctx
*ctx
;
299 struct device
*hwmon
;
301 struct pwm_state state
= { };
303 const struct hwmon_channel_info
**channels
;
305 ctx
= devm_kzalloc(dev
, sizeof(*ctx
), GFP_KERNEL
);
309 mutex_init(&ctx
->lock
);
311 ctx
->pwm
= devm_of_pwm_get(dev
, dev
->of_node
, NULL
);
312 if (IS_ERR(ctx
->pwm
))
313 return dev_err_probe(dev
, PTR_ERR(ctx
->pwm
), "Could not get PWM\n");
315 platform_set_drvdata(pdev
, ctx
);
317 ctx
->reg_en
= devm_regulator_get_optional(dev
, "fan");
318 if (IS_ERR(ctx
->reg_en
)) {
319 if (PTR_ERR(ctx
->reg_en
) != -ENODEV
)
320 return PTR_ERR(ctx
->reg_en
);
324 ret
= regulator_enable(ctx
->reg_en
);
326 dev_err(dev
, "Failed to enable fan supply: %d\n", ret
);
329 ret
= devm_add_action_or_reset(dev
, pwm_fan_regulator_disable
,
335 ctx
->pwm_value
= MAX_PWM
;
337 pwm_init_state(ctx
->pwm
, &state
);
339 * __set_pwm assumes that MAX_PWM * (period - 1) fits into an unsigned
340 * long. Check this here to prevent the fan running at a too low
343 if (state
.period
> ULONG_MAX
/ MAX_PWM
+ 1) {
344 dev_err(dev
, "Configured period too big\n");
348 /* Set duty cycle to maximum allowed and enable PWM output */
349 state
.duty_cycle
= ctx
->pwm
->args
.period
- 1;
350 state
.enabled
= true;
352 ret
= pwm_apply_state(ctx
->pwm
, &state
);
354 dev_err(dev
, "Failed to configure PWM: %d\n", ret
);
357 timer_setup(&ctx
->rpm_timer
, sample_timer
, 0);
358 ret
= devm_add_action_or_reset(dev
, pwm_fan_pwm_disable
, ctx
);
362 tach_count
= platform_irq_count(pdev
);
364 return dev_err_probe(dev
, tach_count
,
365 "Could not get number of fan tachometer inputs\n");
367 channels
= devm_kcalloc(dev
, tach_count
+ 2,
368 sizeof(struct hwmon_channel_info
*), GFP_KERNEL
);
372 channels
[0] = &pwm_fan_channel_pwm
;
374 if (tach_count
> 0) {
377 ctx
->irq
= platform_get_irq(pdev
, 0);
378 if (ctx
->irq
== -EPROBE_DEFER
)
381 ret
= devm_request_irq(dev
, ctx
->irq
, pulse_handler
, 0,
385 "Failed to request interrupt: %d\n",
391 of_property_read_u32(dev
->of_node
,
392 "pulses-per-revolution",
394 ctx
->pulses_per_revolution
= ppr
;
395 if (!ctx
->pulses_per_revolution
) {
396 dev_err(dev
, "pulses-per-revolution can't be zero.\n");
400 dev_dbg(dev
, "tach: irq=%d, pulses_per_revolution=%d\n",
401 ctx
->irq
, ctx
->pulses_per_revolution
);
403 ctx
->sample_start
= ktime_get();
404 mod_timer(&ctx
->rpm_timer
, jiffies
+ HZ
);
406 channels
[1] = &pwm_fan_channel_fan
;
409 ctx
->info
.ops
= &pwm_fan_hwmon_ops
;
410 ctx
->info
.info
= channels
;
412 hwmon
= devm_hwmon_device_register_with_info(dev
, "pwmfan",
413 ctx
, &ctx
->info
, NULL
);
415 dev_err(dev
, "Failed to register hwmon device\n");
416 return PTR_ERR(hwmon
);
419 ret
= pwm_fan_of_get_cooling_data(dev
, ctx
);
423 ctx
->pwm_fan_state
= ctx
->pwm_fan_max_state
;
424 if (IS_ENABLED(CONFIG_THERMAL
)) {
425 cdev
= devm_thermal_of_cooling_device_register(dev
,
426 dev
->of_node
, "pwm-fan", ctx
, &pwm_fan_cooling_ops
);
430 "Failed to register pwm-fan as cooling device: %d\n",
435 thermal_cdev_update(cdev
);
441 static int pwm_fan_disable(struct device
*dev
)
443 struct pwm_fan_ctx
*ctx
= dev_get_drvdata(dev
);
444 struct pwm_args args
;
447 pwm_get_args(ctx
->pwm
, &args
);
449 if (ctx
->pwm_value
) {
450 ret
= pwm_config(ctx
->pwm
, 0, args
.period
);
454 pwm_disable(ctx
->pwm
);
458 ret
= regulator_disable(ctx
->reg_en
);
460 dev_err(dev
, "Failed to disable fan supply: %d\n", ret
);
468 static void pwm_fan_shutdown(struct platform_device
*pdev
)
470 pwm_fan_disable(&pdev
->dev
);
473 #ifdef CONFIG_PM_SLEEP
474 static int pwm_fan_suspend(struct device
*dev
)
476 return pwm_fan_disable(dev
);
479 static int pwm_fan_resume(struct device
*dev
)
481 struct pwm_fan_ctx
*ctx
= dev_get_drvdata(dev
);
482 struct pwm_args pargs
;
487 ret
= regulator_enable(ctx
->reg_en
);
489 dev_err(dev
, "Failed to enable fan supply: %d\n", ret
);
494 if (ctx
->pwm_value
== 0)
497 pwm_get_args(ctx
->pwm
, &pargs
);
498 duty
= DIV_ROUND_UP_ULL(ctx
->pwm_value
* (pargs
.period
- 1), MAX_PWM
);
499 ret
= pwm_config(ctx
->pwm
, duty
, pargs
.period
);
502 return pwm_enable(ctx
->pwm
);
506 static SIMPLE_DEV_PM_OPS(pwm_fan_pm
, pwm_fan_suspend
, pwm_fan_resume
);
508 static const struct of_device_id of_pwm_fan_match
[] = {
509 { .compatible
= "pwm-fan", },
512 MODULE_DEVICE_TABLE(of
, of_pwm_fan_match
);
514 static struct platform_driver pwm_fan_driver
= {
515 .probe
= pwm_fan_probe
,
516 .shutdown
= pwm_fan_shutdown
,
520 .of_match_table
= of_pwm_fan_match
,
524 module_platform_driver(pwm_fan_driver
);
526 MODULE_AUTHOR("Kamil Debski <k.debski@samsung.com>");
527 MODULE_ALIAS("platform:pwm-fan");
528 MODULE_DESCRIPTION("PWM FAN driver");
529 MODULE_LICENSE("GPL");