xref: /openbmc/linux/drivers/hwmon/gpio-fan.c (revision d0b73b48)
1 /*
2  * gpio-fan.c - Hwmon driver for fans connected to GPIO lines.
3  *
4  * Copyright (C) 2010 LaCie
5  *
6  * Author: Simon Guinot <sguinot@lacie.com>
7  *
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.
12  *
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.
17  *
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
21  */
22 
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.h>
33 #include <linux/gpio-fan.h>
34 #include <linux/of_platform.h>
35 #include <linux/of_gpio.h>
36 
37 struct gpio_fan_data {
38 	struct platform_device	*pdev;
39 	struct device		*hwmon_dev;
40 	struct mutex		lock; /* lock GPIOs operations. */
41 	int			num_ctrl;
42 	unsigned		*ctrl;
43 	int			num_speed;
44 	struct gpio_fan_speed	*speed;
45 	int			speed_index;
46 #ifdef CONFIG_PM_SLEEP
47 	int			resume_speed;
48 #endif
49 	bool			pwm_enable;
50 	struct gpio_fan_alarm	*alarm;
51 	struct work_struct	alarm_work;
52 };
53 
54 /*
55  * Alarm GPIO.
56  */
57 
58 static void fan_alarm_notify(struct work_struct *ws)
59 {
60 	struct gpio_fan_data *fan_data =
61 		container_of(ws, struct gpio_fan_data, alarm_work);
62 
63 	sysfs_notify(&fan_data->pdev->dev.kobj, NULL, "fan1_alarm");
64 	kobject_uevent(&fan_data->pdev->dev.kobj, KOBJ_CHANGE);
65 }
66 
67 static irqreturn_t fan_alarm_irq_handler(int irq, void *dev_id)
68 {
69 	struct gpio_fan_data *fan_data = dev_id;
70 
71 	schedule_work(&fan_data->alarm_work);
72 
73 	return IRQ_NONE;
74 }
75 
76 static ssize_t show_fan_alarm(struct device *dev,
77 			      struct device_attribute *attr, char *buf)
78 {
79 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
80 	struct gpio_fan_alarm *alarm = fan_data->alarm;
81 	int value = gpio_get_value(alarm->gpio);
82 
83 	if (alarm->active_low)
84 		value = !value;
85 
86 	return sprintf(buf, "%d\n", value);
87 }
88 
89 static DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL);
90 
91 static int fan_alarm_init(struct gpio_fan_data *fan_data,
92 			  struct gpio_fan_alarm *alarm)
93 {
94 	int err;
95 	int alarm_irq;
96 	struct platform_device *pdev = fan_data->pdev;
97 
98 	fan_data->alarm = alarm;
99 
100 	err = devm_gpio_request(&pdev->dev, alarm->gpio, "GPIO fan alarm");
101 	if (err)
102 		return err;
103 
104 	err = gpio_direction_input(alarm->gpio);
105 	if (err)
106 		return err;
107 
108 	err = device_create_file(&pdev->dev, &dev_attr_fan1_alarm);
109 	if (err)
110 		return err;
111 
112 	/*
113 	 * If the alarm GPIO don't support interrupts, just leave
114 	 * without initializing the fail notification support.
115 	 */
116 	alarm_irq = gpio_to_irq(alarm->gpio);
117 	if (alarm_irq < 0)
118 		return 0;
119 
120 	INIT_WORK(&fan_data->alarm_work, fan_alarm_notify);
121 	irq_set_irq_type(alarm_irq, IRQ_TYPE_EDGE_BOTH);
122 	err = devm_request_irq(&pdev->dev, alarm_irq, fan_alarm_irq_handler,
123 			       IRQF_SHARED, "GPIO fan alarm", fan_data);
124 	if (err)
125 		goto err_free_sysfs;
126 
127 	return 0;
128 
129 err_free_sysfs:
130 	device_remove_file(&pdev->dev, &dev_attr_fan1_alarm);
131 	return err;
132 }
133 
134 static void fan_alarm_free(struct gpio_fan_data *fan_data)
135 {
136 	struct platform_device *pdev = fan_data->pdev;
137 
138 	device_remove_file(&pdev->dev, &dev_attr_fan1_alarm);
139 }
140 
141 /*
142  * Control GPIOs.
143  */
144 
145 /* Must be called with fan_data->lock held, except during initialization. */
146 static void __set_fan_ctrl(struct gpio_fan_data *fan_data, int ctrl_val)
147 {
148 	int i;
149 
150 	for (i = 0; i < fan_data->num_ctrl; i++)
151 		gpio_set_value(fan_data->ctrl[i], (ctrl_val >> i) & 1);
152 }
153 
154 static int __get_fan_ctrl(struct gpio_fan_data *fan_data)
155 {
156 	int i;
157 	int ctrl_val = 0;
158 
159 	for (i = 0; i < fan_data->num_ctrl; i++) {
160 		int value;
161 
162 		value = gpio_get_value(fan_data->ctrl[i]);
163 		ctrl_val |= (value << i);
164 	}
165 	return ctrl_val;
166 }
167 
168 /* Must be called with fan_data->lock held, except during initialization. */
169 static void set_fan_speed(struct gpio_fan_data *fan_data, int speed_index)
170 {
171 	if (fan_data->speed_index == speed_index)
172 		return;
173 
174 	__set_fan_ctrl(fan_data, fan_data->speed[speed_index].ctrl_val);
175 	fan_data->speed_index = speed_index;
176 }
177 
178 static int get_fan_speed_index(struct gpio_fan_data *fan_data)
179 {
180 	int ctrl_val = __get_fan_ctrl(fan_data);
181 	int i;
182 
183 	for (i = 0; i < fan_data->num_speed; i++)
184 		if (fan_data->speed[i].ctrl_val == ctrl_val)
185 			return i;
186 
187 	dev_warn(&fan_data->pdev->dev,
188 		 "missing speed array entry for GPIO value 0x%x\n", ctrl_val);
189 
190 	return -EINVAL;
191 }
192 
193 static int rpm_to_speed_index(struct gpio_fan_data *fan_data, int rpm)
194 {
195 	struct gpio_fan_speed *speed = fan_data->speed;
196 	int i;
197 
198 	for (i = 0; i < fan_data->num_speed; i++)
199 		if (speed[i].rpm >= rpm)
200 			return i;
201 
202 	return fan_data->num_speed - 1;
203 }
204 
205 static ssize_t show_pwm(struct device *dev,
206 			struct device_attribute *attr, char *buf)
207 {
208 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
209 	u8 pwm = fan_data->speed_index * 255 / (fan_data->num_speed - 1);
210 
211 	return sprintf(buf, "%d\n", pwm);
212 }
213 
214 static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
215 		       const char *buf, size_t count)
216 {
217 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
218 	unsigned long pwm;
219 	int speed_index;
220 	int ret = count;
221 
222 	if (kstrtoul(buf, 10, &pwm) || pwm > 255)
223 		return -EINVAL;
224 
225 	mutex_lock(&fan_data->lock);
226 
227 	if (!fan_data->pwm_enable) {
228 		ret = -EPERM;
229 		goto exit_unlock;
230 	}
231 
232 	speed_index = DIV_ROUND_UP(pwm * (fan_data->num_speed - 1), 255);
233 	set_fan_speed(fan_data, speed_index);
234 
235 exit_unlock:
236 	mutex_unlock(&fan_data->lock);
237 
238 	return ret;
239 }
240 
241 static ssize_t show_pwm_enable(struct device *dev,
242 			       struct device_attribute *attr, char *buf)
243 {
244 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
245 
246 	return sprintf(buf, "%d\n", fan_data->pwm_enable);
247 }
248 
249 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
250 			      const char *buf, size_t count)
251 {
252 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
253 	unsigned long val;
254 
255 	if (kstrtoul(buf, 10, &val) || val > 1)
256 		return -EINVAL;
257 
258 	if (fan_data->pwm_enable == val)
259 		return count;
260 
261 	mutex_lock(&fan_data->lock);
262 
263 	fan_data->pwm_enable = val;
264 
265 	/* Disable manual control mode: set fan at full speed. */
266 	if (val == 0)
267 		set_fan_speed(fan_data, fan_data->num_speed - 1);
268 
269 	mutex_unlock(&fan_data->lock);
270 
271 	return count;
272 }
273 
274 static ssize_t show_pwm_mode(struct device *dev,
275 			     struct device_attribute *attr, char *buf)
276 {
277 	return sprintf(buf, "0\n");
278 }
279 
280 static ssize_t show_rpm_min(struct device *dev,
281 			    struct device_attribute *attr, char *buf)
282 {
283 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
284 
285 	return sprintf(buf, "%d\n", fan_data->speed[0].rpm);
286 }
287 
288 static ssize_t show_rpm_max(struct device *dev,
289 			    struct device_attribute *attr, char *buf)
290 {
291 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
292 
293 	return sprintf(buf, "%d\n",
294 		       fan_data->speed[fan_data->num_speed - 1].rpm);
295 }
296 
297 static ssize_t show_rpm(struct device *dev,
298 			struct device_attribute *attr, char *buf)
299 {
300 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
301 
302 	return sprintf(buf, "%d\n", fan_data->speed[fan_data->speed_index].rpm);
303 }
304 
305 static ssize_t set_rpm(struct device *dev, struct device_attribute *attr,
306 		       const char *buf, size_t count)
307 {
308 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
309 	unsigned long rpm;
310 	int ret = count;
311 
312 	if (kstrtoul(buf, 10, &rpm))
313 		return -EINVAL;
314 
315 	mutex_lock(&fan_data->lock);
316 
317 	if (!fan_data->pwm_enable) {
318 		ret = -EPERM;
319 		goto exit_unlock;
320 	}
321 
322 	set_fan_speed(fan_data, rpm_to_speed_index(fan_data, rpm));
323 
324 exit_unlock:
325 	mutex_unlock(&fan_data->lock);
326 
327 	return ret;
328 }
329 
330 static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
331 static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
332 		   show_pwm_enable, set_pwm_enable);
333 static DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL);
334 static DEVICE_ATTR(fan1_min, S_IRUGO, show_rpm_min, NULL);
335 static DEVICE_ATTR(fan1_max, S_IRUGO, show_rpm_max, NULL);
336 static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL);
337 static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm);
338 
339 static struct attribute *gpio_fan_ctrl_attributes[] = {
340 	&dev_attr_pwm1.attr,
341 	&dev_attr_pwm1_enable.attr,
342 	&dev_attr_pwm1_mode.attr,
343 	&dev_attr_fan1_input.attr,
344 	&dev_attr_fan1_target.attr,
345 	&dev_attr_fan1_min.attr,
346 	&dev_attr_fan1_max.attr,
347 	NULL
348 };
349 
350 static const struct attribute_group gpio_fan_ctrl_group = {
351 	.attrs = gpio_fan_ctrl_attributes,
352 };
353 
354 static int fan_ctrl_init(struct gpio_fan_data *fan_data,
355 			 struct gpio_fan_platform_data *pdata)
356 {
357 	struct platform_device *pdev = fan_data->pdev;
358 	int num_ctrl = pdata->num_ctrl;
359 	unsigned *ctrl = pdata->ctrl;
360 	int i, err;
361 
362 	for (i = 0; i < num_ctrl; i++) {
363 		err = devm_gpio_request(&pdev->dev, ctrl[i],
364 					"GPIO fan control");
365 		if (err)
366 			return err;
367 
368 		err = gpio_direction_output(ctrl[i], gpio_get_value(ctrl[i]));
369 		if (err)
370 			return err;
371 	}
372 
373 	fan_data->num_ctrl = num_ctrl;
374 	fan_data->ctrl = ctrl;
375 	fan_data->num_speed = pdata->num_speed;
376 	fan_data->speed = pdata->speed;
377 	fan_data->pwm_enable = true; /* Enable manual fan speed control. */
378 	fan_data->speed_index = get_fan_speed_index(fan_data);
379 	if (fan_data->speed_index < 0)
380 		return -ENODEV;
381 
382 	err = sysfs_create_group(&pdev->dev.kobj, &gpio_fan_ctrl_group);
383 	return err;
384 }
385 
386 static void fan_ctrl_free(struct gpio_fan_data *fan_data)
387 {
388 	struct platform_device *pdev = fan_data->pdev;
389 
390 	sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_ctrl_group);
391 }
392 
393 /*
394  * Platform driver.
395  */
396 
397 static ssize_t show_name(struct device *dev,
398 			 struct device_attribute *attr, char *buf)
399 {
400 	return sprintf(buf, "gpio-fan\n");
401 }
402 
403 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
404 
405 
406 #ifdef CONFIG_OF_GPIO
407 /*
408  * Translate OpenFirmware node properties into platform_data
409  */
410 static int gpio_fan_get_of_pdata(struct device *dev,
411 			    struct gpio_fan_platform_data *pdata)
412 {
413 	struct device_node *node;
414 	struct gpio_fan_speed *speed;
415 	unsigned *ctrl;
416 	unsigned i;
417 	u32 u;
418 	struct property *prop;
419 	const __be32 *p;
420 
421 	node = dev->of_node;
422 
423 	/* Fill GPIO pin array */
424 	pdata->num_ctrl = of_gpio_count(node);
425 	if (!pdata->num_ctrl) {
426 		dev_err(dev, "gpios DT property empty / missing");
427 		return -ENODEV;
428 	}
429 	ctrl = devm_kzalloc(dev, pdata->num_ctrl * sizeof(unsigned),
430 				GFP_KERNEL);
431 	if (!ctrl)
432 		return -ENOMEM;
433 	for (i = 0; i < pdata->num_ctrl; i++) {
434 		int val;
435 
436 		val = of_get_gpio(node, i);
437 		if (val < 0)
438 			return val;
439 		ctrl[i] = val;
440 	}
441 	pdata->ctrl = ctrl;
442 
443 	/* Get number of RPM/ctrl_val pairs in speed map */
444 	prop = of_find_property(node, "gpio-fan,speed-map", &i);
445 	if (!prop) {
446 		dev_err(dev, "gpio-fan,speed-map DT property missing");
447 		return -ENODEV;
448 	}
449 	i = i / sizeof(u32);
450 	if (i == 0 || i & 1) {
451 		dev_err(dev, "gpio-fan,speed-map contains zero/odd number of entries");
452 		return -ENODEV;
453 	}
454 	pdata->num_speed = i / 2;
455 
456 	/*
457 	 * Populate speed map
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
460 	 */
461 	speed = devm_kzalloc(dev,
462 			pdata->num_speed * sizeof(struct gpio_fan_speed),
463 			GFP_KERNEL);
464 	if (!speed)
465 		return -ENOMEM;
466 	p = NULL;
467 	for (i = 0; i < pdata->num_speed; i++) {
468 		p = of_prop_next_u32(prop, p, &u);
469 		if (!p)
470 			return -ENODEV;
471 		speed[i].rpm = u;
472 		p = of_prop_next_u32(prop, p, &u);
473 		if (!p)
474 			return -ENODEV;
475 		speed[i].ctrl_val = u;
476 	}
477 	pdata->speed = speed;
478 
479 	/* Alarm GPIO if one exists */
480 	if (of_gpio_named_count(node, "alarm-gpios")) {
481 		struct gpio_fan_alarm *alarm;
482 		int val;
483 		enum of_gpio_flags flags;
484 
485 		alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm),
486 					GFP_KERNEL);
487 		if (!alarm)
488 			return -ENOMEM;
489 
490 		val = of_get_named_gpio_flags(node, "alarm-gpios", 0, &flags);
491 		if (val < 0)
492 			return val;
493 		alarm->gpio = val;
494 		alarm->active_low = flags & OF_GPIO_ACTIVE_LOW;
495 
496 		pdata->alarm = alarm;
497 	}
498 
499 	return 0;
500 }
501 
502 static struct of_device_id of_gpio_fan_match[] = {
503 	{ .compatible = "gpio-fan", },
504 	{},
505 };
506 #endif /* CONFIG_OF_GPIO */
507 
508 static int gpio_fan_probe(struct platform_device *pdev)
509 {
510 	int err;
511 	struct gpio_fan_data *fan_data;
512 	struct gpio_fan_platform_data *pdata = pdev->dev.platform_data;
513 
514 #ifdef CONFIG_OF_GPIO
515 	if (!pdata) {
516 		pdata = devm_kzalloc(&pdev->dev,
517 					sizeof(struct gpio_fan_platform_data),
518 					GFP_KERNEL);
519 		if (!pdata)
520 			return -ENOMEM;
521 
522 		err = gpio_fan_get_of_pdata(&pdev->dev, pdata);
523 		if (err)
524 			return err;
525 	}
526 #else /* CONFIG_OF_GPIO */
527 	if (!pdata)
528 		return -EINVAL;
529 #endif /* CONFIG_OF_GPIO */
530 
531 	fan_data = devm_kzalloc(&pdev->dev, sizeof(struct gpio_fan_data),
532 				GFP_KERNEL);
533 	if (!fan_data)
534 		return -ENOMEM;
535 
536 	fan_data->pdev = pdev;
537 	platform_set_drvdata(pdev, fan_data);
538 	mutex_init(&fan_data->lock);
539 
540 	/* Configure alarm GPIO if available. */
541 	if (pdata->alarm) {
542 		err = fan_alarm_init(fan_data, pdata->alarm);
543 		if (err)
544 			return err;
545 	}
546 
547 	/* Configure control GPIOs if available. */
548 	if (pdata->ctrl && pdata->num_ctrl > 0) {
549 		if (!pdata->speed || pdata->num_speed <= 1) {
550 			err = -EINVAL;
551 			goto err_free_alarm;
552 		}
553 		err = fan_ctrl_init(fan_data, pdata);
554 		if (err)
555 			goto err_free_alarm;
556 	}
557 
558 	err = device_create_file(&pdev->dev, &dev_attr_name);
559 	if (err)
560 		goto err_free_ctrl;
561 
562 	/* Make this driver part of hwmon class. */
563 	fan_data->hwmon_dev = hwmon_device_register(&pdev->dev);
564 	if (IS_ERR(fan_data->hwmon_dev)) {
565 		err = PTR_ERR(fan_data->hwmon_dev);
566 		goto err_remove_name;
567 	}
568 
569 	dev_info(&pdev->dev, "GPIO fan initialized\n");
570 
571 	return 0;
572 
573 err_remove_name:
574 	device_remove_file(&pdev->dev, &dev_attr_name);
575 err_free_ctrl:
576 	if (fan_data->ctrl)
577 		fan_ctrl_free(fan_data);
578 err_free_alarm:
579 	if (fan_data->alarm)
580 		fan_alarm_free(fan_data);
581 	return err;
582 }
583 
584 static int gpio_fan_remove(struct platform_device *pdev)
585 {
586 	struct gpio_fan_data *fan_data = platform_get_drvdata(pdev);
587 
588 	hwmon_device_unregister(fan_data->hwmon_dev);
589 	device_remove_file(&pdev->dev, &dev_attr_name);
590 	if (fan_data->alarm)
591 		fan_alarm_free(fan_data);
592 	if (fan_data->ctrl)
593 		fan_ctrl_free(fan_data);
594 
595 	return 0;
596 }
597 
598 #ifdef CONFIG_PM_SLEEP
599 static int gpio_fan_suspend(struct device *dev)
600 {
601 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
602 
603 	if (fan_data->ctrl) {
604 		fan_data->resume_speed = fan_data->speed_index;
605 		set_fan_speed(fan_data, 0);
606 	}
607 
608 	return 0;
609 }
610 
611 static int gpio_fan_resume(struct device *dev)
612 {
613 	struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
614 
615 	if (fan_data->ctrl)
616 		set_fan_speed(fan_data, fan_data->resume_speed);
617 
618 	return 0;
619 }
620 
621 static SIMPLE_DEV_PM_OPS(gpio_fan_pm, gpio_fan_suspend, gpio_fan_resume);
622 #define GPIO_FAN_PM	&gpio_fan_pm
623 #else
624 #define GPIO_FAN_PM	NULL
625 #endif
626 
627 static struct platform_driver gpio_fan_driver = {
628 	.probe		= gpio_fan_probe,
629 	.remove		= gpio_fan_remove,
630 	.driver	= {
631 		.name	= "gpio-fan",
632 		.pm	= GPIO_FAN_PM,
633 #ifdef CONFIG_OF_GPIO
634 		.of_match_table = of_match_ptr(of_gpio_fan_match),
635 #endif
636 	},
637 };
638 
639 module_platform_driver(gpio_fan_driver);
640 
641 MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>");
642 MODULE_DESCRIPTION("GPIO FAN driver");
643 MODULE_LICENSE("GPL");
644 MODULE_ALIAS("platform:gpio-fan");
645