2 * gpio-fan.c - Hwmon driver for fans connected to GPIO lines.
4 * Copyright (C) 2010 LaCie
6 * Author: Simon Guinot <sguinot@lacie.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/slab.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/platform_device.h>
29 #include <linux/err.h>
30 #include <linux/mutex.h>
31 #include <linux/hwmon.h>
32 #include <linux/gpio/consumer.h>
34 #include <linux/of_platform.h>
35 #include <linux/thermal.h>
37 struct gpio_fan_speed
{
42 struct gpio_fan_data
{
44 struct device
*hwmon_dev
;
45 /* Cooling device if any */
46 struct thermal_cooling_device
*cdev
;
47 struct mutex lock
; /* lock GPIOs operations. */
49 struct gpio_desc
**gpios
;
51 struct gpio_fan_speed
*speed
;
53 #ifdef CONFIG_PM_SLEEP
57 struct gpio_desc
*alarm_gpio
;
58 struct work_struct alarm_work
;
65 static void fan_alarm_notify(struct work_struct
*ws
)
67 struct gpio_fan_data
*fan_data
=
68 container_of(ws
, struct gpio_fan_data
, alarm_work
);
70 sysfs_notify(&fan_data
->dev
->kobj
, NULL
, "fan1_alarm");
71 kobject_uevent(&fan_data
->dev
->kobj
, KOBJ_CHANGE
);
74 static irqreturn_t
fan_alarm_irq_handler(int irq
, void *dev_id
)
76 struct gpio_fan_data
*fan_data
= dev_id
;
78 schedule_work(&fan_data
->alarm_work
);
83 static ssize_t
fan1_alarm_show(struct device
*dev
,
84 struct device_attribute
*attr
, char *buf
)
86 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
88 return sprintf(buf
, "%d\n",
89 gpiod_get_value_cansleep(fan_data
->alarm_gpio
));
92 static DEVICE_ATTR_RO(fan1_alarm
);
94 static int fan_alarm_init(struct gpio_fan_data
*fan_data
)
97 struct device
*dev
= fan_data
->dev
;
100 * If the alarm GPIO don't support interrupts, just leave
101 * without initializing the fail notification support.
103 alarm_irq
= gpiod_to_irq(fan_data
->alarm_gpio
);
107 INIT_WORK(&fan_data
->alarm_work
, fan_alarm_notify
);
108 irq_set_irq_type(alarm_irq
, IRQ_TYPE_EDGE_BOTH
);
109 return devm_request_irq(dev
, alarm_irq
, fan_alarm_irq_handler
,
110 IRQF_SHARED
, "GPIO fan alarm", fan_data
);
117 /* Must be called with fan_data->lock held, except during initialization. */
118 static void __set_fan_ctrl(struct gpio_fan_data
*fan_data
, int ctrl_val
)
122 for (i
= 0; i
< fan_data
->num_gpios
; i
++)
123 gpiod_set_value_cansleep(fan_data
->gpios
[i
],
124 (ctrl_val
>> i
) & 1);
127 static int __get_fan_ctrl(struct gpio_fan_data
*fan_data
)
132 for (i
= 0; i
< fan_data
->num_gpios
; i
++) {
135 value
= gpiod_get_value_cansleep(fan_data
->gpios
[i
]);
136 ctrl_val
|= (value
<< i
);
141 /* Must be called with fan_data->lock held, except during initialization. */
142 static void set_fan_speed(struct gpio_fan_data
*fan_data
, int speed_index
)
144 if (fan_data
->speed_index
== speed_index
)
147 __set_fan_ctrl(fan_data
, fan_data
->speed
[speed_index
].ctrl_val
);
148 fan_data
->speed_index
= speed_index
;
151 static int get_fan_speed_index(struct gpio_fan_data
*fan_data
)
153 int ctrl_val
= __get_fan_ctrl(fan_data
);
156 for (i
= 0; i
< fan_data
->num_speed
; i
++)
157 if (fan_data
->speed
[i
].ctrl_val
== ctrl_val
)
160 dev_warn(fan_data
->dev
,
161 "missing speed array entry for GPIO value 0x%x\n", ctrl_val
);
166 static int rpm_to_speed_index(struct gpio_fan_data
*fan_data
, unsigned long rpm
)
168 struct gpio_fan_speed
*speed
= fan_data
->speed
;
171 for (i
= 0; i
< fan_data
->num_speed
; i
++)
172 if (speed
[i
].rpm
>= rpm
)
175 return fan_data
->num_speed
- 1;
178 static ssize_t
pwm1_show(struct device
*dev
, struct device_attribute
*attr
,
181 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
182 u8 pwm
= fan_data
->speed_index
* 255 / (fan_data
->num_speed
- 1);
184 return sprintf(buf
, "%d\n", pwm
);
187 static ssize_t
pwm1_store(struct device
*dev
, struct device_attribute
*attr
,
188 const char *buf
, size_t count
)
190 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
195 if (kstrtoul(buf
, 10, &pwm
) || pwm
> 255)
198 mutex_lock(&fan_data
->lock
);
200 if (!fan_data
->pwm_enable
) {
205 speed_index
= DIV_ROUND_UP(pwm
* (fan_data
->num_speed
- 1), 255);
206 set_fan_speed(fan_data
, speed_index
);
209 mutex_unlock(&fan_data
->lock
);
214 static ssize_t
pwm1_enable_show(struct device
*dev
,
215 struct device_attribute
*attr
, char *buf
)
217 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
219 return sprintf(buf
, "%d\n", fan_data
->pwm_enable
);
222 static ssize_t
pwm1_enable_store(struct device
*dev
,
223 struct device_attribute
*attr
,
224 const char *buf
, size_t count
)
226 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
229 if (kstrtoul(buf
, 10, &val
) || val
> 1)
232 if (fan_data
->pwm_enable
== val
)
235 mutex_lock(&fan_data
->lock
);
237 fan_data
->pwm_enable
= val
;
239 /* Disable manual control mode: set fan at full speed. */
241 set_fan_speed(fan_data
, fan_data
->num_speed
- 1);
243 mutex_unlock(&fan_data
->lock
);
248 static ssize_t
pwm1_mode_show(struct device
*dev
,
249 struct device_attribute
*attr
, char *buf
)
251 return sprintf(buf
, "0\n");
254 static ssize_t
fan1_min_show(struct device
*dev
,
255 struct device_attribute
*attr
, char *buf
)
257 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
259 return sprintf(buf
, "%d\n", fan_data
->speed
[0].rpm
);
262 static ssize_t
fan1_max_show(struct device
*dev
,
263 struct device_attribute
*attr
, char *buf
)
265 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
267 return sprintf(buf
, "%d\n",
268 fan_data
->speed
[fan_data
->num_speed
- 1].rpm
);
271 static ssize_t
fan1_input_show(struct device
*dev
,
272 struct device_attribute
*attr
, char *buf
)
274 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
276 return sprintf(buf
, "%d\n", fan_data
->speed
[fan_data
->speed_index
].rpm
);
279 static ssize_t
set_rpm(struct device
*dev
, struct device_attribute
*attr
,
280 const char *buf
, size_t count
)
282 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
286 if (kstrtoul(buf
, 10, &rpm
))
289 mutex_lock(&fan_data
->lock
);
291 if (!fan_data
->pwm_enable
) {
296 set_fan_speed(fan_data
, rpm_to_speed_index(fan_data
, rpm
));
299 mutex_unlock(&fan_data
->lock
);
304 static DEVICE_ATTR_RW(pwm1
);
305 static DEVICE_ATTR_RW(pwm1_enable
);
306 static DEVICE_ATTR_RO(pwm1_mode
);
307 static DEVICE_ATTR_RO(fan1_min
);
308 static DEVICE_ATTR_RO(fan1_max
);
309 static DEVICE_ATTR_RO(fan1_input
);
310 static DEVICE_ATTR(fan1_target
, S_IRUGO
| S_IWUSR
, fan1_input_show
, set_rpm
);
312 static umode_t
gpio_fan_is_visible(struct kobject
*kobj
,
313 struct attribute
*attr
, int index
)
315 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
316 struct gpio_fan_data
*data
= dev_get_drvdata(dev
);
318 if (index
== 0 && !data
->alarm_gpio
)
320 if (index
> 0 && !data
->gpios
)
326 static struct attribute
*gpio_fan_attributes
[] = {
327 &dev_attr_fan1_alarm
.attr
, /* 0 */
328 &dev_attr_pwm1
.attr
, /* 1 */
329 &dev_attr_pwm1_enable
.attr
,
330 &dev_attr_pwm1_mode
.attr
,
331 &dev_attr_fan1_input
.attr
,
332 &dev_attr_fan1_target
.attr
,
333 &dev_attr_fan1_min
.attr
,
334 &dev_attr_fan1_max
.attr
,
338 static const struct attribute_group gpio_fan_group
= {
339 .attrs
= gpio_fan_attributes
,
340 .is_visible
= gpio_fan_is_visible
,
343 static const struct attribute_group
*gpio_fan_groups
[] = {
348 static int fan_ctrl_init(struct gpio_fan_data
*fan_data
)
350 int num_gpios
= fan_data
->num_gpios
;
351 struct gpio_desc
**gpios
= fan_data
->gpios
;
354 for (i
= 0; i
< num_gpios
; i
++) {
356 * The GPIO descriptors were retrieved with GPIOD_ASIS so here
357 * we set the GPIO into output mode, carefully preserving the
358 * current value by setting it to whatever it is already set
359 * (no surprise changes in default fan speed).
361 err
= gpiod_direction_output(gpios
[i
],
362 gpiod_get_value_cansleep(gpios
[i
]));
367 fan_data
->pwm_enable
= true; /* Enable manual fan speed control. */
368 fan_data
->speed_index
= get_fan_speed_index(fan_data
);
369 if (fan_data
->speed_index
< 0)
370 return fan_data
->speed_index
;
375 static int gpio_fan_get_max_state(struct thermal_cooling_device
*cdev
,
376 unsigned long *state
)
378 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
383 *state
= fan_data
->num_speed
- 1;
387 static int gpio_fan_get_cur_state(struct thermal_cooling_device
*cdev
,
388 unsigned long *state
)
390 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
395 *state
= fan_data
->speed_index
;
399 static int gpio_fan_set_cur_state(struct thermal_cooling_device
*cdev
,
402 struct gpio_fan_data
*fan_data
= cdev
->devdata
;
407 set_fan_speed(fan_data
, state
);
411 static const struct thermal_cooling_device_ops gpio_fan_cool_ops
= {
412 .get_max_state
= gpio_fan_get_max_state
,
413 .get_cur_state
= gpio_fan_get_cur_state
,
414 .set_cur_state
= gpio_fan_set_cur_state
,
418 * Translate OpenFirmware node properties into platform_data
420 static int gpio_fan_get_of_data(struct gpio_fan_data
*fan_data
)
422 struct gpio_fan_speed
*speed
;
423 struct device
*dev
= fan_data
->dev
;
424 struct device_node
*np
= dev
->of_node
;
425 struct gpio_desc
**gpios
;
428 struct property
*prop
;
431 /* Alarm GPIO if one exists */
432 fan_data
->alarm_gpio
= devm_gpiod_get_optional(dev
, "alarm", GPIOD_IN
);
433 if (IS_ERR(fan_data
->alarm_gpio
))
434 return PTR_ERR(fan_data
->alarm_gpio
);
436 /* Fill GPIO pin array */
437 fan_data
->num_gpios
= gpiod_count(dev
, NULL
);
438 if (fan_data
->num_gpios
<= 0) {
439 if (fan_data
->alarm_gpio
)
441 dev_err(dev
, "DT properties empty / missing");
444 gpios
= devm_kcalloc(dev
,
445 fan_data
->num_gpios
, sizeof(struct gpio_desc
*),
449 for (i
= 0; i
< fan_data
->num_gpios
; i
++) {
450 gpios
[i
] = devm_gpiod_get_index(dev
, NULL
, i
, GPIOD_ASIS
);
451 if (IS_ERR(gpios
[i
]))
452 return PTR_ERR(gpios
[i
]);
454 fan_data
->gpios
= gpios
;
456 /* Get number of RPM/ctrl_val pairs in speed map */
457 prop
= of_find_property(np
, "gpio-fan,speed-map", &i
);
459 dev_err(dev
, "gpio-fan,speed-map DT property missing");
463 if (i
== 0 || i
& 1) {
464 dev_err(dev
, "gpio-fan,speed-map contains zero/odd number of entries");
467 fan_data
->num_speed
= i
/ 2;
471 * Speed map is in the form <RPM ctrl_val RPM ctrl_val ...>
472 * this needs splitting into pairs to create gpio_fan_speed structs
474 speed
= devm_kcalloc(dev
,
475 fan_data
->num_speed
, sizeof(struct gpio_fan_speed
),
480 for (i
= 0; i
< fan_data
->num_speed
; i
++) {
481 p
= of_prop_next_u32(prop
, p
, &u
);
485 p
= of_prop_next_u32(prop
, p
, &u
);
488 speed
[i
].ctrl_val
= u
;
490 fan_data
->speed
= speed
;
495 static const struct of_device_id of_gpio_fan_match
[] = {
496 { .compatible
= "gpio-fan", },
499 MODULE_DEVICE_TABLE(of
, of_gpio_fan_match
);
501 static int gpio_fan_probe(struct platform_device
*pdev
)
504 struct gpio_fan_data
*fan_data
;
505 struct device
*dev
= &pdev
->dev
;
506 struct device_node
*np
= dev
->of_node
;
508 fan_data
= devm_kzalloc(dev
, sizeof(struct gpio_fan_data
),
514 err
= gpio_fan_get_of_data(fan_data
);
518 platform_set_drvdata(pdev
, fan_data
);
519 mutex_init(&fan_data
->lock
);
521 /* Configure alarm GPIO if available. */
522 if (fan_data
->alarm_gpio
) {
523 err
= fan_alarm_init(fan_data
);
528 /* Configure control GPIOs if available. */
529 if (fan_data
->gpios
&& fan_data
->num_gpios
> 0) {
530 if (!fan_data
->speed
|| fan_data
->num_speed
<= 1)
532 err
= fan_ctrl_init(fan_data
);
537 /* Make this driver part of hwmon class. */
538 fan_data
->hwmon_dev
=
539 devm_hwmon_device_register_with_groups(dev
,
540 "gpio_fan", fan_data
,
542 if (IS_ERR(fan_data
->hwmon_dev
))
543 return PTR_ERR(fan_data
->hwmon_dev
);
545 /* Optional cooling device register for Device tree platforms */
546 fan_data
->cdev
= thermal_of_cooling_device_register(np
,
551 dev_info(dev
, "GPIO fan initialized\n");
556 static int gpio_fan_remove(struct platform_device
*pdev
)
558 struct gpio_fan_data
*fan_data
= platform_get_drvdata(pdev
);
560 if (!IS_ERR(fan_data
->cdev
))
561 thermal_cooling_device_unregister(fan_data
->cdev
);
564 set_fan_speed(fan_data
, 0);
569 static void gpio_fan_shutdown(struct platform_device
*pdev
)
571 gpio_fan_remove(pdev
);
574 #ifdef CONFIG_PM_SLEEP
575 static int gpio_fan_suspend(struct device
*dev
)
577 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
579 if (fan_data
->gpios
) {
580 fan_data
->resume_speed
= fan_data
->speed_index
;
581 set_fan_speed(fan_data
, 0);
587 static int gpio_fan_resume(struct device
*dev
)
589 struct gpio_fan_data
*fan_data
= dev_get_drvdata(dev
);
592 set_fan_speed(fan_data
, fan_data
->resume_speed
);
597 static SIMPLE_DEV_PM_OPS(gpio_fan_pm
, gpio_fan_suspend
, gpio_fan_resume
);
598 #define GPIO_FAN_PM (&gpio_fan_pm)
600 #define GPIO_FAN_PM NULL
603 static struct platform_driver gpio_fan_driver
= {
604 .probe
= gpio_fan_probe
,
605 .remove
= gpio_fan_remove
,
606 .shutdown
= gpio_fan_shutdown
,
610 .of_match_table
= of_match_ptr(of_gpio_fan_match
),
614 module_platform_driver(gpio_fan_driver
);
616 MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>");
617 MODULE_DESCRIPTION("GPIO FAN driver");
618 MODULE_LICENSE("GPL");
619 MODULE_ALIAS("platform:gpio-fan");