linux/drivers/hwmon/gpio-fan.c
<<
>>
Prefs
   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/consumer.h>
  33#include <linux/of.h>
  34#include <linux/of_platform.h>
  35#include <linux/thermal.h>
  36
  37struct gpio_fan_speed {
  38        int rpm;
  39        int ctrl_val;
  40};
  41
  42struct gpio_fan_data {
  43        struct device           *dev;
  44        struct device           *hwmon_dev;
  45        /* Cooling device if any */
  46        struct thermal_cooling_device *cdev;
  47        struct mutex            lock; /* lock GPIOs operations. */
  48        int                     num_gpios;
  49        struct gpio_desc        **gpios;
  50        int                     num_speed;
  51        struct gpio_fan_speed   *speed;
  52        int                     speed_index;
  53#ifdef CONFIG_PM_SLEEP
  54        int                     resume_speed;
  55#endif
  56        bool                    pwm_enable;
  57        struct gpio_desc        *alarm_gpio;
  58        struct work_struct      alarm_work;
  59};
  60
  61/*
  62 * Alarm GPIO.
  63 */
  64
  65static void fan_alarm_notify(struct work_struct *ws)
  66{
  67        struct gpio_fan_data *fan_data =
  68                container_of(ws, struct gpio_fan_data, alarm_work);
  69
  70        sysfs_notify(&fan_data->dev->kobj, NULL, "fan1_alarm");
  71        kobject_uevent(&fan_data->dev->kobj, KOBJ_CHANGE);
  72}
  73
  74static irqreturn_t fan_alarm_irq_handler(int irq, void *dev_id)
  75{
  76        struct gpio_fan_data *fan_data = dev_id;
  77
  78        schedule_work(&fan_data->alarm_work);
  79
  80        return IRQ_NONE;
  81}
  82
  83static ssize_t fan1_alarm_show(struct device *dev,
  84                               struct device_attribute *attr, char *buf)
  85{
  86        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
  87
  88        return sprintf(buf, "%d\n",
  89                       gpiod_get_value_cansleep(fan_data->alarm_gpio));
  90}
  91
  92static DEVICE_ATTR_RO(fan1_alarm);
  93
  94static int fan_alarm_init(struct gpio_fan_data *fan_data)
  95{
  96        int alarm_irq;
  97        struct device *dev = fan_data->dev;
  98
  99        /*
 100         * If the alarm GPIO don't support interrupts, just leave
 101         * without initializing the fail notification support.
 102         */
 103        alarm_irq = gpiod_to_irq(fan_data->alarm_gpio);
 104        if (alarm_irq <= 0)
 105                return 0;
 106
 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);
 111}
 112
 113/*
 114 * Control GPIOs.
 115 */
 116
 117/* Must be called with fan_data->lock held, except during initialization. */
 118static void __set_fan_ctrl(struct gpio_fan_data *fan_data, int ctrl_val)
 119{
 120        int i;
 121
 122        for (i = 0; i < fan_data->num_gpios; i++)
 123                gpiod_set_value_cansleep(fan_data->gpios[i],
 124                                         (ctrl_val >> i) & 1);
 125}
 126
 127static int __get_fan_ctrl(struct gpio_fan_data *fan_data)
 128{
 129        int i;
 130        int ctrl_val = 0;
 131
 132        for (i = 0; i < fan_data->num_gpios; i++) {
 133                int value;
 134
 135                value = gpiod_get_value_cansleep(fan_data->gpios[i]);
 136                ctrl_val |= (value << i);
 137        }
 138        return ctrl_val;
 139}
 140
 141/* Must be called with fan_data->lock held, except during initialization. */
 142static void set_fan_speed(struct gpio_fan_data *fan_data, int speed_index)
 143{
 144        if (fan_data->speed_index == speed_index)
 145                return;
 146
 147        __set_fan_ctrl(fan_data, fan_data->speed[speed_index].ctrl_val);
 148        fan_data->speed_index = speed_index;
 149}
 150
 151static int get_fan_speed_index(struct gpio_fan_data *fan_data)
 152{
 153        int ctrl_val = __get_fan_ctrl(fan_data);
 154        int i;
 155
 156        for (i = 0; i < fan_data->num_speed; i++)
 157                if (fan_data->speed[i].ctrl_val == ctrl_val)
 158                        return i;
 159
 160        dev_warn(fan_data->dev,
 161                 "missing speed array entry for GPIO value 0x%x\n", ctrl_val);
 162
 163        return -ENODEV;
 164}
 165
 166static int rpm_to_speed_index(struct gpio_fan_data *fan_data, unsigned long rpm)
 167{
 168        struct gpio_fan_speed *speed = fan_data->speed;
 169        int i;
 170
 171        for (i = 0; i < fan_data->num_speed; i++)
 172                if (speed[i].rpm >= rpm)
 173                        return i;
 174
 175        return fan_data->num_speed - 1;
 176}
 177
 178static ssize_t pwm1_show(struct device *dev, struct device_attribute *attr,
 179                         char *buf)
 180{
 181        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 182        u8 pwm = fan_data->speed_index * 255 / (fan_data->num_speed - 1);
 183
 184        return sprintf(buf, "%d\n", pwm);
 185}
 186
 187static ssize_t pwm1_store(struct device *dev, struct device_attribute *attr,
 188                          const char *buf, size_t count)
 189{
 190        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 191        unsigned long pwm;
 192        int speed_index;
 193        int ret = count;
 194
 195        if (kstrtoul(buf, 10, &pwm) || pwm > 255)
 196                return -EINVAL;
 197
 198        mutex_lock(&fan_data->lock);
 199
 200        if (!fan_data->pwm_enable) {
 201                ret = -EPERM;
 202                goto exit_unlock;
 203        }
 204
 205        speed_index = DIV_ROUND_UP(pwm * (fan_data->num_speed - 1), 255);
 206        set_fan_speed(fan_data, speed_index);
 207
 208exit_unlock:
 209        mutex_unlock(&fan_data->lock);
 210
 211        return ret;
 212}
 213
 214static ssize_t pwm1_enable_show(struct device *dev,
 215                                struct device_attribute *attr, char *buf)
 216{
 217        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 218
 219        return sprintf(buf, "%d\n", fan_data->pwm_enable);
 220}
 221
 222static ssize_t pwm1_enable_store(struct device *dev,
 223                                 struct device_attribute *attr,
 224                                 const char *buf, size_t count)
 225{
 226        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 227        unsigned long val;
 228
 229        if (kstrtoul(buf, 10, &val) || val > 1)
 230                return -EINVAL;
 231
 232        if (fan_data->pwm_enable == val)
 233                return count;
 234
 235        mutex_lock(&fan_data->lock);
 236
 237        fan_data->pwm_enable = val;
 238
 239        /* Disable manual control mode: set fan at full speed. */
 240        if (val == 0)
 241                set_fan_speed(fan_data, fan_data->num_speed - 1);
 242
 243        mutex_unlock(&fan_data->lock);
 244
 245        return count;
 246}
 247
 248static ssize_t pwm1_mode_show(struct device *dev,
 249                              struct device_attribute *attr, char *buf)
 250{
 251        return sprintf(buf, "0\n");
 252}
 253
 254static ssize_t fan1_min_show(struct device *dev,
 255                             struct device_attribute *attr, char *buf)
 256{
 257        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 258
 259        return sprintf(buf, "%d\n", fan_data->speed[0].rpm);
 260}
 261
 262static ssize_t fan1_max_show(struct device *dev,
 263                             struct device_attribute *attr, char *buf)
 264{
 265        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 266
 267        return sprintf(buf, "%d\n",
 268                       fan_data->speed[fan_data->num_speed - 1].rpm);
 269}
 270
 271static ssize_t fan1_input_show(struct device *dev,
 272                               struct device_attribute *attr, char *buf)
 273{
 274        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 275
 276        return sprintf(buf, "%d\n", fan_data->speed[fan_data->speed_index].rpm);
 277}
 278
 279static ssize_t set_rpm(struct device *dev, struct device_attribute *attr,
 280                       const char *buf, size_t count)
 281{
 282        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 283        unsigned long rpm;
 284        int ret = count;
 285
 286        if (kstrtoul(buf, 10, &rpm))
 287                return -EINVAL;
 288
 289        mutex_lock(&fan_data->lock);
 290
 291        if (!fan_data->pwm_enable) {
 292                ret = -EPERM;
 293                goto exit_unlock;
 294        }
 295
 296        set_fan_speed(fan_data, rpm_to_speed_index(fan_data, rpm));
 297
 298exit_unlock:
 299        mutex_unlock(&fan_data->lock);
 300
 301        return ret;
 302}
 303
 304static DEVICE_ATTR_RW(pwm1);
 305static DEVICE_ATTR_RW(pwm1_enable);
 306static DEVICE_ATTR_RO(pwm1_mode);
 307static DEVICE_ATTR_RO(fan1_min);
 308static DEVICE_ATTR_RO(fan1_max);
 309static DEVICE_ATTR_RO(fan1_input);
 310static DEVICE_ATTR(fan1_target, 0644, fan1_input_show, set_rpm);
 311
 312static umode_t gpio_fan_is_visible(struct kobject *kobj,
 313                                   struct attribute *attr, int index)
 314{
 315        struct device *dev = container_of(kobj, struct device, kobj);
 316        struct gpio_fan_data *data = dev_get_drvdata(dev);
 317
 318        if (index == 0 && !data->alarm_gpio)
 319                return 0;
 320        if (index > 0 && !data->gpios)
 321                return 0;
 322
 323        return attr->mode;
 324}
 325
 326static 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,
 335        NULL
 336};
 337
 338static const struct attribute_group gpio_fan_group = {
 339        .attrs = gpio_fan_attributes,
 340        .is_visible = gpio_fan_is_visible,
 341};
 342
 343static const struct attribute_group *gpio_fan_groups[] = {
 344        &gpio_fan_group,
 345        NULL
 346};
 347
 348static int fan_ctrl_init(struct gpio_fan_data *fan_data)
 349{
 350        int num_gpios = fan_data->num_gpios;
 351        struct gpio_desc **gpios = fan_data->gpios;
 352        int i, err;
 353
 354        for (i = 0; i < num_gpios; i++) {
 355                /*
 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).
 360                 */
 361                err = gpiod_direction_output(gpios[i],
 362                                        gpiod_get_value_cansleep(gpios[i]));
 363                if (err)
 364                        return err;
 365        }
 366
 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;
 371
 372        return 0;
 373}
 374
 375static int gpio_fan_get_max_state(struct thermal_cooling_device *cdev,
 376                                  unsigned long *state)
 377{
 378        struct gpio_fan_data *fan_data = cdev->devdata;
 379
 380        if (!fan_data)
 381                return -EINVAL;
 382
 383        *state = fan_data->num_speed - 1;
 384        return 0;
 385}
 386
 387static int gpio_fan_get_cur_state(struct thermal_cooling_device *cdev,
 388                                  unsigned long *state)
 389{
 390        struct gpio_fan_data *fan_data = cdev->devdata;
 391
 392        if (!fan_data)
 393                return -EINVAL;
 394
 395        *state = fan_data->speed_index;
 396        return 0;
 397}
 398
 399static int gpio_fan_set_cur_state(struct thermal_cooling_device *cdev,
 400                                  unsigned long state)
 401{
 402        struct gpio_fan_data *fan_data = cdev->devdata;
 403
 404        if (!fan_data)
 405                return -EINVAL;
 406
 407        set_fan_speed(fan_data, state);
 408        return 0;
 409}
 410
 411static 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,
 415};
 416
 417/*
 418 * Translate OpenFirmware node properties into platform_data
 419 */
 420static int gpio_fan_get_of_data(struct gpio_fan_data *fan_data)
 421{
 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;
 426        unsigned i;
 427        u32 u;
 428        struct property *prop;
 429        const __be32 *p;
 430
 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);
 435
 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)
 440                        return 0;
 441                dev_err(dev, "DT properties empty / missing");
 442                return -ENODEV;
 443        }
 444        gpios = devm_kcalloc(dev,
 445                             fan_data->num_gpios, sizeof(struct gpio_desc *),
 446                             GFP_KERNEL);
 447        if (!gpios)
 448                return -ENOMEM;
 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]);
 453        }
 454        fan_data->gpios = gpios;
 455
 456        /* Get number of RPM/ctrl_val pairs in speed map */
 457        prop = of_find_property(np, "gpio-fan,speed-map", &i);
 458        if (!prop) {
 459                dev_err(dev, "gpio-fan,speed-map DT property missing");
 460                return -ENODEV;
 461        }
 462        i = i / sizeof(u32);
 463        if (i == 0 || i & 1) {
 464                dev_err(dev, "gpio-fan,speed-map contains zero/odd number of entries");
 465                return -ENODEV;
 466        }
 467        fan_data->num_speed = i / 2;
 468
 469        /*
 470         * Populate speed map
 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
 473         */
 474        speed = devm_kcalloc(dev,
 475                        fan_data->num_speed, sizeof(struct gpio_fan_speed),
 476                        GFP_KERNEL);
 477        if (!speed)
 478                return -ENOMEM;
 479        p = NULL;
 480        for (i = 0; i < fan_data->num_speed; i++) {
 481                p = of_prop_next_u32(prop, p, &u);
 482                if (!p)
 483                        return -ENODEV;
 484                speed[i].rpm = u;
 485                p = of_prop_next_u32(prop, p, &u);
 486                if (!p)
 487                        return -ENODEV;
 488                speed[i].ctrl_val = u;
 489        }
 490        fan_data->speed = speed;
 491
 492        return 0;
 493}
 494
 495static const struct of_device_id of_gpio_fan_match[] = {
 496        { .compatible = "gpio-fan", },
 497        {},
 498};
 499MODULE_DEVICE_TABLE(of, of_gpio_fan_match);
 500
 501static int gpio_fan_probe(struct platform_device *pdev)
 502{
 503        int err;
 504        struct gpio_fan_data *fan_data;
 505        struct device *dev = &pdev->dev;
 506        struct device_node *np = dev->of_node;
 507
 508        fan_data = devm_kzalloc(dev, sizeof(struct gpio_fan_data),
 509                                GFP_KERNEL);
 510        if (!fan_data)
 511                return -ENOMEM;
 512
 513        fan_data->dev = dev;
 514        err = gpio_fan_get_of_data(fan_data);
 515        if (err)
 516                return err;
 517
 518        platform_set_drvdata(pdev, fan_data);
 519        mutex_init(&fan_data->lock);
 520
 521        /* Configure alarm GPIO if available. */
 522        if (fan_data->alarm_gpio) {
 523                err = fan_alarm_init(fan_data);
 524                if (err)
 525                        return err;
 526        }
 527
 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)
 531                        return -EINVAL;
 532                err = fan_ctrl_init(fan_data);
 533                if (err)
 534                        return err;
 535        }
 536
 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,
 541                                                       gpio_fan_groups);
 542        if (IS_ERR(fan_data->hwmon_dev))
 543                return PTR_ERR(fan_data->hwmon_dev);
 544
 545        /* Optional cooling device register for Device tree platforms */
 546        fan_data->cdev = thermal_of_cooling_device_register(np,
 547                                                            "gpio-fan",
 548                                                            fan_data,
 549                                                            &gpio_fan_cool_ops);
 550
 551        dev_info(dev, "GPIO fan initialized\n");
 552
 553        return 0;
 554}
 555
 556static int gpio_fan_remove(struct platform_device *pdev)
 557{
 558        struct gpio_fan_data *fan_data = platform_get_drvdata(pdev);
 559
 560        if (!IS_ERR(fan_data->cdev))
 561                thermal_cooling_device_unregister(fan_data->cdev);
 562
 563        if (fan_data->gpios)
 564                set_fan_speed(fan_data, 0);
 565
 566        return 0;
 567}
 568
 569static void gpio_fan_shutdown(struct platform_device *pdev)
 570{
 571        gpio_fan_remove(pdev);
 572}
 573
 574#ifdef CONFIG_PM_SLEEP
 575static int gpio_fan_suspend(struct device *dev)
 576{
 577        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 578
 579        if (fan_data->gpios) {
 580                fan_data->resume_speed = fan_data->speed_index;
 581                set_fan_speed(fan_data, 0);
 582        }
 583
 584        return 0;
 585}
 586
 587static int gpio_fan_resume(struct device *dev)
 588{
 589        struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
 590
 591        if (fan_data->gpios)
 592                set_fan_speed(fan_data, fan_data->resume_speed);
 593
 594        return 0;
 595}
 596
 597static SIMPLE_DEV_PM_OPS(gpio_fan_pm, gpio_fan_suspend, gpio_fan_resume);
 598#define GPIO_FAN_PM     (&gpio_fan_pm)
 599#else
 600#define GPIO_FAN_PM     NULL
 601#endif
 602
 603static struct platform_driver gpio_fan_driver = {
 604        .probe          = gpio_fan_probe,
 605        .remove         = gpio_fan_remove,
 606        .shutdown       = gpio_fan_shutdown,
 607        .driver = {
 608                .name   = "gpio-fan",
 609                .pm     = GPIO_FAN_PM,
 610                .of_match_table = of_match_ptr(of_gpio_fan_match),
 611        },
 612};
 613
 614module_platform_driver(gpio_fan_driver);
 615
 616MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>");
 617MODULE_DESCRIPTION("GPIO FAN driver");
 618MODULE_LICENSE("GPL");
 619MODULE_ALIAS("platform:gpio-fan");
 620