linux/include/linux/hwmon.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3    hwmon.h - part of lm_sensors, Linux kernel modules for hardware monitoring
   4
   5    This file declares helper functions for the sysfs class "hwmon",
   6    for use by sensors drivers.
   7
   8    Copyright (C) 2005 Mark M. Hoffman <mhoffman@lightlink.com>
   9
  10*/
  11
  12#ifndef _HWMON_H_
  13#define _HWMON_H_
  14
  15#include <linux/bitops.h>
  16
  17struct device;
  18struct attribute_group;
  19
  20enum hwmon_sensor_types {
  21        hwmon_chip,
  22        hwmon_temp,
  23        hwmon_in,
  24        hwmon_curr,
  25        hwmon_power,
  26        hwmon_energy,
  27        hwmon_humidity,
  28        hwmon_fan,
  29        hwmon_pwm,
  30        hwmon_intrusion,
  31        hwmon_max,
  32};
  33
  34enum hwmon_chip_attributes {
  35        hwmon_chip_temp_reset_history,
  36        hwmon_chip_in_reset_history,
  37        hwmon_chip_curr_reset_history,
  38        hwmon_chip_power_reset_history,
  39        hwmon_chip_register_tz,
  40        hwmon_chip_update_interval,
  41        hwmon_chip_alarms,
  42        hwmon_chip_samples,
  43        hwmon_chip_curr_samples,
  44        hwmon_chip_in_samples,
  45        hwmon_chip_power_samples,
  46        hwmon_chip_temp_samples,
  47};
  48
  49#define HWMON_C_TEMP_RESET_HISTORY      BIT(hwmon_chip_temp_reset_history)
  50#define HWMON_C_IN_RESET_HISTORY        BIT(hwmon_chip_in_reset_history)
  51#define HWMON_C_CURR_RESET_HISTORY      BIT(hwmon_chip_curr_reset_history)
  52#define HWMON_C_POWER_RESET_HISTORY     BIT(hwmon_chip_power_reset_history)
  53#define HWMON_C_REGISTER_TZ             BIT(hwmon_chip_register_tz)
  54#define HWMON_C_UPDATE_INTERVAL         BIT(hwmon_chip_update_interval)
  55#define HWMON_C_ALARMS                  BIT(hwmon_chip_alarms)
  56#define HWMON_C_SAMPLES                 BIT(hwmon_chip_samples)
  57#define HWMON_C_CURR_SAMPLES            BIT(hwmon_chip_curr_samples)
  58#define HWMON_C_IN_SAMPLES              BIT(hwmon_chip_in_samples)
  59#define HWMON_C_POWER_SAMPLES           BIT(hwmon_chip_power_samples)
  60#define HWMON_C_TEMP_SAMPLES            BIT(hwmon_chip_temp_samples)
  61
  62enum hwmon_temp_attributes {
  63        hwmon_temp_enable,
  64        hwmon_temp_input,
  65        hwmon_temp_type,
  66        hwmon_temp_lcrit,
  67        hwmon_temp_lcrit_hyst,
  68        hwmon_temp_min,
  69        hwmon_temp_min_hyst,
  70        hwmon_temp_max,
  71        hwmon_temp_max_hyst,
  72        hwmon_temp_crit,
  73        hwmon_temp_crit_hyst,
  74        hwmon_temp_emergency,
  75        hwmon_temp_emergency_hyst,
  76        hwmon_temp_alarm,
  77        hwmon_temp_lcrit_alarm,
  78        hwmon_temp_min_alarm,
  79        hwmon_temp_max_alarm,
  80        hwmon_temp_crit_alarm,
  81        hwmon_temp_emergency_alarm,
  82        hwmon_temp_fault,
  83        hwmon_temp_offset,
  84        hwmon_temp_label,
  85        hwmon_temp_lowest,
  86        hwmon_temp_highest,
  87        hwmon_temp_reset_history,
  88        hwmon_temp_rated_min,
  89        hwmon_temp_rated_max,
  90};
  91
  92#define HWMON_T_ENABLE          BIT(hwmon_temp_enable)
  93#define HWMON_T_INPUT           BIT(hwmon_temp_input)
  94#define HWMON_T_TYPE            BIT(hwmon_temp_type)
  95#define HWMON_T_LCRIT           BIT(hwmon_temp_lcrit)
  96#define HWMON_T_LCRIT_HYST      BIT(hwmon_temp_lcrit_hyst)
  97#define HWMON_T_MIN             BIT(hwmon_temp_min)
  98#define HWMON_T_MIN_HYST        BIT(hwmon_temp_min_hyst)
  99#define HWMON_T_MAX             BIT(hwmon_temp_max)
 100#define HWMON_T_MAX_HYST        BIT(hwmon_temp_max_hyst)
 101#define HWMON_T_CRIT            BIT(hwmon_temp_crit)
 102#define HWMON_T_CRIT_HYST       BIT(hwmon_temp_crit_hyst)
 103#define HWMON_T_EMERGENCY       BIT(hwmon_temp_emergency)
 104#define HWMON_T_EMERGENCY_HYST  BIT(hwmon_temp_emergency_hyst)
 105#define HWMON_T_ALARM           BIT(hwmon_temp_alarm)
 106#define HWMON_T_MIN_ALARM       BIT(hwmon_temp_min_alarm)
 107#define HWMON_T_MAX_ALARM       BIT(hwmon_temp_max_alarm)
 108#define HWMON_T_CRIT_ALARM      BIT(hwmon_temp_crit_alarm)
 109#define HWMON_T_LCRIT_ALARM     BIT(hwmon_temp_lcrit_alarm)
 110#define HWMON_T_EMERGENCY_ALARM BIT(hwmon_temp_emergency_alarm)
 111#define HWMON_T_FAULT           BIT(hwmon_temp_fault)
 112#define HWMON_T_OFFSET          BIT(hwmon_temp_offset)
 113#define HWMON_T_LABEL           BIT(hwmon_temp_label)
 114#define HWMON_T_LOWEST          BIT(hwmon_temp_lowest)
 115#define HWMON_T_HIGHEST         BIT(hwmon_temp_highest)
 116#define HWMON_T_RESET_HISTORY   BIT(hwmon_temp_reset_history)
 117#define HWMON_T_RATED_MIN       BIT(hwmon_temp_rated_min)
 118#define HWMON_T_RATED_MAX       BIT(hwmon_temp_rated_max)
 119
 120enum hwmon_in_attributes {
 121        hwmon_in_enable,
 122        hwmon_in_input,
 123        hwmon_in_min,
 124        hwmon_in_max,
 125        hwmon_in_lcrit,
 126        hwmon_in_crit,
 127        hwmon_in_average,
 128        hwmon_in_lowest,
 129        hwmon_in_highest,
 130        hwmon_in_reset_history,
 131        hwmon_in_label,
 132        hwmon_in_alarm,
 133        hwmon_in_min_alarm,
 134        hwmon_in_max_alarm,
 135        hwmon_in_lcrit_alarm,
 136        hwmon_in_crit_alarm,
 137        hwmon_in_rated_min,
 138        hwmon_in_rated_max,
 139};
 140
 141#define HWMON_I_ENABLE          BIT(hwmon_in_enable)
 142#define HWMON_I_INPUT           BIT(hwmon_in_input)
 143#define HWMON_I_MIN             BIT(hwmon_in_min)
 144#define HWMON_I_MAX             BIT(hwmon_in_max)
 145#define HWMON_I_LCRIT           BIT(hwmon_in_lcrit)
 146#define HWMON_I_CRIT            BIT(hwmon_in_crit)
 147#define HWMON_I_AVERAGE         BIT(hwmon_in_average)
 148#define HWMON_I_LOWEST          BIT(hwmon_in_lowest)
 149#define HWMON_I_HIGHEST         BIT(hwmon_in_highest)
 150#define HWMON_I_RESET_HISTORY   BIT(hwmon_in_reset_history)
 151#define HWMON_I_LABEL           BIT(hwmon_in_label)
 152#define HWMON_I_ALARM           BIT(hwmon_in_alarm)
 153#define HWMON_I_MIN_ALARM       BIT(hwmon_in_min_alarm)
 154#define HWMON_I_MAX_ALARM       BIT(hwmon_in_max_alarm)
 155#define HWMON_I_LCRIT_ALARM     BIT(hwmon_in_lcrit_alarm)
 156#define HWMON_I_CRIT_ALARM      BIT(hwmon_in_crit_alarm)
 157#define HWMON_I_RATED_MIN       BIT(hwmon_in_rated_min)
 158#define HWMON_I_RATED_MAX       BIT(hwmon_in_rated_max)
 159
 160enum hwmon_curr_attributes {
 161        hwmon_curr_enable,
 162        hwmon_curr_input,
 163        hwmon_curr_min,
 164        hwmon_curr_max,
 165        hwmon_curr_lcrit,
 166        hwmon_curr_crit,
 167        hwmon_curr_average,
 168        hwmon_curr_lowest,
 169        hwmon_curr_highest,
 170        hwmon_curr_reset_history,
 171        hwmon_curr_label,
 172        hwmon_curr_alarm,
 173        hwmon_curr_min_alarm,
 174        hwmon_curr_max_alarm,
 175        hwmon_curr_lcrit_alarm,
 176        hwmon_curr_crit_alarm,
 177        hwmon_curr_rated_min,
 178        hwmon_curr_rated_max,
 179};
 180
 181#define HWMON_C_ENABLE          BIT(hwmon_curr_enable)
 182#define HWMON_C_INPUT           BIT(hwmon_curr_input)
 183#define HWMON_C_MIN             BIT(hwmon_curr_min)
 184#define HWMON_C_MAX             BIT(hwmon_curr_max)
 185#define HWMON_C_LCRIT           BIT(hwmon_curr_lcrit)
 186#define HWMON_C_CRIT            BIT(hwmon_curr_crit)
 187#define HWMON_C_AVERAGE         BIT(hwmon_curr_average)
 188#define HWMON_C_LOWEST          BIT(hwmon_curr_lowest)
 189#define HWMON_C_HIGHEST         BIT(hwmon_curr_highest)
 190#define HWMON_C_RESET_HISTORY   BIT(hwmon_curr_reset_history)
 191#define HWMON_C_LABEL           BIT(hwmon_curr_label)
 192#define HWMON_C_ALARM           BIT(hwmon_curr_alarm)
 193#define HWMON_C_MIN_ALARM       BIT(hwmon_curr_min_alarm)
 194#define HWMON_C_MAX_ALARM       BIT(hwmon_curr_max_alarm)
 195#define HWMON_C_LCRIT_ALARM     BIT(hwmon_curr_lcrit_alarm)
 196#define HWMON_C_CRIT_ALARM      BIT(hwmon_curr_crit_alarm)
 197#define HWMON_C_RATED_MIN       BIT(hwmon_curr_rated_min)
 198#define HWMON_C_RATED_MAX       BIT(hwmon_curr_rated_max)
 199
 200enum hwmon_power_attributes {
 201        hwmon_power_enable,
 202        hwmon_power_average,
 203        hwmon_power_average_interval,
 204        hwmon_power_average_interval_max,
 205        hwmon_power_average_interval_min,
 206        hwmon_power_average_highest,
 207        hwmon_power_average_lowest,
 208        hwmon_power_average_max,
 209        hwmon_power_average_min,
 210        hwmon_power_input,
 211        hwmon_power_input_highest,
 212        hwmon_power_input_lowest,
 213        hwmon_power_reset_history,
 214        hwmon_power_accuracy,
 215        hwmon_power_cap,
 216        hwmon_power_cap_hyst,
 217        hwmon_power_cap_max,
 218        hwmon_power_cap_min,
 219        hwmon_power_min,
 220        hwmon_power_max,
 221        hwmon_power_crit,
 222        hwmon_power_lcrit,
 223        hwmon_power_label,
 224        hwmon_power_alarm,
 225        hwmon_power_cap_alarm,
 226        hwmon_power_min_alarm,
 227        hwmon_power_max_alarm,
 228        hwmon_power_lcrit_alarm,
 229        hwmon_power_crit_alarm,
 230        hwmon_power_rated_min,
 231        hwmon_power_rated_max,
 232};
 233
 234#define HWMON_P_ENABLE                  BIT(hwmon_power_enable)
 235#define HWMON_P_AVERAGE                 BIT(hwmon_power_average)
 236#define HWMON_P_AVERAGE_INTERVAL        BIT(hwmon_power_average_interval)
 237#define HWMON_P_AVERAGE_INTERVAL_MAX    BIT(hwmon_power_average_interval_max)
 238#define HWMON_P_AVERAGE_INTERVAL_MIN    BIT(hwmon_power_average_interval_min)
 239#define HWMON_P_AVERAGE_HIGHEST         BIT(hwmon_power_average_highest)
 240#define HWMON_P_AVERAGE_LOWEST          BIT(hwmon_power_average_lowest)
 241#define HWMON_P_AVERAGE_MAX             BIT(hwmon_power_average_max)
 242#define HWMON_P_AVERAGE_MIN             BIT(hwmon_power_average_min)
 243#define HWMON_P_INPUT                   BIT(hwmon_power_input)
 244#define HWMON_P_INPUT_HIGHEST           BIT(hwmon_power_input_highest)
 245#define HWMON_P_INPUT_LOWEST            BIT(hwmon_power_input_lowest)
 246#define HWMON_P_RESET_HISTORY           BIT(hwmon_power_reset_history)
 247#define HWMON_P_ACCURACY                BIT(hwmon_power_accuracy)
 248#define HWMON_P_CAP                     BIT(hwmon_power_cap)
 249#define HWMON_P_CAP_HYST                BIT(hwmon_power_cap_hyst)
 250#define HWMON_P_CAP_MAX                 BIT(hwmon_power_cap_max)
 251#define HWMON_P_CAP_MIN                 BIT(hwmon_power_cap_min)
 252#define HWMON_P_MIN                     BIT(hwmon_power_min)
 253#define HWMON_P_MAX                     BIT(hwmon_power_max)
 254#define HWMON_P_LCRIT                   BIT(hwmon_power_lcrit)
 255#define HWMON_P_CRIT                    BIT(hwmon_power_crit)
 256#define HWMON_P_LABEL                   BIT(hwmon_power_label)
 257#define HWMON_P_ALARM                   BIT(hwmon_power_alarm)
 258#define HWMON_P_CAP_ALARM               BIT(hwmon_power_cap_alarm)
 259#define HWMON_P_MIN_ALARM               BIT(hwmon_power_min_alarm)
 260#define HWMON_P_MAX_ALARM               BIT(hwmon_power_max_alarm)
 261#define HWMON_P_LCRIT_ALARM             BIT(hwmon_power_lcrit_alarm)
 262#define HWMON_P_CRIT_ALARM              BIT(hwmon_power_crit_alarm)
 263#define HWMON_P_RATED_MIN               BIT(hwmon_power_rated_min)
 264#define HWMON_P_RATED_MAX               BIT(hwmon_power_rated_max)
 265
 266enum hwmon_energy_attributes {
 267        hwmon_energy_enable,
 268        hwmon_energy_input,
 269        hwmon_energy_label,
 270};
 271
 272#define HWMON_E_ENABLE                  BIT(hwmon_energy_enable)
 273#define HWMON_E_INPUT                   BIT(hwmon_energy_input)
 274#define HWMON_E_LABEL                   BIT(hwmon_energy_label)
 275
 276enum hwmon_humidity_attributes {
 277        hwmon_humidity_enable,
 278        hwmon_humidity_input,
 279        hwmon_humidity_label,
 280        hwmon_humidity_min,
 281        hwmon_humidity_min_hyst,
 282        hwmon_humidity_max,
 283        hwmon_humidity_max_hyst,
 284        hwmon_humidity_alarm,
 285        hwmon_humidity_fault,
 286        hwmon_humidity_rated_min,
 287        hwmon_humidity_rated_max,
 288};
 289
 290#define HWMON_H_ENABLE                  BIT(hwmon_humidity_enable)
 291#define HWMON_H_INPUT                   BIT(hwmon_humidity_input)
 292#define HWMON_H_LABEL                   BIT(hwmon_humidity_label)
 293#define HWMON_H_MIN                     BIT(hwmon_humidity_min)
 294#define HWMON_H_MIN_HYST                BIT(hwmon_humidity_min_hyst)
 295#define HWMON_H_MAX                     BIT(hwmon_humidity_max)
 296#define HWMON_H_MAX_HYST                BIT(hwmon_humidity_max_hyst)
 297#define HWMON_H_ALARM                   BIT(hwmon_humidity_alarm)
 298#define HWMON_H_FAULT                   BIT(hwmon_humidity_fault)
 299#define HWMON_H_RATED_MIN               BIT(hwmon_humidity_rated_min)
 300#define HWMON_H_RATED_MAX               BIT(hwmon_humidity_rated_max)
 301
 302enum hwmon_fan_attributes {
 303        hwmon_fan_enable,
 304        hwmon_fan_input,
 305        hwmon_fan_label,
 306        hwmon_fan_min,
 307        hwmon_fan_max,
 308        hwmon_fan_div,
 309        hwmon_fan_pulses,
 310        hwmon_fan_target,
 311        hwmon_fan_alarm,
 312        hwmon_fan_min_alarm,
 313        hwmon_fan_max_alarm,
 314        hwmon_fan_fault,
 315};
 316
 317#define HWMON_F_ENABLE                  BIT(hwmon_fan_enable)
 318#define HWMON_F_INPUT                   BIT(hwmon_fan_input)
 319#define HWMON_F_LABEL                   BIT(hwmon_fan_label)
 320#define HWMON_F_MIN                     BIT(hwmon_fan_min)
 321#define HWMON_F_MAX                     BIT(hwmon_fan_max)
 322#define HWMON_F_DIV                     BIT(hwmon_fan_div)
 323#define HWMON_F_PULSES                  BIT(hwmon_fan_pulses)
 324#define HWMON_F_TARGET                  BIT(hwmon_fan_target)
 325#define HWMON_F_ALARM                   BIT(hwmon_fan_alarm)
 326#define HWMON_F_MIN_ALARM               BIT(hwmon_fan_min_alarm)
 327#define HWMON_F_MAX_ALARM               BIT(hwmon_fan_max_alarm)
 328#define HWMON_F_FAULT                   BIT(hwmon_fan_fault)
 329
 330enum hwmon_pwm_attributes {
 331        hwmon_pwm_input,
 332        hwmon_pwm_enable,
 333        hwmon_pwm_mode,
 334        hwmon_pwm_freq,
 335};
 336
 337#define HWMON_PWM_INPUT                 BIT(hwmon_pwm_input)
 338#define HWMON_PWM_ENABLE                BIT(hwmon_pwm_enable)
 339#define HWMON_PWM_MODE                  BIT(hwmon_pwm_mode)
 340#define HWMON_PWM_FREQ                  BIT(hwmon_pwm_freq)
 341
 342enum hwmon_intrusion_attributes {
 343        hwmon_intrusion_alarm,
 344        hwmon_intrusion_beep,
 345};
 346#define HWMON_INTRUSION_ALARM           BIT(hwmon_intrusion_alarm)
 347#define HWMON_INTRUSION_BEEP            BIT(hwmon_intrusion_beep)
 348
 349/**
 350 * struct hwmon_ops - hwmon device operations
 351 * @is_visible: Callback to return attribute visibility. Mandatory.
 352 *              Parameters are:
 353 *              @const void *drvdata:
 354 *                      Pointer to driver-private data structure passed
 355 *                      as argument to hwmon_device_register_with_info().
 356 *              @type:  Sensor type
 357 *              @attr:  Sensor attribute
 358 *              @channel:
 359 *                      Channel number
 360 *              The function returns the file permissions.
 361 *              If the return value is 0, no attribute will be created.
 362 * @read:       Read callback for data attributes. Mandatory if readable
 363 *              data attributes are present.
 364 *              Parameters are:
 365 *              @dev:   Pointer to hardware monitoring device
 366 *              @type:  Sensor type
 367 *              @attr:  Sensor attribute
 368 *              @channel:
 369 *                      Channel number
 370 *              @val:   Pointer to returned value
 371 *              The function returns 0 on success or a negative error number.
 372 * @read_string:
 373 *              Read callback for string attributes. Mandatory if string
 374 *              attributes are present.
 375 *              Parameters are:
 376 *              @dev:   Pointer to hardware monitoring device
 377 *              @type:  Sensor type
 378 *              @attr:  Sensor attribute
 379 *              @channel:
 380 *                      Channel number
 381 *              @str:   Pointer to returned string
 382 *              The function returns 0 on success or a negative error number.
 383 * @write:      Write callback for data attributes. Mandatory if writeable
 384 *              data attributes are present.
 385 *              Parameters are:
 386 *              @dev:   Pointer to hardware monitoring device
 387 *              @type:  Sensor type
 388 *              @attr:  Sensor attribute
 389 *              @channel:
 390 *                      Channel number
 391 *              @val:   Value to write
 392 *              The function returns 0 on success or a negative error number.
 393 */
 394struct hwmon_ops {
 395        umode_t (*is_visible)(const void *drvdata, enum hwmon_sensor_types type,
 396                              u32 attr, int channel);
 397        int (*read)(struct device *dev, enum hwmon_sensor_types type,
 398                    u32 attr, int channel, long *val);
 399        int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
 400                    u32 attr, int channel, const char **str);
 401        int (*write)(struct device *dev, enum hwmon_sensor_types type,
 402                     u32 attr, int channel, long val);
 403};
 404
 405/**
 406 * Channel information
 407 * @type:       Channel type.
 408 * @config:     Pointer to NULL-terminated list of channel parameters.
 409 *              Use for per-channel attributes.
 410 */
 411struct hwmon_channel_info {
 412        enum hwmon_sensor_types type;
 413        const u32 *config;
 414};
 415
 416#define HWMON_CHANNEL_INFO(stype, ...)  \
 417        (&(struct hwmon_channel_info) { \
 418                .type = hwmon_##stype,  \
 419                .config = (u32 []) {    \
 420                        __VA_ARGS__, 0  \
 421                }                       \
 422        })
 423
 424/**
 425 * Chip configuration
 426 * @ops:        Pointer to hwmon operations.
 427 * @info:       Null-terminated list of channel information.
 428 */
 429struct hwmon_chip_info {
 430        const struct hwmon_ops *ops;
 431        const struct hwmon_channel_info **info;
 432};
 433
 434/* hwmon_device_register() is deprecated */
 435struct device *hwmon_device_register(struct device *dev);
 436
 437struct device *
 438hwmon_device_register_with_groups(struct device *dev, const char *name,
 439                                  void *drvdata,
 440                                  const struct attribute_group **groups);
 441struct device *
 442devm_hwmon_device_register_with_groups(struct device *dev, const char *name,
 443                                       void *drvdata,
 444                                       const struct attribute_group **groups);
 445struct device *
 446hwmon_device_register_with_info(struct device *dev,
 447                                const char *name, void *drvdata,
 448                                const struct hwmon_chip_info *info,
 449                                const struct attribute_group **extra_groups);
 450struct device *
 451devm_hwmon_device_register_with_info(struct device *dev,
 452                                const char *name, void *drvdata,
 453                                const struct hwmon_chip_info *info,
 454                                const struct attribute_group **extra_groups);
 455
 456void hwmon_device_unregister(struct device *dev);
 457void devm_hwmon_device_unregister(struct device *dev);
 458
 459int hwmon_notify_event(struct device *dev, enum hwmon_sensor_types type,
 460                       u32 attr, int channel);
 461
 462/**
 463 * hwmon_is_bad_char - Is the char invalid in a hwmon name
 464 * @ch: the char to be considered
 465 *
 466 * hwmon_is_bad_char() can be used to determine if the given character
 467 * may not be used in a hwmon name.
 468 *
 469 * Returns true if the char is invalid, false otherwise.
 470 */
 471static inline bool hwmon_is_bad_char(const char ch)
 472{
 473        switch (ch) {
 474        case '-':
 475        case '*':
 476        case ' ':
 477        case '\t':
 478        case '\n':
 479                return true;
 480        default:
 481                return false;
 482        }
 483}
 484
 485#endif
 486