1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * gpio-fan.c - Hwmon driver for fans connected to GPIO lines.
5 * Copyright (C) 2010 LaCie
7 * Author: Simon Guinot <sguinot@lacie.com>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <linux/interrupt.h>
14 #include <linux/irq.h>
15 #include <linux/platform_device.h>
16 #include <linux/err.h>
17 #include <linux/mutex.h>
18 #include <linux/hwmon.h>
19 #include <linux/gpio/consumer.h>
21 #include <linux/of_platform.h>
22 #include <linux/thermal.h>
24 struct gpio_fan_speed
{
29 struct gpio_fan_data
{
31 struct device
*hwmon_dev
;
32 /* Cooling device if any */
33 struct thermal_cooling_device
*cdev
;
34 struct mutex lock
; /* lock GPIOs operations. */
36 struct gpio_desc
**gpios
;
38 struct gpio_fan_speed
*speed
;
40 #ifdef CONFIG_PM_SLEEP
44 struct gpio_desc
*alarm_gpio
;
45 struct work_struct alarm_work
;
52 static void fan_alarm_notify(struct work_struct
*ws
)
54 struct gpio_fan_data
*fan_data
=
55 container_of(ws
, struct gpio_fan_data
, alarm_work
);
57 sysfs_notify(&fan_data
->hwmon_dev
->kobj
, NULL
, "fan1_alarm");
58 kobject_uevent(&fan_data
->hwmon_dev
->kobj
, KOBJ_CHANGE
);
61 static irqreturn_t
fan_alarm_irq_handler(int irq
, void *dev_id
)
63 struct gpio_fan_data
*fan_data
= dev_id
;
65 schedule_work(&fan_data
->alarm_work
);
70 static ssize_t
fan1_alarm_show(struct device
*dev
,
71 struct device_attribute
*attr
, char *buf
)
73 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
75 return sprintf(buf
, "%d\n",
76 gpiod_get_value_cansleep(fan_data
->alarm_gpio
));
79 static DEVICE_ATTR_RO(fan1_alarm
);
81 static int fan_alarm_init(struct gpio_fan_data
*fan_data
)
84 struct device
*dev
= fan_data
->dev
;
87 * If the alarm GPIO don't support interrupts, just leave
88 * without initializing the fail notification support.
90 alarm_irq
= gpiod_to_irq(fan_data
->alarm_gpio
);
94 INIT_WORK(&fan_data
->alarm_work
, fan_alarm_notify
);
95 irq_set_irq_type(alarm_irq
, IRQ_TYPE_EDGE_BOTH
);
96 return devm_request_irq(dev
, alarm_irq
, fan_alarm_irq_handler
,
97 IRQF_SHARED
, "GPIO fan alarm", fan_data
);
104 /* Must be called with fan_data->lock held, except during initialization. */
105 static void __set_fan_ctrl(struct gpio_fan_data
*fan_data
, int ctrl_val
)
109 for (i
= 0; i
< fan_data
->num_gpios
; i
++)
110 gpiod_set_value_cansleep(fan_data
->gpios
[i
],
111 (ctrl_val
>> i
) & 1);
114 static int __get_fan_ctrl(struct gpio_fan_data
*fan_data
)
119 for (i
= 0; i
< fan_data
->num_gpios
; i
++) {
122 value
= gpiod_get_value_cansleep(fan_data
->gpios
[i
]);
123 ctrl_val
|= (value
<< i
);
128 /* Must be called with fan_data->lock held, except during initialization. */
129 static void set_fan_speed(struct gpio_fan_data
*fan_data
, int speed_index
)
131 if (fan_data
->speed_index
== speed_index
)
134 __set_fan_ctrl(fan_data
, fan_data
->speed
[speed_index
].ctrl_val
);
135 fan_data
->speed_index
= speed_index
;
138 static int get_fan_speed_index(struct gpio_fan_data
*fan_data
)
140 int ctrl_val
= __get_fan_ctrl(fan_data
);
143 for (i
= 0; i
< fan_data
->num_speed
; i
++)
144 if (fan_data
->speed
[i
].ctrl_val
== ctrl_val
)
147 dev_warn(fan_data
->dev
,
148 "missing speed array entry for GPIO value 0x%x\n", ctrl_val
);
153 static int rpm_to_speed_index(struct gpio_fan_data
*fan_data
, unsigned long rpm
)
155 struct gpio_fan_speed
*speed
= fan_data
->speed
;
158 for (i
= 0; i
< fan_data
->num_speed
; i
++)
159 if (speed
[i
].rpm
>= rpm
)
162 return fan_data
->num_speed
- 1;
165 static ssize_t
pwm1_show(struct device
*dev
, struct device_attribute
*attr
,
168 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
169 u8 pwm
= fan_data
->speed_index
* 255 / (fan_data
->num_speed
- 1);
171 return sprintf(buf
, "%d\n", pwm
);
174 static ssize_t
pwm1_store(struct device
*dev
, struct device_attribute
*attr
,
175 const char *buf
, size_t count
)
177 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
182 if (kstrtoul(buf
, 10, &pwm
) || pwm
> 255)
185 mutex_lock(&fan_data
->lock
);
187 if (!fan_data
->pwm_enable
) {
192 speed_index
= DIV_ROUND_UP(pwm
* (fan_data
->num_speed
- 1), 255);
193 set_fan_speed(fan_data
, speed_index
);
196 mutex_unlock(&fan_data
->lock
);
201 static ssize_t
pwm1_enable_show(struct device
*dev
,
202 struct device_attribute
*attr
, char *buf
)
204 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
206 return sprintf(buf
, "%d\n", fan_data
->pwm_enable
);
209 static ssize_t
pwm1_enable_store(struct device
*dev
,
210 struct device_attribute
*attr
,
211 const char *buf
, size_t count
)
213 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
216 if (kstrtoul(buf
, 10, &val
) || val
> 1)
219 if (fan_data
->pwm_enable
== val
)
222 mutex_lock(&fan_data
->lock
);
224 fan_data
->pwm_enable
= val
;
226 /* Disable manual control mode: set fan at full speed. */
228 set_fan_speed(fan_data
, fan_data
->num_speed
- 1);
230 mutex_unlock(&fan_data
->lock
);
235 static ssize_t
pwm1_mode_show(struct device
*dev
,
236 struct device_attribute
*attr
, char *buf
)
238 return sprintf(buf
, "0\n");
241 static ssize_t
fan1_min_show(struct device
*dev
,
242 struct device_attribute
*attr
, char *buf
)
244 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
246 return sprintf(buf
, "%d\n", fan_data
->speed
[0].rpm
);
249 static ssize_t
fan1_max_show(struct device
*dev
,
250 struct device_attribute
*attr
, char *buf
)
252 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
254 return sprintf(buf
, "%d\n",
255 fan_data
->speed
[fan_data
->num_speed
- 1].rpm
);
258 static ssize_t
fan1_input_show(struct device
*dev
,
259 struct device_attribute
*attr
, char *buf
)
261 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
263 return sprintf(buf
, "%d\n", fan_data
->speed
[fan_data
->speed_index
].rpm
);
266 static ssize_t
set_rpm(struct device
*dev
, struct device_attribute
*attr
,
267 const char *buf
, size_t count
)
269 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
273 if (kstrtoul(buf
, 10, &rpm
))
276 mutex_lock(&fan_data
->lock
);
278 if (!fan_data
->pwm_enable
) {
283 set_fan_speed(fan_data
, rpm_to_speed_index(fan_data
, rpm
));
286 mutex_unlock(&fan_data
->lock
);
291 static DEVICE_ATTR_RW(pwm1
);
292 static DEVICE_ATTR_RW(pwm1_enable
);
293 static DEVICE_ATTR_RO(pwm1_mode
);
294 static DEVICE_ATTR_RO(fan1_min
);
295 static DEVICE_ATTR_RO(fan1_max
);
296 static DEVICE_ATTR_RO(fan1_input
);
297 static DEVICE_ATTR(fan1_target
, 0644, fan1_input_show
, set_rpm
);
299 static umode_t
gpio_fan_is_visible(struct kobject
*kobj
,
300 struct attribute
*attr
, int index
)
302 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
303 struct gpio_fan_data
*data
= dev_get_drvdata(dev
);
305 if (index
== 0 && !data
->alarm_gpio
)
307 if (index
> 0 && !data
->gpios
)
313 static struct attribute
*gpio_fan_attributes
[] = {
314 &dev_attr_fan1_alarm
.attr
, /* 0 */
315 &dev_attr_pwm1
.attr
, /* 1 */
316 &dev_attr_pwm1_enable
.attr
,
317 &dev_attr_pwm1_mode
.attr
,
318 &dev_attr_fan1_input
.attr
,
319 &dev_attr_fan1_target
.attr
,
320 &dev_attr_fan1_min
.attr
,
321 &dev_attr_fan1_max
.attr
,
325 static const struct attribute_group gpio_fan_group
= {
326 .attrs
= gpio_fan_attributes
,
327 .is_visible
= gpio_fan_is_visible
,
330 static const struct attribute_group
*gpio_fan_groups
[] = {
335 static int fan_ctrl_init(struct gpio_fan_data
*fan_data
)
337 int num_gpios
= fan_data
->num_gpios
;
338 struct gpio_desc
**gpios
= fan_data
->gpios
;
341 for (i
= 0; i
< num_gpios
; i
++) {
343 * The GPIO descriptors were retrieved with GPIOD_ASIS so here
344 * we set the GPIO into output mode, carefully preserving the
345 * current value by setting it to whatever it is already set
346 * (no surprise changes in default fan speed).
348 err
= gpiod_direction_output(gpios
[i
],
349 gpiod_get_value_cansleep(gpios
[i
]));
354 fan_data
->pwm_enable
= true; /* Enable manual fan speed control. */
355 fan_data
->speed_index
= get_fan_speed_index(fan_data
);
356 if (fan_data
->speed_index
< 0)
357 return fan_data
->speed_index
;
362 static int gpio_fan_get_max_state(struct thermal_cooling_device
*cdev
,
363 unsigned long *state
)
365 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
370 *state
= fan_data
->num_speed
- 1;
374 static int gpio_fan_get_cur_state(struct thermal_cooling_device
*cdev
,
375 unsigned long *state
)
377 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
382 *state
= fan_data
->speed_index
;
386 static int gpio_fan_set_cur_state(struct thermal_cooling_device
*cdev
,
389 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
394 set_fan_speed(fan_data
, state
);
398 static const struct thermal_cooling_device_ops gpio_fan_cool_ops
= {
399 .get_max_state
= gpio_fan_get_max_state
,
400 .get_cur_state
= gpio_fan_get_cur_state
,
401 .set_cur_state
= gpio_fan_set_cur_state
,
405 * Translate OpenFirmware node properties into platform_data
407 static int gpio_fan_get_of_data(struct gpio_fan_data
*fan_data
)
409 struct gpio_fan_speed
*speed
;
410 struct device
*dev
= fan_data
->dev
;
411 struct device_node
*np
= dev
->of_node
;
412 struct gpio_desc
**gpios
;
415 struct property
*prop
;
418 /* Alarm GPIO if one exists */
419 fan_data
->alarm_gpio
= devm_gpiod_get_optional(dev
, "alarm", GPIOD_IN
);
420 if (IS_ERR(fan_data
->alarm_gpio
))
421 return PTR_ERR(fan_data
->alarm_gpio
);
423 /* Fill GPIO pin array */
424 fan_data
->num_gpios
= gpiod_count(dev
, NULL
);
425 if (fan_data
->num_gpios
<= 0) {
426 if (fan_data
->alarm_gpio
)
428 dev_err(dev
, "DT properties empty / missing");
431 gpios
= devm_kcalloc(dev
,
432 fan_data
->num_gpios
, sizeof(struct gpio_desc
*),
436 for (i
= 0; i
< fan_data
->num_gpios
; i
++) {
437 gpios
[i
] = devm_gpiod_get_index(dev
, NULL
, i
, GPIOD_ASIS
);
438 if (IS_ERR(gpios
[i
]))
439 return PTR_ERR(gpios
[i
]);
441 fan_data
->gpios
= gpios
;
443 /* Get number of RPM/ctrl_val pairs in speed map */
444 prop
= of_find_property(np
, "gpio-fan,speed-map", &i
);
446 dev_err(dev
, "gpio-fan,speed-map DT property missing");
450 if (i
== 0 || i
& 1) {
451 dev_err(dev
, "gpio-fan,speed-map contains zero/odd number of entries");
454 fan_data
->num_speed
= i
/ 2;
458 * Speed map is in the form <RPM ctrl_val RPM ctrl_val ...>
459 * this needs splitting into pairs to create gpio_fan_speed structs
461 speed
= devm_kcalloc(dev
,
462 fan_data
->num_speed
, sizeof(struct gpio_fan_speed
),
467 for (i
= 0; i
< fan_data
->num_speed
; i
++) {
468 p
= of_prop_next_u32(prop
, p
, &u
);
472 p
= of_prop_next_u32(prop
, p
, &u
);
475 speed
[i
].ctrl_val
= u
;
477 fan_data
->speed
= speed
;
482 static const struct of_device_id of_gpio_fan_match
[] = {
483 { .compatible
= "gpio-fan", },
486 MODULE_DEVICE_TABLE(of
, of_gpio_fan_match
);
488 static void gpio_fan_stop(void *data
)
490 set_fan_speed(data
, 0);
493 static int gpio_fan_probe(struct platform_device
*pdev
)
496 struct gpio_fan_data
*fan_data
;
497 struct device
*dev
= &pdev
->dev
;
498 struct device_node
*np
= dev
->of_node
;
500 fan_data
= devm_kzalloc(dev
, sizeof(struct gpio_fan_data
),
506 err
= gpio_fan_get_of_data(fan_data
);
510 platform_set_drvdata(pdev
, fan_data
);
511 mutex_init(&fan_data
->lock
);
513 /* Configure control GPIOs if available. */
514 if (fan_data
->gpios
&& fan_data
->num_gpios
> 0) {
515 if (!fan_data
->speed
|| fan_data
->num_speed
<= 1)
517 err
= fan_ctrl_init(fan_data
);
520 err
= devm_add_action_or_reset(dev
, gpio_fan_stop
, fan_data
);
525 /* Make this driver part of hwmon class. */
526 fan_data
->hwmon_dev
=
527 devm_hwmon_device_register_with_groups(dev
,
528 "gpio_fan", fan_data
,
530 if (IS_ERR(fan_data
->hwmon_dev
))
531 return PTR_ERR(fan_data
->hwmon_dev
);
533 /* Configure alarm GPIO if available. */
534 if (fan_data
->alarm_gpio
) {
535 err
= fan_alarm_init(fan_data
);
540 /* Optional cooling device register for Device tree platforms */
541 fan_data
->cdev
= devm_thermal_of_cooling_device_register(dev
, np
,
542 "gpio-fan", fan_data
, &gpio_fan_cool_ops
);
544 dev_info(dev
, "GPIO fan initialized\n");
549 static void gpio_fan_shutdown(struct platform_device
*pdev
)
551 struct gpio_fan_data
*fan_data
= platform_get_drvdata(pdev
);
554 set_fan_speed(fan_data
, 0);
557 #ifdef CONFIG_PM_SLEEP
558 static int gpio_fan_suspend(struct device
*dev
)
560 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
562 if (fan_data
->gpios
) {
563 fan_data
->resume_speed
= fan_data
->speed_index
;
564 set_fan_speed(fan_data
, 0);
570 static int gpio_fan_resume(struct device
*dev
)
572 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
575 set_fan_speed(fan_data
, fan_data
->resume_speed
);
580 static SIMPLE_DEV_PM_OPS(gpio_fan_pm
, gpio_fan_suspend
, gpio_fan_resume
);
581 #define GPIO_FAN_PM (&gpio_fan_pm)
583 #define GPIO_FAN_PM NULL
586 static struct platform_driver gpio_fan_driver
= {
587 .probe
= gpio_fan_probe
,
588 .shutdown
= gpio_fan_shutdown
,
592 .of_match_table
= of_match_ptr(of_gpio_fan_match
),
596 module_platform_driver(gpio_fan_driver
);
598 MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>");
599 MODULE_DESCRIPTION("GPIO FAN driver");
600 MODULE_LICENSE("GPL");
601 MODULE_ALIAS("platform:gpio-fan");