1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * pwm-fan.c - Hwmon driver for fans connected to PWM lines. 4 * 5 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 6 * 7 * Author: Kamil Debski <k.debski@samsung.com> 8 */ 9 10 #include <linux/hwmon.h> 11 #include <linux/interrupt.h> 12 #include <linux/module.h> 13 #include <linux/mutex.h> 14 #include <linux/of.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> 21 22 #define MAX_PWM 255 23 24 struct pwm_fan_tach { 25 int irq; 26 atomic_t pulses; 27 unsigned int rpm; 28 u8 pulses_per_revolution; 29 }; 30 31 enum pwm_fan_enable_mode { 32 pwm_off_reg_off, 33 pwm_disable_reg_enable, 34 pwm_enable_reg_enable, 35 pwm_disable_reg_disable, 36 }; 37 38 struct pwm_fan_ctx { 39 struct device *dev; 40 41 struct mutex lock; 42 struct pwm_device *pwm; 43 struct pwm_state pwm_state; 44 struct regulator *reg_en; 45 enum pwm_fan_enable_mode enable_mode; 46 bool regulator_enabled; 47 bool enabled; 48 49 int tach_count; 50 struct pwm_fan_tach *tachs; 51 ktime_t sample_start; 52 struct timer_list rpm_timer; 53 54 unsigned int pwm_value; 55 unsigned int pwm_fan_state; 56 unsigned int pwm_fan_max_state; 57 unsigned int *pwm_fan_cooling_levels; 58 struct thermal_cooling_device *cdev; 59 60 struct hwmon_chip_info info; 61 struct hwmon_channel_info fan_channel; 62 }; 63 64 /* This handler assumes self resetting edge triggered interrupt. */ 65 static irqreturn_t pulse_handler(int irq, void *dev_id) 66 { 67 struct pwm_fan_tach *tach = dev_id; 68 69 atomic_inc(&tach->pulses); 70 71 return IRQ_HANDLED; 72 } 73 74 static void sample_timer(struct timer_list *t) 75 { 76 struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer); 77 unsigned int delta = ktime_ms_delta(ktime_get(), ctx->sample_start); 78 int i; 79 80 if (delta) { 81 for (i = 0; i < ctx->tach_count; i++) { 82 struct pwm_fan_tach *tach = &ctx->tachs[i]; 83 int pulses; 84 85 pulses = atomic_read(&tach->pulses); 86 atomic_sub(pulses, &tach->pulses); 87 tach->rpm = (unsigned int)(pulses * 1000 * 60) / 88 (tach->pulses_per_revolution * delta); 89 } 90 91 ctx->sample_start = ktime_get(); 92 } 93 94 mod_timer(&ctx->rpm_timer, jiffies + HZ); 95 } 96 97 static void pwm_fan_enable_mode_2_state(int enable_mode, 98 struct pwm_state *state, 99 bool *enable_regulator) 100 { 101 switch (enable_mode) { 102 case pwm_disable_reg_enable: 103 /* disable pwm, keep regulator enabled */ 104 state->enabled = false; 105 *enable_regulator = true; 106 break; 107 case pwm_enable_reg_enable: 108 /* keep pwm and regulator enabled */ 109 state->enabled = true; 110 *enable_regulator = true; 111 break; 112 case pwm_off_reg_off: 113 case pwm_disable_reg_disable: 114 /* disable pwm and regulator */ 115 state->enabled = false; 116 *enable_regulator = false; 117 } 118 } 119 120 static int pwm_fan_switch_power(struct pwm_fan_ctx *ctx, bool on) 121 { 122 int ret = 0; 123 124 if (!ctx->reg_en) 125 return ret; 126 127 if (!ctx->regulator_enabled && on) { 128 ret = regulator_enable(ctx->reg_en); 129 if (ret == 0) 130 ctx->regulator_enabled = true; 131 } else if (ctx->regulator_enabled && !on) { 132 ret = regulator_disable(ctx->reg_en); 133 if (ret == 0) 134 ctx->regulator_enabled = false; 135 } 136 return ret; 137 } 138 139 static int pwm_fan_power_on(struct pwm_fan_ctx *ctx) 140 { 141 struct pwm_state *state = &ctx->pwm_state; 142 int ret; 143 144 if (ctx->enabled) 145 return 0; 146 147 ret = pwm_fan_switch_power(ctx, true); 148 if (ret < 0) { 149 dev_err(ctx->dev, "failed to enable power supply\n"); 150 return ret; 151 } 152 153 state->enabled = true; 154 ret = pwm_apply_state(ctx->pwm, state); 155 if (ret) { 156 dev_err(ctx->dev, "failed to enable PWM\n"); 157 goto disable_regulator; 158 } 159 160 ctx->enabled = true; 161 162 return 0; 163 164 disable_regulator: 165 pwm_fan_switch_power(ctx, false); 166 return ret; 167 } 168 169 static int pwm_fan_power_off(struct pwm_fan_ctx *ctx) 170 { 171 struct pwm_state *state = &ctx->pwm_state; 172 bool enable_regulator = false; 173 int ret; 174 175 if (!ctx->enabled) 176 return 0; 177 178 pwm_fan_enable_mode_2_state(ctx->enable_mode, 179 state, 180 &enable_regulator); 181 182 state->enabled = false; 183 state->duty_cycle = 0; 184 ret = pwm_apply_state(ctx->pwm, state); 185 if (ret) { 186 dev_err(ctx->dev, "failed to disable PWM\n"); 187 return ret; 188 } 189 190 pwm_fan_switch_power(ctx, enable_regulator); 191 192 ctx->enabled = false; 193 194 return 0; 195 } 196 197 static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm) 198 { 199 struct pwm_state *state = &ctx->pwm_state; 200 unsigned long period; 201 int ret = 0; 202 203 if (pwm > 0) { 204 if (ctx->enable_mode == pwm_off_reg_off) 205 /* pwm-fan hard disabled */ 206 return 0; 207 208 period = state->period; 209 state->duty_cycle = DIV_ROUND_UP(pwm * (period - 1), MAX_PWM); 210 ret = pwm_apply_state(ctx->pwm, state); 211 if (ret) 212 return ret; 213 ret = pwm_fan_power_on(ctx); 214 } else { 215 ret = pwm_fan_power_off(ctx); 216 } 217 if (!ret) 218 ctx->pwm_value = pwm; 219 220 return ret; 221 } 222 223 static int set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm) 224 { 225 int ret; 226 227 mutex_lock(&ctx->lock); 228 ret = __set_pwm(ctx, pwm); 229 mutex_unlock(&ctx->lock); 230 231 return ret; 232 } 233 234 static void pwm_fan_update_state(struct pwm_fan_ctx *ctx, unsigned long pwm) 235 { 236 int i; 237 238 for (i = 0; i < ctx->pwm_fan_max_state; ++i) 239 if (pwm < ctx->pwm_fan_cooling_levels[i + 1]) 240 break; 241 242 ctx->pwm_fan_state = i; 243 } 244 245 static int pwm_fan_update_enable(struct pwm_fan_ctx *ctx, long val) 246 { 247 int ret = 0; 248 int old_val; 249 250 mutex_lock(&ctx->lock); 251 252 if (ctx->enable_mode == val) 253 goto out; 254 255 old_val = ctx->enable_mode; 256 ctx->enable_mode = val; 257 258 if (val == 0) { 259 /* Disable pwm-fan unconditionally */ 260 if (ctx->enabled) 261 ret = __set_pwm(ctx, 0); 262 else 263 ret = pwm_fan_switch_power(ctx, false); 264 if (ret) 265 ctx->enable_mode = old_val; 266 pwm_fan_update_state(ctx, 0); 267 } else { 268 /* 269 * Change PWM and/or regulator state if currently disabled 270 * Nothing to do if currently enabled 271 */ 272 if (!ctx->enabled) { 273 struct pwm_state *state = &ctx->pwm_state; 274 bool enable_regulator = false; 275 276 state->duty_cycle = 0; 277 pwm_fan_enable_mode_2_state(val, 278 state, 279 &enable_regulator); 280 281 pwm_apply_state(ctx->pwm, state); 282 pwm_fan_switch_power(ctx, enable_regulator); 283 pwm_fan_update_state(ctx, 0); 284 } 285 } 286 out: 287 mutex_unlock(&ctx->lock); 288 289 return ret; 290 } 291 292 static int pwm_fan_write(struct device *dev, enum hwmon_sensor_types type, 293 u32 attr, int channel, long val) 294 { 295 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); 296 int ret; 297 298 switch (attr) { 299 case hwmon_pwm_input: 300 if (val < 0 || val > MAX_PWM) 301 return -EINVAL; 302 ret = set_pwm(ctx, val); 303 if (ret) 304 return ret; 305 pwm_fan_update_state(ctx, val); 306 break; 307 case hwmon_pwm_enable: 308 if (val < 0 || val > 3) 309 ret = -EINVAL; 310 else 311 ret = pwm_fan_update_enable(ctx, val); 312 313 return ret; 314 default: 315 return -EOPNOTSUPP; 316 } 317 318 return 0; 319 } 320 321 static int pwm_fan_read(struct device *dev, enum hwmon_sensor_types type, 322 u32 attr, int channel, long *val) 323 { 324 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); 325 326 switch (type) { 327 case hwmon_pwm: 328 switch (attr) { 329 case hwmon_pwm_input: 330 *val = ctx->pwm_value; 331 return 0; 332 case hwmon_pwm_enable: 333 *val = ctx->enable_mode; 334 return 0; 335 } 336 return -EOPNOTSUPP; 337 case hwmon_fan: 338 *val = ctx->tachs[channel].rpm; 339 return 0; 340 341 default: 342 return -ENOTSUPP; 343 } 344 } 345 346 static umode_t pwm_fan_is_visible(const void *data, 347 enum hwmon_sensor_types type, 348 u32 attr, int channel) 349 { 350 switch (type) { 351 case hwmon_pwm: 352 return 0644; 353 354 case hwmon_fan: 355 return 0444; 356 357 default: 358 return 0; 359 } 360 } 361 362 static const struct hwmon_ops pwm_fan_hwmon_ops = { 363 .is_visible = pwm_fan_is_visible, 364 .read = pwm_fan_read, 365 .write = pwm_fan_write, 366 }; 367 368 /* thermal cooling device callbacks */ 369 static int pwm_fan_get_max_state(struct thermal_cooling_device *cdev, 370 unsigned long *state) 371 { 372 struct pwm_fan_ctx *ctx = cdev->devdata; 373 374 if (!ctx) 375 return -EINVAL; 376 377 *state = ctx->pwm_fan_max_state; 378 379 return 0; 380 } 381 382 static int pwm_fan_get_cur_state(struct thermal_cooling_device *cdev, 383 unsigned long *state) 384 { 385 struct pwm_fan_ctx *ctx = cdev->devdata; 386 387 if (!ctx) 388 return -EINVAL; 389 390 *state = ctx->pwm_fan_state; 391 392 return 0; 393 } 394 395 static int 396 pwm_fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) 397 { 398 struct pwm_fan_ctx *ctx = cdev->devdata; 399 int ret; 400 401 if (!ctx || (state > ctx->pwm_fan_max_state)) 402 return -EINVAL; 403 404 if (state == ctx->pwm_fan_state) 405 return 0; 406 407 ret = set_pwm(ctx, ctx->pwm_fan_cooling_levels[state]); 408 if (ret) { 409 dev_err(&cdev->device, "Cannot set pwm!\n"); 410 return ret; 411 } 412 413 ctx->pwm_fan_state = state; 414 415 return ret; 416 } 417 418 static const struct thermal_cooling_device_ops pwm_fan_cooling_ops = { 419 .get_max_state = pwm_fan_get_max_state, 420 .get_cur_state = pwm_fan_get_cur_state, 421 .set_cur_state = pwm_fan_set_cur_state, 422 }; 423 424 static int pwm_fan_of_get_cooling_data(struct device *dev, 425 struct pwm_fan_ctx *ctx) 426 { 427 struct device_node *np = dev->of_node; 428 int num, i, ret; 429 430 if (!of_find_property(np, "cooling-levels", NULL)) 431 return 0; 432 433 ret = of_property_count_u32_elems(np, "cooling-levels"); 434 if (ret <= 0) { 435 dev_err(dev, "Wrong data!\n"); 436 return ret ? : -EINVAL; 437 } 438 439 num = ret; 440 ctx->pwm_fan_cooling_levels = devm_kcalloc(dev, num, sizeof(u32), 441 GFP_KERNEL); 442 if (!ctx->pwm_fan_cooling_levels) 443 return -ENOMEM; 444 445 ret = of_property_read_u32_array(np, "cooling-levels", 446 ctx->pwm_fan_cooling_levels, num); 447 if (ret) { 448 dev_err(dev, "Property 'cooling-levels' cannot be read!\n"); 449 return ret; 450 } 451 452 for (i = 0; i < num; i++) { 453 if (ctx->pwm_fan_cooling_levels[i] > MAX_PWM) { 454 dev_err(dev, "PWM fan state[%d]:%d > %d\n", i, 455 ctx->pwm_fan_cooling_levels[i], MAX_PWM); 456 return -EINVAL; 457 } 458 } 459 460 ctx->pwm_fan_max_state = num - 1; 461 462 return 0; 463 } 464 465 static void pwm_fan_cleanup(void *__ctx) 466 { 467 struct pwm_fan_ctx *ctx = __ctx; 468 469 del_timer_sync(&ctx->rpm_timer); 470 /* Switch off everything */ 471 ctx->enable_mode = pwm_disable_reg_disable; 472 pwm_fan_power_off(ctx); 473 } 474 475 static int pwm_fan_probe(struct platform_device *pdev) 476 { 477 struct thermal_cooling_device *cdev; 478 struct device *dev = &pdev->dev; 479 struct pwm_fan_ctx *ctx; 480 struct device *hwmon; 481 int ret; 482 const struct hwmon_channel_info **channels; 483 u32 *fan_channel_config; 484 int channel_count = 1; /* We always have a PWM channel. */ 485 int i; 486 487 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 488 if (!ctx) 489 return -ENOMEM; 490 491 mutex_init(&ctx->lock); 492 493 ctx->dev = &pdev->dev; 494 ctx->pwm = devm_pwm_get(dev, NULL); 495 if (IS_ERR(ctx->pwm)) 496 return dev_err_probe(dev, PTR_ERR(ctx->pwm), "Could not get PWM\n"); 497 498 platform_set_drvdata(pdev, ctx); 499 500 ctx->reg_en = devm_regulator_get_optional(dev, "fan"); 501 if (IS_ERR(ctx->reg_en)) { 502 if (PTR_ERR(ctx->reg_en) != -ENODEV) 503 return PTR_ERR(ctx->reg_en); 504 505 ctx->reg_en = NULL; 506 } 507 508 pwm_init_state(ctx->pwm, &ctx->pwm_state); 509 510 /* 511 * set_pwm assumes that MAX_PWM * (period - 1) fits into an unsigned 512 * long. Check this here to prevent the fan running at a too low 513 * frequency. 514 */ 515 if (ctx->pwm_state.period > ULONG_MAX / MAX_PWM + 1) { 516 dev_err(dev, "Configured period too big\n"); 517 return -EINVAL; 518 } 519 520 ctx->enable_mode = pwm_disable_reg_enable; 521 522 /* 523 * Set duty cycle to maximum allowed and enable PWM output as well as 524 * the regulator. In case of error nothing is changed 525 */ 526 ret = set_pwm(ctx, MAX_PWM); 527 if (ret) { 528 dev_err(dev, "Failed to configure PWM: %d\n", ret); 529 return ret; 530 } 531 timer_setup(&ctx->rpm_timer, sample_timer, 0); 532 ret = devm_add_action_or_reset(dev, pwm_fan_cleanup, ctx); 533 if (ret) 534 return ret; 535 536 ctx->tach_count = platform_irq_count(pdev); 537 if (ctx->tach_count < 0) 538 return dev_err_probe(dev, ctx->tach_count, 539 "Could not get number of fan tachometer inputs\n"); 540 dev_dbg(dev, "%d fan tachometer inputs\n", ctx->tach_count); 541 542 if (ctx->tach_count) { 543 channel_count++; /* We also have a FAN channel. */ 544 545 ctx->tachs = devm_kcalloc(dev, ctx->tach_count, 546 sizeof(struct pwm_fan_tach), 547 GFP_KERNEL); 548 if (!ctx->tachs) 549 return -ENOMEM; 550 551 ctx->fan_channel.type = hwmon_fan; 552 fan_channel_config = devm_kcalloc(dev, ctx->tach_count + 1, 553 sizeof(u32), GFP_KERNEL); 554 if (!fan_channel_config) 555 return -ENOMEM; 556 ctx->fan_channel.config = fan_channel_config; 557 } 558 559 channels = devm_kcalloc(dev, channel_count + 1, 560 sizeof(struct hwmon_channel_info *), GFP_KERNEL); 561 if (!channels) 562 return -ENOMEM; 563 564 channels[0] = HWMON_CHANNEL_INFO(pwm, HWMON_PWM_INPUT | HWMON_PWM_ENABLE); 565 566 for (i = 0; i < ctx->tach_count; i++) { 567 struct pwm_fan_tach *tach = &ctx->tachs[i]; 568 u32 ppr = 2; 569 570 tach->irq = platform_get_irq(pdev, i); 571 if (tach->irq == -EPROBE_DEFER) 572 return tach->irq; 573 if (tach->irq > 0) { 574 ret = devm_request_irq(dev, tach->irq, pulse_handler, 0, 575 pdev->name, tach); 576 if (ret) { 577 dev_err(dev, 578 "Failed to request interrupt: %d\n", 579 ret); 580 return ret; 581 } 582 } 583 584 of_property_read_u32_index(dev->of_node, 585 "pulses-per-revolution", 586 i, 587 &ppr); 588 tach->pulses_per_revolution = ppr; 589 if (!tach->pulses_per_revolution) { 590 dev_err(dev, "pulses-per-revolution can't be zero.\n"); 591 return -EINVAL; 592 } 593 594 fan_channel_config[i] = HWMON_F_INPUT; 595 596 dev_dbg(dev, "tach%d: irq=%d, pulses_per_revolution=%d\n", 597 i, tach->irq, tach->pulses_per_revolution); 598 } 599 600 if (ctx->tach_count > 0) { 601 ctx->sample_start = ktime_get(); 602 mod_timer(&ctx->rpm_timer, jiffies + HZ); 603 604 channels[1] = &ctx->fan_channel; 605 } 606 607 ctx->info.ops = &pwm_fan_hwmon_ops; 608 ctx->info.info = channels; 609 610 hwmon = devm_hwmon_device_register_with_info(dev, "pwmfan", 611 ctx, &ctx->info, NULL); 612 if (IS_ERR(hwmon)) { 613 dev_err(dev, "Failed to register hwmon device\n"); 614 return PTR_ERR(hwmon); 615 } 616 617 ret = pwm_fan_of_get_cooling_data(dev, ctx); 618 if (ret) 619 return ret; 620 621 ctx->pwm_fan_state = ctx->pwm_fan_max_state; 622 if (IS_ENABLED(CONFIG_THERMAL)) { 623 cdev = devm_thermal_of_cooling_device_register(dev, 624 dev->of_node, "pwm-fan", ctx, &pwm_fan_cooling_ops); 625 if (IS_ERR(cdev)) { 626 ret = PTR_ERR(cdev); 627 dev_err(dev, 628 "Failed to register pwm-fan as cooling device: %d\n", 629 ret); 630 return ret; 631 } 632 ctx->cdev = cdev; 633 } 634 635 return 0; 636 } 637 638 static void pwm_fan_shutdown(struct platform_device *pdev) 639 { 640 struct pwm_fan_ctx *ctx = platform_get_drvdata(pdev); 641 642 pwm_fan_cleanup(ctx); 643 } 644 645 static int pwm_fan_suspend(struct device *dev) 646 { 647 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); 648 649 return pwm_fan_power_off(ctx); 650 } 651 652 static int pwm_fan_resume(struct device *dev) 653 { 654 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); 655 656 return set_pwm(ctx, ctx->pwm_value); 657 } 658 659 static DEFINE_SIMPLE_DEV_PM_OPS(pwm_fan_pm, pwm_fan_suspend, pwm_fan_resume); 660 661 static const struct of_device_id of_pwm_fan_match[] = { 662 { .compatible = "pwm-fan", }, 663 {}, 664 }; 665 MODULE_DEVICE_TABLE(of, of_pwm_fan_match); 666 667 static struct platform_driver pwm_fan_driver = { 668 .probe = pwm_fan_probe, 669 .shutdown = pwm_fan_shutdown, 670 .driver = { 671 .name = "pwm-fan", 672 .pm = pm_sleep_ptr(&pwm_fan_pm), 673 .of_match_table = of_pwm_fan_match, 674 }, 675 }; 676 677 module_platform_driver(pwm_fan_driver); 678 679 MODULE_AUTHOR("Kamil Debski <k.debski@samsung.com>"); 680 MODULE_ALIAS("platform:pwm-fan"); 681 MODULE_DESCRIPTION("PWM FAN driver"); 682 MODULE_LICENSE("GPL"); 683